{ lib, runCommandLocal, gfal2-util, }: # `url` and `urls` should only be overriden via `.override`, but not `.overrideAttrs`. { name ? "", pname ? "", version ? "", urls ? [ ], url ? if urls == [ ] then abort "Expect either non-empty `urls` or `url`" else lib.head urls, hash ? lib.fakeHash, recursive ? false, intermediateDestUrls ? [ ], extraGfalCopyFlags ? [ ], allowSubstitutes ? true, }: (runCommandLocal name { } '' for u in "''${urls[@]}"; do gfal-copy "''${gfalCopyFlags[@]}" "$u" "''${intermediateDestUrls[@]}" "$out" ret="$?" (( ret )) && break done if (( ret )); then echo "gfal-copy failed trying to download from any of the urls" >&2 exit "$ret" fi '').overrideAttrs ( finalAttrs: previousAttrs: { __structuredAttrs = true; inherit allowSubstitutes; nativeBuildInputs = [ gfal2-util ]; outputHashAlgo = null; outputHashMode = if finalAttrs.recursive then "recursive" else "flat"; outputHash = hash; inherit url; urls = if urls == [ ] then lib.singleton url else urls; gfalCopyFlags = extraGfalCopyFlags ++ lib.optional finalAttrs.recursive "--recursive"; inherit recursive intermediateDestUrls; } // ( if (pname != "" && version != "") then { inherit pname version; name = "${finalAttrs.pname}-${finalAttrs.version}"; } else { name = if (name != "") then name else (baseNameOf url); } ) )