about summary refs log tree commit diff
path: root/pkgs/build-support/fetchsvn
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2006-05-30 12:42:00 +0000
committerEelco Dolstra <eelco.dolstra@logicblox.com>2006-05-30 12:42:00 +0000
commitc4c224e3684626f56d4cf1579670faff45fb9d80 (patch)
tree4d5442e8a85e6835d47c069e6278481ed5bc0213 /pkgs/build-support/fetchsvn
parent9ece10787e7eb56974d71c17327f609d88584b5d (diff)
* Make nix-prefetch-svn use nix-store --add-fixed (just like
  nix-prefetch-url) 

svn path=/nixpkgs/trunk/; revision=5339
Diffstat (limited to 'pkgs/build-support/fetchsvn')
-rwxr-xr-xpkgs/build-support/fetchsvn/nix-prefetch-svn77
1 files changed, 35 insertions, 42 deletions
diff --git a/pkgs/build-support/fetchsvn/nix-prefetch-svn b/pkgs/build-support/fetchsvn/nix-prefetch-svn
index 722b44bbd38e0..794061ae42035 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,59 +20,47 @@ 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
-    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 -)
+    # Add the downloaded file to the Nix store.
+    finalPath=$(nix-store --add-fixed --recursive "$hashType" $tmpFile)
 
-# Realise it.
-finalPath=$(nix-store -r $storeExpr)
+    if test -n "$tmpPath"; then rm -rf $tmpPath || true; fi
 
-echo "path is $finalPath" >&2
-
-if test -n "$tmpPath1" -o -n "$tmpPath2"; then
-    rm -rf $tmpPath1 $tmpPath2 || true
+    if test -n "$expHash" -a "$expHash" != "$hash"; then
+        echo "hash mismatch for URL \`$url'"
+        exit 1
+    fi
 fi
 
+if ! test -n "$QUIET"; then echo "path is $finalPath" >&2; fi
+
 echo $hash
 
 if test -n "$PRINT_PATH"; then