aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr/flake
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/libexpr/flake
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/libexpr/flake')
-rw-r--r--src/libexpr/flake/flake.cc67
1 files changed, 35 insertions, 32 deletions
diff --git a/src/libexpr/flake/flake.cc b/src/libexpr/flake/flake.cc
index 72e98f6bb..20d7878e9 100644
--- a/src/libexpr/flake/flake.cc
+++ b/src/libexpr/flake/flake.cc
@@ -627,12 +627,7 @@ LockedFlake lockFlake(
debug("new lock file: %s", newLockFile);
- auto relPath = (topRef.subdir == "" ? "" : topRef.subdir + "/") + "flake.lock";
auto sourcePath = topRef.input.getSourcePath();
- auto outputLockFilePath = sourcePath ? std::optional{*sourcePath + "/" + relPath} : std::nullopt;
- if (lockFlags.outputLockFilePath) {
- outputLockFilePath = lockFlags.outputLockFilePath;
- }
/* Check whether we need to / can write the new lock file. */
if (newLockFile != oldLockFile || lockFlags.outputLockFilePath) {
@@ -640,7 +635,7 @@ LockedFlake lockFlake(
auto diff = LockFile::diff(oldLockFile, newLockFile);
if (lockFlags.writeLockFile) {
- if (outputLockFilePath) {
+ if (sourcePath || lockFlags.outputLockFilePath) {
if (auto unlockedInput = newLockFile.isUnlocked()) {
if (fetchSettings.warnDirty)
warn("will not write lock file of flake '%s' because it has an unlocked input ('%s')", topRef, *unlockedInput);
@@ -648,41 +643,49 @@ LockedFlake lockFlake(
if (!lockFlags.updateLockFile)
throw Error("flake '%s' requires lock file changes but they're not allowed due to '--no-update-lock-file'", topRef);
- bool lockFileExists = pathExists(*outputLockFilePath);
+ auto newLockFileS = fmt("%s\n", newLockFile);
- if (lockFileExists) {
- auto s = chomp(diff);
- if (s.empty())
- warn("updating lock file '%s'", *outputLockFilePath);
- else
- warn("updating lock file '%s':\n%s", *outputLockFilePath, s);
- } else
- warn("creating lock file '%s'", *outputLockFilePath);
+ if (lockFlags.outputLockFilePath)
+ writeFile(*lockFlags.outputLockFilePath, newLockFileS);
+ else {
+ auto relPath = (topRef.subdir == "" ? "" : topRef.subdir + "/") + "flake.lock";
+ auto outputLockFilePath = sourcePath ? std::optional{*sourcePath + "/" + relPath} : std::nullopt;
- newLockFile.write(*outputLockFilePath);
+ bool lockFileExists = pathExists(*outputLockFilePath);
- std::optional<std::string> commitMessage = std::nullopt;
- if (lockFlags.commitLockFile) {
- if (lockFlags.outputLockFilePath) {
- throw Error("--commit-lock-file and --output-lock-file are currently incompatible");
- }
- std::string cm;
+ if (lockFileExists) {
+ auto s = chomp(diff);
+ if (s.empty())
+ warn("updating lock file '%s'", *outputLockFilePath);
+ else
+ warn("updating lock file '%s':\n%s", *outputLockFilePath, s);
+ } else
+ warn("creating lock file '%s'", *outputLockFilePath);
- cm = fetchSettings.commitLockFileSummary.get();
+ std::optional<std::string> commitMessage = std::nullopt;
+
+ if (lockFlags.commitLockFile) {
+ if (lockFlags.outputLockFilePath) {
+ throw Error("--commit-lock-file and --output-lock-file are currently incompatible");
+ }
+ std::string cm;
- if (cm == "") {
- cm = fmt("%s: %s", relPath, lockFileExists ? "Update" : "Add");
+ cm = fetchSettings.commitLockFileSummary.get();
+
+ if (cm == "") {
+ cm = fmt("%s: %s", relPath, lockFileExists ? "Update" : "Add");
+ }
+
+ cm += "\n\nFlake lock file updates:\n\n";
+ cm += filterANSIEscapes(diff, true);
+ commitMessage = cm;
}
- cm += "\n\nFlake lock file updates:\n\n";
- cm += filterANSIEscapes(diff, true);
- commitMessage = cm;
+ topRef.input.putFile(
+ CanonPath((topRef.subdir == "" ? "" : topRef.subdir + "/") + "flake.lock"),
+ newLockFileS, commitMessage);
}
- topRef.input.markChangedFile(
- (topRef.subdir == "" ? "" : topRef.subdir + "/") + "flake.lock",
- commitMessage);
-
/* Rewriting the lockfile changed the top-level
repo, so we should re-read it. FIXME: we could
also just clear the 'rev' field... */