1
1
Fork 0
mirror of https://github.com/NixOS/nix.git synced 2025-11-08 19:46:02 +01:00

NullFileSystemObjectSink: Skip over file contents

This commit is contained in:
Eelco Dolstra 2025-10-17 18:32:47 +02:00
parent daa7e0d2e9
commit 67bffa19a5
3 changed files with 16 additions and 1 deletions

View file

@ -132,6 +132,11 @@ static void parseContents(CreateRegularFileSink & sink, Source & source)
sink.preallocateContents(size); sink.preallocateContents(size);
if (sink.skipContents) {
source.skip(size + (size % 8 ? 8 - (size % 8) : 0));
return;
}
uint64_t left = size; uint64_t left = size;
std::array<char, 65536> buf; std::array<char, 65536> buf;
@ -166,7 +171,7 @@ static void parse(FileSystemObjectSink & sink, Source & source, const CanonPath
auto expectTag = [&](std::string_view expected) { auto expectTag = [&](std::string_view expected) {
auto tag = getString(); auto tag = getString();
if (tag != expected) if (tag != expected)
throw badArchive("expected tag '%s', got '%s'", expected, tag); throw badArchive("expected tag '%s', got '%s'", expected, tag.substr(0, 1024));
}; };
expectTag("("); expectTag("(");

View file

@ -196,6 +196,8 @@ void NullFileSystemObjectSink::createRegularFile(
void isExecutable() override {} void isExecutable() override {}
} crf; } crf;
crf.skipContents = true;
// Even though `NullFileSystemObjectSink` doesn't do anything, it's important // Even though `NullFileSystemObjectSink` doesn't do anything, it's important
// that we call the function, to e.g. advance the parser using this // that we call the function, to e.g. advance the parser using this
// sink. // sink.

View file

@ -14,6 +14,14 @@ namespace nix {
*/ */
struct CreateRegularFileSink : Sink struct CreateRegularFileSink : Sink
{ {
/**
* If set to true, the sink will not be called with the contents
* of the file. `preallocateContents()` will still be called to
* convey the file size. Useful for sinks that want to efficiently
* discard the contents of the file.
*/
bool skipContents = false;
virtual void isExecutable() = 0; virtual void isExecutable() = 0;
/** /**