in pkg/rbeconfigsgen/rbeconfigsgen.go [687:730]
func copyCppConfigsToTarball(inTarPath string, outTar *tar.Writer) error {
in, err := os.Open(inTarPath)
if err != nil {
return fmt.Errorf("unable to open input tarball %q for reading: %w", inTarPath, err)
}
defer in.Close()
inTar := tar.NewReader(in)
pathPrefix := "cc"
for {
h, err := inTar.Next()
if err == io.EOF {
break
}
if err != nil {
return fmt.Errorf("error while reading input tarball %q: %w", inTarPath, err)
}
switch h.Typeflag {
case tar.TypeDir:
break
case tar.TypeReg:
if strings.HasSuffix(h.Name, "WORKSPACE") {
break
}
outH := *h
// Update the name to be in a 'cc' directory and set the mod time to epoch because:
// 1. The output becomes deterministic.
// 2. The mod times of the files archived inside the toolchain container sometimes
// seem to be well into the future and I didn't bother figuring out why. Maybe it
// only happens on my machine (shrug).
outH.Name = path.Join(pathPrefix, h.Name)
outH.ModTime = time.Unix(0, 0)
if err := outTar.WriteHeader(&outH); err != nil {
return fmt.Errorf("error while adding tar header for %q from input tarball to output tarball: %w", h.Name, err)
}
if _, err := io.Copy(outTar, inTar); err != nil {
return fmt.Errorf("failed to copy the contents of %q from intput tarball to the output tarball: %w", h.Name, err)
}
default:
return fmt.Errorf("got unexpected entry with name %q of type %v in tarball %q: %w", h.Name, h.Typeflag, inTarPath, err)
}
}
return nil
}