From 01050586980a81e525428eb9e571a8b040f96b26 Mon Sep 17 00:00:00 2001 From: Jan Tojnar Date: Sat, 2 Mar 2019 22:11:54 +0100 Subject: [PATCH 1/2] 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. --- .../networking/browsers/firefox/update.nix | 2 +- pkgs/common-updater/scripts.nix | 4 +- .../scripts/update-source-version | 84 +++++++++++++++---- 3 files changed, 70 insertions(+), 20 deletions(-) diff --git a/pkgs/applications/networking/browsers/firefox/update.nix b/pkgs/applications/networking/browsers/firefox/update.nix index b03720f988a..0ead6de123a 100644 --- a/pkgs/applications/networking/browsers/firefox/update.nix +++ b/pkgs/applications/networking/browsers/firefox/update.nix @@ -32,5 +32,5 @@ writeScript "update-${attrPath}" '' sort --version-sort | \ tail -n 1` - update-source-version ${attrPath} "$version" "" "" ${versionKey} + update-source-version ${attrPath} "$version" "" "" --version-key=${versionKey} '' 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=$1 -newVersion=$2 -newHash=$3 -newUrl=$4 -versionKey=$5 +usage() { + echo "Usage: $scriptName [] []" + echo " [--version-key=] [--system=] [--file=]" +} + +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 From a5cdac3d7c35454c3db52bcf03e250a95436b536 Mon Sep 17 00:00:00 2001 From: Jan Tojnar Date: Sat, 2 Mar 2019 22:39:27 +0100 Subject: [PATCH 2/2] sublime3: Add updateScript --- .../applications/editors/sublime/3/common.nix | 23 ++++++++++++++++--- .../editors/sublime/3/packages.nix | 1 + 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/pkgs/applications/editors/sublime/3/common.nix b/pkgs/applications/editors/sublime/3/common.nix index 937764f0ab8..8f304524dff 100644 --- a/pkgs/applications/editors/sublime/3/common.nix +++ b/pkgs/applications/editors/sublime/3/common.nix @@ -1,8 +1,9 @@ -{buildVersion, x32sha256, x64sha256}: +{buildVersion, x32sha256, x64sha256, dev ? false}: { fetchurl, stdenv, glib, xorg, cairo, gtk2, gtk3, pango, makeWrapper, wrapGAppsHook, openssl, bzip2, runtimeShell, pkexecPath ? "/run/wrappers/bin/pkexec", libredirect, - gksuSupport ? false, gksu, unzip, zip, bash}: + gksuSupport ? false, gksu, unzip, zip, bash, + writeScript, common-updater-scripts, curl, gnugrep}: assert gksuSupport -> gksu != null; @@ -26,7 +27,7 @@ in let # package with just the binaries sublime = stdenv.mkDerivation { - name = "sublimetext3-${buildVersion}-bin"; + name = "sublimetext3-bin-${buildVersion}"; src = fetchurl { name = "sublimetext-${buildVersion}.tar.bz2"; @@ -127,6 +128,22 @@ in stdenv.mkDerivation (rec { ln -s $sublime/Icon/256x256/ $out/share/icons ''; + passthru.updateScript = writeScript "sublime3-update-script" '' + #!${stdenv.shell} + set -o errexit + PATH=${stdenv.lib.makeBinPath [ common-updater-scripts curl gnugrep ]} + + latestVersion=$(curl https://www.sublimetext.com/3${stdenv.lib.optionalString dev "dev"} | grep -Po '(?<=

Version: Build )([0-9]+)') + + for platform in ${stdenv.lib.concatStringsSep " " meta.platforms}; do + package=sublime3${stdenv.lib.optionalString dev "-dev"} + # The script will not perform an update when the version attribute is up to date from previous platform run + # We need to clear it before each run + update-source-version ''${package}.sublime 0 0000000000000000000000000000000000000000000000000000000000000000 --file=pkgs/applications/editors/sublime/3/packages.nix --version-key=buildVersion --system=$platform + update-source-version ''${package}.sublime $latestVersion --file=pkgs/applications/editors/sublime/3/packages.nix --version-key=buildVersion --system=$platform + done + ''; + meta = with stdenv.lib; { description = "Sophisticated text editor for code, markup and prose"; homepage = https://www.sublimetext.com/; diff --git a/pkgs/applications/editors/sublime/3/packages.nix b/pkgs/applications/editors/sublime/3/packages.nix index 2d214f18e9f..6d4b511e598 100644 --- a/pkgs/applications/editors/sublime/3/packages.nix +++ b/pkgs/applications/editors/sublime/3/packages.nix @@ -6,6 +6,7 @@ in rec { sublime3-dev = common { buildVersion = "3184"; + dev = true; x32sha256 = "1b6f1fid75g5z247dbnyyj276lrlv99scrdk1vvfcr6vyws77vzr"; x64sha256 = "03127jhfjr17ai96p3axh5b5940fds8jcw6vkid8y6dmvd2dpylz"; } {};