aboutsummaryrefslogtreecommitdiff
path: root/maintainers/scripts/update.nix
diff options
context:
space:
mode:
authorRok Garbas <rok@garbas.si>2016-12-16 16:14:05 +0100
committerRok Garbas <rok@garbas.si>2016-12-18 16:45:33 +0100
commit56cb5b7609f97e07bf4633ba5d59d230193a0248 (patch)
treec44ee287f794f55ebecb99d6285956aa0ab56254 /maintainers/scripts/update.nix
parentb25475a9be4a5f08584a100fdc83ab6b1e03ec86 (diff)
update.nix moved to maintainers/scripts/update.nix
Diffstat (limited to 'maintainers/scripts/update.nix')
-rwxr-xr-xmaintainers/scripts/update.nix131
1 files changed, 131 insertions, 0 deletions
diff --git a/maintainers/scripts/update.nix b/maintainers/scripts/update.nix
new file mode 100755
index 00000000000..2035950da3e
--- /dev/null
+++ b/maintainers/scripts/update.nix
@@ -0,0 +1,131 @@
+{ package ? null
+, maintainer ? null
+}:
+
+# TODO: add assert statements
+
+let
+
+ pkgs = import ./../../default.nix { };
+
+ packagesWith = cond: return: set:
+ pkgs.lib.flatten
+ (pkgs.lib.mapAttrsToList
+ (name: pkg:
+ let
+ result = builtins.tryEval (
+ if pkgs.lib.isDerivation pkg && cond name pkg
+ then [(return name pkg)]
+ else if pkg.recurseForDerivations or false || pkg.recurseForRelease or false
+ then packagesWith cond return pkg
+ else []
+ );
+ in
+ if result.success then result.value
+ else []
+ )
+ set
+ );
+
+ packagesWithUpdateScriptAndMaintainer = maintainer':
+ let
+ maintainer =
+ if ! builtins.hasAttr maintainer' pkgs.lib.maintainers then
+ builtins.throw "Maintainer with name `${maintainer'} does not exist in `lib/maintainers.nix`."
+ else
+ builtins.getAttr maintainer' pkgs.lib.maintainers;
+ in
+ packagesWith (name: pkg: builtins.hasAttr "updateScript" pkg &&
+ (if builtins.hasAttr "maintainers" pkg.meta
+ then (if builtins.isList pkg.meta.maintainers
+ then builtins.elem maintainer pkg.meta.maintainers
+ else maintainer == pkg.meta.maintainers
+ )
+ else false
+ )
+ )
+ (name: pkg: pkg)
+ pkgs;
+
+ packageByName = name:
+ let
+ package = pkgs.lib.attrByPath (pkgs.lib.splitString "." name) null pkgs;
+ in
+ if package == null then
+ builtins.throw "Package with an attribute name `${name}` does not exists."
+ else if ! builtins.hasAttr "updateScript" package then
+ builtins.throw "Package with an attribute name `${name}` does have an `passthru.updateScript` defined."
+ else
+ package;
+
+ packages =
+ if package != null then
+ [ (packageByName package) ]
+ else if maintainer != null then
+ packagesWithUpdateScriptAndMaintainer maintainer
+ else
+ builtins.throw "No arguments provided.\n\n${helpText}";
+
+ helpText = ''
+ Please run:
+
+ % nix-shell maintainers/scripts/update.nix --argstr maintainer garbas
+
+ to run all update scripts for all packages that lists \`garbas\` as a maintainer
+ and have \`updateScript\` defined, or:
+
+ % nix-shell maintainers/scripts/update.nix --argstr package garbas
+
+ to run update script for specific package.
+ '';
+
+ runUpdateScript = package: ''
+ echo -ne " - ${package.name}: UPDATING ..."\\r
+ ${package.updateScript} &> ${(builtins.parseDrvName package.name).name}.log
+ CODE=$?
+ if [ "$CODE" != "0" ]; then
+ echo " - ${package.name}: ERROR "
+ echo ""
+ echo "--- SHOWING ERROR LOG FOR ${package.name} ----------------------"
+ echo ""
+ cat ${(builtins.parseDrvName package.name).name}.log
+ echo ""
+ echo "--- SHOWING ERROR LOG FOR ${package.name} ----------------------"
+ exit $CODE
+ else
+ rm ${(builtins.parseDrvName package.name).name}.log
+ fi
+ echo " - ${package.name}: DONE. "
+ '';
+
+in pkgs.stdenv.mkDerivation {
+ name = "nixpkgs-update-script";
+ buildCommand = ''
+ echo ""
+ echo "----------------------------------------------------------------"
+ echo ""
+ echo "Not possible to update packages using \`nix-build\`"
+ echo ""
+ echo "${helpText}"
+ echo "----------------------------------------------------------------"
+ exit 1
+ '';
+ shellHook = ''
+ echo ""
+ echo "Going to be running update for following packages:"
+ echo "${builtins.concatStringsSep "\n" (map (x: " - ${x.name}") packages)}"
+ echo ""
+ read -n1 -r -p "Press space to continue..." confirm
+ if [ "$confirm" = "" ]; then
+ echo ""
+ echo "Running update for:"
+ ${builtins.concatStringsSep "\n" (map runUpdateScript packages)}
+ echo ""
+ echo "Packages updated!"
+ exit 0
+ else
+ echo "Aborting!"
+ exit 1
+ fi
+ '';
+}