diff --git a/repo/history.go b/repo/history.go index 21b7abc..de4eea5 100644 --- a/repo/history.go +++ b/repo/history.go @@ -1,13 +1,13 @@ package repo import ( - "fmt" "io/ioutil" "os" "path" "sort" "strings" "time" + "github.com/pkg/errors" ) const historyRepoJSONPrefix = "contentserver-repo-" @@ -50,26 +50,42 @@ func (h *history) getHistory() (files []string, err error) { } } } - sort.Strings(files) + sort.Sort(sort.Reverse(sort.StringSlice(files))) return } func (h *history) cleanup() error { - files, err := h.getHistory() + files, err := h.getFilesForCleanup(maxHistoryVersions) if err != nil { return err } - if len(files) > maxHistoryVersions { - for i := maxHistoryVersions; i < len(files); i++ { - err := os.Remove(files[i]) - if err != nil { - return fmt.Errorf("could not remove file %q got %q", files[i], err) - } + for _, f := range files { + err := os.Remove(f) + if err != nil { + return errors.Wrapf(err, "could not remove file %q", f) } } + return nil } +func (h *history) getFilesForCleanup(historyVersions int) (files []string, err error) { + contentFiles, err := h.getHistory() + if err != nil { + return nil, errors.Wrap(err, "could not generate file cleanup list") + } + if len(contentFiles) > historyVersions { + for i := historyVersions; i < len(contentFiles); i++ { + // ignore current repository file to fall back on + if contentFiles[i] == h.getCurrentFilename() { + continue + } + files = append(files, contentFiles[i]) + } + } + return files, nil +} + func (h *history) getCurrentFilename() string { return path.Join(h.varDir, historyRepoJSONPrefix+"current"+historyRepoJSONSuffix) } diff --git a/repo/history_test.go b/repo/history_test.go index 77dbe05..756c496 100644 --- a/repo/history_test.go +++ b/repo/history_test.go @@ -7,6 +7,7 @@ import ( "os" "testing" "time" + "github.com/stretchr/testify/assert" ) func testHistory() *history { @@ -45,3 +46,29 @@ func TestHistoryCleanup(t *testing.T) { t.Fatal("history too long", len(files), "instead of", maxHistoryVersions) } } + +func TestHistoryOrder(t *testing.T) { + h := testHistory() + h.varDir = "testdata/order" + + files, err := h.getHistory() + + assert.NoError(t, err) + assert.Len(t, files, 4) + assert.Equal(t, "testdata/order/contentserver-repo-current.json", files[0]) + assert.Equal(t, "testdata/order/contentserver-repo-2017-10-23.json", files[1]) + assert.Equal(t, "testdata/order/contentserver-repo-2017-10-22.json", files[2]) + assert.Equal(t, "testdata/order/contentserver-repo-2017-10-21.json", files[3]) +} + +func TestGetFilesForCleanup(t *testing.T) { + h := testHistory() + h.varDir = "testdata/order" + + files, err := h.getFilesForCleanup(2) + + assert.NoError(t,err) + assert.Len(t, files, 2) + assert.Equal(t, "testdata/order/contentserver-repo-2017-10-22.json", files[0]) + assert.Equal(t, "testdata/order/contentserver-repo-2017-10-21.json", files[1]) +} diff --git a/repo/testdata/order/contentserver-repo-2017-10-21.json b/repo/testdata/order/contentserver-repo-2017-10-21.json new file mode 100644 index 0000000..e69de29 diff --git a/repo/testdata/order/contentserver-repo-2017-10-22.json b/repo/testdata/order/contentserver-repo-2017-10-22.json new file mode 100644 index 0000000..e69de29 diff --git a/repo/testdata/order/contentserver-repo-2017-10-23.json b/repo/testdata/order/contentserver-repo-2017-10-23.json new file mode 100644 index 0000000..e69de29 diff --git a/repo/testdata/order/contentserver-repo-current.json b/repo/testdata/order/contentserver-repo-current.json new file mode 100644 index 0000000..e69de29