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)
+ }
+}