func addFileToTar()

in dev-tools/mage/pkgtypes.go [929:1007]


func addFileToTar(ar *tar.Writer, baseDir string, pkgFile PackageFile) error {
	excludedFiles := []string{}

	return filepath.WalkDir(pkgFile.Source, func(path string, d fs.DirEntry, err error) error {
		if err != nil {
			if pkgFile.SkipOnMissing && os.IsNotExist(err) {
				return nil
			}
			return err
		}

		if slices.Contains(excludedFiles, d.Name()) {
			// it's a file we have to exclude
			if mg.Verbose() {
				log.Printf("Skipping file %q...", path)
			}
			return nil
		}

		info, err := d.Info()
		if err != nil {
			return err
		}

		header, err := tar.FileInfoHeader(info, info.Name())
		if err != nil {
			return err
		}
		header.Uname, header.Gname = "root", "root"
		header.Uid, header.Gid = 0, 0

		switch {
		case componentConfigFilePattern.MatchString(info.Name()):
			header.Mode = int64(componentConfigMode & os.ModePerm)
		case pkgFile.ConfigMode > 0 && configFilePattern.MatchString(info.Name()):
			header.Mode = int64(pkgFile.ConfigMode & os.ModePerm)
		case info.Mode().IsRegular() && pkgFile.Mode > 0:
			header.Mode = int64(pkgFile.Mode & os.ModePerm)
		case info.IsDir():
			header.Mode = int64(0755)
		}

		if filepath.IsAbs(pkgFile.Target) {
			baseDir = ""
		}

		relPath, err := filepath.Rel(pkgFile.Source, path)
		if err != nil {
			return err
		}

		header.Name = filepath.Join(baseDir, pkgFile.Target, relPath)
		if info.IsDir() {
			header.Name += string(filepath.Separator)
		}

		if mg.Verbose() {
			log.Println("Adding", os.FileMode(mustConvertToUnit32(header.Mode)), header.Name)
		}
		if err := ar.WriteHeader(header); err != nil {
			return err
		}

		if info.IsDir() {
			return nil
		}

		file, err := os.Open(path)
		if err != nil {
			return err
		}
		defer file.Close()

		if _, err = io.Copy(ar, file); err != nil {
			return err
		}
		return file.Close()
	})
}