aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr/flake
diff options
context:
space:
mode:
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... */