summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Colin Cross <ccross@android.com> 2023-05-08 15:05:29 -0700
committer Colin Cross <ccross@android.com> 2023-05-09 23:19:12 +0000
commit25ff305370712354a8a6f903825833893be275cc (patch)
tree1d0aca4853d84d8a6fea8e0589b8f8be0aa7f552
parent38917496e5e87fd638dc2a5a8dff937bb436480c (diff)
Add -e argument to soong_zip to allow setting an explicit filename
soong_zip normally takes the name of the input source file as the name of the file in the zip, which is ideal for zipping up directories but not for constructing arbitrary zip files. Add a -e argument that explicitly sets the path in the zip file for the next -f argument. Bug: 254867347 Test: zip_test.go Change-Id: If9d62c1a0064a485aebddf6d2a661f63f3e60b0f
-rw-r--r--zip/cmd/main.go10
-rw-r--r--zip/zip.go15
-rw-r--r--zip/zip_test.go70
3 files changed, 94 insertions, 1 deletions
diff --git a/zip/cmd/main.go b/zip/cmd/main.go
index def76aa62..a2ccc2011 100644
--- a/zip/cmd/main.go
+++ b/zip/cmd/main.go
@@ -78,6 +78,15 @@ func (rspFiles) Set(s string) error {
return nil
}
+type explicitFile struct{}
+
+func (explicitFile) String() string { return `""` }
+
+func (explicitFile) Set(s string) error {
+ fileArgsBuilder.ExplicitPathInZip(s)
+ return nil
+}
+
type dir struct{}
func (dir) String() string { return `""` }
@@ -173,6 +182,7 @@ func main() {
flags.Var(&nonDeflatedFiles, "s", "file path to be stored within the zip without compression")
flags.Var(&relativeRoot{}, "C", "path to use as relative root of files in following -f, -l, or -D arguments")
flags.Var(&junkPaths{}, "j", "junk paths, zip files without directory names")
+ flags.Var(&explicitFile{}, "e", "filename to use in the zip file for the next -f argument")
flags.Parse(expandedArgs[1:])
diff --git a/zip/zip.go b/zip/zip.go
index 6f1a8adaf..5e1a10462 100644
--- a/zip/zip.go
+++ b/zip/zip.go
@@ -80,6 +80,7 @@ type pathMapping struct {
type FileArg struct {
PathPrefixInZip, SourcePrefixToStrip string
+ ExplicitPathInZip string
SourceFiles []string
JunkPaths bool
GlobDir string
@@ -124,6 +125,10 @@ func (b *FileArgsBuilder) File(name string) *FileArgsBuilder {
arg := b.state
arg.SourceFiles = []string{name}
b.fileArgs = append(b.fileArgs, arg)
+
+ if b.state.ExplicitPathInZip != "" {
+ b.state.ExplicitPathInZip = ""
+ }
return b
}
@@ -189,6 +194,12 @@ func (b *FileArgsBuilder) RspFile(name string) *FileArgsBuilder {
return b
}
+// ExplicitPathInZip sets the path in the zip file for the next File call.
+func (b *FileArgsBuilder) ExplicitPathInZip(s string) *FileArgsBuilder {
+ b.state.ExplicitPathInZip = s
+ return b
+}
+
func (b *FileArgsBuilder) Error() error {
if b == nil {
return nil
@@ -425,7 +436,9 @@ func fillPathPairs(fa FileArg, src string, pathMappings *[]pathMapping,
var dest string
- if fa.JunkPaths {
+ if fa.ExplicitPathInZip != "" {
+ dest = fa.ExplicitPathInZip
+ } else if fa.JunkPaths {
dest = filepath.Base(src)
} else {
var err error
diff --git a/zip/zip_test.go b/zip/zip_test.go
index e7fdea839..c64c3f499 100644
--- a/zip/zip_test.go
+++ b/zip/zip_test.go
@@ -454,6 +454,60 @@ func TestZip(t *testing.T) {
fhWithSHA256("c", fileC, zip.Deflate, sha256FileC),
},
},
+ {
+ name: "explicit path",
+ args: fileArgsBuilder().
+ ExplicitPathInZip("foo").
+ File("a/a/a").
+ File("a/a/b"),
+ compressionLevel: 9,
+
+ files: []zip.FileHeader{
+ fh("foo", fileA, zip.Deflate),
+ fh("a/a/b", fileB, zip.Deflate),
+ },
+ },
+ {
+ name: "explicit path with prefix",
+ args: fileArgsBuilder().
+ PathPrefixInZip("prefix").
+ ExplicitPathInZip("foo").
+ File("a/a/a").
+ File("a/a/b"),
+ compressionLevel: 9,
+
+ files: []zip.FileHeader{
+ fh("prefix/foo", fileA, zip.Deflate),
+ fh("prefix/a/a/b", fileB, zip.Deflate),
+ },
+ },
+ {
+ name: "explicit path with glob",
+ args: fileArgsBuilder().
+ ExplicitPathInZip("foo").
+ File("a/a/a*").
+ File("a/a/b"),
+ compressionLevel: 9,
+
+ files: []zip.FileHeader{
+ fh("foo", fileA, zip.Deflate),
+ fh("a/a/b", fileB, zip.Deflate),
+ },
+ },
+ {
+ name: "explicit path with junk paths",
+ args: fileArgsBuilder().
+ JunkPaths(true).
+ ExplicitPathInZip("foo/bar").
+ File("a/a/a*").
+ File("a/a/b"),
+ compressionLevel: 9,
+
+ files: []zip.FileHeader{
+ fh("foo/bar", fileA, zip.Deflate),
+ fh("b", fileB, zip.Deflate),
+ },
+ },
// errors
{
@@ -490,6 +544,22 @@ func TestZip(t *testing.T) {
File("d/a/a"),
err: ConflictingFileError{},
},
+ {
+ name: "error explicit path conflicting",
+ args: fileArgsBuilder().
+ ExplicitPathInZip("foo").
+ File("a/a/a").
+ ExplicitPathInZip("foo").
+ File("a/a/b"),
+ err: ConflictingFileError{},
+ },
+ {
+ name: "error explicit path conflicting glob",
+ args: fileArgsBuilder().
+ ExplicitPathInZip("foo").
+ File("a/a/*"),
+ err: ConflictingFileError{},
+ },
}
for _, test := range testCases {