* nix-build: use an indirection scheme to make it easier for users to
get rid of GC roots. Nix-build places a symlink `result' in the current directory. Previously, removing that symlink would not remove the store path being linked to as a GC root. Now, the GC root created by nix-build is actually a symlink in `/nix/var/nix/gcroots/auto' to `result'. So if that symlink is removed the GC root automatically becomes invalid (since it can no longer be resolved). The root itself is not automatically removed - the garbage collector should delete dangling roots.
This commit is contained in:
		
							parent
							
								
									dcc37c236c
								
							
						
					
					
						commit
						630ae0c9d7
					
				
					 7 changed files with 101 additions and 50 deletions
				
			
		|  | @ -1,9 +1,5 @@ | |||
| #include <iostream> | ||||
| 
 | ||||
| #include <sys/types.h> | ||||
| #include <sys/stat.h> | ||||
| #include <unistd.h> | ||||
| 
 | ||||
| #include "globals.hh" | ||||
| #include "build.hh" | ||||
| #include "gc.hh" | ||||
|  | @ -24,6 +20,7 @@ void printHelp() | |||
| 
 | ||||
| static Path gcRoot; | ||||
| static int rootNr = 0; | ||||
| static bool indirectRoot = false; | ||||
| 
 | ||||
| 
 | ||||
| static Path findOutput(const Derivation & drv, string id) | ||||
|  | @ -37,11 +34,9 @@ static Path findOutput(const Derivation & drv, string id) | |||
| 
 | ||||
| static Path followSymlinks(Path & path) | ||||
| { | ||||
|     path = absPath(path); | ||||
|     while (!isStorePath(path)) { | ||||
|         struct stat st; | ||||
|         if (lstat(path.c_str(), &st)) | ||||
|             throw SysError(format("getting status of `%1%'") % path); | ||||
|         if (!S_ISLNK(st.st_mode)) return path; | ||||
|         if (!isLink(path)) return path; | ||||
|         string target = readLink(path); | ||||
|         path = canonPath(string(target, 0, 1) == "/" | ||||
|             ? target | ||||
|  | @ -64,7 +59,9 @@ static Path realisePath(const Path & path) | |||
|         if (gcRoot == "") | ||||
|             printGCWarning(); | ||||
|         else | ||||
|             outPath = addPermRoot(outPath, makeRootName(gcRoot, rootNr)); | ||||
|             outPath = addPermRoot(outPath, | ||||
|                 makeRootName(gcRoot, rootNr), | ||||
|                 indirectRoot); | ||||
|          | ||||
|         return outPath; | ||||
|     } else { | ||||
|  | @ -191,6 +188,7 @@ static void opQuery(Strings opFlags, Strings opArgs) | |||
|             for (Strings::iterator i = opArgs.begin(); | ||||
|                  i != opArgs.end(); i++) | ||||
|             { | ||||
|                 *i = followSymlinks(*i); | ||||
|                 if (forceRealise) realisePath(*i); | ||||
|                 Derivation drv = derivationFromPath(*i); | ||||
|                 cout << format("%1%\n") % findOutput(drv, "out"); | ||||
|  | @ -206,6 +204,7 @@ static void opQuery(Strings opFlags, Strings opArgs) | |||
|             for (Strings::iterator i = opArgs.begin(); | ||||
|                  i != opArgs.end(); i++) | ||||
|             { | ||||
|                 *i = followSymlinks(*i); | ||||
|                 Path path = maybeUseOutput(*i, useOutput, forceRealise); | ||||
|                 if (query == qRequisites) | ||||
|                     storePathRequisites(path, includeOutputs, paths); | ||||
|  | @ -441,8 +440,10 @@ void run(Strings args) | |||
|         else if (arg == "--add-root") { | ||||
|             if (i == args.end()) | ||||
|                 throw UsageError("`--add-root requires an argument"); | ||||
|             gcRoot = *i++; | ||||
|             gcRoot = absPath(*i++); | ||||
|         } | ||||
|         else if (arg == "--indirect") | ||||
|             indirectRoot = true; | ||||
|         else if (arg[0] == '-') | ||||
|             opFlags.push_back(arg); | ||||
|         else | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue