all repos — homestead @ 7ccc87cfbd9f14df91df879f9875f9049f5777eb

Code for my website

fetcher: clean up old versions

Alan Pearce
commit

7ccc87cfbd9f14df91df879f9875f9049f5777eb

parent

e2f03b8c6c5cbcdb0945b1944719b62369ede6e4

1 file changed, 40 insertions(+), 2 deletions(-)

jump to
M internal/fetcher/fetcher.gointernal/fetcher/fetcher.go
@@ -27,6 +27,7 @@ type Fetcher struct {
options *Options log *log.Logger updater events.Listener + current uint64 } type Options struct {
@@ -60,6 +61,7 @@ return errors.WithMessage(err, "could not fetch file")
} } + f.current = run err = renameio.Symlink(runID, filepath.Join(f.options.Root, "current")) if err != nil { return errors.WithMessage(err, "could not create/update symlink")
@@ -88,6 +90,41 @@
return nil } +func (f *Fetcher) CleanOldRevisions() error { + contents, err := os.ReadDir(f.options.Root) + if err != nil { + return errors.WithMessage(err, "could not read root directory") + } + for _, file := range contents { + name := file.Name() + if name == "current" { + continue + } + if numericFilename.MatchString(name) { + v, err := strconv.ParseUint(name, 10, 64) + if err != nil { + return errors.WithMessagef(err, "could not parse numeric filename %s", name) + } + if v < f.current-1 { + err := os.RemoveAll(filepath.Join(f.options.Root, name)) + if err != nil { + return errors.WithMessage(err, "could not remove folder") + } + } + } + } + + return nil +} + +func (f *Fetcher) cleanOldRevisionsAsync() { + go func() { + if err := f.CleanOldRevisions(); err != nil { + f.log.Warn("error cleaning up old revisions", "error", err) + } + }() +} + func (f *Fetcher) getFile(runID, basename string) error { filename := filepath.Join(f.options.Root, runID, basename) url := f.options.FetchURL.JoinPath(runID, basename).String()
@@ -130,12 +167,12 @@ target, err := os.Readlink(filepath.Join(f.options.Root, "current"))
if err != nil && errors.Is(err, fs.ErrNotExist) { return 0, errors.WithMessage(err, "could not stat current link") } - runID, err := strconv.ParseUint(target, 10, 64) + f.current, err = strconv.ParseUint(target, 10, 64) if err != nil { return 0, errors.WithMessagef(err, "unexpected symlink target (current -> %s)", target) } - return runID, nil + return f.current, nil } func (f *Fetcher) initialiseStorage() (uint64, error) {
@@ -150,6 +187,7 @@ f.log.Warn("could not get current version", "error", err)
} f.log.Debug("versions", "current", current, "latest", latest) + defer f.cleanOldRevisionsAsync() if latest > current { err = f.getArtefacts(latest)