diff options
author | Dan Willemsen <dwillemsen@google.com> | 2016-08-03 00:35:25 -0700 |
---|---|---|
committer | Dan Willemsen <dwillemsen@google.com> | 2016-08-10 16:57:03 -0700 |
commit | 3bf1a085050c797f4af31353325c9ee69ca6c02f (patch) | |
tree | 6cc35038a938a8b195c45f8103152bf5c709ec8c /third_party/zip | |
parent | 25a4e07df8d4c6f653d69baa16cd22d1f07e89a1 (diff) | |
download | build_soong-3bf1a085050c797f4af31353325c9ee69ca6c02f.tar.gz build_soong-3bf1a085050c797f4af31353325c9ee69ca6c02f.tar.bz2 build_soong-3bf1a085050c797f4af31353325c9ee69ca6c02f.zip |
Add zip2zip tool to copy zip entries from one file to another
This doesn't do any decompression / recompression, but just copies over
the already compressed contents. So it's similar to zip -U, but allows
rewriting of the paths.
The first expected usecase is to replace img_from_target_files during
the build, since it does the equivalent of this:
zip2zip -i <target-files.zip> -o <img.zip> OTA/android-info.txt:android-info.txt IMAGES/*:.
Except it decompresses and recompresses the images, which takes over a
minute instead of a few seconds.
Change-Id: I88d0df188635088783223873f78e193272dbdf1c
Diffstat (limited to 'third_party/zip')
-rw-r--r-- | third_party/zip/Android.bp | 31 | ||||
-rw-r--r-- | third_party/zip/android.go | 70 |
2 files changed, 101 insertions, 0 deletions
diff --git a/third_party/zip/Android.bp b/third_party/zip/Android.bp new file mode 100644 index 00000000..044e6f8e --- /dev/null +++ b/third_party/zip/Android.bp @@ -0,0 +1,31 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +bootstrap_go_package { + name: "android-archive-zip", + pkgPath: "android/soong/third_party/zip", + srcs: [ + "reader.go", + "register.go", + "struct.go", + "writer.go", + + "android.go", + ], + testSrcs: [ + "reader_test.go", + "writer_test.go", + "zip_test.go", + ], +} diff --git a/third_party/zip/android.go b/third_party/zip/android.go new file mode 100644 index 00000000..7a3a2213 --- /dev/null +++ b/third_party/zip/android.go @@ -0,0 +1,70 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package zip + +import ( + "io" +) + +func (w *Writer) CopyFrom(orig *File, newName string) error { + if w.last != nil && !w.last.closed { + if err := w.last.close(); err != nil { + return err + } + w.last = nil + } + + fileHeader := orig.FileHeader + fileHeader.Name = newName + fh := &fileHeader + fh.Flags |= 0x8 + + h := &header{ + FileHeader: fh, + offset: uint64(w.cw.count), + } + w.dir = append(w.dir, h) + + if err := writeHeader(w.cw, fh); err != nil { + return err + } + + // Copy data + dataOffset, err := orig.DataOffset() + if err != nil { + return err + } + io.Copy(w.cw, io.NewSectionReader(orig.zipr, dataOffset, int64(orig.CompressedSize64))) + + // Write data descriptor. + var buf []byte + if fh.isZip64() { + buf = make([]byte, dataDescriptor64Len) + } else { + buf = make([]byte, dataDescriptorLen) + } + b := writeBuf(buf) + b.uint32(dataDescriptorSignature) + b.uint32(fh.CRC32) + if fh.isZip64() { + b.uint64(fh.CompressedSize64) + b.uint64(fh.UncompressedSize64) + } else { + b.uint32(fh.CompressedSize) + b.uint32(fh.UncompressedSize) + } + _, err = w.cw.Write(buf) + return err +} |