aboutsummaryrefslogtreecommitdiff
path: root/src/libutil/archive.hh
diff options
context:
space:
mode:
authorJohn Ericson <John.Ericson@Obsidian.Systems>2020-07-16 05:09:41 +0000
committerJohn Ericson <John.Ericson@Obsidian.Systems>2020-07-16 05:09:41 +0000
commit68dfb8c6aef7afebf0312c48bb5010653fc464b3 (patch)
tree771075c2311abaae41f0e17ecc8f09082755d7b0 /src/libutil/archive.hh
parent36a124260361ba8dfa43bf43a067dcc48064c93f (diff)
Optimize `addToStoreSlow` and remove `TeeParseSink`
Diffstat (limited to 'src/libutil/archive.hh')
-rw-r--r--src/libutil/archive.hh25
1 files changed, 21 insertions, 4 deletions
diff --git a/src/libutil/archive.hh b/src/libutil/archive.hh
index 302b1bb18..57780d16a 100644
--- a/src/libutil/archive.hh
+++ b/src/libutil/archive.hh
@@ -63,12 +63,29 @@ struct ParseSink
virtual void createSymlink(const Path & path, const string & target) { };
};
-struct TeeParseSink : ParseSink
+/* If the NAR archive contains a single file at top-level, then save
+ the contents of the file to `s'. Otherwise barf. */
+struct RetrieveRegularNARSink : ParseSink
{
- StringSink saved;
- TeeSource source;
+ bool regular = true;
+ Sink & sink;
- TeeParseSink(Source & source) : source(source, saved) { }
+ RetrieveRegularNARSink(Sink & sink) : sink(sink) { }
+
+ void createDirectory(const Path & path)
+ {
+ regular = false;
+ }
+
+ void receiveContents(unsigned char * data, unsigned int len)
+ {
+ sink(data, len);
+ }
+
+ void createSymlink(const Path & path, const string & target)
+ {
+ regular = false;
+ }
};
void parseDump(ParseSink & sink, Source & source);