| 19 | ) |
| 20 | |
| 21 | func run(enableUi bool, options Options, imageResolver image.Resolver, events eventChannel, filesystem afero.Fs) { |
| 22 | var img *image.Image |
| 23 | var err error |
| 24 | defer close(events) |
| 25 | |
| 26 | doExport := options.ExportFile != "" |
| 27 | doBuild := len(options.BuildArgs) > 0 |
| 28 | |
| 29 | if doBuild { |
| 30 | events.message(utils.TitleFormat("Building image...")) |
| 31 | img, err = imageResolver.Build(options.BuildArgs) |
| 32 | if err != nil { |
| 33 | events.exitWithErrorMessage("cannot build image", err) |
| 34 | return |
| 35 | } |
| 36 | } else { |
| 37 | events.message(utils.TitleFormat("Image Source: ") + options.Source.String() + "://" + options.Image) |
| 38 | events.message(utils.TitleFormat("Extracting image from "+imageResolver.Name()+"...") + " (this can take a while for large images)") |
| 39 | img, err = imageResolver.Fetch(options.Image) |
| 40 | if err != nil { |
| 41 | events.exitWithErrorMessage("cannot fetch image", err) |
| 42 | return |
| 43 | } |
| 44 | } |
| 45 | |
| 46 | events.message(utils.TitleFormat("Analyzing image...")) |
| 47 | analysis, err := img.Analyze() |
| 48 | if err != nil { |
| 49 | events.exitWithErrorMessage("cannot analyze image", err) |
| 50 | return |
| 51 | } |
| 52 | |
| 53 | if doExport { |
| 54 | events.message(utils.TitleFormat(fmt.Sprintf("Exporting image to '%s'...", options.ExportFile))) |
| 55 | bytes, err := export.NewExport(analysis).Marshal() |
| 56 | if err != nil { |
| 57 | events.exitWithErrorMessage("cannot marshal export payload", err) |
| 58 | return |
| 59 | } |
| 60 | |
| 61 | file, err := filesystem.OpenFile(options.ExportFile, os.O_RDWR|os.O_CREATE, 0644) |
| 62 | if err != nil { |
| 63 | events.exitWithErrorMessage("cannot open export file", err) |
| 64 | return |
| 65 | } |
| 66 | defer file.Close() |
| 67 | |
| 68 | _, err = file.Write(bytes) |
| 69 | if err != nil { |
| 70 | events.exitWithErrorMessage("cannot write to export file", err) |
| 71 | } |
| 72 | return |
| 73 | } |
| 74 | |
| 75 | if options.Ci { |
| 76 | events.message(fmt.Sprintf(" efficiency: %2.4f %%", analysis.Efficiency*100)) |
| 77 | events.message(fmt.Sprintf(" wastedBytes: %d bytes (%s)", analysis.WastedBytes, humanize.Bytes(analysis.WastedBytes))) |
| 78 | events.message(fmt.Sprintf(" userWastedPercent: %2.4f %%", analysis.WastedUserPercent*100)) |