mirror of
https://github.com/NixOS/nix.git
synced 2025-11-24 11:19:35 +01:00
Merge pull request #14610 from NixOS/git-accessor-options
Introduce GitAccessorOptions
This commit is contained in:
commit
eb654acdd1
6 changed files with 37 additions and 28 deletions
|
|
@ -92,7 +92,7 @@ TEST_F(GitUtilsTest, sink_basic)
|
||||||
// sink->createHardlink("foo-1.1/links/foo-2", CanonPath("foo-1.1/hello"));
|
// sink->createHardlink("foo-1.1/links/foo-2", CanonPath("foo-1.1/hello"));
|
||||||
|
|
||||||
auto result = repo->dereferenceSingletonDirectory(sink->flush());
|
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);
|
auto entries = accessor->readDirectory(CanonPath::root);
|
||||||
ASSERT_EQ(entries.size(), 5u);
|
ASSERT_EQ(entries.size(), 5u);
|
||||||
ASSERT_EQ(accessor->readFile(CanonPath("hello")), "hello world");
|
ASSERT_EQ(accessor->readFile(CanonPath("hello")), "hello world");
|
||||||
|
|
|
||||||
|
|
@ -541,14 +541,15 @@ struct GitRepoImpl : GitRepo, std::enable_shared_from_this<GitRepoImpl>
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A 'GitSourceAccessor' with no regard for export-ignore or any other transformations.
|
* A 'GitSourceAccessor' with no regard for export-ignore.
|
||||||
*/
|
*/
|
||||||
ref<GitSourceAccessor> getRawAccessor(const Hash & rev, bool smudgeLfs = false);
|
ref<GitSourceAccessor> getRawAccessor(const Hash & rev, const GitAccessorOptions & options);
|
||||||
|
|
||||||
ref<SourceAccessor>
|
ref<SourceAccessor>
|
||||||
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<SourceAccessor> getAccessor(const WorkdirInfo & wd, bool exportIgnore, MakeNotAllowedError e) override;
|
ref<SourceAccessor>
|
||||||
|
getAccessor(const WorkdirInfo & wd, const GitAccessorOptions & options, MakeNotAllowedError e) override;
|
||||||
|
|
||||||
ref<GitFileSystemObjectSink> getFileSystemObjectSink() override;
|
ref<GitFileSystemObjectSink> getFileSystemObjectSink() override;
|
||||||
|
|
||||||
|
|
@ -668,7 +669,7 @@ struct GitRepoImpl : GitRepo, std::enable_shared_from_this<GitRepoImpl>
|
||||||
|
|
||||||
Hash treeHashToNarHash(const fetchers::Settings & settings, const Hash & treeHash) override
|
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()}}};
|
fetchers::Cache::Key cacheKey{"treeHashToNarHash", {{"treeHash", treeHash.gitRev()}}};
|
||||||
|
|
||||||
|
|
@ -716,15 +717,17 @@ struct GitSourceAccessor : SourceAccessor
|
||||||
ref<GitRepoImpl> repo;
|
ref<GitRepoImpl> repo;
|
||||||
Object root;
|
Object root;
|
||||||
std::optional<lfs::Fetch> lfsFetch = std::nullopt;
|
std::optional<lfs::Fetch> lfsFetch = std::nullopt;
|
||||||
|
GitAccessorOptions options;
|
||||||
};
|
};
|
||||||
|
|
||||||
Sync<State> state_;
|
Sync<State> state_;
|
||||||
|
|
||||||
GitSourceAccessor(ref<GitRepoImpl> repo_, const Hash & rev, bool smudgeLfs)
|
GitSourceAccessor(ref<GitRepoImpl> repo_, const Hash & rev, const GitAccessorOptions & options)
|
||||||
: state_{State{
|
: state_{State{
|
||||||
.repo = repo_,
|
.repo = repo_,
|
||||||
.root = peelToTreeOrBlob(lookupObject(*repo_, hashToOID(rev)).get()),
|
.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<GitSourceAccessor> GitRepoImpl::getRawAccessor(const Hash & rev, bool smudgeLfs)
|
ref<GitSourceAccessor> GitRepoImpl::getRawAccessor(const Hash & rev, const GitAccessorOptions & options)
|
||||||
{
|
{
|
||||||
auto self = ref<GitRepoImpl>(shared_from_this());
|
auto self = ref<GitRepoImpl>(shared_from_this());
|
||||||
return make_ref<GitSourceAccessor>(self, rev, smudgeLfs);
|
return make_ref<GitSourceAccessor>(self, rev, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
ref<SourceAccessor>
|
ref<SourceAccessor>
|
||||||
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<GitRepoImpl>(shared_from_this());
|
auto self = ref<GitRepoImpl>(shared_from_this());
|
||||||
ref<GitSourceAccessor> rawGitAccessor = getRawAccessor(rev, smudgeLfs);
|
ref<GitSourceAccessor> rawGitAccessor = getRawAccessor(rev, options);
|
||||||
rawGitAccessor->setPathDisplay(std::move(displayPrefix));
|
rawGitAccessor->setPathDisplay(std::move(displayPrefix));
|
||||||
if (exportIgnore)
|
if (options.exportIgnore)
|
||||||
return make_ref<GitExportIgnoreSourceAccessor>(self, rawGitAccessor, rev);
|
return make_ref<GitExportIgnoreSourceAccessor>(self, rawGitAccessor, rev);
|
||||||
else
|
else
|
||||||
return rawGitAccessor;
|
return rawGitAccessor;
|
||||||
}
|
}
|
||||||
|
|
||||||
ref<SourceAccessor>
|
ref<SourceAccessor> GitRepoImpl::getAccessor(
|
||||||
GitRepoImpl::getAccessor(const WorkdirInfo & wd, bool exportIgnore, MakeNotAllowedError makeNotAllowedError)
|
const WorkdirInfo & wd, const GitAccessorOptions & options, MakeNotAllowedError makeNotAllowedError)
|
||||||
{
|
{
|
||||||
auto self = ref<GitRepoImpl>(shared_from_this());
|
auto self = ref<GitRepoImpl>(shared_from_this());
|
||||||
ref<SourceAccessor> fileAccessor = AllowListSourceAccessor::create(
|
ref<SourceAccessor> fileAccessor = AllowListSourceAccessor::create(
|
||||||
|
|
@ -1283,9 +1286,8 @@ GitRepoImpl::getAccessor(const WorkdirInfo & wd, bool exportIgnore, MakeNotAllow
|
||||||
boost::unordered_flat_set<CanonPath>{CanonPath::root},
|
boost::unordered_flat_set<CanonPath>{CanonPath::root},
|
||||||
std::move(makeNotAllowedError))
|
std::move(makeNotAllowedError))
|
||||||
.cast<SourceAccessor>();
|
.cast<SourceAccessor>();
|
||||||
if (exportIgnore)
|
if (options.exportIgnore)
|
||||||
return make_ref<GitExportIgnoreSourceAccessor>(self, fileAccessor, std::nullopt);
|
fileAccessor = make_ref<GitExportIgnoreSourceAccessor>(self, fileAccessor, std::nullopt);
|
||||||
else
|
|
||||||
return fileAccessor;
|
return fileAccessor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1299,7 +1301,7 @@ std::vector<std::tuple<GitRepoImpl::Submodule, Hash>> GitRepoImpl::getSubmodules
|
||||||
/* Read the .gitmodules files from this revision. */
|
/* Read the .gitmodules files from this revision. */
|
||||||
CanonPath modulesFile(".gitmodules");
|
CanonPath modulesFile(".gitmodules");
|
||||||
|
|
||||||
auto accessor = getAccessor(rev, exportIgnore, "");
|
auto accessor = getAccessor(rev, {.exportIgnore = exportIgnore}, "");
|
||||||
if (!accessor->pathExists(modulesFile))
|
if (!accessor->pathExists(modulesFile))
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
|
|
@ -1316,7 +1318,7 @@ std::vector<std::tuple<GitRepoImpl::Submodule, Hash>> GitRepoImpl::getSubmodules
|
||||||
|
|
||||||
std::vector<std::tuple<Submodule, Hash>> result;
|
std::vector<std::tuple<Submodule, Hash>> result;
|
||||||
|
|
||||||
auto rawAccessor = getRawAccessor(rev);
|
auto rawAccessor = getRawAccessor(rev, {});
|
||||||
|
|
||||||
for (auto & submodule : parseSubmodules(pathTemp)) {
|
for (auto & submodule : parseSubmodules(pathTemp)) {
|
||||||
/* Filter out .gitmodules entries that don't exist or are not
|
/* Filter out .gitmodules entries that don't exist or are not
|
||||||
|
|
|
||||||
|
|
@ -900,7 +900,8 @@ struct GitInputScheme : InputScheme
|
||||||
|
|
||||||
bool exportIgnore = getExportIgnoreAttr(input);
|
bool exportIgnore = getExportIgnoreAttr(input);
|
||||||
bool smudgeLfs = getLfsAttr(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
|
/* If the repo has submodules, fetch them and return a mounted
|
||||||
input accessor consisting of the accessor for the top-level
|
input accessor consisting of the accessor for the top-level
|
||||||
|
|
@ -967,7 +968,7 @@ struct GitInputScheme : InputScheme
|
||||||
auto exportIgnore = getExportIgnoreAttr(input);
|
auto exportIgnore = getExportIgnoreAttr(input);
|
||||||
|
|
||||||
ref<SourceAccessor> accessor =
|
ref<SourceAccessor> 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
|
/* If the repo has submodules, return a mounted input accessor
|
||||||
consisting of the accessor for the top-level repo and the
|
consisting of the accessor for the top-level repo and the
|
||||||
|
|
|
||||||
|
|
@ -351,7 +351,7 @@ struct GitArchiveInputScheme : InputScheme
|
||||||
input.attrs.insert_or_assign("lastModified", uint64_t(tarballInfo.lastModified));
|
input.attrs.insert_or_assign("lastModified", uint64_t(tarballInfo.lastModified));
|
||||||
|
|
||||||
auto accessor =
|
auto accessor =
|
||||||
settings.getTarballCache()->getAccessor(tarballInfo.treeHash, false, "«" + input.to_string() + "»");
|
settings.getTarballCache()->getAccessor(tarballInfo.treeHash, {}, "«" + input.to_string() + "»");
|
||||||
|
|
||||||
return {accessor, input};
|
return {accessor, input};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,12 @@ struct GitFileSystemObjectSink : ExtendedFileSystemObjectSink
|
||||||
virtual Hash flush() = 0;
|
virtual Hash flush() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct GitAccessorOptions
|
||||||
|
{
|
||||||
|
bool exportIgnore = false;
|
||||||
|
bool smudgeLfs = false;
|
||||||
|
};
|
||||||
|
|
||||||
struct GitRepo
|
struct GitRepo
|
||||||
{
|
{
|
||||||
virtual ~GitRepo() {}
|
virtual ~GitRepo() {}
|
||||||
|
|
@ -89,10 +95,10 @@ struct GitRepo
|
||||||
virtual bool hasObject(const Hash & oid) = 0;
|
virtual bool hasObject(const Hash & oid) = 0;
|
||||||
|
|
||||||
virtual ref<SourceAccessor>
|
virtual ref<SourceAccessor>
|
||||||
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<SourceAccessor>
|
virtual ref<SourceAccessor> getAccessor(
|
||||||
getAccessor(const WorkdirInfo & wd, bool exportIgnore, MakeNotAllowedError makeNotAllowedError) = 0;
|
const WorkdirInfo & wd, const GitAccessorOptions & options, MakeNotAllowedError makeNotAllowedError) = 0;
|
||||||
|
|
||||||
virtual ref<GitFileSystemObjectSink> getFileSystemObjectSink() = 0;
|
virtual ref<GitFileSystemObjectSink> getFileSystemObjectSink() = 0;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -136,7 +136,7 @@ static DownloadTarballResult downloadTarball_(
|
||||||
.treeHash = treeHash,
|
.treeHash = treeHash,
|
||||||
.lastModified = (time_t) getIntAttr(infoAttrs, "lastModified"),
|
.lastModified = (time_t) getIntAttr(infoAttrs, "lastModified"),
|
||||||
.immutableUrl = maybeGetStrAttr(infoAttrs, "immutableUrl"),
|
.immutableUrl = maybeGetStrAttr(infoAttrs, "immutableUrl"),
|
||||||
.accessor = settings.getTarballCache()->getAccessor(treeHash, false, displayPrefix),
|
.accessor = settings.getTarballCache()->getAccessor(treeHash, {}, displayPrefix),
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue