From e273e5c7eacde03c75a41d052578e0b47865b375 Mon Sep 17 00:00:00 2001 From: LTLA Date: Mon, 27 Jan 2025 09:13:58 -0800 Subject: [PATCH] Remove all existing (potentially obsolete) ..links files during reindexing. --- transfer.go | 6 ++++++ transfer_test.go | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/transfer.go b/transfer.go index a5f7ddb..05e3b46 100644 --- a/transfer.go +++ b/transfer.go @@ -541,6 +541,12 @@ func reindexDirectory(registry, project, asset, version string) error { if info.IsDir() { return filepath.SkipDir } else { + if base == linksFileName { + err := os.Remove(src_path) + if err != nil { + return fmt.Errorf("failed to remove old ..links file at %q; %w", src_path, err) + } + } return nil } } diff --git a/transfer_test.go b/transfer_test.go index 525e7ba..a16bdb8 100644 --- a/transfer_test.go +++ b/transfer_test.go @@ -1156,6 +1156,31 @@ func TestReindexDirectorySimple(t *testing.T) { if err != nil { t.Fatal(err) } + + // What happens if we inject a ..links file in there? + lpath := filepath.Join(v_path, linksFileName) + err = os.WriteFile(lpath, []byte{}, 0644) + if err != nil { + t.Fatal(err) + } + + lpath2 := filepath.Join(v_path, "moves", "electric", linksFileName) + err = os.WriteFile(lpath2, []byte{}, 0644) + if err != nil { + t.Fatal(err) + } + + err = reindexDirectory(reg, project, asset, version) + if err != nil { + t.Fatalf("failed to reindex directory; %v", err) + } + + if _, err := os.Stat(lpath); err == nil || !errors.Is(err, os.ErrNotExist) { + t.Error("expected existing ..links file to be deleted") + } + if _, err := os.Stat(lpath2); err == nil || !errors.Is(err, os.ErrNotExist) { + t.Error("expected existing nested ..links file to be deleted") + } } func TestReindexDirectorySkipHidden(t *testing.T) { @@ -1314,6 +1339,17 @@ func TestReindexDirectoryRegistryLinks(t *testing.T) { if err != nil { t.Fatal(err) } + + // Confirming that we have ..links files. + _, found := recovered[linksFileName] + if !found { + t.Error("missing a top-level ..links file") + } + + _, found = recovered[filepath.Join("moves", "electric", linksFileName)] + if !found { + t.Error("missing a nested ..links file") + } } func TestReindexDirectoryRegistryLinkFailures(t *testing.T) {