diff options
author | Silvan Mosberger <contact@infinisil.com> | 2019-09-06 21:11:12 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-09-06 21:11:12 +0200 |
commit | d1bb36d5cb5b78111f799eb26f5f17e5979bc746 (patch) | |
tree | f2ae3eee349de5717b7ddbc5a9abb67522fbcd1a /lib | |
parent | 6d7282d74a66dd96df3cfd400429b7aa1a694069 (diff) | |
parent | 9a2180fa0b3c1b2744973b57aaff5ed7fb4b8d42 (diff) |
Merge pull request #67996 from roberth/cleanSourceWith-name
lib.cleanSourceWith: Allow name to be set, optional filter, doc
Diffstat (limited to 'lib')
-rw-r--r-- | lib/sources.nix | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/lib/sources.nix b/lib/sources.nix index c4680087b2454..51bcf5559e321 100644 --- a/lib/sources.nix +++ b/lib/sources.nix @@ -36,18 +36,47 @@ rec { # allowing you to chain multiple calls together without any # intermediate copies being put in the nix store. # - # lib.cleanSourceWith f (lib.cleanSourceWith g ./.) # Succeeds! - # builtins.filterSource f (builtins.filterSource g ./.) # Fails! - cleanSourceWith = { filter, src }: + # lib.cleanSourceWith { + # filter = f; + # src = lib.cleanSourceWith { + # filter = g; + # src = ./.; + # }; + # } + # # Succeeds! + # + # builtins.filterSource f (builtins.filterSource g ./.) + # # Fails! + # + # Parameters: + # + # src: A path or cleanSourceWith result to filter and/or rename. + # + # filter: A function (path -> type -> bool) + # Optional with default value: constant true (include everything) + # The function will be combined with the && operator such + # that src.filter is called lazily. + # For implementing a filter, see + # https://nixos.org/nix/manual/#builtin-filterSource + # + # name: Optional name to use as part of the store path. + # This defaults `src.name` or otherwise `baseNameOf src`. + # We recommend setting `name` whenever `src` is syntactically `./.`. + # Otherwise, you depend on `./.`'s name in the parent directory, + # which can cause inconsistent names, defeating caching. + # + cleanSourceWith = { filter ? _path: _type: true, src, name ? null }: let isFiltered = src ? _isLibCleanSourceWith; origSrc = if isFiltered then src.origSrc else src; filter' = if isFiltered then name: type: filter name type && src.filter name type else filter; + name' = if name != null then name else if isFiltered then src.name else baseNameOf src; in { inherit origSrc; filter = filter'; - outPath = builtins.filterSource filter' origSrc; + outPath = builtins.path { filter = filter'; path = origSrc; name = name'; }; _isLibCleanSourceWith = true; + name = name'; }; # Filter sources by a list of regular expressions. |