in tools/build_tar/buildtar.go [300:369]
func (f *tarFile) addTar(toAdd string) error {
root := ""
if f.directory != "/" {
root = f.directory
}
var r io.Reader
file, err := os.Open(toAdd)
if err != nil {
return err
}
defer file.Close()
r = file
r = bufio.NewReader(r)
switch {
case strings.HasSuffix(toAdd, "gz"):
gzr, err := gzip.NewReader(r)
if err != nil {
return err
}
r = gzr
case strings.HasSuffix(toAdd, "bz2"):
bz2r := bzip2.NewReader(r)
r = bz2r
case strings.HasSuffix(toAdd, "xz"):
return fmt.Errorf("%q decompression is not supported yet", toAdd)
default:
}
tr := tar.NewReader(r)
for {
header, err := tr.Next()
if err == io.EOF {
break
}
if err != nil {
return err
}
header.Name = filepath.Join(root, header.Name)
if header.Typeflag == tar.TypeDir && !strings.HasSuffix(header.Name, "/") {
header.Name = header.Name + "/"
} else if ok := f.tryReservePath(header.Name); !ok {
klog.Warningf("Duplicate file in archive: %v, picking first occurence", header.Name)
continue
}
// Create root directories with same permissions if missing.
// makeDirs keeps track of which directories exist,
// so it's safe to duplicate this here.
if err = f.makeDirs(*header); err != nil {
return err
}
// If this is a directory, then makeDirs already created it,
// so skip to the next entry.
if header.Typeflag == tar.TypeDir {
continue
}
err = f.tw.WriteHeader(header)
if err != nil {
return err
}
if _, err = io.Copy(f.tw, tr); err != nil {
return err
}
}
return nil
}