func fixupArtifactPerms()

in packaging/linux/deb/debroot.go [200:281]


func fixupArtifactPerms(spec *dalec.Spec, target string, cfg *SourcePkgConfig) []byte {
	buf := bytes.NewBuffer(nil)
	writeScriptHeader(buf, cfg)

	basePath := filepath.Join("debian", spec.Name)
	artifacts := spec.GetArtifacts(target)

	checkAndWritePerms := func(artifacts map[string]dalec.ArtifactConfig, dir string) {
		if artifacts == nil {
			return
		}
		sorted := dalec.SortMapKeys(artifacts)
		for _, key := range sorted {
			cfg := artifacts[key]
			resolvedName := cfg.ResolveName(key)
			p := filepath.Join(basePath, dir, resolvedName)

			if cfg.Permissions.Perm() != 0 {
				fmt.Fprintf(buf, "chmod %o %q\n", cfg.Permissions.Perm(), p)
				continue
			}

			// Debian does not keep original permissions for files, so we check if artifact matches a source name
			// and if so, we apply the source permissions for inline sources.
			srcKey, subpath, _ := strings.Cut(key, "/")
			src, ok := spec.Sources[srcKey]
			if !ok || src.Inline == nil {
				continue
			}

			if src.Inline.File != nil && src.Inline.File.Permissions.Perm() != 0 {
				fmt.Fprintf(buf, "chmod %o %q\n", src.Inline.File.Permissions.Perm(), p)
				continue
			}

			if src.Inline.Dir == nil {
				continue
			}
			if subpath == "" {
				if src.Inline.Dir.Permissions.Perm() != 0 {
					fmt.Fprintf(buf, "chmod %o %q\n", src.Inline.Dir.Permissions.Perm(), p)
				}
				continue
			}
			if f, ok := src.Inline.Dir.Files[subpath]; ok && f.Permissions.Perm() != 0 {
				fmt.Fprintf(buf, "chmod %o %q\n", f.Permissions.Perm(), p)
			}
		}
	}

	checkAndWritePerms(artifacts.Binaries, BinariesPath)
	checkAndWritePerms(artifacts.ConfigFiles, ConfigFilesPath)
	checkAndWritePerms(artifacts.Manpages, filepath.Join(ManpagesPath, spec.Name))
	checkAndWritePerms(artifacts.Headers, HeadersPath)
	checkAndWritePerms(artifacts.Licenses, filepath.Join(LicensesPath, spec.Name))
	checkAndWritePerms(artifacts.Docs, filepath.Join(DocsPath, spec.Name))
	checkAndWritePerms(artifacts.Libs, filepath.Join(LibsPath))
	checkAndWritePerms(artifacts.Libexec, LibexecPath)
	checkAndWritePerms(artifacts.DataDirs, DataDirsPath)

	if artifacts.Directories != nil {
		sorted := dalec.SortMapKeys(artifacts.Directories.GetConfig())
		for _, name := range sorted {
			cfg := artifacts.Directories.Config[name]
			if cfg.Mode.Perm() != 0 {
				p := filepath.Join(basePath, "/etc", name)
				fmt.Fprintf(buf, "chmod %o %q\n", cfg.Mode.Perm(), p)
			}
		}

		sorted = dalec.SortMapKeys(artifacts.Directories.GetState())
		for _, name := range sorted {
			cfg := artifacts.Directories.State[name]
			if cfg.Mode.Perm() != 0 {
				p := filepath.Join(basePath, "/var/lib", name)
				fmt.Fprintf(buf, "chmod %o %q\n", cfg.Mode.Perm(), p)
			}
		}
	}

	return buf.Bytes()
}