Merge pull request #522 from lethalman/nix-collect-garbage
nix-collect-garbage: translate to C++
This commit is contained in:
		
						commit
						4bbcfaf87f
					
				
					 5 changed files with 95 additions and 66 deletions
				
			
		
							
								
								
									
										1
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										1
									
								
								Makefile
									
										
									
									
									
								
							|  | @ -10,6 +10,7 @@ makefiles = \ | ||||||
|   src/nix-instantiate/local.mk \
 |   src/nix-instantiate/local.mk \
 | ||||||
|   src/nix-env/local.mk \
 |   src/nix-env/local.mk \
 | ||||||
|   src/nix-daemon/local.mk \
 |   src/nix-daemon/local.mk \
 | ||||||
|  |   src/nix-collect-garbage/local.mk \
 | ||||||
|   src/download-via-ssh/local.mk \
 |   src/download-via-ssh/local.mk \
 | ||||||
|   src/nix-log2xml/local.mk \
 |   src/nix-log2xml/local.mk \
 | ||||||
|   src/bsdiff-4.3/local.mk \
 |   src/bsdiff-4.3/local.mk \
 | ||||||
|  |  | ||||||
|  | @ -1,7 +1,6 @@ | ||||||
| nix_bin_scripts := \
 | nix_bin_scripts := \
 | ||||||
|   $(d)/nix-build \
 |   $(d)/nix-build \
 | ||||||
|   $(d)/nix-channel \
 |   $(d)/nix-channel \
 | ||||||
|   $(d)/nix-collect-garbage \
 |  | ||||||
|   $(d)/nix-copy-closure \
 |   $(d)/nix-copy-closure \
 | ||||||
|   $(d)/nix-generate-patches \
 |   $(d)/nix-generate-patches \
 | ||||||
|   $(d)/nix-install-package \
 |   $(d)/nix-install-package \
 | ||||||
|  |  | ||||||
|  | @ -1,65 +0,0 @@ | ||||||
| #! @perl@ -w @perlFlags@ |  | ||||||
| 
 |  | ||||||
| use strict; |  | ||||||
| use Nix::Config; |  | ||||||
| 
 |  | ||||||
| my $profilesDir = "@localstatedir@/nix/profiles"; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| # Process the command line arguments. |  | ||||||
| my @args = (); |  | ||||||
| my $arg; |  | ||||||
| 
 |  | ||||||
| my $removeOld = 0; |  | ||||||
| my $gen; |  | ||||||
| my $dryRun = 0; |  | ||||||
| 
 |  | ||||||
| while ($arg = shift) { |  | ||||||
|     if ($arg eq "--delete-old" || $arg eq "-d") { |  | ||||||
|         $removeOld = 1; |  | ||||||
|         $gen = "old"; |  | ||||||
|     } elsif ($arg eq "--delete-older-than") { |  | ||||||
|         $removeOld = 1; |  | ||||||
|         $gen = shift; |  | ||||||
|     } elsif ($arg eq "--dry-run") { |  | ||||||
|         $dryRun = 1; |  | ||||||
|     } elsif ($arg eq "--help") { |  | ||||||
|         exec "man nix-collect-garbage" or die; |  | ||||||
|     } else { |  | ||||||
|         push @args, $arg; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| # If `-d' was specified, remove all old generations of all profiles. |  | ||||||
| # Of course, this makes rollbacks to before this point in time |  | ||||||
| # impossible. |  | ||||||
| 
 |  | ||||||
| sub removeOldGenerations; |  | ||||||
| sub removeOldGenerations { |  | ||||||
|     my $dir = shift; |  | ||||||
| 
 |  | ||||||
|     my $dh; |  | ||||||
|     opendir $dh, $dir or die; |  | ||||||
| 
 |  | ||||||
|     foreach my $name (sort (readdir $dh)) { |  | ||||||
|         next if $name eq "." || $name eq ".."; |  | ||||||
|         $name = $dir . "/" . $name; |  | ||||||
|         if (-l $name && (readlink($name) =~ /link/)) { |  | ||||||
|             print STDERR "removing old generations of profile $name\n"; |  | ||||||
| 
 |  | ||||||
|             system("$Nix::Config::binDir/nix-env", "-p", $name, "--delete-generations", $gen, $dryRun ? "--dry-run" : ()); |  | ||||||
|         } |  | ||||||
|         elsif (! -l $name && -d $name) { |  | ||||||
|             removeOldGenerations $name; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     closedir $dh or die; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| removeOldGenerations $profilesDir if $removeOld; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| # Run the actual garbage collector. |  | ||||||
| exec "$Nix::Config::binDir/nix-store", "--gc", @args unless $dryRun; |  | ||||||
							
								
								
									
										7
									
								
								src/nix-collect-garbage/local.mk
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/nix-collect-garbage/local.mk
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,7 @@ | ||||||
|  | programs += nix-collect-garbage | ||||||
|  | 
 | ||||||
|  | nix-collect-garbage_DIR := $(d) | ||||||
|  | 
 | ||||||
|  | nix-collect-garbage_SOURCES := $(d)/nix-collect-garbage.cc | ||||||
|  | 
 | ||||||
|  | nix-collect-garbage_LIBS = libmain libstore libutil libformat | ||||||
							
								
								
									
										87
									
								
								src/nix-collect-garbage/nix-collect-garbage.cc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								src/nix-collect-garbage/nix-collect-garbage.cc
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,87 @@ | ||||||
|  | #include "hash.hh" | ||||||
|  | #include "shared.hh" | ||||||
|  | #include "globals.hh" | ||||||
|  | 
 | ||||||
|  | #include <iostream> | ||||||
|  | 
 | ||||||
|  | using namespace nix; | ||||||
|  | 
 | ||||||
|  | std::string gen = ""; | ||||||
|  | bool dryRun = false; | ||||||
|  | 
 | ||||||
|  | void runProgramSimple(Path program, const Strings & args) | ||||||
|  | { | ||||||
|  |     checkInterrupt(); | ||||||
|  | 
 | ||||||
|  |     /* Fork. */ | ||||||
|  |     Pid pid = startProcess([&]() { | ||||||
|  |         Strings args_(args); | ||||||
|  |         args_.push_front(program); | ||||||
|  |         auto cargs = stringsToCharPtrs(args_); | ||||||
|  | 
 | ||||||
|  |         execv(program.c_str(), (char * *) &cargs[0]); | ||||||
|  | 
 | ||||||
|  |         throw SysError(format("executing ‘%1%’") % program); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     pid.wait(true); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* If `-d' was specified, remove all old generations of all profiles.
 | ||||||
|  |  * Of course, this makes rollbacks to before this point in time | ||||||
|  |  * impossible. */ | ||||||
|  | 
 | ||||||
|  | void removeOldGenerations(std::string dir) | ||||||
|  | { | ||||||
|  |     for (auto & i : readDirectory(dir)) { | ||||||
|  |         checkInterrupt(); | ||||||
|  | 
 | ||||||
|  |         auto path = dir + "/" + i.name;  | ||||||
|  |         auto type = getFileType(path); | ||||||
|  | 
 | ||||||
|  |         if (type == DT_LNK) { | ||||||
|  |             auto link = readLink(path); | ||||||
|  |             if (link.find("link") != string::npos) { | ||||||
|  |                 printMsg(lvlInfo, format("removing old generations of profile %1%") % path); | ||||||
|  | 
 | ||||||
|  |                 runProgramSimple(settings.nixBinDir + "/nix-env", Strings{"-p", path, "--delete-generations", gen, dryRun ? "--dry-run" : ""}); | ||||||
|  |             } | ||||||
|  |         } else if (type == DT_DIR) { | ||||||
|  |             removeOldGenerations(path); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int main(int argc, char * * argv) | ||||||
|  | { | ||||||
|  |     bool removeOld = false; | ||||||
|  |     Strings extraArgs; | ||||||
|  | 
 | ||||||
|  |     return handleExceptions(argv[0], [&]() { | ||||||
|  |         initNix(); | ||||||
|  | 
 | ||||||
|  |         parseCmdLine(argc, argv, [&](Strings::iterator & arg, const Strings::iterator & end) { | ||||||
|  |             if (*arg == "--help") | ||||||
|  |                 showManPage("nix-collect-garbage"); | ||||||
|  |             else if (*arg == "--version") | ||||||
|  |                 printVersion("nix-collect-garbage"); | ||||||
|  |             else if (*arg == "--delete-old" || *arg == "-d") removeOld = true; | ||||||
|  |             else if (*arg == "--delete-older-than") { | ||||||
|  |                 removeOld = true; | ||||||
|  |                 gen = getArg(*arg, arg, end); | ||||||
|  |             } | ||||||
|  |             else if (*arg == "--dry-run") dryRun = true; | ||||||
|  |             else | ||||||
|  |                 extraArgs.push_back(*arg); | ||||||
|  |             return true; | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         auto profilesDir = settings.nixStateDir + "/profiles"; | ||||||
|  |         if (removeOld) removeOldGenerations(profilesDir); | ||||||
|  | 
 | ||||||
|  |         // Run the actual garbage collector.
 | ||||||
|  |         if (!dryRun) runProgramSimple(settings.nixBinDir + "/nix-store", Strings{"--gc"}); | ||||||
|  |     }); | ||||||
|  | } | ||||||
|  | 
 | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue