From 0791282b2f42313c94dd9bc85b24428e585cd099 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Thu, 16 Oct 2003 16:29:57 +0000 Subject: * Substitutes and nix-pull now work again. * Fixed a segfault caused by the buffering of stderr. * Fix now allows the specification of the full output path. This should be used with great care, since it by-passes the normal hash generation. * Incremented the version number to 0.4 (prerelease). --- scripts/nix-pull.in | 151 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 91 insertions(+), 60 deletions(-) (limited to 'scripts/nix-pull.in') diff --git a/scripts/nix-pull.in b/scripts/nix-pull.in index a3d23ea167af..8cd276801ee6 100644 --- a/scripts/nix-pull.in +++ b/scripts/nix-pull.in @@ -2,11 +2,18 @@ use strict; use IPC::Open2; +use POSIX qw(tmpnam); -my $tmpfile = "@localstatedir@/nix/pull.tmp"; +my $tmpdir; +do { $tmpdir = tmpnam(); } +until mkdir $tmpdir, 0777; + +my $manifest = "$tmpdir/manifest"; my $conffile = "@sysconfdir@/nix/prebuilts.conf"; -my @ids; +#END { unlink $manifest; rmdir $tmpdir; } + +my @srcpaths; my @subs; my @sucs; @@ -20,70 +27,89 @@ while () { chomp; if (/^\s*(\S+)\s*(\#.*)?$/) { my $url = $1; + $url =~ s/\/$//; print "obtaining list of Nix archives at $url...\n"; - system "wget '$url' -O '$tmpfile' 2> /dev/null"; # !!! escape + system "wget '$url'/MANIFEST -O '$manifest' 2> /dev/null"; # !!! escape if ($?) { die "`wget' failed"; } - open INDEX, "<$tmpfile"; - - while () { - # Get all links to prebuilts, that is, file names of the - # form foo-HASH-HASH.tar.bz2. - next unless (/HREF=\"([^\"]*)\"/); - my $fn = $1; - next if $fn =~ /\.\./; - next if $fn =~ /\//; - next unless $fn =~ /^([0-9a-z]{32})-([0-9a-z]{32})(.*)\.nar\.bz2$/; - my $hash = $1; - my $id = $2; - my $outname = $3; - my $fsid; - if ($outname =~ /^-/) { - next unless $outname =~ /^-((s-([0-9a-z]{32}))?.*)$/; - $outname = $1; - $fsid = $3; - } else { - $outname = "unnamed"; - } - - print STDERR "$id ($outname)\n"; - - # Construct a Fix expression that fetches and unpacks a - # Nix archive from the network. - my $fetch = - "App(IncludeFix(\"fetchurl/fetchurl.fix\"), " . - "[(\"url\", \"$url/$fn\"), (\"md5\", \"$hash\")])"; - my $fixexpr = - "App(IncludeFix(\"nar/unnar.fix\"), " . - "[ (\"nar\", $fetch)" . - ", (\"name\", \"$outname\")" . - ", (\"id\", \"$id\")" . - "])"; - - if (!$first) { $fullexpr .= "," }; - $first = 0; - $fullexpr .= $fixexpr; # !!! O(n^2)? - - push @ids, $id; - - # Does the name encode a successor relation? - if (defined $fsid) { - push @sucs, $fsid; - push @sucs, $id; - } + open MANIFEST, "<$manifest"; + + my $inside = 0; + + my $storepath; + my $narname; + my $hash; + my @preds; + + while () { + chomp; + s/\#.*$//g; + next if (/^$/); + + if (!$inside) { + if (/^\{$/) { + $inside = 1; + undef $storepath; + undef $narname; + undef $hash; + @preds = (); + } + else { die "bad line: $_"; } + } else { + if (/^\}$/) { + $inside = 0; + my $fullurl = "$url/$narname"; + print "$storepath\n"; + + # Construct a Fix expression that fetches and unpacks a + # Nix archive from the network. + my $fetch = + "App(IncludeFix(\"fetchurl/fetchurl.fix\"), " . + "[(\"url\", \"$fullurl\"), (\"md5\", \"$hash\")])"; + my $fixexpr = + "App(IncludeFix(\"nar/unnar.fix\"), " . + "[ (\"nar\", $fetch)" . + ", (\"outPath\", \"$storepath\")" . + "])"; + + if (!$first) { $fullexpr .= "," }; + $first = 0; + $fullexpr .= $fixexpr; # !!! O(n^2)? + + push @srcpaths, $storepath; + + foreach my $p (@preds) { + push @sucs, $p; + push @sucs, $storepath; + } + + } + elsif (/^\s*StorePath:\s*(\/\S+)\s*$/) { + $storepath = $1; + } + elsif (/^\s*NarName:\s*(\S+)\s*$/) { + $narname = $1; + } + elsif (/^\s*MD5:\s*(\S+)\s*$/) { + $hash = $1; + } + elsif (/^\s*SuccOf:\s*(\/\S+)\s*$/) { + push @preds, $1; + } + else { die "bad line: $_"; } + } } - close INDEX; - - unlink $tmpfile; + close MANIFEST; } } $fullexpr .= "]"; + # Instantiate Nix expressions from the Fix expressions we created above. print STDERR "running fix...\n"; my $pid = open2(\*READ, \*WRITE, "fix -") or die "cannot run fix"; @@ -93,23 +119,28 @@ close WRITE; my $i = 0; while () { chomp; - die unless /^([0-9a-z]{32})$/; - my $nid = $1; - die unless ($i < scalar @ids); - my $id = $ids[$i++]; - push @subs, $id; - push @subs, $nid; + die unless /^\//; + my $subpath = $_; + die unless ($i < scalar @srcpaths); + my $srcpath = $srcpaths[$i++]; + push @subs, $srcpath; + push @subs, $subpath; + print "$srcpath $subpath\n"; } waitpid $pid, 0; $? == 0 or die "fix failed"; + # Register all substitutes. print STDERR "registering substitutes...\n"; +print "@subs\n"; system "nix --substitute @subs"; if ($?) { die "`nix --substitute' failed"; } + # Register all successors. print STDERR "registering successors...\n"; -system "nix --successor @sucs"; +print "@sucs\n"; +system "nix --successor -vvvv @sucs"; if ($?) { die "`nix --successor' failed"; } -- cgit 1.4.1