forked from lix-project/lix
* Add a test for nix-channel.
* Refactor the nix-channel unpacker a bit.
This commit is contained in:
parent
dadbb51d96
commit
39d45a6b09
|
@ -346,9 +346,6 @@ AC_CONFIG_FILES([Makefile
|
||||||
perl/Makefile
|
perl/Makefile
|
||||||
scripts/Makefile
|
scripts/Makefile
|
||||||
corepkgs/Makefile
|
corepkgs/Makefile
|
||||||
corepkgs/nar/Makefile
|
|
||||||
corepkgs/buildenv/Makefile
|
|
||||||
corepkgs/channels/Makefile
|
|
||||||
doc/Makefile
|
doc/Makefile
|
||||||
doc/manual/Makefile
|
doc/manual/Makefile
|
||||||
misc/Makefile
|
misc/Makefile
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
SUBDIRS = channels
|
|
||||||
|
|
||||||
all-local: config.nix
|
all-local: config.nix
|
||||||
|
|
||||||
|
files = nar.nix buildenv.nix buildenv.pl unpack-channel.nix unpack-channel.sh
|
||||||
|
|
||||||
install-exec-local:
|
install-exec-local:
|
||||||
$(INSTALL) -d $(DESTDIR)$(datadir)/nix/corepkgs
|
$(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
|
include ../substitute.mk
|
||||||
|
|
||||||
EXTRA_DIST = config.nix.in nar.nix buildenv.nix buildenv.pl
|
EXTRA_DIST = config.nix.in $(files)
|
||||||
|
|
|
@ -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
|
|
|
@ -1,7 +0,0 @@
|
||||||
{system, inputs}:
|
|
||||||
|
|
||||||
derivation {
|
|
||||||
name = "channels";
|
|
||||||
builder = ./unpack.sh;
|
|
||||||
inherit system inputs;
|
|
||||||
}
|
|
|
@ -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
|
|
11
corepkgs/unpack-channel.nix
Normal file
11
corepkgs/unpack-channel.nix
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
with import <nix/config.nix>;
|
||||||
|
|
||||||
|
{ system, inputs }:
|
||||||
|
|
||||||
|
derivation {
|
||||||
|
name = "channels";
|
||||||
|
builder = shell;
|
||||||
|
args = [ "-e" ./unpack-channel.sh ];
|
||||||
|
inherit system inputs bzip2 tar tr;
|
||||||
|
PATH = "${nixBinDir}:${coreutils}";
|
||||||
|
}
|
30
corepkgs/unpack-channel.sh
Normal file
30
corepkgs/unpack-channel.sh
Normal file
|
@ -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
|
|
@ -2,6 +2,7 @@ package Nix::Config;
|
||||||
|
|
||||||
$binDir = $ENV{"NIX_BIN_DIR"} || "@bindir@";
|
$binDir = $ENV{"NIX_BIN_DIR"} || "@bindir@";
|
||||||
$libexecDir = $ENV{"NIX_LIBEXEC_DIR"} || "@libexecdir@";
|
$libexecDir = $ENV{"NIX_LIBEXEC_DIR"} || "@libexecdir@";
|
||||||
|
$stateDir = $ENV{"NIX_STATE_DIR"} || "@localstatedir@/nix";
|
||||||
$manifestDir = $ENV{"NIX_MANIFESTS_DIR"} || "@localstatedir@/nix/manifests";
|
$manifestDir = $ENV{"NIX_MANIFESTS_DIR"} || "@localstatedir@/nix/manifests";
|
||||||
$logDir = $ENV{"NIX_LOG_DIR"} || "@localstatedir@/log/nix";
|
$logDir = $ENV{"NIX_LOG_DIR"} || "@localstatedir@/log/nix";
|
||||||
$confDir = $ENV{"NIX_CONF_DIR"} || "@sysconfdir@/nix";
|
$confDir = $ENV{"NIX_CONF_DIR"} || "@sysconfdir@/nix";
|
||||||
|
|
|
@ -1,15 +1,13 @@
|
||||||
#! @perl@ -w
|
#! @perl@ -w
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
|
use Nix::Config;
|
||||||
|
|
||||||
my $rootsDir = "@localstatedir@/nix/gcroots";
|
my $manifestDir = $Nix::Config::manifestDir;
|
||||||
|
|
||||||
my $stateDir = $ENV{"NIX_STATE_DIR"};
|
|
||||||
$stateDir = "@localstatedir@/nix" unless defined $stateDir;
|
|
||||||
|
|
||||||
|
|
||||||
# Turn on caching in nix-prefetch-url.
|
# 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;
|
mkdir $channelCache, 0755 unless -e $channelCache;
|
||||||
$ENV{'NIX_DOWNLOAD_CACHE'} = $channelCache if -W $channelCache;
|
$ENV{'NIX_DOWNLOAD_CACHE'} = $channelCache if -W $channelCache;
|
||||||
|
|
||||||
|
@ -79,19 +77,19 @@ sub update {
|
||||||
readChannels;
|
readChannels;
|
||||||
|
|
||||||
# Create the manifests directory if it doesn't exist.
|
# 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,
|
# Do we have write permission to the manifests directory? If not,
|
||||||
# then just skip pulling the manifest and just download the Nix
|
# then just skip pulling the manifest and just download the Nix
|
||||||
# expressions. If the user is a non-privileged user in a
|
# expressions. If the user is a non-privileged user in a
|
||||||
# multi-user Nix installation, he at least gets installation from
|
# multi-user Nix installation, he at least gets installation from
|
||||||
# source.
|
# source.
|
||||||
if (-W "$stateDir/manifests") {
|
if (-W $manifestDir) {
|
||||||
|
|
||||||
# Pull cache manifests.
|
# Pull cache manifests.
|
||||||
foreach my $url (@channels) {
|
foreach my $url (@channels) {
|
||||||
#print "pulling cache manifest from `$url'\n";
|
#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'";
|
or die "cannot pull cache manifest from `$url'";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,7 +108,7 @@ sub update {
|
||||||
print "downloading Nix expressions from `$fullURL'...\n";
|
print "downloading Nix expressions from `$fullURL'...\n";
|
||||||
$ENV{"PRINT_PATH"} = 1;
|
$ENV{"PRINT_PATH"} = 1;
|
||||||
$ENV{"QUIET"} = 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;
|
die "cannot fetch `$fullURL'" if $? != 0;
|
||||||
chomp $path;
|
chomp $path;
|
||||||
$inputs .= '"' . $channelName . '"' . " " . $path . " ";
|
$inputs .= '"' . $channelName . '"' . " " . $path . " ";
|
||||||
|
@ -121,13 +119,13 @@ sub update {
|
||||||
my $userName = getpwuid($<);
|
my $userName = getpwuid($<);
|
||||||
die "who ARE you? go away" unless defined $userName;
|
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.
|
# Build the Nix expression.
|
||||||
print "unpacking channel Nix expressions...\n";
|
print "unpacking channel Nix expressions...\n";
|
||||||
my $outPath = `\\
|
my $outPath = `\\
|
||||||
@bindir@/nix-build --out-link '$rootFile' --drv-link '$rootFile'.tmp \\
|
$Nix::Config::binDir/nix-build --out-link '$rootFile' --drv-link '$rootFile'.tmp \\
|
||||||
@datadir@/nix/corepkgs/channels/unpack.nix \\
|
'<nix/unpack-channel.nix>' \\
|
||||||
--argstr system @system@ --arg inputs '$inputs'`
|
--argstr system @system@ --arg inputs '$inputs'`
|
||||||
or die "cannot unpack the channels";
|
or die "cannot unpack the channels";
|
||||||
chomp $outPath;
|
chomp $outPath;
|
||||||
|
|
|
@ -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 \
|
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 \
|
gc-runtime.sh install-package.sh check-refs.sh filter-source.sh \
|
||||||
remote-store.sh export.sh export-graph.sh negative-caching.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 =
|
XFAIL_TESTS =
|
||||||
|
|
||||||
|
@ -37,4 +37,3 @@ EXTRA_DIST = $(TESTS) \
|
||||||
secure-drv-outputs.nix \
|
secure-drv-outputs.nix \
|
||||||
$(wildcard lang/*.nix) $(wildcard lang/*.exp) $(wildcard lang/*.exp.xml) $(wildcard lang/*.flags) $(wildcard lang/dir*/*.nix) \
|
$(wildcard lang/*.nix) $(wildcard lang/*.exp) $(wildcard lang/*.exp.xml) $(wildcard lang/*.flags) $(wildcard lang/dir*/*.nix) \
|
||||||
common.sh.in
|
common.sh.in
|
||||||
|
|
||||||
|
|
|
@ -13,5 +13,6 @@ rec {
|
||||||
builder = shell;
|
builder = shell;
|
||||||
args = ["-e" args.builder];
|
args = ["-e" args.builder];
|
||||||
PATH = path;
|
PATH = path;
|
||||||
} // removeAttrs args ["builder"]);
|
} // removeAttrs args ["builder" "meta"])
|
||||||
|
// { meta = args.meta or {}; };
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@ let {
|
||||||
builder = ./dependencies.builder0.sh + "/FOOBAR/../.";
|
builder = ./dependencies.builder0.sh + "/FOOBAR/../.";
|
||||||
input1 = input1 + "/.";
|
input1 = input1 + "/.";
|
||||||
inherit input2;
|
inherit input2;
|
||||||
|
meta.description = "Random test package";
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
43
tests/nix-channel.sh
Normal file
43
tests/nix-channel.sh
Normal file
|
@ -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 ]
|
Loading…
Reference in a new issue