81 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| #! /usr/bin/perl -w
 | |
| 
 | |
| my $tmpfile = "@localstatedir@/nix/pull.tmp";
 | |
| my $conffile = "@sysconfdir@/nix/prebuilts.conf";
 | |
| 
 | |
| my @subs;
 | |
| my @sucs;
 | |
| 
 | |
| 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})(-s-([0-9a-z]{32}))?\.nar.bz2$/;
 | |
|             my $hash = $1;
 | |
|             my $fshash = $3;
 | |
| 
 | |
|             print "registering $hash -> $url/$fn\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\", \"ignore\")])";
 | |
|             my $fixexpr = 
 | |
|                 "App(IncludeFix(\"nar/unnar.fix\"), " .
 | |
|                 "[ (\"nar\", $fetch)" .
 | |
|                 ", (\"name\", \"fetched-$hash\")" .
 | |
|                 "])";
 | |
|             
 | |
|             my $fixfile = "/tmp/nix-pull-tmp.fix";
 | |
|             open FIX, ">$fixfile";
 | |
|             print FIX $fixexpr;
 | |
|             close FIX;
 | |
| 
 | |
|             # Instantiate a Nix expression from the Fix expression.
 | |
|             my $nhash = `fix $fixfile`;
 | |
|             $? and die "instantiating Nix archive expression";
 | |
|             chomp $nhash;
 | |
|             die unless $nhash =~ /^([0-9a-z]{32})$/;
 | |
| 
 | |
|             push @subs, $hash;
 | |
|             push @subs, $nhash;
 | |
| 
 | |
|             # Does the name encode a successor relation?
 | |
|             if (defined $fshash) {
 | |
|                 print "NORMAL $fshash -> $hash\n";
 | |
|                 push @sucs, $fshash;
 | |
|                 push @sucs, $hash;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         close INDEX;
 | |
| 
 | |
|         unlink $tmpfile;
 | |
|     }
 | |
| 
 | |
| }
 | |
| 
 | |
| system "nix --substitute @subs";
 | |
| if ($?) { die "`nix --substitute' failed"; }
 | |
| 
 | |
| system "nix --successor @sucs";
 | |
| if ($?) { die "`nix --successor' failed"; }
 |