* Use fixed-output hashes in fetchsvn.

* In nix-prefetch-svn, support setuid installations where the user has
  no write access to the Nix store.

svn path=/nixpkgs/trunk/; revision=2275
This commit is contained in:
Eelco Dolstra 2005-02-22 16:27:28 +00:00
parent 1177e8925f
commit fa88e75c45
3 changed files with 26 additions and 10 deletions

View file

@ -2,7 +2,7 @@
header "exporting $url (r$rev) into $out"
prefetch=$(dirname $out)/svn-checkout-tmp-$md5
prefetch=$(dirname $out)/svn-checkout-tmp-$outputHash
echo $prefetch
if test -e "$prefetch"; then
mv $prefetch $out
@ -11,8 +11,8 @@ else
fi
actual=$(nix-hash $out)
if test "$actual" != "$md5"; then
echo "hash is $actual, expected $md5" >&2
if test "$actual" != "$outputHash"; then
echo "hash is $actual, expected $outputHash" >&2
exit 1
fi

View file

@ -4,6 +4,12 @@ stdenv.mkDerivation {
name = "svn-export";
builder = ./builder.sh;
buildInputs = [subversion nix];
# Nix <= 0.7 compatibility.
id = md5;
inherit url rev md5;
outputHashAlgo = "md5";
outputHash = md5;
inherit url rev;
}

View file

@ -24,6 +24,15 @@ if test -z "$hash"; 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
# Perform the checkout.
svn export -r "$rev" "$url" $tmpPath1 >&2
@ -32,9 +41,10 @@ if test -z "$hash"; then
echo "hash is $hash" >&2
# Rename it so that the fetchsvn builder can find it.
tmpPath2=$storeDir/svn-checkout-tmp-$hash
test -e $tmpPath2 || mv $tmpPath1 $tmpPath2 # !!! race
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.
@ -44,12 +54,12 @@ storeExpr=$( \
| nix-instantiate -)
# Realise it.
finalPath=$(nix-store -qnB --force-realise $storeExpr)
finalPath=$(nix-store -r $storeExpr)
echo "path is $finalPath" >&2
if test -n "$tmpPath2"; then
rm -rf $tmpPath2 || true
if test -n "$tmpPath1" -o -n "$tmpPath2"; then
rm -rf $tmpPath1 $tmpPath2 || true
fi
echo $hash