From 48cea0d01ef48733ab38a73a20611f63aeb1b5cc Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 3 Jan 2012 00:16:29 +0000 Subject: * Refactoring: Get rid of a few subdirectories in corepkgs/, and some other simplifications. * Use to locate the corepkgs. This allows them to be overriden through $NIX_PATH. * Use bash's pipefail option in the NAR builder so that we don't need to create a temporary file. --- tests/common.sh.in | 7 +------ tests/init.sh | 24 ------------------------ tests/lang.sh | 2 +- tests/lang/eval-okay-search-path.nix | 2 +- tests/user-envs.sh | 2 +- 5 files changed, 4 insertions(+), 33 deletions(-) (limited to 'tests') diff --git a/tests/common.sh.in b/tests/common.sh.in index 4ab490a62645..7504dc059e56 100644 --- a/tests/common.sh.in +++ b/tests/common.sh.in @@ -9,7 +9,6 @@ if ! NIX_STORE_DIR=$(readlink -f $TEST_ROOT/store 2> /dev/null); then export NIX_IGNORE_SYMLINK_STORE=1 NIX_STORE_DIR=$TEST_ROOT/store fi -export NIX_DATA_DIR=$TEST_ROOT/data export NIX_LOCALSTATE_DIR=$TEST_ROOT/var export NIX_LOG_DIR=$TEST_ROOT/var/log/nix export NIX_STATE_DIR=$TEST_ROOT/var/nix @@ -19,15 +18,11 @@ export NIX_BIN_DIR=$TEST_ROOT/bin export NIX_LIBEXEC_DIR=$TEST_ROOT/bin export NIX_MANIFESTS_DIR=$TEST_ROOT/var/nix/manifests export NIX_ROOT_FINDER= +export NIX_PATH=nix=$TOP/corepkgs export SHARED=$TEST_ROOT/shared export PATH=$NIX_BIN_DIR:$TOP/scripts:$PATH -export REAL_BIN_DIR=@bindir@ -export REAL_LIBEXEC_DIR=@libexecdir@ -export REAL_LOCALSTATE_DIR=@localstatedir@ -export REAL_DATA_DIR=@datadir@ -export REAL_STORE_DIR=@storedir@ export NIX_BUILD_HOOK= export PERL=perl export PERL5LIB=$TOP/perl/lib:$PERL5LIB diff --git a/tests/init.sh b/tests/init.sh index 63e939dff10e..9ce7985d709e 100644 --- a/tests/init.sh +++ b/tests/init.sh @@ -10,7 +10,6 @@ fi mkdir "$TEST_ROOT" mkdir "$NIX_STORE_DIR" -mkdir "$NIX_DATA_DIR" mkdir "$NIX_LOCALSTATE_DIR" mkdir -p "$NIX_LOG_DIR"/drvs mkdir "$NIX_STATE_DIR" @@ -39,29 +38,6 @@ env-keep-derivations = false fsync-metadata = false EOF -mkdir $NIX_DATA_DIR/nix -cp -pr $TOP/corepkgs $NIX_DATA_DIR/nix/ -# Bah, scripts have the prefix hard-coded. This is really messy stuff -# (and likely to fail). -for i in \ - $NIX_DATA_DIR/nix/corepkgs/nar/nar.sh \ - ; do - sed < $i > $i.tmp \ - -e "s^$REAL_BIN_DIR/nix-store^$NIX_BIN_DIR/nix-store^" \ - -e "s^$REAL_BIN_DIR/nix-hash^$NIX_BIN_DIR/nix-hash^" \ - -e "s^$REAL_LIBEXEC_DIR^$NIX_LIBEXEC_DIR^" \ - -e "s^$REAL_LOCALSTATE_DIR^$NIX_LOCALSTATE_DIR^" \ - -e "s^$REAL_DATA_DIR^$NIX_DATA_DIR^" \ - -e "s^$REAL_STORE_DIR\([^/]\)^$NIX_STORE_DIR\1^" - mv $i.tmp $i - chmod +x $i -done - -# Another ugly hack. -sed "s|^$|PATH='$PATH'|" < $NIX_DATA_DIR/nix/corepkgs/nar/nar.sh > tmp -chmod +x tmp -mv tmp $NIX_DATA_DIR/nix/corepkgs/nar/nar.sh - # An uberhack for Mac OS X 10.5: download-using-manifests uses Perl, # and Perl links against Darwin's libutil.dylib (in /usr/lib), but # when running "make check", the libtool wrapper script around the Nix diff --git a/tests/lang.sh b/tests/lang.sh index c9fc65e6ac37..cab1cfd9b05a 100644 --- a/tests/lang.sh +++ b/tests/lang.sh @@ -40,7 +40,7 @@ for i in lang/eval-okay-*.nix; do if test -e lang/$i.flags; then flags=$(cat lang/$i.flags) fi - if ! NIX_PATH=lang/dir3:lang/dir4 nix-instantiate $flags --eval-only --strict lang/$i.nix > lang/$i.out; then + if ! NIX_PATH=lang/dir3:lang/dir4:$NIX_PATH nix-instantiate $flags --eval-only --strict lang/$i.nix > lang/$i.out; then echo "FAIL: $i should evaluate" fail=1 elif ! diff lang/$i.out lang/$i.exp; then diff --git a/tests/lang/eval-okay-search-path.nix b/tests/lang/eval-okay-search-path.nix index 21485dbbf62e..9b711502336b 100644 --- a/tests/lang/eval-okay-search-path.nix +++ b/tests/lang/eval-okay-search-path.nix @@ -1,3 +1,3 @@ -assert builtins.pathExists ; +assert builtins.pathExists ; import + import + import + import diff --git a/tests/user-envs.sh b/tests/user-envs.sh index 5037e28b916b..2bc9bee50baa 100644 --- a/tests/user-envs.sh +++ b/tests/user-envs.sh @@ -36,7 +36,7 @@ nix-env -p $profiles/test -q '*' | grep -q foo-2.0pre1 test "$($profiles/test/bin/foo)" = "foo-2.0pre1" # Upgrade "foo": should install foo-2.0. -NIX_PATH=nixpkgs=./user-envs.nix nix-env -p $profiles/test -f '' -u foo +NIX_PATH=nixpkgs=./user-envs.nix:$NIX_PATH nix-env -p $profiles/test -f '' -u foo # Query installed: should contain foo-2.0 now. test "$(nix-env -p $profiles/test -q '*' | wc -l)" -eq 1 -- cgit 1.4.1 From 39d45a6b090b5105423b22b8ef39c2a4a000a4a1 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 3 Jan 2012 01:51:38 +0000 Subject: * Add a test for nix-channel. * Refactor the nix-channel unpacker a bit. --- configure.ac | 3 --- corepkgs/Makefile.am | 8 ++++---- corepkgs/channels/Makefile.am | 11 ----------- corepkgs/channels/unpack.nix | 7 ------- corepkgs/channels/unpack.sh.in | 35 ---------------------------------- corepkgs/unpack-channel.nix | 11 +++++++++++ corepkgs/unpack-channel.sh | 30 +++++++++++++++++++++++++++++ perl/lib/Nix/Config.pm.in | 1 + scripts/nix-channel.in | 22 ++++++++++----------- tests/Makefile.am | 3 +-- tests/config.nix.in | 3 ++- tests/dependencies.nix | 1 + tests/nix-channel.sh | 43 ++++++++++++++++++++++++++++++++++++++++++ 13 files changed, 103 insertions(+), 75 deletions(-) delete mode 100644 corepkgs/channels/Makefile.am delete mode 100644 corepkgs/channels/unpack.nix delete mode 100644 corepkgs/channels/unpack.sh.in create mode 100644 corepkgs/unpack-channel.nix create mode 100644 corepkgs/unpack-channel.sh create mode 100644 tests/nix-channel.sh (limited to 'tests') diff --git a/configure.ac b/configure.ac index 0443fe49205a..52c92b76bf10 100644 --- a/configure.ac +++ b/configure.ac @@ -346,9 +346,6 @@ AC_CONFIG_FILES([Makefile perl/Makefile scripts/Makefile corepkgs/Makefile - corepkgs/nar/Makefile - corepkgs/buildenv/Makefile - corepkgs/channels/Makefile doc/Makefile doc/manual/Makefile misc/Makefile diff --git a/corepkgs/Makefile.am b/corepkgs/Makefile.am index 7f43a700e734..86d7027ed06e 100644 --- a/corepkgs/Makefile.am +++ b/corepkgs/Makefile.am @@ -1,11 +1,11 @@ -SUBDIRS = channels - all-local: config.nix +files = nar.nix buildenv.nix buildenv.pl unpack-channel.nix unpack-channel.sh + install-exec-local: $(INSTALL) -d $(DESTDIR)$(datadir)/nix/corepkgs - $(INSTALL_DATA) config.nix $(srcdir)/nar.nix $(srcdir)/buildenv.nix $(srcdir)/buildenv.pl $(DESTDIR)$(datadir)/nix/corepkgs + $(INSTALL_DATA) config.nix $(files) $(DESTDIR)$(datadir)/nix/corepkgs include ../substitute.mk -EXTRA_DIST = config.nix.in nar.nix buildenv.nix buildenv.pl +EXTRA_DIST = config.nix.in $(files) diff --git a/corepkgs/channels/Makefile.am b/corepkgs/channels/Makefile.am deleted file mode 100644 index d4d478f0e2c5..000000000000 --- a/corepkgs/channels/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ -all-local: unpack.sh - -install-exec-local: - $(INSTALL) -d $(DESTDIR)$(datadir)/nix/corepkgs - $(INSTALL) -d $(DESTDIR)$(datadir)/nix/corepkgs/channels - $(INSTALL_DATA) $(srcdir)/unpack.nix $(DESTDIR)$(datadir)/nix/corepkgs/channels - $(INSTALL_PROGRAM) unpack.sh $(DESTDIR)$(datadir)/nix/corepkgs/channels - -include ../../substitute.mk - -EXTRA_DIST = unpack.nix unpack.sh.in diff --git a/corepkgs/channels/unpack.nix b/corepkgs/channels/unpack.nix deleted file mode 100644 index 80ca4a371034..000000000000 --- a/corepkgs/channels/unpack.nix +++ /dev/null @@ -1,7 +0,0 @@ -{system, inputs}: - -derivation { - name = "channels"; - builder = ./unpack.sh; - inherit system inputs; -} \ No newline at end of file diff --git a/corepkgs/channels/unpack.sh.in b/corepkgs/channels/unpack.sh.in deleted file mode 100644 index 6e5939f4f21b..000000000000 --- a/corepkgs/channels/unpack.sh.in +++ /dev/null @@ -1,35 +0,0 @@ -#! @shell@ -e - -# Cygwin compatibility hack: bunzip2 expects cygwin.dll in $PATH. -export PATH=@coreutils@ - -@coreutils@/mkdir $out -@coreutils@/mkdir $out/tmp -cd $out/tmp - -inputs=($inputs) -for ((n = 0; n < ${#inputs[*]}; n += 2)); do - channelName=${inputs[n]} - channelTarball=${inputs[n+1]} - - echo "unpacking channel $channelName" - - @bzip2@ -d < $channelTarball | @tar@ xf - - - if test -e */channel-name; then - channelName="$(@coreutils@/cat */channel-name)" - fi - - nr=1 - attrName=$(echo $channelName | @tr@ -- '- ' '__') - dirName=$attrName - while test -e ../$dirName; do - nr=$((nr+1)) - dirName=$attrName-$nr - done - - @coreutils@/mv * ../$dirName # !!! hacky -done - -cd .. -@coreutils@/rmdir tmp diff --git a/corepkgs/unpack-channel.nix b/corepkgs/unpack-channel.nix new file mode 100644 index 000000000000..5e6ccf23fd47 --- /dev/null +++ b/corepkgs/unpack-channel.nix @@ -0,0 +1,11 @@ +with import ; + +{ system, inputs }: + +derivation { + name = "channels"; + builder = shell; + args = [ "-e" ./unpack-channel.sh ]; + inherit system inputs bzip2 tar tr; + PATH = "${nixBinDir}:${coreutils}"; +} diff --git a/corepkgs/unpack-channel.sh b/corepkgs/unpack-channel.sh new file mode 100644 index 000000000000..7c244a6a8552 --- /dev/null +++ b/corepkgs/unpack-channel.sh @@ -0,0 +1,30 @@ +mkdir $out +mkdir $out/tmp +cd $out/tmp + +inputs=($inputs) +for ((n = 0; n < ${#inputs[*]}; n += 2)); do + channelName=${inputs[n]} + channelTarball=${inputs[n+1]} + + echo "unpacking channel $channelName" + + $bzip2 -d < $channelTarball | $tar xf - + + if test -e */channel-name; then + channelName="$(cat */channel-name)" + fi + + nr=1 + attrName=$(echo $channelName | $tr -- '- ' '__') + dirName=$attrName + while test -e ../$dirName; do + nr=$((nr+1)) + dirName=$attrName-$nr + done + + mv * ../$dirName # !!! hacky +done + +cd .. +rmdir tmp diff --git a/perl/lib/Nix/Config.pm.in b/perl/lib/Nix/Config.pm.in index b657683be3f8..c88854daf0a8 100644 --- a/perl/lib/Nix/Config.pm.in +++ b/perl/lib/Nix/Config.pm.in @@ -2,6 +2,7 @@ package Nix::Config; $binDir = $ENV{"NIX_BIN_DIR"} || "@bindir@"; $libexecDir = $ENV{"NIX_LIBEXEC_DIR"} || "@libexecdir@"; +$stateDir = $ENV{"NIX_STATE_DIR"} || "@localstatedir@/nix"; $manifestDir = $ENV{"NIX_MANIFESTS_DIR"} || "@localstatedir@/nix/manifests"; $logDir = $ENV{"NIX_LOG_DIR"} || "@localstatedir@/log/nix"; $confDir = $ENV{"NIX_CONF_DIR"} || "@sysconfdir@/nix"; diff --git a/scripts/nix-channel.in b/scripts/nix-channel.in index 3688063cba4e..9bfa04722647 100755 --- a/scripts/nix-channel.in +++ b/scripts/nix-channel.in @@ -1,15 +1,13 @@ #! @perl@ -w use strict; +use Nix::Config; -my $rootsDir = "@localstatedir@/nix/gcroots"; - -my $stateDir = $ENV{"NIX_STATE_DIR"}; -$stateDir = "@localstatedir@/nix" unless defined $stateDir; +my $manifestDir = $Nix::Config::manifestDir; # Turn on caching in nix-prefetch-url. -my $channelCache = "$stateDir/channel-cache"; +my $channelCache = "$Nix::Config::stateDir/channel-cache"; mkdir $channelCache, 0755 unless -e $channelCache; $ENV{'NIX_DOWNLOAD_CACHE'} = $channelCache if -W $channelCache; @@ -79,19 +77,19 @@ sub update { readChannels; # Create the manifests directory if it doesn't exist. - mkdir "$stateDir/manifests", 0755 unless -e "$stateDir/manifests"; + mkdir $manifestDir, 0755 unless -e $manifestDir; # Do we have write permission to the manifests directory? If not, # then just skip pulling the manifest and just download the Nix # expressions. If the user is a non-privileged user in a # multi-user Nix installation, he at least gets installation from # source. - if (-W "$stateDir/manifests") { + if (-W $manifestDir) { # Pull cache manifests. foreach my $url (@channels) { #print "pulling cache manifest from `$url'\n"; - system("@bindir@/nix-pull", "--skip-wrong-store", "$url/MANIFEST") == 0 + system("$Nix::Config::binDir/nix-pull", "--skip-wrong-store", "$url/MANIFEST") == 0 or die "cannot pull cache manifest from `$url'"; } @@ -110,7 +108,7 @@ sub update { print "downloading Nix expressions from `$fullURL'...\n"; $ENV{"PRINT_PATH"} = 1; $ENV{"QUIET"} = 1; - my ($hash, $path) = `@bindir@/nix-prefetch-url '$fullURL'`; + my ($hash, $path) = `$Nix::Config::binDir/nix-prefetch-url '$fullURL'`; die "cannot fetch `$fullURL'" if $? != 0; chomp $path; $inputs .= '"' . $channelName . '"' . " " . $path . " "; @@ -121,13 +119,13 @@ sub update { my $userName = getpwuid($<); die "who ARE you? go away" unless defined $userName; - my $rootFile = "$rootsDir/per-user/$userName/channels"; + my $rootFile = "$Nix::Config::stateDir/gcroots/per-user/$userName/channels"; # Build the Nix expression. print "unpacking channel Nix expressions...\n"; my $outPath = `\\ - @bindir@/nix-build --out-link '$rootFile' --drv-link '$rootFile'.tmp \\ - @datadir@/nix/corepkgs/channels/unpack.nix \\ + $Nix::Config::binDir/nix-build --out-link '$rootFile' --drv-link '$rootFile'.tmp \\ + '' \\ --argstr system @system@ --arg inputs '$inputs'` or die "cannot unpack the channels"; chomp $outPath; diff --git a/tests/Makefile.am b/tests/Makefile.am index 38bfa139d767..dbafd553ac82 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -8,7 +8,7 @@ TESTS = init.sh hash.sh lang.sh add.sh simple.sh dependencies.sh \ referrers.sh user-envs.sh logging.sh nix-build.sh misc.sh fixed.sh \ gc-runtime.sh install-package.sh check-refs.sh filter-source.sh \ remote-store.sh export.sh export-graph.sh negative-caching.sh \ - binary-patching.sh timeout.sh secure-drv-outputs.sh + binary-patching.sh timeout.sh secure-drv-outputs.sh nix-channel.sh XFAIL_TESTS = @@ -37,4 +37,3 @@ EXTRA_DIST = $(TESTS) \ secure-drv-outputs.nix \ $(wildcard lang/*.nix) $(wildcard lang/*.exp) $(wildcard lang/*.exp.xml) $(wildcard lang/*.flags) $(wildcard lang/dir*/*.nix) \ common.sh.in - diff --git a/tests/config.nix.in b/tests/config.nix.in index 2bfee8b44b19..db3da145135c 100644 --- a/tests/config.nix.in +++ b/tests/config.nix.in @@ -13,5 +13,6 @@ rec { builder = shell; args = ["-e" args.builder]; PATH = path; - } // removeAttrs args ["builder"]); + } // removeAttrs args ["builder" "meta"]) + // { meta = args.meta or {}; }; } diff --git a/tests/dependencies.nix b/tests/dependencies.nix index 00717ae98d90..6f6a7e46fa80 100644 --- a/tests/dependencies.nix +++ b/tests/dependencies.nix @@ -17,6 +17,7 @@ let { builder = ./dependencies.builder0.sh + "/FOOBAR/../."; input1 = input1 + "/."; inherit input2; + meta.description = "Random test package"; }; } diff --git a/tests/nix-channel.sh b/tests/nix-channel.sh new file mode 100644 index 000000000000..1d7724e93374 --- /dev/null +++ b/tests/nix-channel.sh @@ -0,0 +1,43 @@ +source common.sh + +clearProfiles +clearManifests + +rm -f $TEST_ROOT/.nix-channels + +# Override location of ~/.nix-channels. +export HOME=$TEST_ROOT + +# Test add/list/remove. +nix-channel --add http://foo/bar +nix-channel --list | grep -q http://foo/bar +nix-channel --remove http://foo/bar + +[ -e $TEST_ROOT/.nix-channels ] +[ "$(cat $TEST_ROOT/.nix-channels)" = '' ] + +# Create a channel. +rm -rf $TEST_ROOT/foo +mkdir -p $TEST_ROOT/foo +nix-push --copy $TEST_ROOT/foo $TEST_ROOT/foo/MANIFEST $(nix-store -r $(nix-instantiate dependencies.nix)) +rm -rf $TEST_ROOT/nixexprs +mkdir -p $TEST_ROOT/nixexprs +cp config.nix dependencies.nix dependencies.builder*.sh $TEST_ROOT/nixexprs/ +ln -s dependencies.nix $TEST_ROOT/nixexprs/default.nix +(cd $TEST_ROOT && tar cv nixexprs) | bzip2 > $TEST_ROOT/foo/nixexprs.tar.bz2 + +# Test the update action. +nix-channel --add file://$TEST_ROOT/foo +nix-channel --update + +# Do a query. +nix-env -qa \* --meta --xml --out-path > $TEST_ROOT/meta.xml +if [ "$xmllint" != false ]; then + $xmllint --noout $TEST_ROOT/meta.xml || fail "malformed XML" +fi +grep -q 'meta.*description.*Random test package' $TEST_ROOT/meta.xml +grep -q 'item.*attrPath="foo".*name="dependencies"' $TEST_ROOT/meta.xml + +# Do an install. +nix-env -i dependencies +[ -e $TEST_ROOT/var/nix/profiles/default/foobar ] -- cgit 1.4.1 From 63227d434cefaa9faeb14afe28ebeb9b2d449ee2 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 3 Jan 2012 12:18:41 +0000 Subject: * FreeBSD tar defaults to the tape device instead of stdout. --- tests/nix-channel.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tests') diff --git a/tests/nix-channel.sh b/tests/nix-channel.sh index 1d7724e93374..4819b57c91c0 100644 --- a/tests/nix-channel.sh +++ b/tests/nix-channel.sh @@ -24,7 +24,7 @@ rm -rf $TEST_ROOT/nixexprs mkdir -p $TEST_ROOT/nixexprs cp config.nix dependencies.nix dependencies.builder*.sh $TEST_ROOT/nixexprs/ ln -s dependencies.nix $TEST_ROOT/nixexprs/default.nix -(cd $TEST_ROOT && tar cv nixexprs) | bzip2 > $TEST_ROOT/foo/nixexprs.tar.bz2 +(cd $TEST_ROOT && tar cvf - nixexprs) | bzip2 > $TEST_ROOT/foo/nixexprs.tar.bz2 # Test the update action. nix-channel --add file://$TEST_ROOT/foo -- cgit 1.4.1