Skip to content

Commit e7adb12

Browse files
authored
fix(ssh): deduplicate resolved Poolside targets (#1260)
Poolside support in #1241 registered three platform-specific default directories behind the single `POOLSIDE_DIR` override. The SSH resolver evaluates that override while iterating each default, so a non-empty override emits the same `trajectories` target three times. The Linux fallback correction in #1258 changed one default path but did not cause or resolve this duplication. Deduplicate resolved directory targets per agent before archive construction, preserving first-seen order and allowing different agents to share a path independently. Strengthen the Poolside override regression to require one parsed transfer target. This addresses the post-merge roborev finding on #1241. Co-authored-by: Matthew Jacobs <mjacobs@users.noreply.github.com>
1 parent 1989908 commit e7adb12

2 files changed

Lines changed: 17 additions & 3 deletions

File tree

internal/ssh/resolve.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -372,9 +372,9 @@ func resolveAgentHasOnDiskSource(def parser.AgentDef) bool {
372372
}
373373
}
374374

375-
// parseResolvedTargets parses script output into agent root paths,
376-
// agent-scoped files, and a deduplicated list of extra files (records
377-
// tagged with resolveFilePrefix). Generated resolver output is
375+
// parseResolvedTargets parses script output into deduplicated agent root paths,
376+
// agent-scoped files, and extra files (records tagged with resolveFilePrefix).
377+
// Generated resolver output is
378378
// NUL-delimited so remote paths containing newlines cannot inject extra
379379
// records; newline-delimited input is accepted only for older tests and
380380
// defensive compatibility. Most agent targets are directories; Aider
@@ -386,6 +386,7 @@ func parseResolvedTargets(
386386
dirs := make(map[parser.AgentType][]string)
387387
files := make(map[parser.AgentType][]string)
388388
var extraFiles []string
389+
seenDir := make(map[parser.AgentType]map[string]struct{})
389390
seenFile := make(map[string]struct{})
390391
seenAgentFile := make(map[parser.AgentType]map[string]struct{})
391392
for _, record := range resolveOutputRecords(output) {
@@ -431,6 +432,15 @@ func parseResolvedTargets(
431432
path.Base(value) != parser.AiderHistoryFileName() {
432433
continue
433434
}
435+
seen, ok := seenDir[at]
436+
if !ok {
437+
seen = make(map[string]struct{})
438+
seenDir[at] = seen
439+
}
440+
if _, dup := seen[value]; dup {
441+
continue
442+
}
443+
seen[value] = struct{}{}
434444
dirs[at] = append(dirs[at], value)
435445
}
436446
return dirs, files, extraFiles

internal/ssh/resolve_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -774,6 +774,10 @@ func TestResolveScriptPoolsideTrajectoriesRoot(t *testing.T) {
774774

775775
out := runResolveScriptForTest(t, "HOME="+home, "POOLSIDE_DIR="+trajectoriesDir)
776776

777+
dirs, _ := parseResolvedDirs(string(out))
778+
assert.Equal(t, []string{trajectoriesDir}, dirs[parser.AgentPoolside],
779+
"the environment override must produce one transfer target")
780+
777781
records := resolveOutputRecords(string(out))
778782
agentSuffix := filepath.ToSlash(filepath.Join("poolside", "trajectories"))
779783
assert.True(t, hasRecordWithPathSuffix(records,

0 commit comments

Comments
 (0)