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()
}