109 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| #! /usr/bin/perl -w
 | |
| 
 | |
| my $tmpfile = "@localstatedir@/nix/pull.tmp";
 | |
| my $conffile = "@sysconfdir@/nix/prebuilts.conf";
 | |
| 
 | |
| my @ids;
 | |
| my @subs;
 | |
| my @sucs;
 | |
| 
 | |
| my $fixfile = "/tmp/nix-pull-tmp.fix";
 | |
| open FIX, ">$fixfile";
 | |
| print FIX "[";
 | |
| my $first = 1;
 | |
| 
 | |
| open CONFFILE, "<$conffile";
 | |
| 
 | |
| while (<CONFFILE>) {
 | |
| 
 | |
|     chomp;
 | |
|     if (/^\s*(\S+)\s*(\#.*)?$/) {
 | |
|         my $url = $1;
 | |
| 
 | |
|         print "obtaining list of Nix archives at $url...\n";
 | |
| 
 | |
|         system "wget '$url' -O '$tmpfile' 2> /dev/null"; # !!! escape
 | |
|         if ($?) { die "`wget' failed"; }
 | |
|         
 | |
|         open INDEX, "<$tmpfile";
 | |
| 
 | |
|         while (<INDEX>) {
 | |
|             # 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\")" .
 | |
|                 "])";
 | |
|             
 | |
| 	    print FIX "," unless ($first);
 | |
| 	    $first = 0;
 | |
| 	    print FIX $fixexpr;
 | |
| 
 | |
| 	    push @ids, $id;
 | |
| 
 | |
|             # Does the name encode a successor relation?
 | |
|             if (defined $fsid) {
 | |
|                 push @sucs, $fsid;
 | |
|                 push @sucs, $id;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         close INDEX;
 | |
| 
 | |
|         unlink $tmpfile;
 | |
|     }
 | |
| 
 | |
| }
 | |
| 
 | |
| print FIX "]";
 | |
| close FIX;
 | |
| 
 | |
| # Instantiate Nix expressions from the Fix expressions we created above.
 | |
| print STDERR "running fix...\n";
 | |
| open NIDS, "fix $fixfile |" or die "cannot run fix";
 | |
| my $i = 0;
 | |
| while (<NIDS>) {
 | |
|     chomp;
 | |
|     die unless /^([0-9a-z]{32})$/;
 | |
|     $nid = $1;
 | |
|     die unless ($i < scalar @ids);
 | |
|     $id = $ids[$i++];
 | |
|     push @subs, $id;
 | |
|     push @subs, $nid;
 | |
| }
 | |
| 
 | |
| # Register all substitutes.
 | |
| print STDERR "registering substitutes...\n";
 | |
| system "nix --substitute @subs";
 | |
| if ($?) { die "`nix --substitute' failed"; }
 | |
| 
 | |
| # Register all successors.
 | |
| print STDERR "registering successors...\n";
 | |
| system "nix --successor @sucs";
 | |
| if ($?) { die "`nix --successor' failed"; }
 |