1{
2 lib,
3 fetchurl,
4 runCommand,
5 writeText,
6}:
7
8{
9 name ? "deps",
10 data,
11 dontFixup ? true,
12 ...
13}@attrs:
14
15let
16 data' = builtins.removeAttrs (if builtins.isPath data then lib.importJSON data else data) [
17 "!version"
18 ];
19
20 urlToPath =
21 url:
22 if lib.hasPrefix "https://" url then
23 (
24 let
25 url' = lib.drop 2 (lib.splitString "/" url);
26 in
27 "https/${builtins.concatStringsSep "/" url'}"
28 )
29 else
30 builtins.replaceStrings [ "://" ] [ "/" ] url;
31 code = ''
32 mkdir -p "$out"
33 cd "$out"
34 ''
35 + builtins.concatStringsSep "" (
36 lib.mapAttrsToList (
37 url: info:
38 let
39 key = builtins.head (builtins.attrNames info);
40 val = info.${key};
41 path = urlToPath url;
42 name = baseNameOf path;
43 source =
44 {
45 redirect = "$out/${urlToPath val}";
46 hash = fetchurl {
47 inherit url;
48 hash = val;
49 };
50 text = writeText name val;
51 }
52 .${key} or (throw "Unknown key: ${url}");
53 in
54 ''
55 mkdir -p "${dirOf path}"
56 ln -s "${source}" "${path}"
57 ''
58 ) data'
59 );
60in
61runCommand name (
62 builtins.removeAttrs attrs [
63 "name"
64 "data"
65 ]
66 // {
67 passthru = (attrs.passthru or { }) // {
68 data = writeText "deps.json" (builtins.toJSON data);
69 };
70 }
71) code