func main()

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)
	}
}