diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2005-02-25T15·42+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2005-02-25T15·42+0000 |
commit | 6bafeafb884d72ac920ec667eeea143309ed64b5 (patch) | |
tree | 1d6a1b8d279792d466a1646badcdafc3a1b90f08 /scripts/nix-install-package.in | |
parent | 3259ae58119b93ca48a267ec90d7e1efb929fef8 (diff) |
* nix-install-package: Use the new (trivial) package format generated
by the build farm. See e.g., http://catamaran.labs.cs.uu.nl/dist/nixpkgs-0.8/nixpkgs-0.7pre2302/; the user can click on packages, and they will be installed (assuming the `application/nix-package' MIME type has been associated with `nix-install-package'). Nix expressions are no longer involved: a "package" is just a pointer to a manifest, and the top-level store derivation to be added to the user environment. This makes these packages independent from Nix expression evolution. Note that we install the store derivation ($drvPath), not the resulting output path ($outPath). This is equivalent, except that installing the derivation maintains the back-link from the output path to the derivation that built it. This is useful for maintenance. * Automatically re-exec in an xterm so that the user sees something when `nix-install-package' is run from a browser.
Diffstat (limited to 'scripts/nix-install-package.in')
-rw-r--r-- | scripts/nix-install-package.in | 55 |
1 files changed, 34 insertions, 21 deletions
diff --git a/scripts/nix-install-package.in b/scripts/nix-install-package.in index 0fcfd4e8f770..362ed035fbaf 100644 --- a/scripts/nix-install-package.in +++ b/scripts/nix-install-package.in @@ -3,35 +3,48 @@ use strict; use POSIX qw(tmpnam); -my $pkgfile = $ARGV[0]; -die unless defined $pkgfile; +my $pkgFile = $ARGV[0]; +die unless defined $pkgFile; -my $tmpdir; -do { $tmpdir = tmpnam(); } -until mkdir $tmpdir, 0777; -# !!! remove tmpdir on exit +# Re-execute in a terminal, if necessary, so that if we're executed +# from a web browser, the user gets to see us. +if (!defined $ENV{"NIX_HAVE_TERMINAL"}) { + $ENV{"NIX_HAVE_TERMINAL"} = "1"; + exec("xterm", "-e", "@bindir@/nix-install-package", "$pkgFile"); + die "cannot execute `xterm'"; +} -print "Unpacking $pkgfile in $tmpdir...\n"; -system "bunzip2 < $pkgfile | (cd $tmpdir && tar xf -)"; -die if $?; -print "This package contains the following derivations:\n"; -system "@bindir@/nix-env -qasf $tmpdir/default.nix"; -die if $?; +# Read and parse the package file. +open PKGFILE, "<$pkgFile" or die "cannot open `$pkgFile': $!"; +my $contents = <PKGFILE>; +close PKGFILE; -print "Do you wish to install these (Y/N)? "; +$contents =~ /^\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/ or die "invalid package contents"; +my $version = $1; +my $manifestURL = $2; +my $drvName = $3; +my $system = $4; +my $drvPath = $5; +my $outPath = $6; + +die "invalid package version `$version'" unless $version eq "NIXPKG1"; + + +# Ask confirmation. +print "Do you want to install `$drvName' (Y/N)? "; my $reply = <STDIN>; chomp $reply; -exit if (!($reply eq "y")); +exit if $reply ne "y" && $reply ne "Y"; -print "Pulling caches...\n"; -system "@bindir@/nix-pull `cat $tmpdir/caches`"; -die if $?; +print "\nPulling manifests...\n"; +system "@bindir@/nix-pull '$manifestURL'"; +die if $? != 0; -print "Installing package...\n"; -system "@bindir@/nix-env -if $tmpdir/default.nix '*'"; -die if $?; +print "\nInstalling package...\n"; +system "@bindir@/nix-env -i '$drvPath'"; +die if $? != 0; -print "Installation succeeded! Press Enter to continue.\n"; +print "\nInstallation succeeded! Press Enter to continue.\n"; <STDIN>; |