Clone of https://github.com/NixOS/nixpkgs.git (to stress-test knotserver)
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