From 6bafeafb884d72ac920ec667eeea143309ed64b5 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Fri, 25 Feb 2005 15:42:52 +0000 Subject: [PATCH] * 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. --- scripts/nix-install-package.in | 55 +++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 21 deletions(-) diff --git a/scripts/nix-install-package.in b/scripts/nix-install-package.in index 0fcfd4e8f..362ed035f 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 = ; +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 = ; 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"; ;