Skip to content

Commit 18becee

Browse files
fix(parser): tighten sqlite sidecar classification
Deleted DB sidecar events need to remain classifiable, but basename-only matching is too broad once missing DB parses become complete force-replace outcomes. Unrelated files under the same provider root should not synthesize the canonical shared DB source. Restrict Zed sidecars to the watched threads directory and Shelley sidecars to the provider root, with regression tests for unrelated matching basenames.
1 parent e069617 commit 18becee

3 files changed

Lines changed: 40 additions & 3 deletions

File tree

internal/parser/shelley_provider.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,8 @@ func shelleyDBPathForEvent(root, path string) (string, bool) {
390390
return "", false
391391
}
392392
if filepath.ToSlash(rel) == shelleyDBName ||
393-
strings.HasPrefix(filepath.Base(rel), shelleyDBName+"-") {
393+
(filepath.Dir(rel) == "." &&
394+
strings.HasPrefix(filepath.Base(rel), shelleyDBName+"-")) {
394395
return filepath.Join(root, shelleyDBName), true
395396
}
396397
return "", false

internal/parser/zed_provider.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -379,8 +379,10 @@ func zedDBPathForEvent(root, path string) (string, bool) {
379379
if !ok {
380380
return "", false
381381
}
382-
if filepath.ToSlash(rel) == "threads/threads.db" ||
383-
strings.HasPrefix(filepath.Base(rel), "threads.db-") {
382+
relSlash := filepath.ToSlash(rel)
383+
if relSlash == "threads/threads.db" ||
384+
(filepath.ToSlash(filepath.Dir(rel)) == "threads" &&
385+
strings.HasPrefix(filepath.Base(rel), "threads.db-")) {
384386
return filepath.Join(root, zedThreadsDBRelPath), true
385387
}
386388
return "", false

internal/parser/zed_shelley_provider_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,23 @@ func TestZedProviderClassifiesDeletedPhysicalDB(t *testing.T) {
211211
assert.Empty(t, outcome.Results)
212212
}
213213

214+
func TestZedProviderIgnoresUnrelatedSidecarBasename(t *testing.T) {
215+
root := t.TempDir()
216+
provider, ok := NewProvider(AgentZed, ProviderConfig{Roots: []string{root}})
217+
require.True(t, ok)
218+
219+
changed, err := provider.SourcesForChangedPath(
220+
context.Background(),
221+
ChangedPathRequest{
222+
Path: filepath.Join(root, "other", "threads.db-wal"),
223+
EventKind: "remove",
224+
WatchRoot: filepath.Join(root, "other"),
225+
},
226+
)
227+
require.NoError(t, err)
228+
assert.Empty(t, changed)
229+
}
230+
214231
func TestShelleyProviderFactoryReplacesLegacyAdapter(t *testing.T) {
215232
factory, ok := ProviderFactoryByType(AgentShelley)
216233
require.True(t, ok)
@@ -419,3 +436,20 @@ func TestShelleyProviderClassifiesDeletedPhysicalDB(t *testing.T) {
419436
assert.Equal(t, SkipNoSession, outcome.SkipReason)
420437
assert.Empty(t, outcome.Results)
421438
}
439+
440+
func TestShelleyProviderIgnoresUnrelatedSidecarBasename(t *testing.T) {
441+
root := t.TempDir()
442+
provider, ok := NewProvider(AgentShelley, ProviderConfig{Roots: []string{root}})
443+
require.True(t, ok)
444+
445+
changed, err := provider.SourcesForChangedPath(
446+
context.Background(),
447+
ChangedPathRequest{
448+
Path: filepath.Join(root, "nested", shelleyDBName+"-wal"),
449+
EventKind: "remove",
450+
WatchRoot: filepath.Join(root, "nested"),
451+
},
452+
)
453+
require.NoError(t, err)
454+
assert.Empty(t, changed)
455+
}

0 commit comments

Comments
 (0)