Skip to content

Commit 66df5d8

Browse files
committed
feat: support installing Homebrew taps from remote config
- Add Taps field to RemoteConfig struct - Add InstallTaps function to brew package - Install taps before packages in custom install flow This enables third-party taps like steipete/tap to be restored from snapshots.
1 parent aa6c59c commit 66df5d8

3 files changed

Lines changed: 41 additions & 2 deletions

File tree

internal/brew/brew.go

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,32 @@ func Install(packages []string, dryRun bool) error {
100100
return cmd.Run()
101101
}
102102

103+
func InstallTaps(taps []string, dryRun bool) error {
104+
if len(taps) == 0 {
105+
return nil
106+
}
107+
108+
if dryRun {
109+
ui.Info("Would add taps:")
110+
for _, t := range taps {
111+
fmt.Printf(" brew tap %s\n", t)
112+
}
113+
return nil
114+
}
115+
116+
ui.Info(fmt.Sprintf("Adding %d Homebrew taps...", len(taps)))
117+
118+
for _, tap := range taps {
119+
cmd := exec.Command("brew", "tap", tap)
120+
cmd.Stdout = os.Stdout
121+
cmd.Stderr = os.Stderr
122+
if err := cmd.Run(); err != nil {
123+
ui.Warn(fmt.Sprintf("Failed to tap %s: %v", tap, err))
124+
}
125+
}
126+
return nil
127+
}
128+
103129
func InstallCask(packages []string, dryRun bool) error {
104130
if len(packages) == 0 {
105131
return nil
@@ -300,7 +326,7 @@ func installSmartCaskWithError(pkg string) string {
300326

301327
func parseBrewError(output string) string {
302328
lowerOutput := strings.ToLower(output)
303-
329+
304330
switch {
305331
case strings.Contains(lowerOutput, "no available formula"):
306332
return "package not found"

internal/config/config.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ type RemoteConfig struct {
3737
Name string `json:"name"`
3838
Preset string `json:"preset"`
3939
Packages []string `json:"packages"`
40+
Taps []string `json:"taps"`
4041
DotfilesRepo string `json:"dotfiles_repo"`
4142
}
4243

internal/installer/installer.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,21 @@ func runInstall(cfg *config.Config) error {
4444

4545
func runCustomInstall(cfg *config.Config) error {
4646
ui.Info(fmt.Sprintf("Custom config: @%s/%s", cfg.RemoteConfig.Username, cfg.RemoteConfig.Slug))
47-
ui.Info(fmt.Sprintf("Installing %d packages...", len(cfg.RemoteConfig.Packages)))
47+
48+
if len(cfg.RemoteConfig.Taps) > 0 {
49+
ui.Info(fmt.Sprintf("Adding %d taps, installing %d packages...", len(cfg.RemoteConfig.Taps), len(cfg.RemoteConfig.Packages)))
50+
} else {
51+
ui.Info(fmt.Sprintf("Installing %d packages...", len(cfg.RemoteConfig.Packages)))
52+
}
4853
fmt.Println()
4954

55+
if len(cfg.RemoteConfig.Taps) > 0 {
56+
if err := brew.InstallTaps(cfg.RemoteConfig.Taps, cfg.DryRun); err != nil {
57+
ui.Warn(fmt.Sprintf("Some taps failed: %v", err))
58+
}
59+
fmt.Println()
60+
}
61+
5062
cfg.SelectedPkgs = make(map[string]bool)
5163
for _, pkg := range cfg.RemoteConfig.Packages {
5264
cfg.SelectedPkgs[pkg] = true

0 commit comments

Comments
 (0)