* Doh! Path sizes need to be computed recursively of course.
(NIX-70)
This commit is contained in:
		
							parent
							
								
									a76efaeb3f
								
							
						
					
					
						commit
						c6a97e3b74
					
				
					 3 changed files with 28 additions and 6 deletions
				
			
		|  | @ -528,12 +528,8 @@ void collectGarbage(GCAction action, const PathSet & pathsToDelete, | ||||||
| 
 | 
 | ||||||
|         /* If just returning the set of dead paths, we also return the
 |         /* If just returning the set of dead paths, we also return the
 | ||||||
|            space that would be freed if we deleted them. */ |            space that would be freed if we deleted them. */ | ||||||
|         if (action == gcReturnDead) { |         if (action == gcReturnDead) | ||||||
|             struct stat st; |             bytesFreed += computePathSize(*i); | ||||||
|             if (lstat(i->c_str(), &st) == -1) |  | ||||||
|                 st.st_size = 0; |  | ||||||
|             bytesFreed += st.st_size; |  | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
|         if (action == gcDeleteDead || action == gcDeleteSpecific) { |         if (action == gcDeleteDead || action == gcDeleteSpecific) { | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -238,6 +238,29 @@ void writeFile(const Path & path, const string & s) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | unsigned long long computePathSize(const Path & path) | ||||||
|  | { | ||||||
|  |     unsigned long long size = 0; | ||||||
|  |      | ||||||
|  |     checkInterrupt(); | ||||||
|  | 
 | ||||||
|  |     struct stat st; | ||||||
|  |     if (lstat(path.c_str(), &st)) | ||||||
|  | 	throw SysError(format("getting attributes of path `%1%'") % path); | ||||||
|  | 
 | ||||||
|  |     size += st.st_size; | ||||||
|  | 
 | ||||||
|  |     if (S_ISDIR(st.st_mode)) { | ||||||
|  | 	Strings names = readDirectory(path); | ||||||
|  | 
 | ||||||
|  | 	for (Strings::iterator i = names.begin(); i != names.end(); ++i) | ||||||
|  |             size += computePathSize(path + "/" + *i); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return size; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| static void _deletePath(const Path & path, unsigned long long & bytesFreed) | static void _deletePath(const Path & path, unsigned long long & bytesFreed) | ||||||
| { | { | ||||||
|     checkInterrupt(); |     checkInterrupt(); | ||||||
|  |  | ||||||
|  | @ -56,6 +56,9 @@ string readFile(const Path & path); | ||||||
| /* Write a string to a file. */ | /* Write a string to a file. */ | ||||||
| void writeFile(const Path & path, const string & s); | void writeFile(const Path & path, const string & s); | ||||||
| 
 | 
 | ||||||
|  | /* Compute the sum of the sizes of all files in `path'. */ | ||||||
|  | unsigned long long computePathSize(const Path & path); | ||||||
|  | 
 | ||||||
| /* Delete a path; i.e., in the case of a directory, it is deleted
 | /* Delete a path; i.e., in the case of a directory, it is deleted
 | ||||||
|    recursively.  Don't use this at home, kids.  The second variant |    recursively.  Don't use this at home, kids.  The second variant | ||||||
|    returns the number of bytes freed. */ |    returns the number of bytes freed. */ | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue