From c4c224e3684626f56d4cf1579670faff45fb9d80 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 30 May 2006 12:42:00 +0000 Subject: [PATCH] * Make nix-prefetch-svn use nix-store --add-fixed (just like nix-prefetch-url) svn path=/nixpkgs/trunk/; revision=5339 --- pkgs/build-support/fetchsvn/nix-prefetch-svn | 77 +++++++++----------- 1 file changed, 35 insertions(+), 42 deletions(-) diff --git a/pkgs/build-support/fetchsvn/nix-prefetch-svn b/pkgs/build-support/fetchsvn/nix-prefetch-svn index 722b44bbd38e..794061ae4203 100755 --- a/pkgs/build-support/fetchsvn/nix-prefetch-svn +++ b/pkgs/build-support/fetchsvn/nix-prefetch-svn @@ -2,10 +2,15 @@ url=$1 rev=$2 -hash=$3 +expHash=$3 + +hashType=$NIX_HASH_ALGO +if test -z "$hashType"; then + hashType=md5 +fi if test -z "$url"; then - echo "syntax: nix-prefetch-svn URL [REVISION]" >&2 + echo "syntax: nix-prefetch-svn URL [REVISION [EXPECTED-HASH]]" >&2 exit 1 fi @@ -15,58 +20,46 @@ test -n "$rev" || rev="HEAD" # is not group- or world-writable. Nix 0.10 complains about this. umask 0022 -# Determine the hash, unless it was given. -if test -z "$hash"; then - # !!! hacky; we should have a way to query the location of the store. - if storeDir=$(which nix-store); then - storeDir=$(dirname $(dirname "$storeDir"))/store - else - storeDir=/nix/store +# If the hash was given, a file with that hash may already be in the +# store. +if test -n "$expHash"; then + finalPath=$(nix-store --print-fixed-path --recursive "$hashType" "$expHash" svn-export) + if ! nix-store --check-validity "$finalPath" 2> /dev/null; then + finalPath= fi + hash=$expHash +fi + + +# If we don't know the hash or a path with that hash doesn't exist, +# download the file and add it to the store. +if test -z "$finalPath"; then # !!! race? should be relatively safe, `svn export' barfs if $tmpPath exists. - tmpPath1=$storeDir/svn-checkout-tmp-$$ - - # Test whether we have write permission in the store. If not, - # fetch to /tmp and don't copy to the store. This is a hack to - # make this script at least work somewhat in setuid installations. - if ! touch $tmpPath1 2> /dev/null; then - echo "(cannot write to the store, result won't be cached)" >&2 - dummyMode=1 - tmpPath1=/tmp/nix-prefetch-svn-$$ # !!! security? - fi - rm -f $tmpPath1 + tmpPath=/tmp/svn-checkout-tmp-$$ + tmpFile=$tmpPath/svn-export + mkdir $tmpPath # Perform the checkout. - svn export -r "$rev" "$url" $tmpPath1 >&2 + svn export -r "$rev" "$url" $tmpFile >&2 # Compute the hash. - hash=$(nix-hash $tmpPath1) - echo "hash is $hash" >&2 + hash=$(nix-hash --type $hashType $hashFormat $tmpFile) + if ! test -n "$QUIET"; then echo "hash is $hash" >&2; fi - # Rename it so that the fetchsvn builder can find it. - if test "$dummyMode" != 1; then - tmpPath2=$storeDir/svn-checkout-tmp-$hash - test -e $tmpPath2 || mv $tmpPath1 $tmpPath2 # !!! race + # Add the downloaded file to the Nix store. + finalPath=$(nix-store --add-fixed --recursive "$hashType" $tmpFile) + + if test -n "$tmpPath"; then rm -rf $tmpPath || true; fi + + if test -n "$expHash" -a "$expHash" != "$hash"; then + echo "hash mismatch for URL \`$url'" + exit 1 fi fi -# Create a Nix expression that does a fetchsvn. -scriptDir=$(dirname $(readlink -f $0 2> /dev/null || echo $0)) -nixExpr=$scriptDir/../../top-level/all-packages.nix -storeExpr=$( \ - echo "(import $nixExpr {}).fetchsvn {url=\"$url\"; rev=\"$rev\"; md5=\"$hash\";}" \ - | nix-instantiate -) - -# Realise it. -finalPath=$(nix-store -r $storeExpr) - -echo "path is $finalPath" >&2 - -if test -n "$tmpPath1" -o -n "$tmpPath2"; then - rm -rf $tmpPath1 $tmpPath2 || true -fi +if ! test -n "$QUIET"; then echo "path is $finalPath" >&2; fi echo $hash