in dev-tools/mage/pkgtypes.go [380:487]
func (s PackageSpec) Evaluate(args ...map[string]interface{}) PackageSpec {
args = append([]map[string]interface{}{s.toMap(), s.evalContext}, args...)
mustExpand := func(in string) string {
if in == "" {
return ""
}
return MustExpand(in, args...)
}
if s.evalContext == nil {
s.evalContext = map[string]interface{}{}
}
for k, v := range s.ExtraVars {
s.evalContext[k] = mustExpand(v)
}
if s.ExtraTags != nil {
for i, tag := range s.ExtraTags {
s.ExtraTags[i] = mustExpand(tag)
}
}
s.Name = mustExpand(s.Name)
s.ServiceName = mustExpand(s.ServiceName)
s.OS = mustExpand(s.OS)
s.Arch = mustExpand(s.Arch)
s.Vendor = mustExpand(s.Vendor)
s.Version = mustExpand(s.Version)
s.License = mustExpand(s.License)
s.URL = mustExpand(s.URL)
s.Description = mustExpand(s.Description)
s.PreInstallScript = mustExpand(s.PreInstallScript)
s.PostInstallScript = mustExpand(s.PostInstallScript)
s.PostRmScript = mustExpand(s.PostRmScript)
s.OutputFile = mustExpand(s.OutputFile)
if s.ServiceName == "" {
s.ServiceName = s.Name
}
if s.packageDir == "" {
outputFileName := filepath.Base(s.OutputFile)
if outputFileName != "." {
s.packageDir = filepath.Join(packageStagingDir, outputFileName)
} else {
s.packageDir = filepath.Join(packageStagingDir, strings.Join([]string{s.Name, s.OS, s.Arch, s.hash()}, "-"))
}
} else {
s.packageDir = filepath.Clean(mustExpand(s.packageDir))
}
s.evalContext["PackageDir"] = s.packageDir
s.evalContext["fips"] = s.FIPS
evaluatedFiles := make(map[string]PackageFile, len(s.Files))
for target, f := range s.Files {
// Execute the dependency if it exists.
if f.Dep != nil {
if err := f.Dep(s); err != nil {
panic(fmt.Errorf("failed executing package file dependency for target=%v: %w", target, err))
}
}
f.Source = s.MustExpand(f.Source)
f.Template = s.MustExpand(f.Template)
f.Target = s.MustExpand(target)
target = f.Target
// Expand templates.
switch {
case f.Source != "":
case f.Content != "":
content, err := s.Expand(f.Content)
if err != nil {
panic(fmt.Errorf("failed to expand content template for target=%v: %w", target, err))
}
f.Source = filepath.Join(s.packageDir, filepath.Base(f.Target))
if err = os.WriteFile(CreateDir(f.Source), []byte(content), 0644); err != nil {
panic(fmt.Errorf("failed to write file containing content for target=%v: %w", target, err))
}
case f.Template != "":
f.Source = filepath.Join(s.packageDir, filepath.Base(f.Template))
if err := s.ExpandFile(f.Template, CreateDir(f.Source)); err != nil {
panic(fmt.Errorf("failed to expand template file for target=%v: %w", target, err))
}
default:
panic(fmt.Errorf("package file with target=%v must have either source, content, or template", target))
}
evaluatedFiles[f.Target] = f
}
// Replace the map instead of modifying the source.
s.Files = evaluatedFiles
if err := copyInstallScript(s, s.PreInstallScript, &s.localPreInstallScript); err != nil {
panic(err)
}
if err := copyInstallScript(s, s.PostInstallScript, &s.localPostInstallScript); err != nil {
panic(err)
}
if err := copyInstallScript(s, s.PostRmScript, &s.localPostRmScript); err != nil {
panic(err)
}
return s
}