func UntarIntoZip()

in internal/extraction/extraction.go [53:102]


func UntarIntoZip(reader *io.PipeReader, job RemoteSource, file *archive.ZipFile, verbose bool) error {
	tarReader := tar.NewReader(reader)
	for {
		header, err := tarReader.Next()
		if err != nil {
			if !errors.Is(err, io.EOF) {
				return err
			}
			break
		}
		remoteFilename := header.Name
		// remove the path prefix on the Pod
		relOutputDir := fmt.Sprintf("%s/", strings.TrimPrefix(job.PodOutputDir, "/"))
		relativeFilename := strings.TrimPrefix(remoteFilename, relOutputDir)
		// stack diagnostics create output in a directory called api-diagnostics-{{.Timestamp}}
		if !strings.HasPrefix(relativeFilename, job.sourceDirPrefix()) {
			if verbose {
				logger.Printf("Ignoring file %s in tar from %s diagnostics\n", header.Name, job.ResourceName)
			}
			continue
		}
		manifest := archive.StackDiagnosticManifest{DiagType: job.Typ}

		switch {
		case strings.HasSuffix(relativeFilename, "tar.gz"):
			manifest.DiagPath = job.outputDirPrefix()
			if err := RepackageTarGzip(tarReader, job.outputDirPrefix(), file); err != nil {
				return err
			}
		case strings.HasSuffix(relativeFilename, ".zip"):
			manifest.DiagPath = job.outputDirPrefix()
			if err := RepackageZip(tarReader, job.outputDirPrefix(), file); err != nil {
				return err
			}
		default:
			path := archive.Path(job.Namespace, job.Typ, job.ResourceName, relativeFilename)
			manifest.DiagPath = path
			out, err := file.Create(path)
			if err != nil {
				return err
			}
			// accept decompression bomb for CLI as we control the src
			if _, err := io.Copy(out, tarReader); err != nil { //nolint:gosec
				return err
			}
		}
		file.AddManifestEntry(manifest)
	}
	return nil
}