aboutsummaryrefslogtreecommitdiff
path: root/src/libstore
diff options
context:
space:
mode:
authorJade Lovelace <lix@jade.fyi>2024-09-11 00:27:39 -0700
committerJade Lovelace <lix@jade.fyi>2024-09-11 01:10:49 -0700
commit81c2e0ac8e76ddb3fd3c8e2ce59929853614b1b6 (patch)
treec4a2796a7aa0788baf4a2c7b8a2b615144186ffd /src/libstore
parent686120ee4a34f658b2f19dcac9f9dc44dbc98b93 (diff)
archive: rename ParseSink to NARParseVisitor
- Rename the listener to not be called a "sink". If it were a "sink" it would be eating bytes and conform with any of the Nix sink stuff (maybe FileHandle should be a Sink itself! but that's a later CL's problem). This is a parser listener. - Move the RetrieveRegularNARSink thing into store-api.cc, which is its only usage, and fix it to actually do what it is stated to do: crash if its invariants are violated. It's, of course, used to erm, unpack single-file NAR files, generated via a horrible contraption of sources and sinks that looks like a plumbing blueprint. Refactoring that is a future task. - Add a description of the invariants of NARParseVisitor in preparation of refactoring it. Change-Id: Ifca1d74d2947204a1f66349772e54dad0743e944
Diffstat (limited to 'src/libstore')
-rw-r--r--src/libstore/local-store.cc2
-rw-r--r--src/libstore/nar-accessor.cc3
-rw-r--r--src/libstore/store-api.cc35
3 files changed, 36 insertions, 4 deletions
diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc
index 4c8e2ea2f..d3520582e 100644
--- a/src/libstore/local-store.cc
+++ b/src/libstore/local-store.cc
@@ -1215,7 +1215,7 @@ void LocalStore::addToStore(const ValidPathInfo & info, Source & source,
bool narRead = false;
Finally cleanup = [&]() {
if (!narRead) {
- ParseSink sink;
+ NARParseVisitor sink;
try {
parseDump(sink, source);
} catch (...) {
diff --git a/src/libstore/nar-accessor.cc b/src/libstore/nar-accessor.cc
index f0dfcb19b..fa7d5e3cb 100644
--- a/src/libstore/nar-accessor.cc
+++ b/src/libstore/nar-accessor.cc
@@ -2,6 +2,7 @@
#include "archive.hh"
#include <map>
+#include <memory>
#include <stack>
#include <algorithm>
@@ -33,7 +34,7 @@ struct NarAccessor : public FSAccessor
NarMember root;
- struct NarIndexer : ParseSink, Source
+ struct NarIndexer : NARParseVisitor, Source
{
NarAccessor & acc;
Source & source;
diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc
index 6d9fec41b..1619e5062 100644
--- a/src/libstore/store-api.cc
+++ b/src/libstore/store-api.cc
@@ -379,6 +379,37 @@ void Store::addMultipleToStore(
}
}
+namespace {
+/**
+ * If the NAR archive contains a single file at top-level, then save
+ * the contents of the file to `s`. Otherwise assert.
+ */
+struct RetrieveRegularNARVisitor : NARParseVisitor
+{
+ Sink & sink;
+
+ RetrieveRegularNARVisitor(Sink & sink) : sink(sink) { }
+
+ void createRegularFile(const Path & path) override
+ {
+ }
+
+ void receiveContents(std::string_view data) override
+ {
+ sink(data);
+ }
+
+ void createDirectory(const Path & path) override
+ {
+ assert(false && "RetrieveRegularNARVisitor::createDirectory must not be called");
+ }
+
+ void createSymlink(const Path & path, const std::string & target) override
+ {
+ assert(false && "RetrieveRegularNARVisitor::createSymlink must not be called");
+ }
+};
+}
/*
The aim of this function is to compute in one pass the correct ValidPathInfo for
@@ -413,7 +444,7 @@ ValidPathInfo Store::addToStoreSlow(std::string_view name, const Path & srcPath,
/* Note that fileSink and unusualHashTee must be mutually exclusive, since
they both write to caHashSink. Note that that requisite is currently true
because the former is only used in the flat case. */
- RetrieveRegularNARSink fileSink { caHashSink };
+ RetrieveRegularNARVisitor fileSink { caHashSink };
TeeSink unusualHashTee { narHashSink, caHashSink };
auto & narSink = method == FileIngestionMethod::Recursive && hashAlgo != HashType::SHA256
@@ -429,7 +460,7 @@ ValidPathInfo Store::addToStoreSlow(std::string_view name, const Path & srcPath,
information to narSink. */
TeeSource tapped { fileSource, narSink };
- ParseSink blank;
+ NARParseVisitor blank;
auto & parseSink = method == FileIngestionMethod::Flat
? fileSink
: blank;