diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2003-07-10 15:11:48 +0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2003-07-10 15:11:48 +0000 |
commit | 1d1c3691d2fdf5aad0baceadd8596f23c1e0e1fa (patch) | |
tree | c89123e33796e3408b613e1a824bcc66ad30395e /scripts | |
parent | d072485d2895d01dbbab1d899418726e3349343f (diff) |
* The policy-free derivate sharing now *almost* works. :-) For any
hash for which no local expansion is available, Nix can execute a
`substitute' which should produce a path with such a hash.
This is policy-free since Nix does not in any way specify how the
substitute should work, i.e., it's an arbitrary (unnormalised)
fstate expression. For example, `nix-pull' registers substitutes
that fetch Nix archives from the network (through `wget') and unpack
them, but any other method is possible as well. This is an
improvement over the old Nix sharing scheme, which had a policy
(fetching through `wget') built in.
The sharing scheme doesn't work completely yet because successors
from fstate rewriting have to be registered on the receiving side.
Probably the whole successor stuff can be folded up into the
substitute mechanism; this would be a nice simplification.
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/Makefile.am | 4 | ||||
-rw-r--r-- | scripts/nix-pull | 65 | ||||
-rwxr-xr-x | scripts/nix-pull-prebuilts | 83 | ||||
-rwxr-xr-x | scripts/nix-push-prebuilts | 44 | ||||
-rw-r--r-- | scripts/prebuilts.conf | 6 |
5 files changed, 69 insertions, 133 deletions
diff --git a/scripts/Makefile.am b/scripts/Makefile.am index e4602f2a1..2f4dbacc9 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -5,5 +5,5 @@ install-exec-local: $(INSTALL) -d $(sysconfdir)/profile.d $(INSTALL_PROGRAM) nix-profile.sh $(sysconfdir)/profile.d/nix.sh $(INSTALL) -d $(sysconfdir)/nix - # !!! don't overwrite local modifications - $(INSTALL_PROGRAM) prebuilts.conf $(sysconfdir)/nix/prebuilts.conf +# !!! don't overwrite local modifications + $(INSTALL_DATA) prebuilts.conf $(sysconfdir)/nix/prebuilts.conf diff --git a/scripts/nix-pull b/scripts/nix-pull index 0b09c8e00..59773a2ba 100644 --- a/scripts/nix-pull +++ b/scripts/nix-pull @@ -1,2 +1,67 @@ #! /usr/bin/perl -w +my $prefix = $ENV{"NIX"} || "/tmp/nix"; # !!! use prefix +my $etcdir = "$prefix/etc/nix"; +my $tmpfile = "$prefix/var/nix/pull.tmp"; + +my $conffile = "$etcdir/prebuilts.conf"; + +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/; + my $hash = $2; + + 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\"), (\"hash\", \"\")])"; + 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})$/; + + system "nix --substitute $hash $nhash"; + if ($?) { die "`nix --substitute' failed"; } + } + + close INDEX; + + unlink $tmpfile; + } + +} diff --git a/scripts/nix-pull-prebuilts b/scripts/nix-pull-prebuilts deleted file mode 100755 index 3d045b463..000000000 --- a/scripts/nix-pull-prebuilts +++ /dev/null @@ -1,83 +0,0 @@ -#! /usr/bin/perl -w - -my $prefix = $ENV{"NIX"} || "/nix"; # !!! use prefix -my $etcdir = "$prefix/etc/nix"; -my $knowns = "$prefix/var/nix/known-prebuilts"; -my $tmpfile = "$prefix/var/nix/prebuilts.tmp"; - -my $conffile = "$etcdir/prebuilts.conf"; - -umask 0022; - -sub register { - my $fn = shift; - my $url = shift; - return unless $fn =~ /([^\/]*)-([0-9a-z]{32})-([0-9a-z]{32})\.tar\.bz2/; - my $id = $1; - my $pkghash = $2; - my $prebuilthash = $3; - - print "$pkghash => $prebuilthash ($id)\n"; - - system "nix regprebuilt $pkghash $prebuilthash"; - if ($?) { die "`nix regprebuilt' failed"; } - - if ($url =~ /^\//) { - system "nix regfile $url"; - if ($?) { die "`nix regfile' failed"; } - } else { - system "nix regurl $prebuilthash $url"; - if ($?) { die "`nix regurl' failed"; } - } - - print KNOWNS "$pkghash\n"; -} - -open KNOWNS, ">$knowns"; - -open CONFFILE, "<$conffile"; - -while (<CONFFILE>) { - chomp; - if (/^\s*(\S+)\s*(\#.*)?$/) { - my $url = $1; - - print "obtaining prebuilt list from $url...\n"; - - if ($url =~ /^\//) { - - # It's a local path. - - foreach my $fn (glob "$url/*") { - register($fn, $fn); - } - - } else { - - # It's a URL. - - 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 =~ /\//; - register($fn, "$url/$fn"); - } - - close INDEX; - - unlink $tmpfile; - } - } -} - -close CONFFILE; - -close KNOWNS; diff --git a/scripts/nix-push-prebuilts b/scripts/nix-push-prebuilts deleted file mode 100755 index 2d44e7cda..000000000 --- a/scripts/nix-push-prebuilts +++ /dev/null @@ -1,44 +0,0 @@ -#! /usr/bin/perl -w - -my $prefix = $ENV{"NIX"} || "/nix"; # !!! use prefix -my $etcdir = "$prefix/etc/nix"; -my $exportdir = "$prefix/var/nix/prebuilts/exports"; -my $knowns = "$prefix/var/nix/known-prebuilts"; - -umask 0022; - -# For performance, put the known hashes in an associative array. -my %knowns = (); -open KNOWNS, "<$knowns"; -while (<KNOWNS>) { - next unless /([0-9a-z]{32})/; - $knowns{$1} = 1; -} -close KNOWNS; - -# For each installed package, check whether a prebuilt is known. - -open PKGS, "nix listinst|"; - -while (<PKGS>) { - chomp; - next unless /([0-9a-z]{32})/; - my $pkghash = $1; - if (!defined $knowns{$1}) { - # No known prebuilt exists for this package; so export it. - print "exporting $pkghash...\n"; - system "nix export '$exportdir' $pkghash"; - if ($?) { die "`nix export' failed"; } - } -} - -close PKGS; - -# Push the prebuilts to the server. !!! FIXME - -system "rsync -av -e ssh '$exportdir'/ eelco\@losser.st-lab.cs.uu.nl:/home/eelco/public_html/nix-prebuilts/"; - -# Rerun `nix-pull-prebuilts' to rescan the prebuilt source locations. - -print "running nix-pull-prebuilts..."; -system "nix-pull-prebuilts"; diff --git a/scripts/prebuilts.conf b/scripts/prebuilts.conf index 9b950cad4..c7bc89c61 100644 --- a/scripts/prebuilts.conf +++ b/scripts/prebuilts.conf @@ -1,4 +1,2 @@ -# A list of URLs or local paths from where we obtain prebuilts. -/nix/var/nix/prebuilts/imports -/nix/var/nix/prebuilts/exports -http://losser.st-lab.cs.uu.nl/~eelco/nix-prebuilts/ +# A list of URLs from where we obtain Nix archives. +http://losser.st-lab.cs.uu.nl/~eelco/nix-dist/ |