Skip to content

Commit

Permalink
Merge commit 'b50ef4e3f226dde6c34817e3f92ca0aa3e18a72e' into ghcreboot
Browse files Browse the repository at this point in the history
  • Loading branch information
lostnet committed Oct 12, 2020
2 parents ae3b2eb + b50ef4e commit fafc65e
Show file tree
Hide file tree
Showing 865 changed files with 22,746 additions and 10,819 deletions.
2 changes: 1 addition & 1 deletion default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ if ! builtins ? nixVersion || builtins.compareVersions requiredVersion builtins.
- If you installed Nix using the install script (https://nixos.org/nix/install),
it is safe to upgrade by running it again:
curl https://nixos.org/nix/install | sh
curl -L https://nixos.org/nix/install | sh
For more information, please see the NixOS release notes at
https://nixos.org/nixos/manual or locally at
Expand Down
13 changes: 6 additions & 7 deletions doc/stdenv/stdenv.xml
Original file line number Diff line number Diff line change
Expand Up @@ -475,9 +475,12 @@ passthru.updateScript = writeScript "update-zoom-us" ''
<programlisting>
passthru.updateScript = [ ../../update.sh pname "--requested-release=unstable" ];
</programlisting>
</para>
<para>
The script will be usually run from the root of the Nixpkgs repository but you should not rely on that. Also note that the update scripts will be run in parallel by default; you should avoid running <command>git commit</command> or any other commands that cannot handle that.
The script will be run with <varname>UPDATE_NIX_ATTR_PATH</varname> environment variable set to the attribute path it is supposed to update.
<note>
<para>
The script will be usually run from the root of the Nixpkgs repository but you should not rely on that. Also note that the update scripts will be run in parallel by default; you should avoid running <command>git commit</command> or any other commands that cannot handle that.
</para>
</note>
</para>
<para>
For information about how to run the updates, execute <command>nix-shell maintainers/scripts/update.nix</command>.
Expand Down Expand Up @@ -1636,10 +1639,6 @@ substitute ./foo.in ./foo.out \
--subst-var someVar
</programlisting>
</para>
<para>
<function>substitute</function> is implemented using the <command
xlink:href="http://replace.richardlloyd.org.uk/">replace</command> command. Unlike with the <command>sed</command> command, you don’t have to worry about escaping special characters. It supports performing substitutions on binary files (such as executables), though there you’ll probably want to make sure that the replacement string is as long as the replaced string.
</para>
</listitem>
</varlistentry>
<varlistentry xml:id='fun-substituteInPlace'>
Expand Down
1 change: 1 addition & 0 deletions lib/types.nix
Original file line number Diff line number Diff line change
Expand Up @@ -499,6 +499,7 @@ rec {
show = v:
if builtins.isString v then ''"${v}"''
else if builtins.isInt v then builtins.toString v
else if builtins.isBool v then if v then "true" else "false"
else ''<${builtins.typeOf v}>'';
in
mkOptionType rec {
Expand Down
74 changes: 74 additions & 0 deletions maintainers/maintainer-list.nix
Original file line number Diff line number Diff line change
Expand Up @@ -806,6 +806,12 @@
githubId = 574938;
name = "Jonathan Glines";
};
austinbutler = {
email = "[email protected]";
github = "austinbutler";
githubId = 354741;
name = "Austin Butler";
};
avaq = {
email = "[email protected]";
github = "avaq";
Expand Down Expand Up @@ -1236,6 +1242,12 @@
githubId = 32319131;
name = "Brett L";
};
buckley310 = {
email = "[email protected]";
github = "buckley310";
githubId = 2379774;
name = "Sean Buckley";
};
buffet = {
email = "[email protected]";
github = "buffet";
Expand Down Expand Up @@ -3491,6 +3503,12 @@
githubId = 39689;
name = "Hugo Tavares Reis";
};
hugolgst = {
email = "[email protected]";
github = "hugolgst";
githubId = 15371828;
name = "Hugo Lageneste";
};
hyphon81 = {
email = "[email protected]";
github = "hyphon81";
Expand Down Expand Up @@ -4250,6 +4268,12 @@
githubId = 39434424;
name = "Felix Springer";
};
justinlovinger = {
email = "[email protected]";
github = "JustinLovinger";
githubId = 7183441;
name = "Justin Lovinger";
};
justinwoo = {
email = "[email protected]";
github = "justinwoo";
Expand Down Expand Up @@ -6549,6 +6573,12 @@
githubId = 8641;
name = "Pierre Carrier";
};
penguwin = {
email = "[email protected]";
github = "penguwin";
githubId = 13225611;
name = "Nicolas Martin";
};
periklis = {
email = "[email protected]";
github = "periklis";
Expand Down Expand Up @@ -8239,6 +8269,12 @@
githubId = 203195;
name = "Szczyp";
};
szlend = {
email = "[email protected]";
github = "szlend";
githubId = 7301807;
name = "Simon Žlender";
};
sztupi = {
email = "[email protected]";
github = "sztupi";
Expand Down Expand Up @@ -9688,4 +9724,42 @@
fingerprint = "F1C5 760E 45B9 9A44 72E9 6BFB D65C 9AFB 4C22 4DA3";
}];
};
berbiche = {
name = "Nicolas Berbiche";
email = "[email protected]";
github = "berbiche";
githubId = 20448408;
keys = [{
longkeyid = "rsa4096/0xB461292445C6E696";
fingerprint = "D446 E58D 87A0 31C7 EC15 88D7 B461 2924 45C6 E696";
}];
};
wenngle = {
name = "Zeke Stephens";
email = "[email protected]";
github = "wenngle";
githubId = 63376671;
};
yanganto = {
name = "Antonio Yang";
email = "[email protected]";
github = "yanganto";
githubId = 10803111;
};
starcraft66 = {
name = "Tristan Gosselin-Hane";
email = "[email protected]";
github = "starcraft66";
githubId = 1858154;
keys = [{
longkeyid = "rsa4096/0x9D98CDACFF04FD78";
fingerprint = "8597 4506 EC69 5392 0443 0805 9D98 CDAC FF04 FD78";
}];
};
hloeffler = {
name = "Hauke Löffler";
email = "[email protected]";
github = "hloeffler";
githubId = 6627191;
};
}
125 changes: 80 additions & 45 deletions maintainers/scripts/update.nix
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
, max-workers ? null
, include-overlays ? false
, keep-going ? null
, commit ? null
}:

# TODO: add assert statements
Expand Down Expand Up @@ -31,30 +32,47 @@ let
in
[x] ++ nubOn f xs;

packagesWithPath = relativePath: cond: return: pathContent:
let
result = builtins.tryEval pathContent;
/* Recursively find all packages (derivations) in `pkgs` matching `cond` predicate.
dedupResults = lst: nubOn (pkg: pkg.updateScript) (lib.concatLists lst);
in
if result.success then
Type: packagesWithPath :: AttrPath → (AttrPath → derivation → bool) → (AttrSet | List) → List<AttrSet{attrPath :: str; package :: derivation; }>
AttrPath :: [str]
The packages will be returned as a list of named pairs comprising of:
- attrPath: stringified attribute path (based on `rootPath`)
- package: corresponding derivation
*/
packagesWithPath = rootPath: cond: pkgs:
let
packagesWithPathInner = path: pathContent:
let
pathContent = result.value;
result = builtins.tryEval pathContent;

dedupResults = lst: nubOn ({ package, attrPath }: package.updateScript) (lib.concatLists lst);
in
if lib.isDerivation pathContent then
lib.optional (cond relativePath pathContent) (return relativePath pathContent)
else if lib.isAttrs pathContent then
# If user explicitly points to an attrSet or it is marked for recursion, we recur.
if relativePath == [] || pathContent.recurseForDerivations or false || pathContent.recurseForRelease or false then
dedupResults (lib.mapAttrsToList (name: elem: packagesWithPath (relativePath ++ [name]) cond return elem) pathContent)
else []
else if lib.isList pathContent then
dedupResults (lib.imap0 (i: elem: packagesWithPath (relativePath ++ [i]) cond return elem) pathContent)
else []
else [];
if result.success then
let
evaluatedPathContent = result.value;
in
if lib.isDerivation evaluatedPathContent then
lib.optional (cond path evaluatedPathContent) { attrPath = lib.concatStringsSep "." path; package = evaluatedPathContent; }
else if lib.isAttrs evaluatedPathContent then
# If user explicitly points to an attrSet or it is marked for recursion, we recur.
if path == rootPath || evaluatedPathContent.recurseForDerivations or false || evaluatedPathContent.recurseForRelease or false then
dedupResults (lib.mapAttrsToList (name: elem: packagesWithPathInner (path ++ [name]) elem) evaluatedPathContent)
else []
else if lib.isList evaluatedPathContent then
dedupResults (lib.imap0 (i: elem: packagesWithPathInner (path ++ [i]) elem) evaluatedPathContent)
else []
else [];
in
packagesWithPathInner rootPath pkgs;

/* Recursively find all packages (derivations) in `pkgs` matching `cond` predicate.
*/
packagesWith = packagesWithPath [];

/* Recursively find all packages in `pkgs` with updateScript by given maintainer.
*/
packagesWithUpdateScriptAndMaintainer = maintainer':
let
maintainer =
Expand All @@ -63,47 +81,51 @@ let
else
builtins.getAttr maintainer' lib.maintainers;
in
packagesWith (relativePath: 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
)
)
(relativePath: pkg: pkg)
pkgs;

packagesWithUpdateScript = path:
packagesWith (path: 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
)
);

/* Recursively find all packages under `path` in `pkgs` with updateScript.
*/
packagesWithUpdateScript = path: pkgs:
let
pathContent = lib.attrByPath (lib.splitString "." path) null pkgs;
prefix = lib.splitString "." path;
pathContent = lib.attrByPath prefix null pkgs;
in
if pathContent == null then
builtins.throw "Attribute path `${path}` does not exists."
else
packagesWith (relativePath: pkg: builtins.hasAttr "updateScript" pkg)
(relativePath: pkg: pkg)
packagesWithPath prefix (path: pkg: builtins.hasAttr "updateScript" pkg)
pathContent;

packageByName = name:
/* Find a package under `path` in `pkgs` and require that it has an updateScript.
*/
packageByName = path: pkgs:
let
package = lib.attrByPath (lib.splitString "." name) null pkgs;
package = lib.attrByPath (lib.splitString "." path) null pkgs;
in
if package == null then
builtins.throw "Package with an attribute name `${name}` does not exists."
builtins.throw "Package with an attribute name `${path}` does not exists."
else if ! builtins.hasAttr "updateScript" package then
builtins.throw "Package with an attribute name `${name}` does not have a `passthru.updateScript` attribute defined."
builtins.throw "Package with an attribute name `${path}` does not have a `passthru.updateScript` attribute defined."
else
package;
{ attrPath = path; inherit package; };

/* List of packages matched based on the CLI arguments.
*/
packages =
if package != null then
[ (packageByName package) ]
[ (packageByName package pkgs) ]
else if maintainer != null then
packagesWithUpdateScriptAndMaintainer maintainer
packagesWithUpdateScriptAndMaintainer maintainer pkgs
else if path != null then
packagesWithUpdateScript path
packagesWithUpdateScript path pkgs
else
builtins.throw "No arguments provided.\n\n${helpText}";

Expand Down Expand Up @@ -132,19 +154,32 @@ let
--argstr keep-going true
to continue running when a single update fails.
You can also make the updater automatically commit on your behalf from updateScripts
that support it by adding
--argstr commit true
'';

packageData = package: {
/* Transform a matched package into an object for update.py.
*/
packageData = { package, attrPath }: {
name = package.name;
pname = lib.getName package;
updateScript = map builtins.toString (lib.toList package.updateScript);
oldVersion = lib.getVersion package;
updateScript = map builtins.toString (lib.toList (package.updateScript.command or package.updateScript));
supportedFeatures = package.updateScript.supportedFeatures or [];
attrPath = package.updateScript.attrPath or attrPath;
};

/* JSON file with data for update.py.
*/
packagesJson = pkgs.writeText "packages.json" (builtins.toJSON (map packageData packages));

optionalArgs =
lib.optional (max-workers != null) "--max-workers=${max-workers}"
++ lib.optional (keep-going == "true") "--keep-going";
++ lib.optional (keep-going == "true") "--keep-going"
++ lib.optional (commit == "true") "--commit";

args = [ packagesJson ] ++ optionalArgs;

Expand Down
Loading

0 comments on commit fafc65e

Please sign in to comment.