Remove empty directories properly. We must remove child directories before parent directories. Change-Id: I96e83c60b5051561ec301669cd465012579c4d5e
diff --git a/cmd/gitfs-populate/main.go b/cmd/gitfs-populate/main.go index 737a4c8..2b01c58 100644 --- a/cmd/gitfs-populate/main.go +++ b/cmd/gitfs-populate/main.go
@@ -204,7 +204,11 @@ }); err != nil { return "", err } - for _, d := range dirs { + + // Reverse the ordering, so we get the deepest subdirs first. + sort.Strings(dirs) + for i := range dirs { + d := dirs[len(dirs)-1-i] // Ignore error: dir may still contain entries. os.Remove(d) }
diff --git a/cmd/gitfs-populate/main_test.go b/cmd/gitfs-populate/main_test.go index 6a4159f..f1eabd1 100644 --- a/cmd/gitfs-populate/main_test.go +++ b/cmd/gitfs-populate/main_test.go
@@ -176,3 +176,35 @@ t.Errorf("got %v, want %v", got, want) } } + +func TestClearEmptyDirs(t *testing.T) { + dir, err := createFSTree([]string{ + "ro/build/sub/sub2/p1/.gitid", + "ro/build/sub/sub2/p1/build.mk", + + "rw/build/proj/.git/HEAD", + "rw/build/proj/build.mk", + + "r3/toplevel", + }) + if err != nil { + t.Fatal("createFSTree:", err) + } + + dest := filepath.Join(dir, "rw", "build/sub/sub2/p1") + if err := os.MkdirAll(filepath.Dir(dest), 0755); err != nil { + t.Errorf("MkdirAll: %v", err) + } + if err := os.Symlink(filepath.Join(dir, "ro", "build/sub/sub2/p1"), dest); err != nil { + t.Errorf("Symlink(%s): %v", dest, err) + } + + if err := populateCheckout(filepath.Join(dir, "r3"), filepath.Join(dir, "rw")); err != nil { + t.Errorf("populateCheckout: %v", err) + } + + gone := filepath.Join(dir, "rw", "build", "sub") + if fi, err := os.Lstat(gone); err == nil { + t.Errorf("directory %s still there: %v", gone, fi) + } +}