* In dumpPath(): pass a function object that allows files to be
selectively in/excluded from the dump.
This commit is contained in:
		
							parent
							
								
									3130f1f0fa
								
							
						
					
					
						commit
						b438d37558
					
				
					 2 changed files with 28 additions and 14 deletions
				
			
		|  | @ -18,10 +18,13 @@ namespace nix { | ||||||
| static string archiveVersion1 = "nix-archive-1"; | static string archiveVersion1 = "nix-archive-1"; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| static void dump(const string & path, Sink & sink); | DumpFilter defaultDumpFilter; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| static void dumpEntries(const Path & path, Sink & sink) | static void dump(const string & path, Sink & sink, DumpFilter & filter); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | static void dumpEntries(const Path & path, Sink & sink, DumpFilter & filter) | ||||||
| { | { | ||||||
|     Strings names = readDirectory(path); |     Strings names = readDirectory(path); | ||||||
|     vector<string> names2(names.begin(), names.end()); |     vector<string> names2(names.begin(), names.end()); | ||||||
|  | @ -30,15 +33,17 @@ static void dumpEntries(const Path & path, Sink & sink) | ||||||
|     for (vector<string>::iterator it = names2.begin(); |     for (vector<string>::iterator it = names2.begin(); | ||||||
|          it != names2.end(); it++) |          it != names2.end(); it++) | ||||||
|     { |     { | ||||||
|  |         if (filter(path)) { | ||||||
|             writeString("entry", sink); |             writeString("entry", sink); | ||||||
|             writeString("(", sink); |             writeString("(", sink); | ||||||
|             writeString("name", sink); |             writeString("name", sink); | ||||||
|             writeString(*it, sink); |             writeString(*it, sink); | ||||||
|             writeString("node", sink); |             writeString("node", sink); | ||||||
|         dump(path + "/" + *it, sink); |             dump(path + "/" + *it, sink, filter); | ||||||
|             writeString(")", sink); |             writeString(")", sink); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| static void dumpContents(const Path & path, unsigned int size,  | static void dumpContents(const Path & path, unsigned int size,  | ||||||
|  | @ -64,7 +69,7 @@ static void dumpContents(const Path & path, unsigned int size, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| static void dump(const Path & path, Sink & sink) | static void dump(const Path & path, Sink & sink, DumpFilter & filter) | ||||||
| { | { | ||||||
|     struct stat st; |     struct stat st; | ||||||
|     if (lstat(path.c_str(), &st)) |     if (lstat(path.c_str(), &st)) | ||||||
|  | @ -85,7 +90,7 @@ static void dump(const Path & path, Sink & sink) | ||||||
|     else if (S_ISDIR(st.st_mode)) { |     else if (S_ISDIR(st.st_mode)) { | ||||||
|         writeString("type", sink); |         writeString("type", sink); | ||||||
|         writeString("directory", sink); |         writeString("directory", sink); | ||||||
|         dumpEntries(path, sink); |         dumpEntries(path, sink, filter); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     else if (S_ISLNK(st.st_mode)) { |     else if (S_ISLNK(st.st_mode)) { | ||||||
|  | @ -101,10 +106,10 @@ static void dump(const Path & path, Sink & sink) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| void dumpPath(const Path & path, Sink & sink) | void dumpPath(const Path & path, Sink & sink, DumpFilter & filter) | ||||||
| { | { | ||||||
|     writeString(archiveVersion1, sink); |     writeString(archiveVersion1, sink); | ||||||
|     dump(path, sink); |     dump(path, sink, filter); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -45,7 +45,16 @@ namespace nix { | ||||||
| 
 | 
 | ||||||
|      `+' denotes string concatenation. */ |      `+' denotes string concatenation. */ | ||||||
| 
 | 
 | ||||||
| void dumpPath(const Path & path, Sink & sink); | struct DumpFilter | ||||||
|  | { | ||||||
|  |     virtual ~DumpFilter() { } | ||||||
|  |     virtual bool operator () (const Path & path) { return true; } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | extern DumpFilter defaultDumpFilter; | ||||||
|  | 
 | ||||||
|  | void dumpPath(const Path & path, Sink & sink, | ||||||
|  |     DumpFilter & filter = defaultDumpFilter); | ||||||
| 
 | 
 | ||||||
| void restorePath(const Path & path, Source & source); | void restorePath(const Path & path, Source & source); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue