Skip to content

Commit f99c6a5

Browse files
Jerry XieJerry Xie
authored andcommitted
fix: verify actual package installation status after batch install
- Check GetInstalledPackages() after batch install to determine per-package success - Update status messages to include cask count in package totals
1 parent f5271b2 commit f99c6a5

File tree

2 files changed

+69
-32
lines changed

2 files changed

+69
-32
lines changed

internal/brew/brew.go

Lines changed: 62 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -260,30 +260,48 @@ func InstallWithProgress(cliPkgs, caskPkgs []string, dryRun bool) (installedForm
260260

261261
if len(newCli) > 0 {
262262
ui.Info(fmt.Sprintf("Installing %d CLI packages...", len(newCli)))
263-
263+
264264
args := append([]string{"install"}, newCli...)
265265
cmd := brewInstallCmd(args...)
266266
cmd.Stdout = os.Stdout
267267
cmd.Stderr = os.Stderr
268-
err := cmd.Run()
269-
270-
// Track as completed - we rely on brew's exit code for errors
271-
for _, pkg := range newCli {
272-
progress.IncrementWithStatus(err == nil)
273-
if err == nil {
274-
installedFormulae = append(installedFormulae, pkg)
275-
} else {
276-
allFailed = append(allFailed, failedJob{
277-
installJob: installJob{name: pkg, isCask: false},
278-
errMsg: "install failed",
279-
})
268+
cmdErr := cmd.Run()
269+
270+
// Re-check installed packages to determine actual success
271+
postFormulae, _, postErr := GetInstalledPackages()
272+
if postErr != nil {
273+
// Fallback: use command error to determine status
274+
for _, pkg := range newCli {
275+
progress.IncrementWithStatus(cmdErr == nil)
276+
if cmdErr == nil {
277+
installedFormulae = append(installedFormulae, pkg)
278+
} else {
279+
allFailed = append(allFailed, failedJob{
280+
installJob: installJob{name: pkg, isCask: false},
281+
errMsg: "install failed",
282+
})
283+
}
284+
}
285+
} else {
286+
// Check each package individually
287+
for _, pkg := range newCli {
288+
isInstalled := postFormulae[pkg]
289+
progress.IncrementWithStatus(isInstalled)
290+
if isInstalled {
291+
installedFormulae = append(installedFormulae, pkg)
292+
} else {
293+
allFailed = append(allFailed, failedJob{
294+
installJob: installJob{name: pkg, isCask: false},
295+
errMsg: "install failed",
296+
})
297+
}
280298
}
281299
}
282300
}
283301

284302
if len(newCask) > 0 {
285303
ui.Info(fmt.Sprintf("Installing %d GUI apps...", len(newCask)))
286-
304+
287305
args := append([]string{"install", "--cask"}, newCask...)
288306
cmd := brewInstallCmd(args...)
289307
cmd.Stdout = os.Stdout
@@ -293,20 +311,39 @@ func InstallWithProgress(cliPkgs, caskPkgs []string, dryRun bool) (installedForm
293311
if opened {
294312
cmd.Stdin = tty
295313
}
296-
err := cmd.Run()
314+
cmdErr := cmd.Run()
297315
if opened {
298316
tty.Close()
299317
}
300-
301-
for _, pkg := range newCask {
302-
progress.IncrementWithStatus(err == nil)
303-
if err == nil {
304-
installedCasks = append(installedCasks, pkg)
305-
} else {
306-
allFailed = append(allFailed, failedJob{
307-
installJob: installJob{name: pkg, isCask: true},
308-
errMsg: "install failed",
309-
})
318+
319+
// Re-check installed casks to determine actual success
320+
_, postCasks, postErr := GetInstalledPackages()
321+
if postErr != nil {
322+
// Fallback: use command error to determine status
323+
for _, pkg := range newCask {
324+
progress.IncrementWithStatus(cmdErr == nil)
325+
if cmdErr == nil {
326+
installedCasks = append(installedCasks, pkg)
327+
} else {
328+
allFailed = append(allFailed, failedJob{
329+
installJob: installJob{name: pkg, isCask: true},
330+
errMsg: "install failed",
331+
})
332+
}
333+
}
334+
} else {
335+
// Check each cask individually
336+
for _, pkg := range newCask {
337+
isInstalled := postCasks[pkg]
338+
progress.IncrementWithStatus(isInstalled)
339+
if isInstalled {
340+
installedCasks = append(installedCasks, pkg)
341+
} else {
342+
allFailed = append(allFailed, failedJob{
343+
installJob: installJob{name: pkg, isCask: true},
344+
errMsg: "install failed",
345+
})
346+
}
310347
}
311348
}
312349
}

internal/installer/installer.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -99,18 +99,18 @@ func checkDependencies(opts *config.InstallOptions, st *config.InstallState) err
9999
func runCustomInstall(opts *config.InstallOptions, st *config.InstallState) error {
100100
ui.Info(fmt.Sprintf("Custom config: @%s/%s", st.RemoteConfig.Username, st.RemoteConfig.Slug))
101101

102-
if len(st.RemoteConfig.Taps) > 0 {
103-
ui.Info(fmt.Sprintf("Adding %d taps, installing %d packages...", len(st.RemoteConfig.Taps), len(st.RemoteConfig.Packages)))
104-
} else {
105-
ui.Info(fmt.Sprintf("Installing %d packages...", len(st.RemoteConfig.Packages)))
106-
}
107-
fmt.Println()
108-
109102
formulaeCount := len(st.RemoteConfig.Packages)
110103
caskCount := len(st.RemoteConfig.Casks)
111104
npmCount := len(st.RemoteConfig.Npm)
112105
totalPackages := formulaeCount + caskCount + npmCount
113106

107+
if len(st.RemoteConfig.Taps) > 0 {
108+
ui.Info(fmt.Sprintf("Adding %d taps, installing %d packages...", len(st.RemoteConfig.Taps), totalPackages))
109+
} else {
110+
ui.Info(fmt.Sprintf("Installing %d packages...", totalPackages))
111+
}
112+
fmt.Println()
113+
114114
minutes := estimateInstallMinutes(formulaeCount, caskCount, npmCount)
115115
ui.Info(fmt.Sprintf("Estimated install time: ~%d min for %d packages", minutes, totalPackages))
116116
fmt.Println()

0 commit comments

Comments
 (0)