From 93aefd9fc0250eda2c47d22a88922d319cde34b8 Mon Sep 17 00:00:00 2001
From: Eelco Dolstra <e.dolstra@tudelft.nl>
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 bc52859c2..350f8791f 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 80c177024..03c6e5b2f 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 73096a12b..095f36d79 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 daa987fe7..d2d01072f 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 5038bd4bf..bdc9c4350 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" \
-- 
GitLab