diff --git a/internal/sites/sites.go b/internal/sites/sites.go index a6d98db..7d274eb 100644 --- a/internal/sites/sites.go +++ b/internal/sites/sites.go @@ -100,6 +100,22 @@ func (m *Manager) Sync() error { if err != nil { return err } + wanted := make(map[string]struct{}, len(all)) + for _, dm := range all { + wanted[dm.Domain] = struct{}{} + } + entries, err := os.ReadDir(m.domDir) + if err != nil { + return err + } + for _, entry := range entries { + if _, ok := wanted[entry.Name()]; ok { + continue + } + if err := os.RemoveAll(filepath.Join(m.domDir, entry.Name())); err != nil { + return err + } + } for _, dm := range all { if err := m.link(dm.Domain, dm.Username); err != nil { return err diff --git a/internal/sites/sites_test.go b/internal/sites/sites_test.go index b408485..7108520 100644 --- a/internal/sites/sites_test.go +++ b/internal/sites/sites_test.go @@ -111,6 +111,31 @@ func TestManagerAddRemoveSyncAsk(t *testing.T) { } } +func TestSyncRemovesStaleDomainEntries(t *testing.T) { + dir := t.TempDir() + st, err := store.Open(filepath.Join(dir, "test.db")) + if err != nil { + t.Fatal(err) + } + defer st.Close() + + m, err := NewManager(st, dir) + if err != nil { + t.Fatal(err) + } + stale := filepath.Join(dir, "domains", "stale.example.com") + if err := os.WriteFile(stale, []byte("stale"), 0o644); err != nil { + t.Fatal(err) + } + + if err := m.Sync(); err != nil { + t.Fatal(err) + } + if _, err := os.Lstat(stale); !os.IsNotExist(err) { + t.Errorf("expected stale domain entry removed, got err=%v", err) + } +} + func TestAskUserSubdomain(t *testing.T) { t.Setenv("AGENTBBS_HOST", "bbs.profullstack.com") dir := t.TempDir()