* One-click installation :-)

The script nix-install-package takes a `Nix package file' (which
  contains one or more derivations, along with URLs of Nix caches),
  unpacks it, pulls the caches, and installs the derivations in the
  user's environment.

  For best results, associate the command `xterm -e
  /nix/bin/nix-install-package' with the MIME type
  `application/x-nix-package' and visit
  http://losser.st-lab.cs.uu.nl/~eelco/test/.
This commit is contained in:
Eelco Dolstra 2003-11-24 11:11:40 +00:00
parent b857267893
commit e7ea52d3b3
3 changed files with 117 additions and 67 deletions

View file

@ -1,5 +1,6 @@
bin_SCRIPTS = nix-collect-garbage \ bin_SCRIPTS = nix-collect-garbage \
nix-pull nix-push nix-prefetch-url nix-pull nix-push nix-prefetch-url \
nix-install-package
noinst_SCRIPTS = nix-profile.sh noinst_SCRIPTS = nix-profile.sh
@ -12,8 +13,8 @@ install-exec-local:
include ../substitute.mk include ../substitute.mk
EXTRA_DIST = nix-switch.in nix-collect-garbage.in \ EXTRA_DIST = nix-collect-garbage.in \
nix-pull.in nix-push.in nix-profile.sh.in \ nix-pull.in nix-push.in nix-profile.sh.in \
nix-prefetch-url.in \ nix-prefetch-url.in nix-install-package.in \
prebuilts.conf prebuilts.conf

View file

@ -0,0 +1,37 @@
#! /usr/bin/perl -w
use strict;
use POSIX qw(tmpnam);
my $pkgfile = $ARGV[0];
die unless defined $pkgfile;
my $tmpdir;
do { $tmpdir = tmpnam(); }
until mkdir $tmpdir, 0777;
# !!! remove tmpdir on exit
print "unpacking $pkgfile in $tmpdir...\n";
system "bunzip2 < $pkgfile | (cd $tmpdir && tar xf -)";
die if $?;
print "this package contains the following derivations:\n";
system "nix-env -qsf $tmpdir/default.nix";
die if $?;
print "do you wish to install them (y/n)? ";
my $reply = <STDIN>;
chomp $reply;
exit if (!($reply eq "y"));
print "pulling caches...\n";
system "nix-pull `cat $tmpdir/caches`";
die if $?;
print "installing package...\n";
system "nix-env -i $tmpdir/default.nix '*'";
die if $?;
print "installing succeeded! (enter to continue)\n";
<STDIN>;

View file

@ -19,86 +19,98 @@ my @sucs;
my $fullexpr = "["; my $fullexpr = "[";
open CONFFILE, "<$conffile";
while (<CONFFILE>) { sub processURL {
my $url = shift;
$url =~ s/\/$//;
print "obtaining list of Nix archives at $url...\n";
chomp; system "wget --cache=off '$url'/MANIFEST -O '$manifest' 2> /dev/null"; # !!! escape
if (/^\s*(\S+)\s*(\#.*)?$/) { if ($?) { die "`wget' failed"; }
my $url = $1;
$url =~ s/\/$//;
print "obtaining list of Nix archives at $url...\n"; open MANIFEST, "<$manifest";
system "wget --cache=off '$url'/MANIFEST -O '$manifest' 2> /dev/null"; # !!! escape my $inside = 0;
if ($?) { die "`wget' failed"; }
open MANIFEST, "<$manifest"; my $storepath;
my $narname;
my $hash;
my @preds;
my $inside = 0; while (<MANIFEST>) {
chomp;
s/\#.*$//g;
next if (/^$/);
my $storepath; if (!$inside) {
my $narname; if (/^\{$/) {
my $hash; $inside = 1;
my @preds; undef $storepath;
undef $narname;
while (<MANIFEST>) { undef $hash;
chomp; @preds = ();
s/\#.*$//g;
next if (/^$/);
if (!$inside) {
if (/^\{$/) {
$inside = 1;
undef $storepath;
undef $narname;
undef $hash;
@preds = ();
} }
else { die "bad line: $_"; } else { die "bad line: $_"; }
} else { } else {
if (/^\}$/) { if (/^\}$/) {
$inside = 0; $inside = 0;
my $fullurl = "$url/$narname"; my $fullurl = "$url/$narname";
print "$storepath\n"; # print "$storepath\n";
# Construct a Nix expression that fetches and unpacks a # Construct a Nix expression that fetches and unpacks a
# Nix archive from the network. # Nix archive from the network.
my $fetch = my $fetch =
"(import @datadir@/nix/corepkgs/fetchurl) " . "(import @datadir@/nix/corepkgs/fetchurl) " .
"{url = $fullurl; md5 = \"$hash\"; system = \"@host@\"}"; "{url = $fullurl; md5 = \"$hash\"; system = \"@host@\"}";
my $nixexpr = my $nixexpr =
"((import @datadir@/nix/corepkgs/nar/unnar.nix) " . "((import @datadir@/nix/corepkgs/nar/unnar.nix) " .
"{narFile = ($fetch); outPath = \"$storepath\"; system = \"@host@\"}) "; "{narFile = ($fetch); outPath = \"$storepath\"; system = \"@host@\"}) ";
$fullexpr .= $nixexpr; # !!! O(n^2)? $fullexpr .= $nixexpr; # !!! O(n^2)?
push @srcpaths, $storepath; push @srcpaths, $storepath;
foreach my $p (@preds) { foreach my $p (@preds) {
push @sucs, $p; push @sucs, $p;
push @sucs, $storepath; 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: $_"; }
} }
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 MANIFEST;
} }
close MANIFEST;
}
# Obtain URLs either from the command line or from a configuration file.
if (scalar @ARGV > 0) {
while (@ARGV) {
my $url = shift @ARGV;
processURL $url;
}
} else {
open CONFFILE, "<$conffile";
while (<CONFFILE>) {
chomp;
if (/^\s*(\S+)\s*(\#.*)?$/) {
my $url = $1;
processURL $url;
}
}
close CONFFILE;
} }
$fullexpr .= "]"; $fullexpr .= "]";