diff --git a/src/libfetchers-tests/git-utils.cc b/src/libfetchers-tests/git-utils.cc index 774934d26..762e39ad6 100644 --- a/src/libfetchers-tests/git-utils.cc +++ b/src/libfetchers-tests/git-utils.cc @@ -92,7 +92,7 @@ TEST_F(GitUtilsTest, sink_basic) // sink->createHardlink("foo-1.1/links/foo-2", CanonPath("foo-1.1/hello")); auto result = repo->dereferenceSingletonDirectory(sink->flush()); - auto accessor = repo->getAccessor(result, false, getRepoName()); + auto accessor = repo->getAccessor(result, {}, getRepoName()); auto entries = accessor->readDirectory(CanonPath::root); ASSERT_EQ(entries.size(), 5u); ASSERT_EQ(accessor->readFile(CanonPath("hello")), "hello world"); diff --git a/src/libfetchers/git-utils.cc b/src/libfetchers/git-utils.cc index 770ef894c..14504ee0b 100644 --- a/src/libfetchers/git-utils.cc +++ b/src/libfetchers/git-utils.cc @@ -541,14 +541,15 @@ struct GitRepoImpl : GitRepo, std::enable_shared_from_this } /** - * A 'GitSourceAccessor' with no regard for export-ignore or any other transformations. + * A 'GitSourceAccessor' with no regard for export-ignore. */ - ref getRawAccessor(const Hash & rev, bool smudgeLfs = false); + ref getRawAccessor(const Hash & rev, const GitAccessorOptions & options); ref - getAccessor(const Hash & rev, bool exportIgnore, std::string displayPrefix, bool smudgeLfs = false) override; + getAccessor(const Hash & rev, const GitAccessorOptions & options, std::string displayPrefix) override; - ref getAccessor(const WorkdirInfo & wd, bool exportIgnore, MakeNotAllowedError e) override; + ref + getAccessor(const WorkdirInfo & wd, const GitAccessorOptions & options, MakeNotAllowedError e) override; ref getFileSystemObjectSink() override; @@ -668,7 +669,7 @@ struct GitRepoImpl : GitRepo, std::enable_shared_from_this Hash treeHashToNarHash(const fetchers::Settings & settings, const Hash & treeHash) override { - auto accessor = getAccessor(treeHash, false, ""); + auto accessor = getAccessor(treeHash, {}, ""); fetchers::Cache::Key cacheKey{"treeHashToNarHash", {{"treeHash", treeHash.gitRev()}}}; @@ -716,15 +717,17 @@ struct GitSourceAccessor : SourceAccessor ref repo; Object root; std::optional lfsFetch = std::nullopt; + GitAccessorOptions options; }; Sync state_; - GitSourceAccessor(ref repo_, const Hash & rev, bool smudgeLfs) + GitSourceAccessor(ref repo_, const Hash & rev, const GitAccessorOptions & options) : state_{State{ .repo = repo_, .root = peelToTreeOrBlob(lookupObject(*repo_, hashToOID(rev)).get()), - .lfsFetch = smudgeLfs ? std::make_optional(lfs::Fetch(*repo_, hashToOID(rev))) : std::nullopt, + .lfsFetch = options.smudgeLfs ? std::make_optional(lfs::Fetch(*repo_, hashToOID(rev))) : std::nullopt, + .options = options, }} { } @@ -1254,26 +1257,26 @@ struct GitFileSystemObjectSinkImpl : GitFileSystemObjectSink } }; -ref GitRepoImpl::getRawAccessor(const Hash & rev, bool smudgeLfs) +ref GitRepoImpl::getRawAccessor(const Hash & rev, const GitAccessorOptions & options) { auto self = ref(shared_from_this()); - return make_ref(self, rev, smudgeLfs); + return make_ref(self, rev, options); } ref -GitRepoImpl::getAccessor(const Hash & rev, bool exportIgnore, std::string displayPrefix, bool smudgeLfs) +GitRepoImpl::getAccessor(const Hash & rev, const GitAccessorOptions & options, std::string displayPrefix) { auto self = ref(shared_from_this()); - ref rawGitAccessor = getRawAccessor(rev, smudgeLfs); + ref rawGitAccessor = getRawAccessor(rev, options); rawGitAccessor->setPathDisplay(std::move(displayPrefix)); - if (exportIgnore) + if (options.exportIgnore) return make_ref(self, rawGitAccessor, rev); else return rawGitAccessor; } -ref -GitRepoImpl::getAccessor(const WorkdirInfo & wd, bool exportIgnore, MakeNotAllowedError makeNotAllowedError) +ref GitRepoImpl::getAccessor( + const WorkdirInfo & wd, const GitAccessorOptions & options, MakeNotAllowedError makeNotAllowedError) { auto self = ref(shared_from_this()); ref fileAccessor = AllowListSourceAccessor::create( @@ -1283,10 +1286,9 @@ GitRepoImpl::getAccessor(const WorkdirInfo & wd, bool exportIgnore, MakeNotAllow boost::unordered_flat_set{CanonPath::root}, std::move(makeNotAllowedError)) .cast(); - if (exportIgnore) - return make_ref(self, fileAccessor, std::nullopt); - else - return fileAccessor; + if (options.exportIgnore) + fileAccessor = make_ref(self, fileAccessor, std::nullopt); + return fileAccessor; } ref GitRepoImpl::getFileSystemObjectSink() @@ -1299,7 +1301,7 @@ std::vector> GitRepoImpl::getSubmodules /* Read the .gitmodules files from this revision. */ CanonPath modulesFile(".gitmodules"); - auto accessor = getAccessor(rev, exportIgnore, ""); + auto accessor = getAccessor(rev, {.exportIgnore = exportIgnore}, ""); if (!accessor->pathExists(modulesFile)) return {}; @@ -1316,7 +1318,7 @@ std::vector> GitRepoImpl::getSubmodules std::vector> result; - auto rawAccessor = getRawAccessor(rev); + auto rawAccessor = getRawAccessor(rev, {}); for (auto & submodule : parseSubmodules(pathTemp)) { /* Filter out .gitmodules entries that don't exist or are not diff --git a/src/libfetchers/git.cc b/src/libfetchers/git.cc index 0fbb6148d..75e3f1214 100644 --- a/src/libfetchers/git.cc +++ b/src/libfetchers/git.cc @@ -900,7 +900,8 @@ struct GitInputScheme : InputScheme bool exportIgnore = getExportIgnoreAttr(input); bool smudgeLfs = getLfsAttr(input); - auto accessor = repo->getAccessor(rev, exportIgnore, "«" + input.to_string() + "»", smudgeLfs); + auto accessor = repo->getAccessor( + rev, {.exportIgnore = exportIgnore, .smudgeLfs = smudgeLfs}, "«" + input.to_string() + "»"); /* If the repo has submodules, fetch them and return a mounted input accessor consisting of the accessor for the top-level @@ -967,7 +968,7 @@ struct GitInputScheme : InputScheme auto exportIgnore = getExportIgnoreAttr(input); ref accessor = - repo->getAccessor(repoInfo.workdirInfo, exportIgnore, makeNotAllowedError(repoPath)); + repo->getAccessor(repoInfo.workdirInfo, {.exportIgnore = exportIgnore}, makeNotAllowedError(repoPath)); /* If the repo has submodules, return a mounted input accessor consisting of the accessor for the top-level repo and the diff --git a/src/libfetchers/github.cc b/src/libfetchers/github.cc index b9ae06c7c..cd7ce1b4e 100644 --- a/src/libfetchers/github.cc +++ b/src/libfetchers/github.cc @@ -351,7 +351,7 @@ struct GitArchiveInputScheme : InputScheme input.attrs.insert_or_assign("lastModified", uint64_t(tarballInfo.lastModified)); auto accessor = - settings.getTarballCache()->getAccessor(tarballInfo.treeHash, false, "«" + input.to_string() + "»"); + settings.getTarballCache()->getAccessor(tarballInfo.treeHash, {}, "«" + input.to_string() + "»"); return {accessor, input}; } diff --git a/src/libfetchers/include/nix/fetchers/git-utils.hh b/src/libfetchers/include/nix/fetchers/git-utils.hh index 19b5f0f6b..8ed48a7b5 100644 --- a/src/libfetchers/include/nix/fetchers/git-utils.hh +++ b/src/libfetchers/include/nix/fetchers/git-utils.hh @@ -22,6 +22,12 @@ struct GitFileSystemObjectSink : ExtendedFileSystemObjectSink virtual Hash flush() = 0; }; +struct GitAccessorOptions +{ + bool exportIgnore = false; + bool smudgeLfs = false; +}; + struct GitRepo { virtual ~GitRepo() {} @@ -89,10 +95,10 @@ struct GitRepo virtual bool hasObject(const Hash & oid) = 0; virtual ref - getAccessor(const Hash & rev, bool exportIgnore, std::string displayPrefix, bool smudgeLfs = false) = 0; + getAccessor(const Hash & rev, const GitAccessorOptions & options, std::string displayPrefix) = 0; - virtual ref - getAccessor(const WorkdirInfo & wd, bool exportIgnore, MakeNotAllowedError makeNotAllowedError) = 0; + virtual ref getAccessor( + const WorkdirInfo & wd, const GitAccessorOptions & options, MakeNotAllowedError makeNotAllowedError) = 0; virtual ref getFileSystemObjectSink() = 0; diff --git a/src/libfetchers/tarball.cc b/src/libfetchers/tarball.cc index 4f1498156..b1ebd749d 100644 --- a/src/libfetchers/tarball.cc +++ b/src/libfetchers/tarball.cc @@ -136,7 +136,7 @@ static DownloadTarballResult downloadTarball_( .treeHash = treeHash, .lastModified = (time_t) getIntAttr(infoAttrs, "lastModified"), .immutableUrl = maybeGetStrAttr(infoAttrs, "immutableUrl"), - .accessor = settings.getTarballCache()->getAccessor(treeHash, false, displayPrefix), + .accessor = settings.getTarballCache()->getAccessor(treeHash, {}, displayPrefix), }; };