//go:build linux // SPDX-License-Identifier: AGPL-3.0-only package deploy import ( "os" "syscall" ) type fileIdentity struct { mode os.FileMode uid, gid int owned bool } func identityFor(info os.FileInfo, fallback os.FileMode) fileIdentity { identity := fileIdentity{mode: fallback} if info == nil { return identity } identity.mode = info.Mode().Perm() if stat, ok := info.Sys().(*syscall.Stat_t); ok { identity.uid = int(stat.Uid) identity.gid = int(stat.Gid) identity.owned = true } return identity } func applyIdentity(file *os.File, identity fileIdentity) error { if identity.owned { if err := file.Chown(identity.uid, identity.gid); err != nil { return err } } return file.Chmod(identity.mode) }