Have soong_zip add entries for ancestor directories
Bug: 64536066
Test: When I run:
$ mkdir -p a/b/c
$ touch a/b/c/d
$ soong_zip -o test.zip -d -C . -f a/b/c/d
$ zipinfo -1 test.zip
a/b/c/
a/b/c/d
I should get:
a/
a/b/
a/b/c/
a/b/c/d
Change-Id: I779bb48062dfaf88a70fab08d8d98d1e366087b3
diff --git a/cmd/soong_zip/soong_zip.go b/cmd/soong_zip/soong_zip.go
index 8407788..d634dda 100644
--- a/cmd/soong_zip/soong_zip.go
+++ b/cmd/soong_zip/soong_zip.go
@@ -646,15 +646,24 @@
}
func (z *zipWriter) writeDirectory(dir string) error {
- if dir != "" && !strings.HasSuffix(dir, "/") {
- dir = dir + "/"
+ // clean the input
+ cleanDir := filepath.Clean(dir)
+
+ // discover any uncreated directories in the path
+ zipDirs := []string{}
+ for cleanDir != "" && cleanDir != "." && !z.createdDirs[cleanDir] {
+
+ z.createdDirs[cleanDir] = true
+ // parent directories precede their children
+ zipDirs = append([]string{cleanDir}, zipDirs...)
+
+ cleanDir = filepath.Dir(cleanDir)
}
- for dir != "" && dir != "./" && !z.createdDirs[dir] {
- z.createdDirs[dir] = true
-
+ // make a directory entry for each uncreated directory
+ for _, cleanDir := range zipDirs {
dirHeader := &zip.FileHeader{
- Name: dir,
+ Name: cleanDir + "/",
}
dirHeader.SetMode(0700 | os.ModeDir)
dirHeader.SetModTime(z.time)
@@ -665,8 +674,6 @@
}
close(ze)
z.writeOps <- ze
-
- dir, _ = filepath.Split(dir)
}
return nil