package cli import ( "errors" "flag" "fmt" "io" "werkdock/internal/store" ) // importCmd creates an image from a plain rootfs archive — `docker // import` semantics: `werkdock import ARCHIVE [REPOSITORY[:TAG]]`. func importCmd(args []string) int { fs := flag.NewFlagSet("import", flag.ContinueOnError) fs.SetOutput(io.Discard) var changes stringList fs.Var(&changes, "c", "apply a Dockerfile instruction to the image (ENTRYPOINT, CMD, ENV, WORKDIR, LABEL)") fs.Var(&changes, "change", "apply a Dockerfile instruction to the image (ENTRYPOINT, CMD, ENV, WORKDIR, LABEL)") if err := fs.Parse(args); err != nil { return fail(err) } var config store.ImageConfig for _, change := range changes { if err := store.ApplyChange(&config, change); err != nil { return fail(fmt.Errorf("--change %w", err)) } } rest := fs.Args() if len(rest) == 0 { return fail(errors.New("import needs an ARCHIVE (werkdock import ARCHIVE [REPOSITORY[:TAG]])")) } if len(rest) > 2 { return fail(fmt.Errorf("unexpected argument %q", rest[2])) } archive := rest[0] reference := store.ImageNameFromArchive(archive) if len(rest) == 2 { reference = rest[1] } return importArchive(archive, reference, config) } func importArchive(archive, reference string, config store.ImageConfig) int { st, err := store.Default() if err != nil { return fail(err) } if err := st.Import(archive, reference, config); err != nil { return fail(err) } ref, _ := store.ParseReference(reference) fmt.Printf("Imported image: %s\n", ref.Short()) return 0 }