diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2023-10-25 18:18:15 +0200 |
---|---|---|
committer | lunaphied <lunaphied@lunaphied.me> | 2024-03-25 15:30:36 +0000 |
commit | b525d0f20c4fd94b89d6d34d8acd0ca4c579a5fc (patch) | |
tree | 89f2259054c2afec58c56993b70c2ed45efe5529 /src/libfetchers/git.cc | |
parent | 3d065192c08b3dcb76b9cf70cd0104974106ae8f (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.cc | 22 |
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 }); } } } |