Merge "Added functionality in soong_zip that supports adding root prefix."
This commit is contained in:
@@ -22,6 +22,7 @@ import (
|
|||||||
"hash/crc32"
|
"hash/crc32"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
@@ -54,7 +55,11 @@ func (nopCloser) Close() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type fileArg struct {
|
type fileArg struct {
|
||||||
relativeRoot, file string
|
rootPrefix, relativeRoot, file string
|
||||||
|
}
|
||||||
|
|
||||||
|
type pathMapping struct {
|
||||||
|
dest, src string
|
||||||
}
|
}
|
||||||
|
|
||||||
type fileArgs []fileArg
|
type fileArgs []fileArg
|
||||||
@@ -65,10 +70,13 @@ func (l *fileArgs) String() string {
|
|||||||
|
|
||||||
func (l *fileArgs) Set(s string) error {
|
func (l *fileArgs) Set(s string) error {
|
||||||
if *relativeRoot == "" {
|
if *relativeRoot == "" {
|
||||||
return fmt.Errorf("must pass -C before -f")
|
return fmt.Errorf("must pass -C before -f or -l")
|
||||||
}
|
}
|
||||||
|
|
||||||
*l = append(*l, fileArg{filepath.Clean(*relativeRoot), s})
|
*l = append(*l,
|
||||||
|
fileArg{rootPrefix: filepath.Clean(*rootPrefix),
|
||||||
|
relativeRoot: filepath.Clean(*relativeRoot),
|
||||||
|
file: s})
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,11 +88,13 @@ var (
|
|||||||
out = flag.String("o", "", "file to write zip file to")
|
out = flag.String("o", "", "file to write zip file to")
|
||||||
manifest = flag.String("m", "", "input jar manifest file name")
|
manifest = flag.String("m", "", "input jar manifest file name")
|
||||||
directories = flag.Bool("d", false, "include directories in zip")
|
directories = flag.Bool("d", false, "include directories in zip")
|
||||||
|
rootPrefix = flag.String("P", "", "path prefix within the zip at which to place files")
|
||||||
relativeRoot = flag.String("C", "", "path to use as relative root of files in next -f or -l argument")
|
relativeRoot = flag.String("C", "", "path to use as relative root of files in next -f or -l argument")
|
||||||
parallelJobs = flag.Int("j", runtime.NumCPU(), "number of parallel threads to use")
|
parallelJobs = flag.Int("j", runtime.NumCPU(), "number of parallel threads to use")
|
||||||
compLevel = flag.Int("L", 5, "deflate compression level (0-9)")
|
compLevel = flag.Int("L", 5, "deflate compression level (0-9)")
|
||||||
listFiles fileArgs
|
|
||||||
files fileArgs
|
listFiles fileArgs
|
||||||
|
files fileArgs
|
||||||
|
|
||||||
cpuProfile = flag.String("cpuprofile", "", "write cpu profile to file")
|
cpuProfile = flag.String("cpuprofile", "", "write cpu profile to file")
|
||||||
traceFile = flag.String("trace", "", "write trace to file")
|
traceFile = flag.String("trace", "", "write trace to file")
|
||||||
@@ -163,14 +173,66 @@ func main() {
|
|||||||
compLevel: *compLevel,
|
compLevel: *compLevel,
|
||||||
}
|
}
|
||||||
|
|
||||||
err := w.write(*out, listFiles, *manifest)
|
pathMappings := []pathMapping{}
|
||||||
|
set := make(map[string]string)
|
||||||
|
|
||||||
|
// load listFiles, which specify other files to include.
|
||||||
|
for _, l := range listFiles {
|
||||||
|
list, err := ioutil.ReadFile(l.file)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintln(os.Stderr, err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
srcs := strings.Split(string(list), "\n")
|
||||||
|
for _, src := range srcs {
|
||||||
|
if err := fillPathPairs(l.rootPrefix, l.relativeRoot, src,
|
||||||
|
set, &pathMappings); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// also include the usual files that are to be added directly.
|
||||||
|
for _, f := range files {
|
||||||
|
if err := fillPathPairs(f.rootPrefix, f.relativeRoot,
|
||||||
|
f.file, set, &pathMappings); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err := w.write(*out, pathMappings, *manifest)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintln(os.Stderr, err.Error())
|
fmt.Fprintln(os.Stderr, err.Error())
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (z *zipWriter) write(out string, listFiles fileArgs, manifest string) error {
|
func fillPathPairs(prefix, rel, src string, set map[string]string, pathMappings *[]pathMapping) error {
|
||||||
|
src = strings.TrimSpace(src)
|
||||||
|
if src == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
src = filepath.Clean(src)
|
||||||
|
dest, err := filepath.Rel(rel, src)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
dest = filepath.Join(prefix, dest)
|
||||||
|
|
||||||
|
if _, found := set[dest]; found {
|
||||||
|
return fmt.Errorf("found two file paths to be copied into dest path: %q,"+
|
||||||
|
" both [%q]%q and [%q]%q!",
|
||||||
|
dest, dest, src, dest, set[dest])
|
||||||
|
} else {
|
||||||
|
set[dest] = src
|
||||||
|
}
|
||||||
|
|
||||||
|
*pathMappings = append(*pathMappings, pathMapping{dest: dest, src: src})
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (z *zipWriter) write(out string, pathMappings []pathMapping, manifest string) error {
|
||||||
f, err := os.Create(out)
|
f, err := os.Create(out)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -206,16 +268,8 @@ func (z *zipWriter) write(out string, listFiles fileArgs, manifest string) error
|
|||||||
var err error
|
var err error
|
||||||
defer close(z.writeOps)
|
defer close(z.writeOps)
|
||||||
|
|
||||||
for _, listFile := range listFiles {
|
for _, ele := range pathMappings {
|
||||||
err = z.writeListFile(listFile)
|
err = z.writeFile(ele.dest, ele.src)
|
||||||
if err != nil {
|
|
||||||
z.errors <- err
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, file := range files {
|
|
||||||
err = z.writeRelFile(file.relativeRoot, file.file)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
z.errors <- err
|
z.errors <- err
|
||||||
return
|
return
|
||||||
@@ -317,66 +371,28 @@ func (z *zipWriter) write(out string, listFiles fileArgs, manifest string) error
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (z *zipWriter) writeListFile(listFile fileArg) error {
|
func (z *zipWriter) writeFile(dest, src string) error {
|
||||||
list, err := ioutil.ReadFile(listFile.file)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
files := strings.Split(string(list), "\n")
|
|
||||||
|
|
||||||
for _, file := range files {
|
|
||||||
file = strings.TrimSpace(file)
|
|
||||||
if file == "" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
err = z.writeRelFile(listFile.relativeRoot, file)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (z *zipWriter) writeRelFile(root, file string) error {
|
|
||||||
file = filepath.Clean(file)
|
|
||||||
|
|
||||||
rel, err := filepath.Rel(root, file)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = z.writeFile(rel, file)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (z *zipWriter) writeFile(rel, file string) error {
|
|
||||||
var fileSize int64
|
var fileSize int64
|
||||||
var executable bool
|
var executable bool
|
||||||
|
|
||||||
if s, err := os.Lstat(file); err != nil {
|
if s, err := os.Lstat(src); err != nil {
|
||||||
return err
|
return err
|
||||||
} else if s.IsDir() {
|
} else if s.IsDir() {
|
||||||
if z.directories {
|
if z.directories {
|
||||||
return z.writeDirectory(rel)
|
return z.writeDirectory(dest)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
} else if s.Mode()&os.ModeSymlink != 0 {
|
} else if s.Mode()&os.ModeSymlink != 0 {
|
||||||
return z.writeSymlink(rel, file)
|
return z.writeSymlink(dest, src)
|
||||||
} else if !s.Mode().IsRegular() {
|
} else if !s.Mode().IsRegular() {
|
||||||
return fmt.Errorf("%s is not a file, directory, or symlink", file)
|
return fmt.Errorf("%s is not a file, directory, or symlink", src)
|
||||||
} else {
|
} else {
|
||||||
fileSize = s.Size()
|
fileSize = s.Size()
|
||||||
executable = s.Mode()&0100 != 0
|
executable = s.Mode()&0100 != 0
|
||||||
}
|
}
|
||||||
|
|
||||||
if z.directories {
|
if z.directories {
|
||||||
dir, _ := filepath.Split(rel)
|
dir, _ := filepath.Split(dest)
|
||||||
err := z.writeDirectory(dir)
|
err := z.writeDirectory(dir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -390,7 +406,7 @@ func (z *zipWriter) writeFile(rel, file string) error {
|
|||||||
// we're sure about the Method and CRC.
|
// we're sure about the Method and CRC.
|
||||||
ze := &zipEntry{
|
ze := &zipEntry{
|
||||||
fh: &zip.FileHeader{
|
fh: &zip.FileHeader{
|
||||||
Name: rel,
|
Name: dest,
|
||||||
Method: zip.Deflate,
|
Method: zip.Deflate,
|
||||||
|
|
||||||
UncompressedSize64: uint64(fileSize),
|
UncompressedSize64: uint64(fileSize),
|
||||||
@@ -401,7 +417,7 @@ func (z *zipWriter) writeFile(rel, file string) error {
|
|||||||
ze.fh.SetMode(0700)
|
ze.fh.SetMode(0700)
|
||||||
}
|
}
|
||||||
|
|
||||||
r, err := os.Open(file)
|
r, err := os.Open(src)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user