Make some params in soong_zip explicit and/or exported

in preparation to split soong_zip into a lib and a bin

Bug: 67478260
Test: m -j
Change-Id: I725da6f0c9b13069e3e5b036e2ac8cbdde9ba6bf
diff --git a/cmd/soong_zip/soong_zip.go b/cmd/soong_zip/soong_zip.go
index cb9df9a..2bcc9a5 100644
--- a/cmd/soong_zip/soong_zip.go
+++ b/cmd/soong_zip/soong_zip.go
@@ -62,12 +62,6 @@
 	io.Closer
 }
 
-type fileArg struct {
-	pathPrefixInZip, sourcePrefixToStrip string
-	sourceFiles                          []string
-	globDir                              string
-}
-
 type pathMapping struct {
 	dest, src string
 	zipMethod uint16
@@ -89,8 +83,6 @@
 	return nil
 }
 
-type fileArgs []fileArg
-
 type file struct{}
 
 type listFiles struct{}
@@ -106,10 +98,10 @@
 		return fmt.Errorf("must pass -C before -f")
 	}
 
-	fArgs = append(fArgs, fileArg{
-		pathPrefixInZip:     filepath.Clean(*rootPrefix),
-		sourcePrefixToStrip: filepath.Clean(*relativeRoot),
-		sourceFiles:         []string{s},
+	fArgs = append(fArgs, FileArg{
+		PathPrefixInZip:     filepath.Clean(*rootPrefix),
+		SourcePrefixToStrip: filepath.Clean(*relativeRoot),
+		SourceFiles:         []string{s},
 	})
 
 	return nil
@@ -129,10 +121,10 @@
 		return err
 	}
 
-	fArgs = append(fArgs, fileArg{
-		pathPrefixInZip:     filepath.Clean(*rootPrefix),
-		sourcePrefixToStrip: filepath.Clean(*relativeRoot),
-		sourceFiles:         strings.Split(string(list), "\n"),
+	fArgs = append(fArgs, FileArg{
+		PathPrefixInZip:     filepath.Clean(*rootPrefix),
+		SourcePrefixToStrip: filepath.Clean(*relativeRoot),
+		SourceFiles:         strings.Split(string(list), "\n"),
 	})
 
 	return nil
@@ -147,10 +139,10 @@
 		return fmt.Errorf("must pass -C before -D")
 	}
 
-	fArgs = append(fArgs, fileArg{
-		pathPrefixInZip:     filepath.Clean(*rootPrefix),
-		sourcePrefixToStrip: filepath.Clean(*relativeRoot),
-		globDir:             filepath.Clean(s),
+	fArgs = append(fArgs, FileArg{
+		PathPrefixInZip:     filepath.Clean(*rootPrefix),
+		SourcePrefixToStrip: filepath.Clean(*relativeRoot),
+		GlobDir:             filepath.Clean(s),
 	})
 
 	return nil
@@ -166,7 +158,7 @@
 	compLevel    = flag.Int("L", 5, "deflate compression level (0-9)")
 	emulateJar   = flag.Bool("jar", false, "modify the resultant .zip to emulate the output of 'jar'")
 
-	fArgs            fileArgs
+	fArgs            FileArgs
 	nonDeflatedFiles = make(uniqueSet)
 
 	cpuProfile = flag.String("cpuprofile", "", "write cpu profile to file")
@@ -186,7 +178,36 @@
 	os.Exit(2)
 }
 
-type zipWriter struct {
+func main() {
+	flag.Parse()
+
+	err := Run(ZipArgs{
+		FileArgs:                 fArgs,
+		OutputFilePath:           *out,
+		CpuProfileFilePath:       *cpuProfile,
+		TraceFilePath:            *traceFile,
+		EmulateJar:               *emulateJar,
+		AddDirectoryEntriesToZip: *directories,
+		CompressionLevel:         *compLevel,
+		ManifestSourcePath:       *manifest,
+		NumParallelJobs:          *parallelJobs,
+		NonDeflatedFiles:         nonDeflatedFiles,
+	})
+	if err != nil {
+		fmt.Fprintln(os.Stderr, err.Error())
+		os.Exit(1)
+	}
+}
+
+type FileArg struct {
+	PathPrefixInZip, SourcePrefixToStrip string
+	SourceFiles                          []string
+	GlobDir                              string
+}
+
+type FileArgs []FileArg
+
+type ZipWriter struct {
 	time         time.Time
 	createdFiles map[string]string
 	createdDirs  map[string]string
@@ -213,11 +234,22 @@
 	allocatedSize int64
 }
 
-func main() {
-	flag.Parse()
+type ZipArgs struct {
+	FileArgs                 FileArgs
+	OutputFilePath           string
+	CpuProfileFilePath       string
+	TraceFilePath            string
+	EmulateJar               bool
+	AddDirectoryEntriesToZip bool
+	CompressionLevel         int
+	ManifestSourcePath       string
+	NumParallelJobs          int
+	NonDeflatedFiles         map[string]bool
+}
 
-	if *cpuProfile != "" {
-		f, err := os.Create(*cpuProfile)
+func Run(args ZipArgs) (err error) {
+	if args.CpuProfileFilePath != "" {
+		f, err := os.Create(args.CpuProfileFilePath)
 		if err != nil {
 			fmt.Fprintln(os.Stderr, err.Error())
 			os.Exit(1)
@@ -227,8 +259,8 @@
 		defer pprof.StopCPUProfile()
 	}
 
-	if *traceFile != "" {
-		f, err := os.Create(*traceFile)
+	if args.TraceFilePath != "" {
+		f, err := os.Create(args.TraceFilePath)
 		if err != nil {
 			fmt.Fprintln(os.Stderr, err.Error())
 			os.Exit(1)
@@ -242,46 +274,41 @@
 		defer trace.Stop()
 	}
 
-	if *out == "" {
-		fmt.Fprintf(os.Stderr, "error: -o is required\n")
-		usage()
+	if args.OutputFilePath == "" {
+		return fmt.Errorf("output file path must be nonempty")
 	}
 
-	if *emulateJar {
-		*directories = true
+	if args.EmulateJar {
+		args.AddDirectoryEntriesToZip = true
 	}
 
-	w := &zipWriter{
+	w := &ZipWriter{
 		time:         jar.DefaultTime,
 		createdDirs:  make(map[string]string),
 		createdFiles: make(map[string]string),
-		directories:  *directories,
-		compLevel:    *compLevel,
+		directories:  args.AddDirectoryEntriesToZip,
+		compLevel:    args.CompressionLevel,
 	}
-
 	pathMappings := []pathMapping{}
 
-	for _, fa := range fArgs {
-		srcs := fa.sourceFiles
-		if fa.globDir != "" {
-			srcs = append(srcs, recursiveGlobFiles(fa.globDir)...)
+	for _, fa := range args.FileArgs {
+		srcs := fa.SourceFiles
+		if fa.GlobDir != "" {
+			srcs = append(srcs, recursiveGlobFiles(fa.GlobDir)...)
 		}
 		for _, src := range srcs {
-			if err := fillPathPairs(fa.pathPrefixInZip,
-				fa.sourcePrefixToStrip, src, &pathMappings); err != nil {
+			if err := fillPathPairs(fa.PathPrefixInZip,
+				fa.SourcePrefixToStrip, src, &pathMappings, args.NonDeflatedFiles); err != nil {
 				log.Fatal(err)
 			}
 		}
 	}
 
-	err := w.write(*out, pathMappings, *manifest)
-	if err != nil {
-		fmt.Fprintln(os.Stderr, err.Error())
-		os.Exit(1)
-	}
+	return w.write(args.OutputFilePath, pathMappings, args.ManifestSourcePath, args.EmulateJar, args.NumParallelJobs)
+
 }
 
-func fillPathPairs(prefix, rel, src string, pathMappings *[]pathMapping) error {
+func fillPathPairs(prefix, rel, src string, pathMappings *[]pathMapping, nonDeflatedFiles map[string]bool) error {
 	src = strings.TrimSpace(src)
 	if src == "" {
 		return nil
@@ -317,7 +344,7 @@
 	io.Seeker
 }
 
-func (z *zipWriter) write(out string, pathMappings []pathMapping, manifest string) error {
+func (z *ZipWriter) write(out string, pathMappings []pathMapping, manifest string, emulateJar bool, parallelJobs int) error {
 	f, err := os.Create(out)
 	if err != nil {
 		return err
@@ -346,18 +373,18 @@
 	// The RateLimit object will put the upper bounds on the number of
 	// parallel compressions and outstanding buffers.
 	z.writeOps = make(chan chan *zipEntry, 1000)
-	z.cpuRateLimiter = NewCPURateLimiter(int64(*parallelJobs))
+	z.cpuRateLimiter = NewCPURateLimiter(int64(parallelJobs))
 	z.memoryRateLimiter = NewMemoryRateLimiter(0)
 	defer func() {
 		z.cpuRateLimiter.Stop()
 		z.memoryRateLimiter.Stop()
 	}()
 
-	if manifest != "" && !*emulateJar {
+	if manifest != "" && !emulateJar {
 		return errors.New("must specify --jar when specifying a manifest via -m")
 	}
 
-	if *emulateJar {
+	if emulateJar {
 		// manifest may be empty, in which case addManifest will fill in a default
 		pathMappings = append(pathMappings, pathMapping{jar.ManifestFile, manifest, zip.Deflate})
 
@@ -369,10 +396,10 @@
 		defer close(z.writeOps)
 
 		for _, ele := range pathMappings {
-			if *emulateJar && ele.dest == jar.ManifestFile {
+			if emulateJar && ele.dest == jar.ManifestFile {
 				err = z.addManifest(ele.dest, ele.src, ele.zipMethod)
 			} else {
-				err = z.addFile(ele.dest, ele.src, ele.zipMethod)
+				err = z.addFile(ele.dest, ele.src, ele.zipMethod, emulateJar)
 			}
 			if err != nil {
 				z.errors <- err
@@ -470,7 +497,7 @@
 }
 
 // imports (possibly with compression) <src> into the zip at sub-path <dest>
-func (z *zipWriter) addFile(dest, src string, method uint16) error {
+func (z *ZipWriter) addFile(dest, src string, method uint16, emulateJar bool) error {
 	var fileSize int64
 	var executable bool
 
@@ -478,11 +505,11 @@
 		return err
 	} else if s.IsDir() {
 		if z.directories {
-			return z.writeDirectory(dest, src)
+			return z.writeDirectory(dest, src, emulateJar)
 		}
 		return nil
 	} else {
-		if err := z.writeDirectory(filepath.Dir(dest), src); err != nil {
+		if err := z.writeDirectory(filepath.Dir(dest), src, emulateJar); err != nil {
 			return err
 		}
 
@@ -523,7 +550,7 @@
 	return z.writeFileContents(header, r)
 }
 
-func (z *zipWriter) addManifest(dest string, src string, method uint16) error {
+func (z *ZipWriter) addManifest(dest string, src string, method uint16) error {
 	if prev, exists := z.createdDirs[dest]; exists {
 		return fmt.Errorf("destination %q is both a directory %q and a file %q", dest, prev, src)
 	}
@@ -531,7 +558,7 @@
 		return fmt.Errorf("destination %q has two files %q and %q", dest, prev, src)
 	}
 
-	if err := z.writeDirectory(filepath.Dir(dest), src); err != nil {
+	if err := z.writeDirectory(filepath.Dir(dest), src, true); err != nil {
 		return err
 	}
 
@@ -545,7 +572,7 @@
 	return z.writeFileContents(fh, reader)
 }
 
-func (z *zipWriter) writeFileContents(header *zip.FileHeader, r readerSeekerCloser) (err error) {
+func (z *ZipWriter) writeFileContents(header *zip.FileHeader, r readerSeekerCloser) (err error) {
 
 	header.SetModTime(z.time)
 
@@ -621,7 +648,7 @@
 	return nil
 }
 
-func (z *zipWriter) crcFile(r io.Reader, ze *zipEntry, resultChan chan *zipEntry, wg *sync.WaitGroup) {
+func (z *ZipWriter) crcFile(r io.Reader, ze *zipEntry, resultChan chan *zipEntry, wg *sync.WaitGroup) {
 	defer wg.Done()
 	defer z.cpuRateLimiter.Finish()
 
@@ -637,7 +664,7 @@
 	close(resultChan)
 }
 
-func (z *zipWriter) compressPartialFile(r io.Reader, dict []byte, last bool, resultChan chan io.Reader, wg *sync.WaitGroup) {
+func (z *ZipWriter) compressPartialFile(r io.Reader, dict []byte, last bool, resultChan chan io.Reader, wg *sync.WaitGroup) {
 	defer wg.Done()
 
 	result, err := z.compressBlock(r, dict, last)
@@ -651,7 +678,7 @@
 	resultChan <- result
 }
 
-func (z *zipWriter) compressBlock(r io.Reader, dict []byte, last bool) (*bytes.Buffer, error) {
+func (z *ZipWriter) compressBlock(r io.Reader, dict []byte, last bool) (*bytes.Buffer, error) {
 	buf := new(bytes.Buffer)
 	var fw *flate.Writer
 	var err error
@@ -685,7 +712,7 @@
 	return buf, nil
 }
 
-func (z *zipWriter) compressWholeFile(ze *zipEntry, r io.ReadSeeker, compressChan chan *zipEntry) {
+func (z *ZipWriter) compressWholeFile(ze *zipEntry, r io.ReadSeeker, compressChan chan *zipEntry) {
 
 	crc := crc32.NewIEEE()
 	_, err := io.Copy(crc, r)
@@ -758,7 +785,7 @@
 
 // writeDirectory annotates that dir is a directory created for the src file or directory, and adds
 // the directory entry to the zip file if directories are enabled.
-func (z *zipWriter) writeDirectory(dir, src string) error {
+func (z *ZipWriter) writeDirectory(dir string, src string, emulateJar bool) error {
 	// clean the input
 	dir = filepath.Clean(dir)
 
@@ -785,7 +812,7 @@
 		for _, cleanDir := range zipDirs {
 			var dirHeader *zip.FileHeader
 
-			if *emulateJar && cleanDir+"/" == jar.MetaDir {
+			if emulateJar && cleanDir+"/" == jar.MetaDir {
 				dirHeader = jar.MetaDirFileHeader()
 			} else {
 				dirHeader = &zip.FileHeader{
@@ -808,7 +835,7 @@
 	return nil
 }
 
-func (z *zipWriter) writeSymlink(rel, file string) error {
+func (z *ZipWriter) writeSymlink(rel, file string) error {
 	fileHeader := &zip.FileHeader{
 		Name: rel,
 	}