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