diff options
author | John Ericson <John.Ericson@Obsidian.Systems> | 2020-07-27 14:22:45 +0000 |
---|---|---|
committer | John Ericson <John.Ericson@Obsidian.Systems> | 2020-07-27 14:22:45 +0000 |
commit | 699fc89b394ef5347ff0508abe389e77a7cde09e (patch) | |
tree | 35630ccbb1f9dae69137251b6198a71a20092c04 /src/libstore/references.cc | |
parent | 5ea817dace2b554e602d7f9df6e43084ad112e3d (diff) | |
parent | d7c0f094cbcfe1ae4ccc3d54baec00b66ccb1ed0 (diff) |
Merge remote-tracking branch 'upstream/master' into hash-always-has-type
Diffstat (limited to 'src/libstore/references.cc')
-rw-r--r-- | src/libstore/references.cc | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/src/libstore/references.cc b/src/libstore/references.cc index 4733bc388..62a3cda61 100644 --- a/src/libstore/references.cc +++ b/src/libstore/references.cc @@ -48,13 +48,12 @@ static void search(const unsigned char * s, size_t len, struct RefScanSink : Sink { - HashSink hashSink; StringSet hashes; StringSet seen; string tail; - RefScanSink() : hashSink(htSHA256) { } + RefScanSink() { } void operator () (const unsigned char * data, size_t len); }; @@ -62,8 +61,6 @@ struct RefScanSink : Sink void RefScanSink::operator () (const unsigned char * data, size_t len) { - hashSink(data, len); - /* It's possible that a reference spans the previous and current fragment, so search in the concatenation of the tail of the previous fragment and the start of the current fragment. */ @@ -82,7 +79,9 @@ void RefScanSink::operator () (const unsigned char * data, size_t len) std::pair<PathSet, HashResult> scanForReferences(const string & path, const PathSet & refs) { - RefScanSink sink; + RefScanSink refsSink; + HashSink hashSink { htSHA256 }; + TeeSink sink { refsSink, hashSink }; std::map<string, Path> backMap; /* For efficiency (and a higher hit rate), just search for the @@ -97,7 +96,7 @@ std::pair<PathSet, HashResult> scanForReferences(const string & path, assert(s.size() == refLength); assert(backMap.find(s) == backMap.end()); // parseHash(htSHA256, s); - sink.hashes.insert(s); + refsSink.hashes.insert(s); backMap[s] = i; } @@ -106,13 +105,13 @@ std::pair<PathSet, HashResult> scanForReferences(const string & path, /* Map the hashes found back to their store paths. */ PathSet found; - for (auto & i : sink.seen) { + for (auto & i : refsSink.seen) { std::map<string, Path>::iterator j; if ((j = backMap.find(i)) == backMap.end()) abort(); found.insert(j->second); } - auto hash = sink.hashSink.finish(); + auto hash = hashSink.finish(); return std::pair<PathSet, HashResult>(found, hash); } |