about summary refs log tree commit diff
path: root/nixpkgs/pkgs/tools/archivers/rar
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/tools/archivers/rar')
-rw-r--r--nixpkgs/pkgs/tools/archivers/rar/default.nix35
-rwxr-xr-xnixpkgs/pkgs/tools/archivers/rar/update.sh78
2 files changed, 99 insertions, 14 deletions
diff --git a/nixpkgs/pkgs/tools/archivers/rar/default.nix b/nixpkgs/pkgs/tools/archivers/rar/default.nix
index a1c22835752b..168316813f76 100644
--- a/nixpkgs/pkgs/tools/archivers/rar/default.nix
+++ b/nixpkgs/pkgs/tools/archivers/rar/default.nix
@@ -1,39 +1,43 @@
-{ lib, stdenv, fetchurl, autoPatchelfHook, installShellFiles }:
+{ lib
+, stdenv
+, fetchurl
+, autoPatchelfHook
+, installShellFiles
+}:
 
 let
-  version = "6.21";
+  version = "6.24";
   downloadVersion = lib.replaceStrings [ "." ] [ "" ] version;
-  # Use `nix store prefetch-file <url>` to generate the hashes for the other systems
-  # TODO: create update script
-  srcUrl = {
+  # Use `./update.sh` to generate the entries below
+  srcs = {
     i686-linux = {
       url = "https://www.rarlab.com/rar/rarlinux-x32-${downloadVersion}.tar.gz";
-      hash = "sha256-mDeRmLTjF0ZLv4JoLrgI8YBFFulBSKfOPb6hrxDZIkU=";
+      hash = "sha256-aacgJH0iJLRNEaZuVyzl/FxZgSnW3dIZFUfaqt0l88M=";
     };
     x86_64-linux = {
       url = "https://www.rarlab.com/rar/rarlinux-x64-${downloadVersion}.tar.gz";
-      hash = "sha256-3fr5aVkh/r6OfBEcZULJSZp5ydakJOLRPlgzMdlwGTM=";
+      hash = "sha256-iOIqjoQSXJR2N7vyjHRuM4oKYyedgPn51zc2A4ddses=";
     };
     aarch64-darwin = {
       url = "https://www.rarlab.com/rar/rarmacos-arm-${downloadVersion}.tar.gz";
-      hash = "sha256-OR9HBlRteTzuyQ06tyXTSrFTBHFwmZ41kUfvgflogT4=";
+      hash = "sha256-2r4zWDT7Xw/CNvA7oNEsGfrXJDzFa5gNthIB/5TYR5U=";
     };
     x86_64-darwin = {
       url = "https://www.rarlab.com/rar/rarmacos-x64-${downloadVersion}.tar.gz";
-      hash = "sha256-UN3gmEuIpCXwmw3/l+KdarAYLy1DxGoPAOB2bfJTGbw=";
+      hash = "sha256-4vENPNfMpQstsm9+8+glHPK9fAlDmnHWbCHW+HUwSX4=";
     };
-  }.${stdenv.system} or (throw "Unsupported system: ${stdenv.system}");
+  };
   manSrc = fetchurl {
     url = "https://aur.archlinux.org/cgit/aur.git/plain/rar.1?h=rar&id=8e39a12e88d8a3b168c496c44c18d443c876dd10";
     name = "rar.1";
     hash = "sha256-93cSr9oAsi+xHUtMsUvICyHJe66vAImS2tLie7nt8Uw=";
   };
 in
-stdenv.mkDerivation rec {
+stdenv.mkDerivation {
   pname = "rar";
   inherit version;
 
-  src = fetchurl srcUrl;
+  src = fetchurl (srcs.${stdenv.hostPlatform.system});
 
   dontBuild = true;
 
@@ -57,12 +61,15 @@ stdenv.mkDerivation rec {
     installManPage ${manSrc}
   '';
 
+  passthru.updateScript = ./update.sh;
+
   meta = with lib; {
     description = "Utility for RAR archives";
     homepage = "https://www.rarlab.com/";
-    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
     license = licenses.unfree;
+    mainProgram = "rar";
     maintainers = with maintainers; [ thiagokokada ];
-    platforms = with platforms; linux ++ darwin;
+    platforms = lib.attrNames srcs;
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
   };
 }
diff --git a/nixpkgs/pkgs/tools/archivers/rar/update.sh b/nixpkgs/pkgs/tools/archivers/rar/update.sh
new file mode 100755
index 000000000000..f81562727f29
--- /dev/null
+++ b/nixpkgs/pkgs/tools/archivers/rar/update.sh
@@ -0,0 +1,78 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i bash -p curl gawk gnused pup jq
+
+set -euo pipefail
+
+DIRNAME=$(dirname "$0")
+readonly DIRNAME
+readonly NIXPKGS_ROOT="../../../.."
+readonly NIX_FLAGS=(--extra-experimental-features 'nix-command flakes')
+
+# awk is used for parsing the RARLAB website to get the newest version
+readonly AWK_FIELD_SEPARATOR='[-.]'
+# shellcheck disable=SC2016
+readonly AWK_COMMAND='
+# We will get the following output from pup:
+# /rar/rarlinux-x64-700b3.tar.gz
+# /rar/rarmacos-x64-700b3.tar.gz
+# /rar/rarlinux-x64-624.tar.gz
+# /rar/rarbsd-x64-624.tar.gz
+# /rar/rarmacos-x64-624.tar.gz
+
+# Ignore anything that is flagged as beta (e.g.: `/rar/rarlinux-x64-700b3.tar.gz`)
+!/[0-9]+b[0-9]*.tar.gz$/ {
+    # /rar/rarlinux-x64-624.tar.gz -> 624
+    val = $3
+    # Only get the value if it is bigger than the current one
+    if (val > max) max = val
+}
+END {
+    # 624 -> 6.24
+    printf "%.2f\n", max/100
+}
+'
+
+updateHash() {
+    local -r version="${1//./}"
+    local -r arch="$2"
+    local -r os="$3"
+    local -r nix_arch="$4"
+
+    url="https://www.rarlab.com/rar/rar$os-$arch-$version.tar.gz"
+    hash=$(nix store prefetch-file --json "$url" | jq -r .hash)
+    currentHash=$(cd "$DIRNAME" && nix "${NIX_FLAGS[@]}" eval --raw "$NIXPKGS_ROOT#legacyPackages.$nix_arch.rar.src.outputHash")
+
+    sed -i "s|$currentHash|$hash|g" "$DIRNAME/default.nix"
+}
+
+updateVersion() {
+    local -r version="$1"
+    sed -i "s|version = \"[0-9.]*\";|version = \"$version\";|g" "$DIRNAME/default.nix"
+}
+
+latestVersion="${1:-}"
+if [[ -z "$latestVersion" ]]; then
+    latestVersion=$(
+        curl --silent --location --fail https://www.rarlab.com/download.htm | \
+            pup 'a[href*=".tar.gz"] attr{href}' | \
+            awk -F"$AWK_FIELD_SEPARATOR" "$AWK_COMMAND"
+    )
+fi
+readonly latestVersion
+echo "Latest version: $latestVersion"
+
+currentVersion=$(cd "$DIRNAME" && nix "${NIX_FLAGS[@]}" eval --raw "$NIXPKGS_ROOT#legacyPackages.x86_64-linux.rar.version")
+readonly currentVersion
+echo "Current version: $currentVersion"
+
+if [[ "$currentVersion" == "$latestVersion" ]]; then
+    echo "rar is up-to-date"
+    exit 0
+fi
+
+updateHash "$latestVersion" x32 linux i686-linux
+updateHash "$latestVersion" x64 linux x86_64-linux
+updateHash "$latestVersion" arm macos aarch64-darwin
+updateHash "$latestVersion" x64 macos x86_64-darwin
+
+updateVersion "$latestVersion"