diff options
Diffstat (limited to 'zip/zip.go')
-rw-r--r-- | zip/zip.go | 56 |
1 files changed, 39 insertions, 17 deletions
diff --git a/zip/zip.go b/zip/zip.go index 95520fe31..c878a0cce 100644 --- a/zip/zip.go +++ b/zip/zip.go @@ -32,6 +32,8 @@ import ( "sync" "time" + "github.com/google/blueprint/pathtools" + "android/soong/jar" "android/soong/third_party/zip" ) @@ -127,6 +129,7 @@ type ZipArgs struct { ManifestSourcePath string NumParallelJobs int NonDeflatedFiles map[string]bool + WriteIfChanged bool } func Run(args ZipArgs) (err error) { @@ -186,8 +189,38 @@ func Run(args ZipArgs) (err error) { } } - return w.write(args.OutputFilePath, pathMappings, args.ManifestSourcePath, args.EmulateJar, args.NumParallelJobs) + buf := &bytes.Buffer{} + var out io.Writer = buf + + if !args.WriteIfChanged { + f, err := os.Create(args.OutputFilePath) + if err != nil { + return err + } + + defer f.Close() + defer func() { + if err != nil { + os.Remove(args.OutputFilePath) + } + }() + + out = f + } + + err = w.write(out, pathMappings, args.ManifestSourcePath, args.EmulateJar, args.NumParallelJobs) + if err != nil { + return err + } + if args.WriteIfChanged { + err := pathtools.WriteFileIfChanged(args.OutputFilePath, buf.Bytes(), 0666) + if err != nil { + return err + } + } + + return nil } func fillPathPairs(prefix, rel, src string, pathMappings *[]pathMapping, nonDeflatedFiles map[string]bool) error { @@ -226,19 +259,7 @@ type readerSeekerCloser interface { io.Seeker } -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 - } - - defer f.Close() - defer func() { - if err != nil { - os.Remove(out) - } - }() - +func (z *ZipWriter) write(f io.Writer, pathMappings []pathMapping, manifest string, emulateJar bool, parallelJobs int) error { z.errors = make(chan error) defer close(z.errors) @@ -324,6 +345,7 @@ func (z *ZipWriter) write(out string, pathMappings []pathMapping, manifest strin case op := <-writeOpChan: currentWriteOpChan = nil + var err error if op.fh.Method == zip.Deflate { currentWriter, err = zipw.CreateCompressedHeader(op.fh) } else { @@ -356,21 +378,21 @@ func (z *ZipWriter) write(out string, pathMappings []pathMapping, manifest strin currentReader = futureReader case reader := <-currentReader: - _, err = io.Copy(currentWriter, reader) + _, err := io.Copy(currentWriter, reader) if err != nil { return err } currentReader = nil - case err = <-z.errors: + case err := <-z.errors: return err } } // One last chance to catch an error select { - case err = <-z.errors: + case err := <-z.errors: return err default: zipw.Close() |