1{
2 lib,
3 runCommandLocal,
4 gfal2-util,
5}:
6
7# `url` and `urls` should only be overridden via `<pkg>.override`, but not `<pkg>.overrideAttrs`.
8{
9 name ? "",
10 pname ? "",
11 version ? "",
12 urls ? [ ],
13 url ? if urls == [ ] then abort "Expect either non-empty `urls` or `url`" else lib.head urls,
14 hash ? lib.fakeHash,
15 recursive ? false,
16 intermediateDestUrls ? [ ],
17 extraGfalCopyFlags ? [ ],
18 allowSubstitutes ? true,
19}:
20
21(runCommandLocal name { } ''
22 for u in "''${urls[@]}"; do
23 gfal-copy "''${gfalCopyFlags[@]}" "$u" "''${intermediateDestUrls[@]}" "$out"
24 ret="$?"
25 (( ret )) && break
26 done
27 if (( ret )); then
28 echo "gfal-copy failed trying to download from any of the urls" >&2
29 exit "$ret"
30 fi
31'').overrideAttrs
32 (
33 finalAttrs: previousAttrs:
34 {
35 __structuredAttrs = true;
36 inherit allowSubstitutes;
37 nativeBuildInputs = [ gfal2-util ];
38 outputHashAlgo = null;
39 outputHashMode = if finalAttrs.recursive then "recursive" else "flat";
40 outputHash = hash;
41 inherit url;
42 urls = if urls == [ ] then lib.singleton url else urls;
43 gfalCopyFlags = extraGfalCopyFlags ++ lib.optional finalAttrs.recursive "--recursive";
44 inherit recursive intermediateDestUrls;
45 }
46 // (
47 if (pname != "" && version != "") then
48 {
49 inherit pname version;
50 name = "${finalAttrs.pname}-${finalAttrs.version}";
51 }
52 else
53 { name = if (name != "") then name else (baseNameOf url); }
54 )
55 )