in packaging/linux/deb/debroot.go [110:198]
func Debroot(ctx context.Context, sOpt dalec.SourceOpts, spec *dalec.Spec, worker, in llb.State, target, dir, distroVersionID string, cfg SourcePkgConfig, opts ...llb.ConstraintsOpt) (llb.State, error) {
control, err := controlFile(spec, in, target, dir)
if err != nil {
return llb.Scratch(), errors.Wrap(err, "error generating control file")
}
rules, err := Rules(spec, in, dir, target)
if err != nil {
return llb.Scratch(), errors.Wrap(err, "error generating rules file")
}
changelog, err := Changelog(spec, in, target, dir, distroVersionID)
if err != nil {
return llb.Scratch(), errors.Wrap(err, "error generating changelog file")
}
if dir == "" {
dir = "debian"
}
base := llb.Scratch().File(llb.Mkdir(dir, 0o755), opts...)
installers := createInstallScripts(worker, spec, dir, target)
const (
sourceFormat = "3.0 (quilt)"
)
debian := base.
File(llb.Mkdir(filepath.Join(dir, "source"), 0o755), opts...).
File(llb.Mkfile(filepath.Join(dir, "source/format"), 0o640, []byte(sourceFormat)), opts...).
File(llb.Mkdir(filepath.Join(dir, "dalec"), 0o755), opts...).
File(llb.Mkfile(filepath.Join(dir, "source/include-binaries"), 0o640, append([]byte("dalec"), '\n')), opts...)
states := []llb.State{control, rules, changelog, debian}
states = append(states, installers...)
dalecDir := base.
File(llb.Mkdir(filepath.Join(dir, "dalec"), 0o755), opts...)
states = append(states, dalecDir.File(llb.Mkfile(filepath.Join(dir, "dalec/build.sh"), 0o700, createBuildScript(spec, &cfg)), opts...))
states = append(states, dalecDir.File(llb.Mkfile(filepath.Join(dir, "dalec/patch.sh"), 0o700, createPatchScript(spec, &cfg)), opts...))
states = append(states, dalecDir.File(llb.Mkfile(filepath.Join(dir, "dalec/fix_generators.sh"), 0o700, fixupGenerators(spec, &cfg)), opts...))
states = append(states, dalecDir.File(llb.Mkfile(filepath.Join(dir, "dalec/fix_perms.sh"), 0o700, fixupArtifactPerms(spec, target, &cfg)), opts...))
customEnable, err := customDHInstallSystemdPostinst(spec, target)
if err != nil {
return llb.Scratch(), err
}
if len(customEnable) > 0 {
// This is not meant to be executed on its own and will instead get added
// to a post inst file, so need to mark this as executable.
states = append(states, dalecDir.File(llb.Mkfile(filepath.Join(dir, "dalec/"+customSystemdPostinstFile), 0o600, customEnable), opts...))
}
postinst := bytes.NewBuffer(nil)
artifacts := spec.GetArtifacts(target)
writeUsersPostInst(postinst, artifacts.Users)
writeGroupsPostInst(postinst, artifacts.Groups)
if postinst.Len() > 0 {
dt := []byte("#!/usr/bin/env sh\nset -e\n")
dt = append(dt, postinst.Bytes()...)
states = append(states, dalecDir.File(llb.Mkfile(filepath.Join(dir, "postinst"), 0o700, dt), opts...))
}
patchDir := dalecDir.File(llb.Mkdir(filepath.Join(dir, "dalec/patches"), 0o755), opts...)
sorted := dalec.SortMapKeys(spec.Patches)
for _, name := range sorted {
pls, err := sourcePatchesDir(sOpt, patchDir, filepath.Join(dir, "dalec/patches"), name, spec, opts...)
if err != nil {
return llb.Scratch(), errors.Wrapf(err, "error creating patch directory for source %q", name)
}
states = append(states, pls...)
}
if len(artifacts.Links) > 0 {
buf := bytes.NewBuffer(nil)
for _, l := range artifacts.Links {
src := strings.TrimPrefix(l.Source, "/")
dst := strings.TrimPrefix(l.Dest, "/")
fmt.Fprintln(buf, src, dst)
}
states = append(states, dalecDir.File(llb.Mkfile(filepath.Join(dir, spec.Name+".links"), 0o644, buf.Bytes()), opts...))
}
return dalec.MergeAtPath(in, states, "/"), nil
}