in getdeps/main.go [209:343]
func main() {
flag.Parse()
baseDir, err := getBaseDir(*flagBaseDir, *flagConfigFile)
if err != nil {
log.Fatalf("Failed to get base dir: %v", err)
}
// expand requested components
components, err := expandComponents(*flagComponents)
if err != nil {
log.Fatalf("Invalid components: %v", err)
}
found := false
for _, hm := range supportedHashModes {
if *flagHashMode == string(hm) {
found = true
break
}
}
if !found {
log.Fatalf("unsupported hash mode %q", *flagHashMode)
}
configData, err := ioutil.ReadFile(*flagConfigFile)
if err != nil {
log.Fatalf("Failed to read configuration file '%s': %v", *flagConfigFile, err)
}
config, err := NewConfigWithIncludes(configData, baseDir)
if err != nil {
log.Fatalln(err)
}
// load URL overrides file
var urlOverrides *URLOverrides
if *flagURLOverridesFile != "" {
urloverridesData, err := ioutil.ReadFile(*flagURLOverridesFile)
if err != nil {
log.Fatalf("Failed to open URL overrides file '%s': %v", *flagURLOverridesFile, err)
}
urlOverrides, err = NewURLOverrides(urloverridesData)
if err != nil {
log.Fatalln(err)
}
}
projectDir, err := os.Getwd()
if err != nil {
log.Fatalln(err)
}
buildID := getBuildID(*flagConfigFile, projectDir)
for _, componentName := range components {
var component Component
switch componentName {
case "coreboot":
component = config.Coreboot
case "kernel":
component = config.Kernel
case "initramfs":
component = config.Initramfs
default:
// this should not happen, unless the switch cases are not kept in
// sync with the `supportedComponents` variable.
log.Fatalf("Unsupported component '%s'. This could be a bug, please report it to the maintainers", componentName)
}
workingDir := path.Join(projectDir, componentName)
log.Printf("Build ID: %s", buildID)
// clean up previous working directory
if err = os.RemoveAll(workingDir); err != nil {
log.Fatalln(err)
}
// create new working directory
if err = os.Mkdir(workingDir, os.ModePerm); err != nil {
log.Fatalln(err)
}
// change working directory
if err := os.Chdir(workingDir); err != nil {
log.Fatalln(err)
}
// get the sources
if err := component.Get(baseDir, urlOverrides, HashMode(*flagHashMode)); err != nil {
log.Fatalln(err)
}
}
// To ensure consistent formatting when the config is fed into vpd,
// write out a final versions file whether or not the base config was
// patched. This will also expose fields that were not explicitly set
// in hand-written config files.
// If the file already exists, override only the portion that was processed.
finalConfigFile := *flagFinalConfigFile
if finalConfigFile != "" {
if !filepath.IsAbs(finalConfigFile) {
finalConfigFile = filepath.Join(projectDir, finalConfigFile)
}
act := "Wrote"
var finalConfig *Config
finalConfigData, err := ioutil.ReadFile(finalConfigFile)
if err == nil {
if fc, err := NewConfig(finalConfigData); err == nil {
finalConfig = fc
act = "Updated"
}
}
if finalConfig == nil {
finalConfig = &Config{}
}
finalConfig.BuildID = buildID
for _, componentName := range components {
switch componentName {
case "coreboot":
finalConfig.Coreboot = config.Coreboot
case "kernel":
finalConfig.Kernel = config.Kernel
case "initramfs":
finalConfig.Initramfs = config.Initramfs
}
}
indentedConfig, err := json.MarshalIndent(finalConfig, "", " ")
if err != nil {
log.Fatalf("Failed to marshal configuration: %v", err)
}
if err := ioutil.WriteFile(finalConfigFile, indentedConfig, 0644); err != nil {
log.Fatalf("Failed to write generated versions to file '%s': %v", finalConfigFile, err)
}
log.Printf("%s %s", act, finalConfigFile)
}
}