From 93aefd9fc0250eda2c47d22a88922d319cde34b8 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 1 May 2007 23:16:38 +0000 Subject: [PATCH] * Give unpacked channels more sensible names than 0, 1, ... They now get the basename of the channel URL (e.g., nixpkgs-unstable). The top-level Nix expression of the channel is now an attribute set, the attributes of which are the individual channels (e.g., {nixpkgs_unstable = ...; strategoxt_unstable = ...}). This makes attribute paths ("nix-env -qaA" and "nix-env -iA") more sensible, e.g., "nix-env -iA nixpkgs_unstable.subversion". --- configure.ac | 1 + corepkgs/channels/unpack.sh.in | 29 ++++++++++++++++++++--------- scripts/nix-channel.in | 17 +++++++++-------- src/libexpr/get-drvs.cc | 15 ++++++++++++--- substitute.mk | 1 + 5 files changed, 43 insertions(+), 20 deletions(-) diff --git a/configure.ac b/configure.ac index bc52859c24..350f8791fc 100644 --- a/configure.ac +++ b/configure.ac @@ -139,6 +139,7 @@ fi AC_MSG_RESULT(yes) NEED_PROG(cat, cat) +NEED_PROG(tr, tr) AC_ARG_WITH(coreutils-bin, AC_HELP_STRING([--with-coreutils-bin=PATH], [path of cat, mkdir, etc.]), coreutils=$withval, coreutils=$(dirname $cat)) diff --git a/corepkgs/channels/unpack.sh.in b/corepkgs/channels/unpack.sh.in index 80c177024c..03c6e5b2f8 100644 --- a/corepkgs/channels/unpack.sh.in +++ b/corepkgs/channels/unpack.sh.in @@ -5,18 +5,29 @@ cd $out/tmp expr=$out/default.nix -echo '[' > $expr +echo '{' > $expr -nr=0 -for i in $inputs; do - echo "unpacking $i" - @bunzip2@ < $i | @tar@ xf - - @coreutils@/mv * ../$nr # !!! hacky - echo "(import ./$nr)" >> $expr - nr=$(($nr + 1)) +inputs=($inputs) +for ((n = 0; n < ${#inputs[*]}; n += 2)); do + channelName=${inputs[n]} + channelTarball=${inputs[n+1]} + echo "unpacking channel $channelName" + @bunzip2@ < $channelTarball | @tar@ xf - + + nr=1 + dirName=$channelName + while test -e ../$dirName; do + nr=$((nr+1)) + dirName=$channelName-$nr + done + + @coreutils@/mv * ../$dirName # !!! hacky + + attrName=$(echo $dirName | @tr@ -- '- ' '__') + echo "$attrName = import ./$dirName {};" >> $expr done -echo ']' >> $expr +echo '} // {_combineChannels = true;}' >> $expr cd .. @coreutils@/rmdir tmp diff --git a/scripts/nix-channel.in b/scripts/nix-channel.in index 73096a12ba..095f36d794 100644 --- a/scripts/nix-channel.in +++ b/scripts/nix-channel.in @@ -89,21 +89,22 @@ sub update { # Create a Nix expression that fetches and unpacks the channel Nix # expressions. - my $nixExpr = "["; + my $inputs = "["; foreach my $url (@channels) { + $url =~ /\/([^\/]+)\/?$/; + my $channelName = $1; + $channelName = "unnamed" unless defined $channelName; + print "$channelName\n"; + my $fullURL = "$url/nixexprs.tar.bz2"; print "downloading Nix expressions from `$fullURL'...\n"; $ENV{"PRINT_PATH"} = 1; my ($hash, $path) = `@bindir@/nix-prefetch-url '$fullURL' 2> /dev/null`; die "cannot fetch `$fullURL'" if $? != 0; chomp $path; - $nixExpr .= $path . " "; + $inputs .= '"' . $channelName . '"' . " " . $path . " "; } - $nixExpr .= "]"; - - $nixExpr = - "(import @datadir@/nix/corepkgs/channels/unpack.nix) " . - "{inputs = $nixExpr; system = \"@system@\";}"; + $inputs .= "]"; # Figure out a name for the GC root. my $userName = getpwuid($<); @@ -113,7 +114,7 @@ sub update { # Instantiate the Nix expression. print "unpacking channel Nix expressions...\n"; - my $storeExpr = `echo '$nixExpr' | @bindir@/nix-instantiate --add-root '$rootFile'.tmp -` + my $storeExpr = `@bindir@/nix-instantiate --add-root '$rootFile'.tmp @datadir@/nix/corepkgs/channels/unpack.nix --argstr system @system@ --arg inputs '$inputs'` or die "cannot instantiate Nix expression"; chomp $storeExpr; diff --git a/src/libexpr/get-drvs.cc b/src/libexpr/get-drvs.cc index daa987fe71..d2d01072f6 100644 --- a/src/libexpr/get-drvs.cc +++ b/src/libexpr/get-drvs.cc @@ -170,12 +170,21 @@ static void getDerivations(EvalState & state, Expr e, if (matchAttrs(e, es)) { ATermMap drvMap(ATgetLength(es)); queryAllAttrs(e, drvMap); + + /* !!! undocumented hackery to support + corepkgs/channels/unpack.sh. */ + Expr e2 = drvMap.get(toATerm("_combineChannels")); + bool combineChannels = e2 && evalBool(state, e2); for (ATermMap::const_iterator i = drvMap.begin(); i != drvMap.end(); ++i) { startNest(nest, lvlDebug, format("evaluating attribute `%1%'") % aterm2String(i->key)); string pathPrefix2 = addToPath(pathPrefix, aterm2String(i->key)); - if (getDerivation(state, i->value, pathPrefix2, drvs, doneExprs)) { + if (combineChannels) { + if (((string) aterm2String(i->key)) != "_combineChannels") + getDerivations(state, i->value, pathPrefix2, autoArgs, drvs, doneExprs); + } + else if (getDerivation(state, i->value, pathPrefix2, drvs, doneExprs)) { /* If the value of this attribute is itself an attribute set, should we recurse into it? => Only if it has a `recurseForDerivations = true' @@ -185,8 +194,8 @@ static void getDerivations(EvalState & state, Expr e, if (matchAttrs(e, es)) { ATermMap attrs(ATgetLength(es)); queryAllAttrs(e, attrs, false); - Expr e2 = attrs.get(toATerm("recurseForDerivations")); - if (e2 && evalBool(state, e2)) + if (((e2 = attrs.get(toATerm("recurseForDerivations"))) + && evalBool(state, e2))) getDerivations(state, e, pathPrefix2, autoArgs, drvs, doneExprs); } } diff --git a/substitute.mk b/substitute.mk index 5038bd4bfd..bdc9c43501 100644 --- a/substitute.mk +++ b/substitute.mk @@ -17,6 +17,7 @@ -e "s^@perl\@^$(perl)^g" \ -e "s^@coreutils\@^$(coreutils)^g" \ -e "s^@tar\@^$(tar)^g" \ + -e "s^@tr\@^$(tr)^g" \ -e "s^@dot\@^$(dot)^g" \ -e "s^@xmllint\@^$(xmllint)^g" \ -e "s^@xmlflags\@^$(xmlflags)^g" \