Merge changes I5144bc62,Id6d6561f

am: 8a274392ac

Change-Id: I62a802f7ad60f9bd3a50ecf7f462642b10516fbd
This commit is contained in:
Dan Willemsen 2016-08-05 20:54:00 +00:00 committed by android-build-merger
commit f7f5b8c1b3
1 changed files with 46 additions and 6 deletions

View File

@ -41,7 +41,7 @@ func (l *fileArgs) Set(s string) error {
return fmt.Errorf("must pass -C before -f")
}
*l = append(*l, fileArg{*relativeRoot, s})
*l = append(*l, fileArg{filepath.Clean(*relativeRoot), s})
return nil
}
@ -86,7 +86,7 @@ func main() {
}
w := &zipWriter{
time: time.Now(),
time: time.Date(2009, 1, 1, 0, 0, 0, 0, time.UTC),
createdDirs: make(map[string]bool),
directories: *directories,
}
@ -162,6 +162,8 @@ func (z *zipWriter) writeListFile(listFile fileArg) error {
}
func (z *zipWriter) writeRelFile(root, file string) error {
file = filepath.Clean(file)
rel, err := filepath.Rel(root, file)
if err != nil {
return err
@ -176,11 +178,17 @@ func (z *zipWriter) writeRelFile(root, file string) error {
}
func (z *zipWriter) writeFile(rel, file string) error {
if s, _ := os.Stat(file); s.IsDir() {
if s, err := os.Lstat(file); err != nil {
return err
} else if s.IsDir() {
if z.directories {
return z.writeDirectory(file)
return z.writeDirectory(rel)
}
return nil
} else if s.Mode()&os.ModeSymlink != 0 {
return z.writeSymlink(rel, file)
} else if !s.Mode().IsRegular() {
return fmt.Errorf("%s is not a file, directory, or symlink", file)
}
if z.directories {
@ -217,13 +225,17 @@ func (z *zipWriter) writeFile(rel, file string) error {
}
func (z *zipWriter) writeDirectory(dir string) error {
for dir != "" && !z.createdDirs[dir] {
if dir != "" && !strings.HasSuffix(dir, "/") {
dir = dir + "/"
}
for dir != "" && dir != "./" && !z.createdDirs[dir] {
z.createdDirs[dir] = true
dirHeader := &zip.FileHeader{
Name: dir,
}
dirHeader.SetMode(os.ModeDir)
dirHeader.SetMode(0700 | os.ModeDir)
dirHeader.SetModTime(z.time)
_, err := z.w.CreateHeader(dirHeader)
@ -236,3 +248,31 @@ func (z *zipWriter) writeDirectory(dir string) error {
return nil
}
func (z *zipWriter) writeSymlink(rel, file string) error {
if z.directories {
dir, _ := filepath.Split(rel)
if err := z.writeDirectory(dir); err != nil {
return err
}
}
fileHeader := &zip.FileHeader{
Name: rel,
}
fileHeader.SetModTime(z.time)
fileHeader.SetMode(0700 | os.ModeSymlink)
out, err := z.w.CreateHeader(fileHeader)
if err != nil {
return err
}
dest, err := os.Readlink(file)
if err != nil {
return err
}
_, err = io.WriteString(out, dest)
return err
}