diff --git a/pkgs/build-support/fetchdarcs/builder.sh b/pkgs/build-support/fetchdarcs/builder.sh index e1c5d7745d35..adc9c55939c3 100644 --- a/pkgs/build-support/fetchdarcs/builder.sh +++ b/pkgs/build-support/fetchdarcs/builder.sh @@ -1,3 +1,5 @@ +set -u + tagtext="" tagflags="" # Darcs hashes are sha1 (120 bits, 40-character hex) @@ -12,8 +14,19 @@ elif test -n "$context"; then tagflags="--context=$context" fi -echo "Cloning $url $partial ${tagtext} into $out" +# Repository list may contain ?. No glob expansion for that. +set -o noglob -darcs clone --lazy $tagflags "$url" "$out" -# remove metadata, because it can change -rm -rf "$out/_darcs" +for repository in $repositories; do + echo "Trying to clone $repository $tagtext into $out …" + if darcs clone --lazy $tagflags "$repository" "$out"; then + # remove metadata, because it can change + rm -rf "$out/_darcs" + exit 0 + fi +done + +set +o noglob + +echo "Error: couldn’t clone repository from any mirror" 1>&2 +exit 1 diff --git a/pkgs/build-support/fetchdarcs/default.nix b/pkgs/build-support/fetchdarcs/default.nix index 2d24ddaecbd4..d6a9093c76dc 100644 --- a/pkgs/build-support/fetchdarcs/default.nix +++ b/pkgs/build-support/fetchdarcs/default.nix @@ -8,7 +8,11 @@ lib.makeOverridable ( lib.fetchers.withNormalizedHash { } ( { + # Repository to fetch url, + # Additional list of repositories specifying alternative download + # location to be tried in order, if the prior repository failed to fetch. + mirrors ? [ ], rev ? null, context ? null, outputHash ? lib.fakeHash, @@ -27,11 +31,12 @@ lib.makeOverridable ( outputHashMode = "recursive"; inherit - url rev context name ; + + repositories = [ url ] ++ mirrors; } ) )