func runBuild(args []string) (exit int) { if len(args) != 2 { stderr("build: Must provide directory and output file") return 1 } switch { case buildFilesetName != "" && buildAppManifest == "": case buildFilesetName == "" && buildAppManifest != "": default: stderr("build: must specify either --fileset-name or --app-manifest") return 1 } root := args[0] tgt := args[1] ext := filepath.Ext(tgt) if ext != schema.ACIExtension { stderr("build: Extension must be %s (given %s)", schema.ACIExtension, ext) return 1 } mode := os.O_CREATE | os.O_WRONLY if !buildOverwrite { mode |= os.O_EXCL } fh, err := os.OpenFile(tgt, mode, 0644) if err != nil { if os.IsExist(err) { stderr("build: Target file exists (try --overwrite)") } else { stderr("build: Unable to open target %s: %v", tgt, err) } return 1 } gw := gzip.NewWriter(fh) tr := tar.NewWriter(gw) defer func() { tr.Close() gw.Close() fh.Close() if exit != 0 && !buildOverwrite { os.Remove(tgt) } }() var aw aci.ArchiveWriter if buildFilesetName != "" { aw, err = aci.NewFilesetWriter(buildFilesetName, tr) if err != nil { stderr("build: Unable to create FilesetWriter: %v", err) return 1 } } else { b, err := ioutil.ReadFile(buildAppManifest) if err != nil { stderr("build: Unable to read App Manifest: %v", err) return 1 } var am schema.AppManifest if err := am.UnmarshalJSON(b); err != nil { stderr("build: Unable to load App Manifest: %v", err) return 1 } aw = aci.NewAppWriter(am, tr) } err = filepath.Walk(root, buildWalker(root, aw, buildRootfs)) if err != nil { stderr("build: Error walking rootfs: %v", err) return 1 } err = aw.Close() if err != nil { stderr("build: Unable to close Fileset image %s: %v", tgt, err) return 1 } return }