diff options
Diffstat (limited to 'maintainers')
-rwxr-xr-x | maintainers/scripts/update.nix | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/maintainers/scripts/update.nix b/maintainers/scripts/update.nix new file mode 100755 index 000000000000..2035950da3e3 --- /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 + ''; +} |