diff --git a/cmd/soong_zip/soong_zip.go b/cmd/soong_zip/soong_zip.go index 840778842..d634dda3c 100644 --- a/cmd/soong_zip/soong_zip.go +++ b/cmd/soong_zip/soong_zip.go @@ -646,15 +646,24 @@ func (z *zipWriter) compressWholeFile(ze *zipEntry, r *os.File, exec Execution, } 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 @@ func (z *zipWriter) writeDirectory(dir string) error { } close(ze) z.writeOps <- ze - - dir, _ = filepath.Split(dir) } return nil