|
| 1 | +package cli |
| 2 | + |
| 3 | +import ( |
| 4 | + "fmt" |
| 5 | + |
| 6 | + "github.com/openbootdotdev/openboot/internal/auth" |
| 7 | + "github.com/openbootdotdev/openboot/internal/config" |
| 8 | + "github.com/openbootdotdev/openboot/internal/installer" |
| 9 | + "github.com/openbootdotdev/openboot/internal/updater" |
| 10 | + "github.com/spf13/cobra" |
| 11 | +) |
| 12 | + |
| 13 | +var installCmd = &cobra.Command{ |
| 14 | + Use: "install [username]", |
| 15 | + Short: "Set up your Mac dev environment", |
| 16 | + Long: `Install and configure your Mac development environment. |
| 17 | +
|
| 18 | +You can provide a username to install from that user's openboot.dev config, |
| 19 | +or run it interactively without arguments.`, |
| 20 | + Example: ` # Interactive setup with package selection |
| 21 | + openboot install |
| 22 | +
|
| 23 | + # Install from a user's cloud config |
| 24 | + openboot install githubusername |
| 25 | +
|
| 26 | + # Quick setup with a preset |
| 27 | + openboot install -p developer |
| 28 | +
|
| 29 | + # Preview changes without installing |
| 30 | + openboot install --dry-run`, |
| 31 | + Args: cobra.MaximumNArgs(1), |
| 32 | + RunE: func(cmd *cobra.Command, args []string) error { |
| 33 | + if len(args) > 0 && cfg.User == "" { |
| 34 | + cfg.User = args[0] |
| 35 | + |
| 36 | + var token string |
| 37 | + if stored, err := auth.LoadToken(); err == nil && stored != nil { |
| 38 | + token = stored.Token |
| 39 | + } |
| 40 | + rc, err := config.FetchRemoteConfig(cfg.User, token) |
| 41 | + if err != nil { |
| 42 | + return fmt.Errorf("error fetching remote config: %v", err) |
| 43 | + } |
| 44 | + cfg.RemoteConfig = rc |
| 45 | + if cfg.Preset == "" { |
| 46 | + cfg.Preset = rc.Preset |
| 47 | + } |
| 48 | + } |
| 49 | + |
| 50 | + updater.AutoUpgrade(version) |
| 51 | + cfg.Version = version |
| 52 | + err := installer.Run(cfg) |
| 53 | + if err == installer.ErrUserCancelled { |
| 54 | + return nil |
| 55 | + } |
| 56 | + return err |
| 57 | + }, |
| 58 | +} |
| 59 | + |
| 60 | +func init() { |
| 61 | + installCmd.Flags().SortFlags = false |
| 62 | + |
| 63 | + installCmd.Flags().StringVarP(&cfg.Preset, "preset", "p", "", "use a preset: minimal, developer, full") |
| 64 | + installCmd.Flags().StringVarP(&cfg.User, "user", "u", "", "install from openboot.dev/username config") |
| 65 | + installCmd.Flags().BoolVarP(&cfg.Silent, "silent", "s", false, "non-interactive mode (for CI/CD)") |
| 66 | + installCmd.Flags().BoolVar(&cfg.DryRun, "dry-run", false, "preview changes without installing") |
| 67 | + installCmd.Flags().BoolVar(&cfg.Resume, "resume", false, "resume an incomplete installation") |
| 68 | + installCmd.Flags().BoolVar(&cfg.PackagesOnly, "packages-only", false, "install packages only, skip system config") |
| 69 | + |
| 70 | + installCmd.Flags().StringVar(&cfg.Shell, "shell", "", "shell setup: install, skip") |
| 71 | + installCmd.Flags().StringVar(&cfg.Macos, "macos", "", "macOS preferences: configure, skip") |
| 72 | + installCmd.Flags().StringVar(&cfg.Dotfiles, "dotfiles", "", "dotfiles: clone, link, skip") |
| 73 | + |
| 74 | + installCmd.Flags().BoolVar(&cfg.Update, "update", false, "update Homebrew before installing") |
| 75 | + installCmd.Flags().BoolVar(&cfg.Rollback, "rollback", false, "restore backed-up config files") |
| 76 | +} |
0 commit comments