fix(files): пропускать пустой dedup-ключ (dotfiles) (#63)
Файлы без stem (.env, .gitignore, .npmrc) давали FileDedupKey="", и findWithinFolderDuplicates/findCrossFolderDuplicates считали их одной группой дублей и удаляли лишние. Пустой ключ больше не образует группу.
This commit is contained in:
@@ -154,6 +154,9 @@ func findWithinFolderDuplicates(indexed []ProjectFolderFile) []DedupGroup {
|
|||||||
byKey[k] = append(byKey[k], it.File)
|
byKey[k] = append(byKey[k], it.File)
|
||||||
}
|
}
|
||||||
for k, group := range byKey {
|
for k, group := range byKey {
|
||||||
|
if k == "" {
|
||||||
|
continue // dotfiles etc. have no stem: never treat as duplicates
|
||||||
|
}
|
||||||
if len(group) < 2 {
|
if len(group) < 2 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -178,6 +181,9 @@ func findCrossFolderDuplicates(indexed []ProjectFolderFile) []DedupGroup {
|
|||||||
}
|
}
|
||||||
var out []DedupGroup
|
var out []DedupGroup
|
||||||
for k, items := range byKey {
|
for k, items := range byKey {
|
||||||
|
if k == "" {
|
||||||
|
continue // dotfiles etc. have no stem: never treat as duplicates
|
||||||
|
}
|
||||||
if len(items) < 2 {
|
if len(items) < 2 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,6 +84,32 @@ func TestMergeProjectRootForDedupe(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestFindDuplicatesSkipsEmptyKey(t *testing.T) {
|
||||||
|
// Dotfiles (".env", ".gitignore", ".npmrc") normalize to an empty stem, so
|
||||||
|
// FileDedupKey is "". They are not duplicates of each other and must never
|
||||||
|
// form a dedup group that would delete one of them.
|
||||||
|
env := &FileEntry{ID: jsonNum("1"), Title: strPtr(".env")}
|
||||||
|
gitignore := &FileEntry{ID: jsonNum("2"), Title: strPtr(".gitignore")}
|
||||||
|
npmrc := &FileEntry{ID: jsonNum("3"), Title: strPtr(".npmrc")}
|
||||||
|
if FileDedupKey(env) != "" || FileDedupKey(gitignore) != "" || FileDedupKey(npmrc) != "" {
|
||||||
|
t.Fatalf("dotfiles should have empty dedup key")
|
||||||
|
}
|
||||||
|
within := []ProjectFolderFile{
|
||||||
|
{FolderID: "500", FolderTitle: "Cfg", File: env},
|
||||||
|
{FolderID: "500", FolderTitle: "Cfg", File: gitignore},
|
||||||
|
}
|
||||||
|
if groups := findWithinFolderDuplicates(within); len(groups) != 0 {
|
||||||
|
t.Fatalf("within-folder empty-key groups = %d, want 0 (%+v)", len(groups), groups)
|
||||||
|
}
|
||||||
|
cross := []ProjectFolderFile{
|
||||||
|
{FolderID: "500", FolderTitle: "Cfg", File: env},
|
||||||
|
{FolderID: "501", FolderTitle: "Other", File: npmrc},
|
||||||
|
}
|
||||||
|
if groups := findCrossFolderDuplicates(cross); len(groups) != 0 {
|
||||||
|
t.Fatalf("cross-folder empty-key groups = %d, want 0 (%+v)", len(groups), groups)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestIsTrashFolderTitle(t *testing.T) {
|
func TestIsTrashFolderTitle(t *testing.T) {
|
||||||
if !IsTrashFolderTitle("_trash-md") {
|
if !IsTrashFolderTitle("_trash-md") {
|
||||||
t.Fatal("expected trash")
|
t.Fatal("expected trash")
|
||||||
|
|||||||
Reference in New Issue
Block a user