aboutsummaryrefslogtreecommitdiff
path: root/cmd/krino/sort.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/krino/sort.go')
-rw-r--r--cmd/krino/sort.go17
1 files changed, 13 insertions, 4 deletions
diff --git a/cmd/krino/sort.go b/cmd/krino/sort.go
index 637587d..f600475 100644
--- a/cmd/krino/sort.go
+++ b/cmd/krino/sort.go
@@ -119,10 +119,11 @@ func cmdSort(g *globals, names []string, stdout, stderr io.Writer) int {
exit := 0
printed := false
jsonDirs := []plan.JSONDir{} // never nil: the document's "dirs" must marshal as [], not null
- // A3: one Claims for the whole run, shared across every directory's
- // Plan call below, so two directories that both plan a move to the
- // same destination resolve the collision at planning time instead of
- // each independently believing it owns that path.
+ // A3: in a dry run one Claims is shared across every directory's Plan
+ // call below, so two directories that both plan a move to the same
+ // destination resolve the collision at planning time instead of each
+ // independently believing it owns that path. A real run applies each
+ // directory before planning the next and starts fresh claims after it.
claims := plan.NewClaims()
for _, d := range e.Dirs {
@@ -281,6 +282,14 @@ func cmdSort(g *globals, names []string, stdout, stderr io.Writer) int {
if quit {
break
}
+ if !g.dry {
+ // This directory is applied (or skipped) now, so the disk is the
+ // truth for the next one: its claims - sources it moved away,
+ // destinations it planned but declined or failed - must not
+ // block a later directory (triage 28i). A dry run applies
+ // nothing, so there they carry over.
+ claims = plan.NewClaims()
+ }
}
if g.json {