* 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,13 +33,15 @@ 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++)
|
||||||
{
|
{
|
||||||
writeString("entry", sink);
|
if (filter(path)) {
|
||||||
writeString("(", sink);
|
writeString("entry", sink);
|
||||||
writeString("name", sink);
|
writeString("(", sink);
|
||||||
writeString(*it, sink);
|
writeString("name", sink);
|
||||||
writeString("node", sink);
|
writeString(*it, sink);
|
||||||
dump(path + "/" + *it, sink);
|
writeString("node", sink);
|
||||||
writeString(")", 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;
|
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…
Reference in a new issue