summary refs log tree commit diff
path: root/pkgs/common-updater
diff options
context:
space:
mode:
authorJan Tojnar <jtojnar@gmail.com>2019-03-02 22:11:54 +0100
committerJan Tojnar <jtojnar@gmail.com>2019-03-02 23:03:04 +0100
commit01050586980a81e525428eb9e571a8b040f96b26 (patch)
treec93dc06c936d4c4c01c33da0fc03298054207a71 /pkgs/common-updater
parent025c2abd08de80609b961c8c8176a2be390a6d88 (diff)
downloadnixpkgs-01050586980a81e525428eb9e571a8b040f96b26.tar
nixpkgs-01050586980a81e525428eb9e571a8b040f96b26.tar.gz
nixpkgs-01050586980a81e525428eb9e571a8b040f96b26.tar.bz2
nixpkgs-01050586980a81e525428eb9e571a8b040f96b26.tar.lz
nixpkgs-01050586980a81e525428eb9e571a8b040f96b26.tar.xz
nixpkgs-01050586980a81e525428eb9e571a8b040f96b26.tar.zst
nixpkgs-01050586980a81e525428eb9e571a8b040f96b26.zip
common-updater-scripts: Add file and system flags
You can now optionally invoke update-source-versions with:

* --system flag changing the host platform, to be passed dirrectly to Nix commands.
  This is useful for binary packages which have different sources for each platform.
* --file flag allowing to change the file to be modified. This is useful for packages
  that offer multiple variants, listed in a different file than the derivation itself;
  e.g. packages.nix of Sublime Text 3.
* --version-key, which is now a keyword flag instead of a positional argument.
Diffstat (limited to 'pkgs/common-updater')
-rw-r--r--pkgs/common-updater/scripts.nix4
-rwxr-xr-xpkgs/common-updater/scripts/update-source-version84
2 files changed, 69 insertions, 19 deletions
diff --git a/pkgs/common-updater/scripts.nix b/pkgs/common-updater/scripts.nix
index b260c67ca7c..8a122b74b23 100644
--- a/pkgs/common-updater/scripts.nix
+++ b/pkgs/common-updater/scripts.nix
@@ -1,4 +1,4 @@
-{ stdenv, makeWrapper, coreutils, gawk, gnused, diffutils, nix }:
+{ stdenv, makeWrapper, coreutils, gawk, gnused, gnugrep, diffutils, nix }:
 
 stdenv.mkDerivation {
   name = "common-updater-scripts";
@@ -12,7 +12,7 @@ stdenv.mkDerivation {
     cp ${./scripts}/* $out/bin
 
     for f in $out/bin/*; do
-      wrapProgram $f --prefix PATH : ${stdenv.lib.makeBinPath [ coreutils gawk gnused nix diffutils ]}
+      wrapProgram $f --prefix PATH : ${stdenv.lib.makeBinPath [ coreutils gawk gnused gnugrep nix diffutils ]}
     done
   '';
 }
diff --git a/pkgs/common-updater/scripts/update-source-version b/pkgs/common-updater/scripts/update-source-version
index 117e8724cd8..a66ffb750f6 100755
--- a/pkgs/common-updater/scripts/update-source-version
+++ b/pkgs/common-updater/scripts/update-source-version
@@ -1,29 +1,79 @@
 #!/usr/bin/env bash
 set -e
 
+scriptName=update-source-versions # do not use the .wrapped name
+
 die() {
-    echo "$0: error: $1" >&2
+    echo "$scriptName: error: $1" >&2
     exit 1
 }
 
-# Usage: update-source-hash <attr> <version> [<new-source-hash>] [<new-source-url>] [<version-key>]
-attr=$1
-newVersion=$2
-newHash=$3
-newUrl=$4
-versionKey=$5
+usage() {
+    echo "Usage: $scriptName <attr> <version> [<new-source-hash>] [<new-source-url>]"
+    echo "                              [--version-key=<version-key>] [--system=<system>] [--file=<file-to-update>]"
+}
+
+args=()
+
+for arg in "$@"; do
+    case $arg in
+        --system=*)
+            systemArg="--system ${arg#*=}"
+        ;;
+        --version-key=*)
+            versionKey="${arg#*=}"
+        ;;
+        --file=*)
+            nixFile="${arg#*=}"
+            if [ ! -f "$nixFile" ]; then
+                die "Could not find provided file $nixFile"
+            fi
+        ;;
+        --help)
+            usage
+            exit 0
+        ;;
+        --*)
+            echo "$scriptName: Unknown argument: " $arg
+            usage
+            exit 1
+        ;;
+        *)
+            args["${#args[*]}"]=$arg
+        ;;
+    esac
+done
+
+attr=${args[0]}
+newVersion=${args[1]}
+newHash=${args[2]}
+newUrl=${args[3]}
+
+if [ "${#args[*]}" -lt 2 ]; then
+    echo "$scriptName: Too few arguments"
+    usage
+    exit 1
+fi
+
+if [ "${#args[*]}" -gt 4 ]; then
+    echo "$scriptName: Too many arguments"
+    usage
+    exit 1
+fi
 
 if [ -z "$versionKey" ]; then
     versionKey=version
 fi
 
-nixFile=$(nix-instantiate --eval --strict -A "$attr.meta.position" | sed -re 's/^"(.*):[0-9]+"$/\1/')
-if [ ! -f "$nixFile" ]; then
-    die "Couldn't evaluate '$attr.meta.position' to locate the .nix file!"
+if [ -z "$nixFile" ]; then
+    nixFile=$(nix-instantiate $systemArg --eval --strict -A "$attr.meta.position" | sed -re 's/^"(.*):[0-9]+"$/\1/')
+    if [ ! -f "$nixFile" ]; then
+        die "Couldn't evaluate '$attr.meta.position' to locate the .nix file!"
+    fi
 fi
 
-oldHashAlgo=$(nix-instantiate --eval --strict -A "$attr.src.drvAttrs.outputHashAlgo" | tr -d '"')
-oldHash=$(nix-instantiate --eval --strict -A "$attr.src.drvAttrs.outputHash" | tr -d '"')
+oldHashAlgo=$(nix-instantiate $systemArg --eval --strict -A "$attr.src.drvAttrs.outputHashAlgo" | tr -d '"')
+oldHash=$(nix-instantiate $systemArg --eval --strict -A "$attr.src.drvAttrs.outputHash" | tr -d '"')
 
 if [ -z "$oldHashAlgo" -o -z "$oldHash" ]; then
     die "Couldn't evaluate old source hash from '$attr.src'!"
@@ -33,21 +83,21 @@ if [ $(grep -c "$oldHash" "$nixFile") != 1 ]; then
     die "Couldn't locate old source hash '$oldHash' (or it appeared more than once) in '$nixFile'!"
 fi
 
-oldUrl=$(nix-instantiate --eval -E "with import ./. {}; builtins.elemAt $attr.src.drvAttrs.urls 0" | tr -d '"')
+oldUrl=$(nix-instantiate $systemArg --eval -E "with import ./. {}; builtins.elemAt $attr.src.drvAttrs.urls 0" | tr -d '"')
 
 if [ -z "$oldUrl" ]; then
     die "Couldn't evaluate source url from '$attr.name'!"
 fi
 
-drvName=$(nix-instantiate --eval -E "with import ./. {}; (builtins.parseDrvName $attr.name).name" | tr -d '"')
-oldVersion=$(nix-instantiate --eval -E "with import ./. {}; $attr.version or (builtins.parseDrvName $attr.name).version" | tr -d '"')
+drvName=$(nix-instantiate $systemArg --eval -E "with import ./. {}; (builtins.parseDrvName $attr.name).name" | tr -d '"')
+oldVersion=$(nix-instantiate $systemArg --eval -E "with import ./. {}; $attr.version or (builtins.parseDrvName $attr.name).version" | tr -d '"')
 
 if [ -z "$drvName" -o -z "$oldVersion" ]; then
     die "Couldn't evaluate name and version from '$attr.name'!"
 fi
 
 if [ "$oldVersion" = "$newVersion" ]; then
-    echo "$0: New version same as old version, nothing to do." >&2
+    echo "$scriptName: New version same as old version, nothing to do." >&2
     exit 0
 fi
 
@@ -94,7 +144,7 @@ fi
 
 # If new hash not given on the command line, recalculate it ourselves.
 if [ -z "$newHash" ]; then
-    nix-build --no-out-link -A "$attr.src" 2>"$attr.fetchlog" >/dev/null || true
+    nix-build $systemArg --no-out-link -A "$attr.src" 2>"$attr.fetchlog" >/dev/null || true
     # FIXME: use nix-build --hash here once https://github.com/NixOS/nix/issues/1172 is fixed
     newHash=$(egrep -v "killing process|dependencies couldn't be built|wanted: " "$attr.fetchlog" | tail -n2 | sed "s~output path .* has .* hash ‘\(.*\)’ when .* was expected\|fixed-output derivation produced path '.*' with .* hash '\(.*\)' instead of the expected hash '.*'\|  got:    .*:\(.*\)~\1\2\3~" | head -n1)
 fi