soong_jar: combine zipWriter and zipInfo into a class

Combine the zipWriter and info arguments that are passed into every
function into a single writer class, and make all the functions
methods on the new class.

Change-Id: I29d0164578894974ceaed9482349604633de6533
diff --git a/cmd/soong_jar/soong_jar.go b/cmd/soong_jar/soong_jar.go
index 2314496..95c86c3 100644
--- a/cmd/soong_jar/soong_jar.go
+++ b/cmd/soong_jar/soong_jar.go
@@ -69,10 +69,12 @@
 	os.Exit(2)
 }
 
-type zipInfo struct {
+type zipWriter struct {
 	time        time.Time
 	createdDirs map[string]bool
 	directories bool
+
+	w *zip.Writer
 }
 
 func main() {
@@ -83,21 +85,21 @@
 		usage()
 	}
 
-	info := zipInfo{
+	w := &zipWriter{
 		time:        time.Now(),
 		createdDirs: make(map[string]bool),
 		directories: *directories,
 	}
 
 	// TODO: Go's zip implementation doesn't support increasing the compression level yet
-	err := writeZipFile(*out, listFiles, *manifest, info)
+	err := w.write(*out, listFiles, *manifest)
 	if err != nil {
 		fmt.Fprintln(os.Stderr, err.Error())
 		os.Exit(1)
 	}
 }
 
-func writeZipFile(out string, listFiles fileArgs, manifest string, info zipInfo) error {
+func (z *zipWriter) write(out string, listFiles fileArgs, manifest string) error {
 	f, err := os.Create(out)
 	if err != nil {
 		return err
@@ -110,25 +112,25 @@
 		}
 	}()
 
-	zipFile := zip.NewWriter(f)
-	defer zipFile.Close()
+	z.w = zip.NewWriter(f)
+	defer z.w.Close()
 
 	for _, listFile := range listFiles {
-		err = writeListFile(zipFile, listFile, info)
+		err = z.writeListFile(listFile)
 		if err != nil {
 			return err
 		}
 	}
 
 	for _, file := range files {
-		err = writeRelFile(zipFile, file.relativeRoot, file.file, info)
+		err = z.writeRelFile(file.relativeRoot, file.file)
 		if err != nil {
 			return err
 		}
 	}
 
 	if manifest != "" {
-		err = writeFile(zipFile, "META-INF/MANIFEST.MF", manifest, info)
+		err = z.writeFile("META-INF/MANIFEST.MF", manifest)
 		if err != nil {
 			return err
 		}
@@ -137,7 +139,7 @@
 	return nil
 }
 
-func writeListFile(zipFile *zip.Writer, listFile fileArg, info zipInfo) error {
+func (z *zipWriter) writeListFile(listFile fileArg) error {
 	list, err := ioutil.ReadFile(listFile.file)
 	if err != nil {
 		return err
@@ -150,7 +152,7 @@
 		if file == "" {
 			continue
 		}
-		err = writeRelFile(zipFile, listFile.relativeRoot, file, info)
+		err = z.writeRelFile(listFile.relativeRoot, file)
 		if err != nil {
 			return err
 		}
@@ -159,13 +161,13 @@
 	return nil
 }
 
-func writeRelFile(zipFile *zip.Writer, root, file string, info zipInfo) error {
+func (z *zipWriter) writeRelFile(root, file string) error {
 	rel, err := filepath.Rel(root, file)
 	if err != nil {
 		return err
 	}
 
-	err = writeFile(zipFile, rel, file, info)
+	err = z.writeFile(rel, file)
 	if err != nil {
 		return err
 	}
@@ -173,24 +175,12 @@
 	return nil
 }
 
-func writeFile(zipFile *zip.Writer, rel, file string, info zipInfo) error {
-	if info.directories {
+func (z *zipWriter) writeFile(rel, file string) error {
+	if z.directories {
 		dir, _ := filepath.Split(rel)
-		for dir != "" && !info.createdDirs[dir] {
-			info.createdDirs[dir] = true
-
-			dirHeader := &zip.FileHeader{
-				Name: dir,
-			}
-			dirHeader.SetMode(os.ModeDir)
-			dirHeader.SetModTime(info.time)
-
-			_, err := zipFile.CreateHeader(dirHeader)
-			if err != nil {
-				return err
-			}
-
-			dir, _ = filepath.Split(dir)
+		err := z.writeDirectory(dir)
+		if err != nil {
+			return err
 		}
 	}
 
@@ -198,9 +188,9 @@
 		Name:   rel,
 		Method: zip.Deflate,
 	}
-	fileHeader.SetModTime(info.time)
+	fileHeader.SetModTime(z.time)
 
-	out, err := zipFile.CreateHeader(fileHeader)
+	out, err := z.w.CreateHeader(fileHeader)
 	if err != nil {
 		return err
 	}
@@ -218,3 +208,24 @@
 
 	return nil
 }
+
+func (z *zipWriter) writeDirectory(dir string) error {
+	for dir != "" && !z.createdDirs[dir] {
+		z.createdDirs[dir] = true
+
+		dirHeader := &zip.FileHeader{
+			Name: dir,
+		}
+		dirHeader.SetMode(os.ModeDir)
+		dirHeader.SetModTime(z.time)
+
+		_, err := z.w.CreateHeader(dirHeader)
+		if err != nil {
+			return err
+		}
+
+		dir, _ = filepath.Split(dir)
+	}
+
+	return nil
+}