in packaging/linux/rpm/template.go [339:404]
func (w *specWrapper) PrepareSources() (fmt.Stringer, error) {
b := &strings.Builder{}
if len(w.Spec.Sources) == 0 {
return b, nil
}
fmt.Fprintf(b, "%%prep\n")
patches := make(map[string]bool)
for _, v := range w.Spec.Patches {
for _, p := range v {
patches[p.Source] = true
}
}
// Sort keys for consistent output
keys := dalec.SortMapKeys(w.Spec.Sources)
prepareGomods := sync.OnceFunc(func() {
if !w.Spec.HasGomods() {
return
}
fmt.Fprintf(b, "mkdir -p \"%%{_builddir}/%s\"\n", gomodsName)
fmt.Fprintf(b, "tar -C \"%%{_builddir}/%s\" -xzf \"%%{_sourcedir}/%s.tar.gz\"\n", gomodsName, gomodsName)
})
prepareCargohomes := sync.OnceFunc(func() {
if !w.Spec.HasCargohomes() {
return
}
fmt.Fprintf(b, "mkdir -p \"%%{_builddir}/%s\"\n", cargohomeName)
fmt.Fprintf(b, "tar -C \"%%{_builddir}/%s\" -xzf \"%%{_sourcedir}/%s.tar.gz\"\n", cargohomeName, cargohomeName)
})
// Extract all the sources from the rpm source dir
for _, key := range keys {
if !dalec.SourceIsDir(w.Spec.Sources[key]) {
// This is a file, nothing to extract, but we need to put it into place
// in the rpm build dir
fmt.Fprintf(b, "cp -a \"%%{_sourcedir}/%s\" .\n", key)
continue
}
// This is a directory source so it needs to be untarred into the rpm build dir.
fmt.Fprintf(b, "mkdir -p \"%%{_builddir}/%s\"\n", key)
fmt.Fprintf(b, "tar -C \"%%{_builddir}/%s\" -xzf \"%%{_sourcedir}/%s.tar.gz\"\n", key, key)
}
prepareGomods()
prepareCargohomes()
// Apply patches to all sources.
// Note: These are applied based on the key sorting algorithm (lexicographic).
// Using one patch to patch another patch is not supported, except that it may
// occur if they happen to be sorted lexicographically.
patchKeys := dalec.SortMapKeys(w.Spec.Patches)
for _, key := range patchKeys {
for _, patch := range w.Spec.Patches[key] {
fmt.Fprintf(b, "patch -d %q -p%d -s --input \"%%{_builddir}/%s\"\n", key, *patch.Strip, filepath.Join(patch.Source, patch.Path))
}
}
if len(keys) > 0 {
b.WriteString("\n")
}
return b, nil
}