fetch-cargo-deps: factor into fetchCargoDeps function

This commit is contained in:
Nikolay Amiantov 2016-02-25 14:05:14 +03:00
parent 34023d867d
commit 4f74a4aacb
2 changed files with 143 additions and 146 deletions

View File

@ -1,27 +1,24 @@
source $stdenv/setup fetchCargoDeps() {
src=$(realpath $1)
out=$(realpath $2)
set -euo pipefail echo "Fetching $src to $out"
src=$(realpath $1) mkdir $out
out=$(realpath $2)
echo "Fetching $src to $out" # Configure cargo to fetch from a local copy of the crates.io registry
mkdir $out echo "Using rust registry from $rustRegistry"
# Configure cargo to fetch from a local copy of the crates.io registry cat <<EOF > $out/config
echo "Using rust registry from $rustRegistry"
cat <<EOF > $out/config
[registry] [registry]
index = "file://$rustRegistry" index = "file://$rustRegistry"
EOF EOF
export CARGO_HOME=$out export CARGO_HOME=$out
cd $src cd $src
if [[ ! -f Cargo.lock ]]; then if [[ ! -f Cargo.lock ]]; then
echo echo
echo "ERROR: The Cargo.lock file doesn't exist" echo "ERROR: The Cargo.lock file doesn't exist"
echo echo
@ -30,91 +27,87 @@ if [[ ! -f Cargo.lock ]]; then
echo echo
exit 1 exit 1
fi fi
# We need to do the following string replacement so that 'cargo fetch' # We need to do the following string replacement so that 'cargo fetch'
# doesn't ignore the versions specified in Cargo.lock # doesn't ignore the versions specified in Cargo.lock
set +u substituteInPlace Cargo.lock \
substituteInPlace Cargo.lock \
--replace "registry+https://github.com/rust-lang/crates.io-index" \ --replace "registry+https://github.com/rust-lang/crates.io-index" \
"registry+file://$rustRegistry" "registry+file://$rustRegistry"
set -u
# Do any possible 'cargo update -p <pkgName> --precise <version>' ad-hoc updates # Do any possible 'cargo update -p <pkgName> --precise <version>' ad-hoc updates
eval "$cargoUpdateHook" eval "$cargoUpdateHook"
# Do the fetch # Do the fetch
cargo fetch --verbose cargo fetch --verbose
# Now that we have fetched everything, let's make the output deterministic # Now that we have fetched everything, let's make the output deterministic
# Cargo uses the following directory structure for fetched data, where # Cargo uses the following directory structure for fetched data, where
# $indexHash is a hash of the registry index URL: # $indexHash is a hash of the registry index URL:
# #
# #
# /config: # /config:
# #
# Cargo config file. We'll delete this because it's not deterministic, # Cargo config file. We'll delete this because it's not deterministic,
# and instead recreate it just before running 'cargo build'. # and instead recreate it just before running 'cargo build'.
# #
# /registry/cache/$indexHash/: # /registry/cache/$indexHash/:
# #
# This is where tarballs of registry package dependencies are kept # This is where tarballs of registry package dependencies are kept
# We'll need to keep this, but make sure $indexHash is a fixed name. # We'll need to keep this, but make sure $indexHash is a fixed name.
# #
# /registry/index/$indexHash/: # /registry/index/$indexHash/:
# #
# A copy of the registry index is kept here. We can delete this, and # A copy of the registry index is kept here. We can delete this, and
# instead, just before running 'cargo build', we'll symlink this # instead, just before running 'cargo build', we'll symlink this
# directory to our static copy of the registry in the Nix store. # directory to our static copy of the registry in the Nix store.
# #
# /registry/src/$indexHash/{pkgName-pkgVersion}/: # /registry/src/$indexHash/{pkgName-pkgVersion}/:
# #
# Here cargo keeps extracted sources of the cached tarballs. # Here cargo keeps extracted sources of the cached tarballs.
# We'll just delete this because cargo will re-populate them from the # We'll just delete this because cargo will re-populate them from the
# tarballs. # tarballs.
# #
# /git/db/{domain-hash}/: # /git/db/{domain-hash}/:
# #
# Here cargo keeps the `.git` directories of git dependencies. # Here cargo keeps the `.git` directories of git dependencies.
# We'll need to keep these, but make them deterministic. # We'll need to keep these, but make them deterministic.
# #
# /git/checkouts/{domain-hash}/{branchName}/: # /git/checkouts/{domain-hash}/{branchName}/:
# #
# Here cargo keeps checked-out sources of the git dependencies. # Here cargo keeps checked-out sources of the git dependencies.
# We can delete this, because cargo will re-populate them from the above # We can delete this, because cargo will re-populate them from the above
# `.git` directories. # `.git` directories.
# #
# Let's start # Let's start
# Remove cargo config file, which points to the ever-changing registry # Remove cargo config file, which points to the ever-changing registry
rm $out/config rm $out/config
# Save the Cargo.lock file into the output, so that we don't have to do another # Save the Cargo.lock file into the output, so that we don't have to do another
# 'cargo update' during the build (which would try to access the network) for # 'cargo update' during the build (which would try to access the network) for
# any ad-hoc package updates (through $cargoUpdateHook). # any ad-hoc package updates (through $cargoUpdateHook).
# #
# We need to replace the rustRegistry URL with something deterministic. # We need to replace the rustRegistry URL with something deterministic.
# Since the URL won't actually be accessed anymore, it's fine to use /dev/null. # Since the URL won't actually be accessed anymore, it's fine to use /dev/null.
set +u substituteInPlace Cargo.lock \
substituteInPlace Cargo.lock \
--replace "registry+file://$rustRegistry" \ --replace "registry+file://$rustRegistry" \
"registry+file:///dev/null" "registry+file:///dev/null"
set -u mv Cargo.lock $out/
mv Cargo.lock $out/
# Let's replace $indexHash with something more deterministic # Let's replace $indexHash with something more deterministic
mv $out/registry/cache/* $out/registry/cache/HASH mv $out/registry/cache/* $out/registry/cache/HASH
# The registry index changes all the time, so it's not deterministic # The registry index changes all the time, so it's not deterministic
# We'll symlink it before running 'cargo build' # We'll symlink it before running 'cargo build'
rm -rf $out/registry/index/* rm -rf $out/registry/index/*
# Make git DBs deterministic # Make git DBs deterministic
# TODO: test with git submodules # TODO: test with git submodules
[[ ! -d $out/git/checkouts ]] || (cd $out/git/checkouts && for name in *; do [[ ! -d $out/git/checkouts ]] || (cd $out/git/checkouts && for name in *; do
revs="" revs=""
cd "$out/git/checkouts/$name" cd "$out/git/checkouts/$name"
while read dir; do while read dir; do
@ -171,13 +164,14 @@ rm -rf $out/registry/index/*
# Garbage collect unreferenced objects. # Garbage collect unreferenced objects.
git gc --prune=all git gc --prune=all
) )
done) done)
# Remove unneeded outputs # Remove unneeded outputs
[[ ! -d $out/registry/src ]] || rm -rf $out/registry/src [[ ! -d $out/registry/src ]] || rm -rf $out/registry/src
[[ ! -d $out/git/checkouts ]] || rm -rf $out/git/checkouts [[ ! -d $out/git/checkouts ]] || rm -rf $out/git/checkouts
# XXX: provide some debugging output to see find out why we are seeing # XXX: provide some debugging output to see find out why we are seeing
# sporadic hash mismatches # sporadic hash mismatches
find $out ! -type f find $out ! -type f
find $out -type f -exec sha256sum {} + find $out -type f -exec sha256sum {} +
}

View File

@ -9,8 +9,11 @@ stdenv.mkDerivation {
phases = "unpackPhase installPhase"; phases = "unpackPhase installPhase";
installPhase = '' installPhase = ''
source ${./fetch-cargo-deps}
export SSL_CERT_FILE=${cacert}/etc/ssl/certs/ca-bundle.crt export SSL_CERT_FILE=${cacert}/etc/ssl/certs/ca-bundle.crt
bash ${./fetch-cargo-deps} . "$out"
fetchCargoDeps . "$out"
''; '';
outputHashAlgo = "sha256"; outputHashAlgo = "sha256";