From b438d37558eab56a2927771013c9080675381ba8 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 12 Dec 2006 21:51:02 +0000 Subject: [PATCH] * In dumpPath(): pass a function object that allows files to be selectively in/excluded from the dump. --- src/libutil/archive.cc | 31 ++++++++++++++++++------------- src/libutil/archive.hh | 11 ++++++++++- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/libutil/archive.cc b/src/libutil/archive.cc index e3bd63db0b..4aedd31f76 100644 --- a/src/libutil/archive.cc +++ b/src/libutil/archive.cc @@ -18,10 +18,13 @@ namespace nix { 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); vector names2(names.begin(), names.end()); @@ -30,13 +33,15 @@ static void dumpEntries(const Path & path, Sink & sink) for (vector::iterator it = names2.begin(); it != names2.end(); it++) { - writeString("entry", sink); - writeString("(", sink); - writeString("name", sink); - writeString(*it, sink); - writeString("node", sink); - dump(path + "/" + *it, sink); - writeString(")", sink); + if (filter(path)) { + writeString("entry", sink); + writeString("(", sink); + writeString("name", sink); + writeString(*it, sink); + writeString("node", sink); + dump(path + "/" + *it, sink, filter); + writeString(")", sink); + } } } @@ -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; 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)) { writeString("type", sink); writeString("directory", sink); - dumpEntries(path, sink); + dumpEntries(path, sink, filter); } 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); - dump(path, sink); + dump(path, sink, filter); } diff --git a/src/libutil/archive.hh b/src/libutil/archive.hh index c70ef3f1c8..70e836055c 100644 --- a/src/libutil/archive.hh +++ b/src/libutil/archive.hh @@ -45,7 +45,16 @@ namespace nix { `+' 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);