* Get rid of nix-pack-closure / nix-unpack-closure, they're redundant.
This commit is contained in:
		
							parent
							
								
									3f4ed681c2
								
							
						
					
					
						commit
						fa791116a3
					
				
					 8 changed files with 7 additions and 298 deletions
				
			
		|  | @ -14,7 +14,6 @@ XSLTPROC = $(xsltproc) $(xmlflags) \ | |||
| man1_MANS = nix-env.1 nix-build.1 nix-store.1 nix-instantiate.1 \ | ||||
|  nix-collect-garbage.1 nix-push.1 nix-pull.1 \ | ||||
|  nix-prefetch-url.1 nix-channel.1 \ | ||||
|  nix-pack-closure.1 nix-unpack-closure.1 \ | ||||
|  nix-install-package.1 nix-hash.1 nix-copy-closure.1 | ||||
| 
 | ||||
| FIGURES = figures/user-environments.png | ||||
|  |  | |||
|  | @ -89,10 +89,6 @@ | |||
|         <title>nix-install-package</title> | ||||
|         <xi:include href="nix-install-package.xml" /> | ||||
|       </section> | ||||
|       <section xml:id="sec-nix-pack-closure"> | ||||
|         <title>nix-pack-closure</title> | ||||
|         <xi:include href="nix-pack-closure.xml" /> | ||||
|       </section> | ||||
|       <section xml:id="sec-nix-prefetch-url"> | ||||
|         <title>nix-prefetch-url</title> | ||||
|         <xi:include href="nix-prefetch-url.xml" /> | ||||
|  | @ -105,10 +101,6 @@ | |||
|         <title>nix-push</title> | ||||
|         <xi:include href="nix-push.xml" /> | ||||
|       </section> | ||||
|       <section xml:id="sec-nix-unpack-closure"> | ||||
|         <title>nix-unpack-closure</title> | ||||
|         <xi:include href="nix-unpack-closure.xml" /> | ||||
|       </section> | ||||
|     </section> | ||||
|      | ||||
|   </appendix> | ||||
|  |  | |||
|  | @ -1,82 +0,0 @@ | |||
| <refentry xmlns="http://docbook.org/ns/docbook" | ||||
|           xmlns:xlink="http://www.w3.org/1999/xlink" | ||||
|           xmlns:xi="http://www.w3.org/2001/XInclude"> | ||||
| 
 | ||||
| <refmeta> | ||||
|   <refentrytitle>nix-pack-closure</refentrytitle> | ||||
|   <manvolnum>1</manvolnum> | ||||
|   <refmiscinfo class="source">Nix</refmiscinfo> | ||||
|   <refmiscinfo class="version"><xi:include href="version.txt" parse="text"/></refmiscinfo> | ||||
| </refmeta> | ||||
| 
 | ||||
| <refnamediv> | ||||
|   <refname>nix-pack-closure</refname> | ||||
|   <refpurpose>pack the closure of a store path into a single file that | ||||
|   can be unpacked with | ||||
|   <command>nix-unpack-closure</command></refpurpose> | ||||
| </refnamediv> | ||||
| 
 | ||||
| <refsynopsisdiv> | ||||
|   <cmdsynopsis> | ||||
|     <command>nix-pack-closure</command> | ||||
|     <arg choice='plain' rep='repeat'><replaceable>paths</replaceable></arg> | ||||
|   </cmdsynopsis> | ||||
| </refsynopsisdiv> | ||||
| 
 | ||||
| 
 | ||||
| <refsection><title>Description</title> | ||||
| 
 | ||||
| <para>The command <command>nix-pack-closure</command> packs the | ||||
| contents of the store paths <replaceable>paths</replaceable> and | ||||
| <emphasis>all their dependencies</emphasis> into a single file, which | ||||
| is written to standard output.  (That is, it | ||||
| <emphasis>serialises</emphasis> <replaceable>paths</replaceable>.) | ||||
| The output can then be unpacked into the Nix store of another machine | ||||
| using <command>nix-unpack-closure</command>.</para> | ||||
| 
 | ||||
| <para>Together, <command>nix-pack-closure</command> and | ||||
| <command>nix-unpack-closure</command> provide a quick and easy way to | ||||
| deploy a package to a different machine.  However, as the output of | ||||
| <command>nix-pack-closure</command> tends to be rather large (since it | ||||
| contains all dependencies), it’s not very efficient. | ||||
| <command>nix-push</command> and <command>nix-pull</command> are more | ||||
| efficient, but are also a bit more cumbersome to use.</para> | ||||
| 
 | ||||
| </refsection> | ||||
| 
 | ||||
| 
 | ||||
| <refsection><title>Examples</title> | ||||
| 
 | ||||
| <para>To copy some instance of Subversion with all its dependencies to | ||||
| another machine: | ||||
| 
 | ||||
| <screen> | ||||
| $ nix-pack-closure /nix/store/hj232g1r...-subversion-1.3.0 > svn.closure | ||||
| 
 | ||||
| <lineannotation>Copy <!-- !!! <filename> -->svn.closure to the remote machine, then on the remote machine do:</lineannotation> | ||||
| $ nix-unpack-closure < svn.closure</screen> | ||||
| 
 | ||||
| </para> | ||||
| 
 | ||||
| <para>Copy the program <command>azureus</command> with all its | ||||
| dependencies to the machine <literal>scratchy</literal>: | ||||
| 
 | ||||
| <screen> | ||||
| $ nix-pack-closure $(which azureus) | ssh scratchy nix-unpack-closure</screen> | ||||
|      | ||||
| </para> | ||||
| 
 | ||||
| <para>As a variation on the previous example, copy | ||||
| <command>azureus</command>, and also install it in the user’s profile | ||||
| on the target machine: | ||||
| 
 | ||||
| <screen> | ||||
| $ nix-pack-closure $(which azureus) | ssh scratchy 'nix-env -i $(nix-unpack-closure)'</screen> | ||||
| 
 | ||||
| </para> | ||||
|   | ||||
| 
 | ||||
| </refsection> | ||||
| 
 | ||||
| 
 | ||||
| </refentry> | ||||
|  | @ -1,42 +0,0 @@ | |||
| <refentry xmlns="http://docbook.org/ns/docbook" | ||||
|           xmlns:xlink="http://www.w3.org/1999/xlink" | ||||
|           xmlns:xi="http://www.w3.org/2001/XInclude"> | ||||
| 
 | ||||
| <refmeta> | ||||
|   <refentrytitle>nix-unpack-closure</refentrytitle> | ||||
|   <manvolnum>1</manvolnum> | ||||
|   <refmiscinfo class="source">Nix</refmiscinfo> | ||||
|   <refmiscinfo class="version"><xi:include href="version.txt" parse="text"/></refmiscinfo> | ||||
| </refmeta> | ||||
| 
 | ||||
| <refnamediv> | ||||
|   <refname>nix-unpack-closure</refname> | ||||
|   <refpurpose>unpack the closure of a store path created by <command>nix-pack-closure</command> into the Nix store</refpurpose> | ||||
| </refnamediv> | ||||
| 
 | ||||
| <refsynopsisdiv> | ||||
|   <cmdsynopsis> | ||||
|     <command>nix-unpack-closure</command> | ||||
|   </cmdsynopsis> | ||||
| </refsynopsisdiv> | ||||
| 
 | ||||
| 
 | ||||
| <refsection><title>Description</title> | ||||
| 
 | ||||
| <para>The command <command>nix-unpack-closure</command> unpacks the | ||||
| closure of a set of store paths created by | ||||
| <command>nix-pack-closure</command> into the local Nix store.  The | ||||
| closure is a single file read from standard input.  See the | ||||
| description of <command>nix-pack-closure</command> for details and | ||||
| examples.</para> | ||||
| 
 | ||||
| <para>The top-level paths in the closure (i.e., the paths passed to | ||||
| the original <command>nix-pack-closure</command> call that created the | ||||
| closure) are printed on standard output.  These paths can be passed, | ||||
| for instance, to <literal>nix-env -i</literal> to install them into a | ||||
| user environment on the target machine.</para> | ||||
| 
 | ||||
| </refsection> | ||||
| 
 | ||||
| 
 | ||||
| </refentry> | ||||
|  | @ -47,6 +47,13 @@ | |||
|   <listitem><para><command>nix-prefetch-url</command> now supports | ||||
|   <literal>mirror://</literal> URLs.</para></listitem> | ||||
| 
 | ||||
|   <listitem><para>Removed the commands | ||||
|   <command>nix-pack-closure</command> and | ||||
|   <command>nix-unpack-closure</command>.   You can do almost the same | ||||
|   thing but much more efficiently by doing <literal>nix-store --export | ||||
|   $(nix-store -qR <replaceable>paths</replaceable>) > closure</literal> and | ||||
|   <literal>nix-store --import < closure</literal>.</para></listitem> | ||||
| 
 | ||||
| </itemizedlist> | ||||
| 
 | ||||
| </section> | ||||
|  |  | |||
|  | @ -1,7 +1,6 @@ | |||
| bin_SCRIPTS = nix-collect-garbage \ | ||||
|   nix-pull nix-push nix-prefetch-url \ | ||||
|   nix-install-package nix-channel nix-build \ | ||||
|   nix-pack-closure nix-unpack-closure \ | ||||
|   nix-copy-closure  | ||||
| 
 | ||||
| noinst_SCRIPTS = nix-profile.sh generate-patches.pl \ | ||||
|  | @ -36,7 +35,6 @@ EXTRA_DIST = nix-collect-garbage.in \ | |||
|   download-using-manifests.pl.in \ | ||||
|   copy-from-other-stores.pl.in \ | ||||
|   generate-patches.pl.in \ | ||||
|   nix-pack-closure.in nix-unpack-closure.in \ | ||||
|   nix-copy-closure.in \ | ||||
|   find-runtime-roots.pl.in \ | ||||
|   build-remote.pl.in \ | ||||
|  |  | |||
|  | @ -1,75 +0,0 @@ | |||
| #! @perl@ -w | ||||
| 
 | ||||
| # This tool computes the closure of a path (using "nix-store --query | ||||
| # --requisites") and puts the contents of each path in the closure in | ||||
| # a big NAR archive that can be installed on another Nix installation | ||||
| # using "nix-unpack-closure". | ||||
| 
 | ||||
| # TODO: make this program "streamy", i.e., don't use a temporary | ||||
| # directory. | ||||
| 
 | ||||
| use strict; | ||||
| use File::Temp qw(tempdir); | ||||
| 
 | ||||
| my $binDir = $ENV{"NIX_BIN_DIR"}; | ||||
| $binDir = "@bindir@" unless defined $binDir; | ||||
| 
 | ||||
| my $tmpDir = tempdir("nix-pack-closure.XXXXXX", CLEANUP => 1, TMPDIR => 1) | ||||
|     or die "cannot create a temporary directory"; | ||||
| 
 | ||||
| mkdir "$tmpDir/contents", 0755 or die; | ||||
| mkdir "$tmpDir/references", 0755 or die; | ||||
| mkdir "$tmpDir/derivers", 0755 or die; | ||||
| 
 | ||||
| open TOPLEVEL, ">$tmpDir/top-level" or die; | ||||
| 
 | ||||
| 
 | ||||
| my %storePaths; | ||||
| 
 | ||||
| 
 | ||||
| while (@ARGV) { | ||||
|     my $storePath = shift @ARGV; | ||||
| 
 | ||||
|     # $storePath might be a symlink to the store, so resolve it. | ||||
|     $storePath = (`$binDir/nix-store --query --resolve '$storePath'` | ||||
|         or die "cannot resolve `$storePath'"); | ||||
|     chomp $storePath; | ||||
|     print TOPLEVEL $storePath, "\n"; | ||||
| 
 | ||||
|     # Get the closure of this path. | ||||
|     my $pid = open(READ, | ||||
|         "$binDir/nix-store --query --requisites '$storePath'|") or die; | ||||
|      | ||||
|     while (<READ>) { | ||||
|         chomp; | ||||
|         die "bad: $_" unless /^\//; | ||||
|         $storePaths{$_} = ""; | ||||
|     } | ||||
| 
 | ||||
|     close READ or die "nix-store failed: $?"; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| close TOPLEVEL or die; | ||||
| 
 | ||||
| 
 | ||||
| foreach my $storePath (sort(keys %storePaths)) { | ||||
|     print STDERR "packing `$storePath'...\n"; | ||||
| 
 | ||||
|     $storePath =~ /\/([^\/]+)$/; | ||||
|     my $name = $1; | ||||
| 
 | ||||
|     system("$binDir/nix-store --dump '$storePath' > $tmpDir/contents/$name") == 0 | ||||
|         or die "nix-store --dump failed on `$storePath': $?"; | ||||
| 
 | ||||
|     system("$binDir/nix-store --query --references '$storePath' > $tmpDir/references/$name") == 0 | ||||
|         or die "nix-store --query --references failed on `$storePath': $?"; | ||||
| 
 | ||||
|     system("$binDir/nix-store --query --deriver '$storePath' > $tmpDir/derivers/$name") == 0 | ||||
|         or die "nix-store --query --deriver failed on `$storePath': $?"; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| # Write a NAR archive of everything to standard output. | ||||
| system("nix-store --dump '$tmpDir'") == 0 | ||||
|     or die "nix-store --dump failed"; | ||||
|  | @ -1,88 +0,0 @@ | |||
| #! @perl@ -w | ||||
| 
 | ||||
| # This tool unpacks the closures created by "nix-pack-closure" and | ||||
| # adds them to the Nix store. | ||||
| 
 | ||||
| # TODO: make this program "streamy", i.e., don't use a temporary | ||||
| # directory. | ||||
| 
 | ||||
| use strict; | ||||
| use File::Temp qw(tempdir); | ||||
| 
 | ||||
| my $binDir = $ENV{"NIX_BIN_DIR"}; | ||||
| $binDir = "@bindir@" unless defined $binDir; | ||||
| 
 | ||||
| my $tmpDir = tempdir("nix-unpack-closure.XXXXXX", CLEANUP => 1, TMPDIR => 1) | ||||
|     or die "cannot create a temporary directory"; | ||||
| 
 | ||||
| 
 | ||||
| # Unpack the NAR archive on standard input. | ||||
| system("nix-store --restore '$tmpDir/unpacked'") == 0 | ||||
|     or die "nix-store --restore failed"; | ||||
| 
 | ||||
| 
 | ||||
| open VALID, ">$tmpDir/validity" or die; | ||||
| 
 | ||||
| 
 | ||||
| # For each path in the closure that is not yet valid, add it to the | ||||
| # store.  TODO: use proper locking.  Or even better, let nix-store do | ||||
| # this. | ||||
| opendir(DIR, "$tmpDir/unpacked/contents") or die "cannot open directory: $!"; | ||||
| 
 | ||||
| foreach my $name (sort(readdir DIR)) { | ||||
|     next if $name eq "." or $name eq ".."; | ||||
| 
 | ||||
|     my $storePath = "@storedir@/$name"; # !!! | ||||
| 
 | ||||
|     # !!! this really isn't a good validity check! | ||||
|     system "$binDir/nix-store --check-validity '$storePath' 2> /dev/null"; | ||||
|     if ($? != 0) { | ||||
|         print STDERR "unpacking `$storePath'...\n"; | ||||
| 
 | ||||
|         # !!! race | ||||
|         system("@coreutils@/rm -rf '$storePath'") == 0 | ||||
|             or die "cannot remove `$storePath': $?"; | ||||
| 
 | ||||
|         system("$binDir/nix-store --restore '$storePath' < '$tmpDir/unpacked/contents/$name'") == 0 | ||||
|             or die "nix-store --dump failed on `$storePath': $?"; | ||||
|          | ||||
|         print VALID "$storePath\n"; | ||||
| 
 | ||||
|         open DRV, "<$tmpDir/unpacked/derivers/$name" or die; | ||||
|         my $deriver = <DRV>; | ||||
|         chomp $deriver; | ||||
|         $deriver = "" if $deriver eq "unknown-deriver"; | ||||
|         close DRV; | ||||
| 
 | ||||
|         my @refs; | ||||
|         open REFS, "<$tmpDir/unpacked/references/$name" or die; | ||||
|         while (<REFS>) { | ||||
|             chomp; | ||||
|             push @refs, $_; | ||||
|         } | ||||
|         close REFS; | ||||
| 
 | ||||
|         print VALID "$deriver\n"; | ||||
|          | ||||
|         print VALID (scalar @refs), "\n"; | ||||
|         foreach my $ref (@refs) { | ||||
|             print VALID "$ref\n"; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| closedir(DIR) or die; | ||||
| 
 | ||||
| 
 | ||||
| # Register the invalid paths as valid. | ||||
| system("nix-store --register-validity <'$tmpDir/validity'") == 0 | ||||
|     or die "nix-store --register-validity failed"; | ||||
| 
 | ||||
| 
 | ||||
| # Show the top-level paths so that something useful can be done with | ||||
| # them, e.g., passing them to `nix-env -i'. | ||||
| if (-e "$tmpDir/unpacked/top-level") { | ||||
|     open TOPLEVEL, "<$tmpDir/unpacked/top-level" or die; | ||||
|     while (<TOPLEVEL>) { print "$_"; } | ||||
|     close TOPLEVEL; | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue