summary refs log tree commit diff
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)
downloadnixpkgs-56cb5b7609f97e07bf4633ba5d59d230193a0248.tar
nixpkgs-56cb5b7609f97e07bf4633ba5d59d230193a0248.tar.gz
nixpkgs-56cb5b7609f97e07bf4633ba5d59d230193a0248.tar.bz2
nixpkgs-56cb5b7609f97e07bf4633ba5d59d230193a0248.tar.lz
nixpkgs-56cb5b7609f97e07bf4633ba5d59d230193a0248.tar.xz
nixpkgs-56cb5b7609f97e07bf4633ba5d59d230193a0248.tar.zst
nixpkgs-56cb5b7609f97e07bf4633ba5d59d230193a0248.zip
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
+  '';
+}