anvil-editor: init at 0.4
[NixPkgs.git] / pkgs / build-support / replace-direct-dependencies.nix
blob57036ebd74d14f15c70757305451782eb230898e
2   lib,
3   runCommandLocal,
4   nix,
5 }:
7 # Replace some direct dependencies of drv, not recursing into the dependency tree.
8 # You likely want to use replaceDependencies instead, unless you plan to implement your own recursion mechanism.
10   drv,
11   replacements ? [ ],
13 let
14   inherit (lib)
15     isStorePath
16     substring
17     stringLength
18     optionalString
19     escapeShellArgs
20     concatMap
21     ;
23 if replacements == [ ] then
24   drv
25 else
26   let
27     drvName =
28       if isStorePath drv then
29         # Reconstruct the name from the actual store path if available.
30         substring 33 (stringLength (baseNameOf drv)) (baseNameOf drv)
31       else if drv ? drvAttrs.name then
32         # Try to get the name from the derivation arguments otherwise (for floating or deferred derivations).
33         drv.drvAttrs.name
34         + (
35           let
36             outputName = drv.outputName or "out";
37           in
38           optionalString (outputName != "out") "-${outputName}"
39         )
40       else
41         throw "cannot reconstruct the derivation name from ${drv}";
42   in
43   runCommandLocal drvName { nativeBuildInputs = [ nix.out ]; } ''
44     createRewriteScript() {
45         while [ $# -ne 0 ]; do
46             oldBasename="$(basename "$1")"
47             newBasename="$(basename "$2")"
48             shift 2
49             if [ ''${#oldBasename} -ne ''${#newBasename} ]; then
50                 echo "cannot rewrite $oldBasename to $newBasename: length does not match" >&2
51                 exit 1
52             fi
53             echo "s|$oldBasename|$newBasename|g" >> rewrite.sed
54         done
55     }
56     createRewriteScript ${
57       escapeShellArgs (
58         [
59           drv
60           (placeholder "out")
61         ]
62         ++ concatMap (
63           { oldDependency, newDependency }:
64           [
65             oldDependency
66             newDependency
67           ]
68         ) replacements
69       )
70     }
71     nix-store --dump ${drv} | sed -f rewrite.sed | nix-store --restore $out
72   ''