aboutsummaryrefslogtreecommitdiff
path: root/src/libfetchers/git.cc
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2023-10-25 18:18:15 +0200
committerlunaphied <lunaphied@lunaphied.me>2024-03-25 15:30:36 +0000
commitb525d0f20c4fd94b89d6d34d8acd0ca4c579a5fc (patch)
tree89f2259054c2afec58c56993b70c2ed45efe5529 /src/libfetchers/git.cc
parent3d065192c08b3dcb76b9cf70cd0104974106ae8f (diff)
Input: Replace markFileChanged() by putFile()
Committing a lock file using markFileChanged() required the input to be writable by the caller in the local filesystem (using the path returned by getSourcePath()). putFile() abstracts over this. (cherry picked from commit 95d657c8b3ae4282e24628ba7426edb90c8f3942) Change-Id: Ie081c5d9eb4e923b229191c5e23ece85145557ff
Diffstat (limited to 'src/libfetchers/git.cc')
-rw-r--r--src/libfetchers/git.cc22
1 files changed, 15 insertions, 7 deletions
diff --git a/src/libfetchers/git.cc b/src/libfetchers/git.cc
index 48e1bd6e3..671779f84 100644
--- a/src/libfetchers/git.cc
+++ b/src/libfetchers/git.cc
@@ -363,7 +363,7 @@ struct GitInputScheme : InputScheme
runProgram("git", true, args, {}, true);
}
- std::optional<Path> getSourcePath(const Input & input) override
+ std::optional<Path> getSourcePath(const Input & input) const override
{
auto url = parseURL(getStrAttr(input.attrs, "url"));
if (url.scheme == "file" && !input.getRef() && !input.getRev())
@@ -371,22 +371,30 @@ struct GitInputScheme : InputScheme
return {};
}
- void markChangedFile(const Input & input, std::string_view file, std::optional<std::string> commitMsg) override
+ void putFile(
+ const Input & input,
+ const CanonPath & path,
+ std::string_view contents,
+ std::optional<std::string> commitMsg) const override
{
- auto sourcePath = getSourcePath(input);
- assert(sourcePath);
+ auto root = getSourcePath(input);
+ if (!root)
+ throw Error("cannot commit '%s' to Git repository '%s' because it's not a working tree", path, input.to_string());
+
+ writeFile((CanonPath(*root) + path).abs(), contents);
+
auto gitDir = ".git";
auto result = runProgram(RunOptions {
.program = "git",
- .args = {"-C", *sourcePath, "--git-dir", gitDir, "check-ignore", "--quiet", std::string(file)},
+ .args = {"-C", *root, "--git-dir", gitDir, "check-ignore", "--quiet", std::string(path.rel())},
});
auto exitCode = WEXITSTATUS(result.first);
if (exitCode != 0) {
// The path is not `.gitignore`d, we can add the file.
runProgram("git", true,
- { "-C", *sourcePath, "--git-dir", gitDir, "add", "--intent-to-add", "--", std::string(file) });
+ { "-C", *root, "--git-dir", gitDir, "add", "--intent-to-add", "--", std::string(path.rel()) });
if (commitMsg) {
@@ -394,7 +402,7 @@ struct GitInputScheme : InputScheme
logger->pause();
Finally restoreLogger([]() { logger->resume(); });
runProgram("git", true,
- { "-C", *sourcePath, "--git-dir", gitDir, "commit", std::string(file), "-m", *commitMsg });
+ { "-C", *root, "--git-dir", gitDir, "commit", std::string(path.rel()), "-m", *commitMsg });
}
}
}