From f204f2ea5419c78c0dbd21081197dc492ea847be Mon Sep 17 00:00:00 2001 From: leave330 Date: Wed, 1 Jul 2026 16:44:47 +0800 Subject: [PATCH] fix: add pnpm install runner for self-update --- internal/selfupdate/updater.go | 24 ++++++++++++++++++++++++ internal/selfupdate/updater_test.go | 23 +++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/internal/selfupdate/updater.go b/internal/selfupdate/updater.go index 2a9e0e87..4c536733 100644 --- a/internal/selfupdate/updater.go +++ b/internal/selfupdate/updater.go @@ -103,6 +103,7 @@ func (r *NpmResult) CombinedOutput() string { type Updater struct { DetectOverride func() DetectResult NpmInstallOverride func(version string) *NpmResult + PnpmInstallOverride func(version string) *NpmResult SkillsIndexFetchOverride func() *NpmResult SkillsCommandOverride func(args ...string) *NpmResult VerifyOverride func(expectedVersion string) error @@ -190,6 +191,29 @@ func (u *Updater) RunNpmInstall(version string) *NpmResult { return r } +// RunPnpmInstall executes pnpm add -g @larksuite/cli@. +func (u *Updater) RunPnpmInstall(version string) *NpmResult { + if u.PnpmInstallOverride != nil { + return u.PnpmInstallOverride(version) + } + r := &NpmResult{} + pnpmPath, err := exec.LookPath("pnpm") + if err != nil { + r.Err = fmt.Errorf("pnpm not found in PATH: %w", err) + return r + } + ctx, cancel := context.WithTimeout(context.Background(), npmInstallTimeout) + defer cancel() + cmd := exec.CommandContext(ctx, pnpmPath, "add", "-g", NpmPackage+"@"+version) + cmd.Stdout = &r.Stdout + cmd.Stderr = &r.Stderr + r.Err = cmd.Run() + if ctx.Err() == context.DeadlineExceeded { + r.Err = fmt.Errorf("pnpm install timed out after %s", npmInstallTimeout) + } + return r +} + func (u *Updater) ListOfficialSkillsIndex() *NpmResult { if u.SkillsIndexFetchOverride != nil { return u.SkillsIndexFetchOverride() diff --git a/internal/selfupdate/updater_test.go b/internal/selfupdate/updater_test.go index b5f154df..e26abf64 100644 --- a/internal/selfupdate/updater_test.go +++ b/internal/selfupdate/updater_test.go @@ -431,3 +431,26 @@ func TestManualReason_Pnpm(t *testing.T) { t.Errorf("manual reason = %q", got) } } + +func TestRunPnpmInstall_Override(t *testing.T) { + u := &Updater{PnpmInstallOverride: func(version string) *NpmResult { + r := &NpmResult{} + r.Stdout.WriteString("added @larksuite/cli@" + version) + return r + }} + got := u.RunPnpmInstall("2.0.0") + if got.Err != nil { + t.Fatalf("unexpected err: %v", got.Err) + } + if !strings.Contains(got.CombinedOutput(), "2.0.0") { + t.Errorf("output = %q, want version echoed", got.CombinedOutput()) + } +} + +func TestRunPnpmInstall_Error(t *testing.T) { + wantErr := errors.New("boom") + u := &Updater{PnpmInstallOverride: func(string) *NpmResult { return &NpmResult{Err: wantErr} }} + if got := u.RunPnpmInstall("2.0.0"); !errors.Is(got.Err, wantErr) { + t.Errorf("err = %v, want %v", got.Err, wantErr) + } +}