diff --git a/local_store.go b/local_store.go index 007b705c..09e7383d 100644 --- a/local_store.go +++ b/local_store.go @@ -410,6 +410,7 @@ func (f *fileSystemStore) Commit(consistentSnapshot bool, versions map[string]in } return nil } + // Checks if target file should be deleted needsRemoval := func(path string) bool { if consistentSnapshot { // strip out the hash @@ -422,6 +423,19 @@ func (f *fileSystemStore) Commit(consistentSnapshot bool, versions map[string]in _, ok := hashes[path] return !ok } + // Checks if folder is empty + folderNeedsRemoval := func(path string) bool { + f, err := os.Open(path) + if err != nil { + return false + } + defer f.Close() + _, err = f.Readdirnames(1) + if err == io.EOF { + return true + } + return false + } removeFile := func(path string, info os.FileInfo, err error) error { if err != nil { return err @@ -431,9 +445,17 @@ func (f *fileSystemStore) Commit(consistentSnapshot bool, versions map[string]in return err } if !info.IsDir() && isTarget(rel) && needsRemoval(rel) { + // Delete the target file if err := os.Remove(path); err != nil { return err } + // Delete the target folder too if it's empty + targetFolder := filepath.Dir(path) + if folderNeedsRemoval(targetFolder) { + if err := os.Remove(targetFolder); err != nil { + return err + } + } } return nil }