diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2003-11-22T18·45+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2003-11-22T18·45+0000 |
commit | ab0bc4999a49efbc8e1c25989662a96e32fa0cc5 (patch) | |
tree | 3864cf300fccb46a97decd2d00b8176c047a87d0 /scripts | |
parent | 40d9eb14dfb842c51e9f86818b43ae7711e1a5d6 (diff) |
* Maintain integrity of the substitute and successor mappings when
deleting a path in the store. * Allow absolute paths in Nix expressions. * Get nix-prefetch-url to work again. * Various other fixes.
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/Makefile.am | 2 | ||||
-rw-r--r-- | scripts/nix-prefetch-url.in | 28 | ||||
-rwxr-xr-x | scripts/nix-switch.in | 86 |
3 files changed, 16 insertions, 100 deletions
diff --git a/scripts/Makefile.am b/scripts/Makefile.am index 4a1be7f8f0d4..35bb926af6d0 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -1,4 +1,4 @@ -bin_SCRIPTS = nix-switch nix-collect-garbage \ +bin_SCRIPTS = nix-collect-garbage \ nix-pull nix-push nix-prefetch-url noinst_SCRIPTS = nix-profile.sh diff --git a/scripts/nix-prefetch-url.in b/scripts/nix-prefetch-url.in index 332290d40ac8..0873f5a8d7cb 100644 --- a/scripts/nix-prefetch-url.in +++ b/scripts/nix-prefetch-url.in @@ -22,27 +22,29 @@ print "file has hash $hash\n"; my $out2 = "@prefix@/store/nix-prefetch-url-$hash"; rename $out, $out2; -# Create a Fix expression. -my $fixexpr = - "App(IncludeFix(\"fetchurl/fetchurl.fix\"), " . - "[(\"url\", \"$url\"), (\"md5\", \"$hash\")])"; +# Create a Nix expression. +my $nixexpr = + "(import @datadir@/nix/corepkgs/fetchurl) " . + "{url = $url; md5 = \"$hash\"; system = \"@host@\"}"; + +print "expr: $nixexpr\n"; # Instantiate a Nix expression. -print STDERR "running fix...\n"; -my $pid = open2(\*READ, \*WRITE, "fix -") or die "cannot run fix"; +print STDERR "instantiating Nix expression...\n"; +my $pid = open2(\*READ, \*WRITE, "nix-instantiate -") or die "cannot run nix-instantiate"; -print WRITE $fixexpr; +print WRITE $nixexpr; close WRITE; -my $id = <READ>; -chomp $id; +my $drvpath = <READ>; +chomp $drvpath; waitpid $pid, 0; -$? == 0 or die "fix failed"; +$? == 0 or die "nix-instantiate failed"; # Run Nix. -print STDERR "running nix...\n"; -system "nix --install $id > /dev/null"; -$? == 0 or die "`nix --install' failed"; +print STDERR "realising store expression $drvpath...\n"; +system "nix-store --realise $drvpath > /dev/null"; +$? == 0 or die "realisation failed"; unlink $out2; diff --git a/scripts/nix-switch.in b/scripts/nix-switch.in deleted file mode 100755 index 9fcb598e30a3..000000000000 --- a/scripts/nix-switch.in +++ /dev/null @@ -1,86 +0,0 @@ -#! /usr/bin/perl -w - -use strict; - -my $keep = 0; -my $sourceroot = 1; -my $name = "current"; -my $srcid; - -my $argnr = 0; -while ($argnr < scalar @ARGV) { - my $arg = $ARGV[$argnr++]; - if ($arg eq "--keep") { $keep = 1; } - elsif ($arg eq "--no-source") { $sourceroot = 0; } - elsif ($arg eq "--name") { $name = $ARGV[$argnr++]; } - elsif ($arg =~ /^\//) { $srcid = $arg; } - else { die "unknown argument `$arg'" }; -} - -my $linkdir = "@localstatedir@/nix/links"; - -# Build the specified package, and all its dependencies. -my $nfid = `nix --install $srcid`; -if ($?) { die "`nix --install' failed"; } -chomp $nfid; -die unless $nfid =~ /^\//; - -my $pkgdir = `nix --query --list $nfid`; -if ($?) { die "`nix --query --list' failed"; } -chomp $pkgdir; - -# Figure out a generation number. -opendir(DIR, $linkdir); -my $nr = 0; -foreach my $n (sort(readdir(DIR))) { - next if (!($n =~ /^\d+$/)); - $nr = $n + 1 if ($n >= $nr); -} -closedir(DIR); - -my $link = "$linkdir/$nr"; - -# Create a symlink from $link to $pkgdir. -symlink($pkgdir, $link) or die "cannot create $link: $!"; - -# Store the id of the normal form. This is useful for garbage -# collection and the like. -my $idfile = "$linkdir/$nr.id"; -open ID, "> $idfile" or die "cannot create $idfile"; -print ID "$nfid\n"; -close ID; - -# Optionally store the source id. -if ($sourceroot) { - $idfile = "$linkdir/$nr-src.id"; - open ID, "> $idfile" or die "cannot create $idfile"; - print ID "$srcid\n"; - close ID; -} - -my $current = "$linkdir/$name"; - -# Read the current generation so that we can delete it (if --keep -# wasn't specified). -my $oldlink = readlink($current); - -# Make $link the current generation by pointing $linkdir/current to -# it. The rename() system call is supposed to be essentially atomic -# on Unix. That is, if we have links `current -> X' and `new_current -# -> Y', and we rename new_current to current, a process accessing -# current will see X or Y, but never a file-not-found or other error -# condition. This is sufficient to atomically switch the current link -# tree. - -print "switching $current to $link\n"; - -my $tmplink = "$linkdir/.new_$name"; -symlink($link, $tmplink) or die "cannot create $tmplink"; -rename($tmplink, $current) or die "cannot rename $tmplink"; - -if (!$keep && defined $oldlink) { - print "deleting old $oldlink\n"; - unlink($oldlink) == 1 or print "cannot delete $oldlink\n"; - unlink("$oldlink.id") == 1 or print "cannot delete $oldlink.id\n"; - unlink("$oldlink-src.id"); -} |