Add extension upgrade --dry-run (#5098) · cli/cli@2c0236d · GitHub
Skip to content

Commit 2c0236d

Browse files
authored
Add extension upgrade --dry-run (#5098)
1 parent adf2748 commit 2c0236d

11 files changed

Lines changed: 292 additions & 107 deletions

File tree

‎cmd/gh/main.go‎

Lines changed: 1 addition & 1 deletion

‎pkg/cmd/alias/set/set.go‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ func NewCmdSet(f *cmdutil.Factory, runF func(*SetOptions) error) *cobra.Command
8282
return true
8383
}
8484

85-
for _, ext := range f.ExtensionManager.List(false) {
85+
for _, ext := range f.ExtensionManager.List() {
8686
if ext.Name() == split[0] {
8787
return true
8888
}

‎pkg/cmd/alias/set/set_test.go‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func runCommand(cfg config.Config, isTTY bool, cli string, in string) (*test.Cmd
3030
return cfg, nil
3131
},
3232
ExtensionManager: &extensions.ExtensionManagerMock{
33-
ListFunc: func(bool) []extensions.Extension {
33+
ListFunc: func() []extensions.Extension {
3434
return []extensions.Extension{}
3535
},
3636
},

‎pkg/cmd/extension/command.go‎

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func NewCmdExtension(f *cmdutil.Factory) *cobra.Command {
4545
Aliases: []string{"ls"},
4646
Args: cobra.NoArgs,
4747
RunE: func(cmd *cobra.Command, args []string) error {
48-
cmds := m.List(true)
48+
cmds := m.List()
4949
if len(cmds) == 0 {
5050
return errors.New("no extensions installed")
5151
}
@@ -61,22 +61,13 @@ func NewCmdExtension(f *cmdutil.Factory) *cobra.Command {
6161

6262
t.AddField(fmt.Sprintf("gh %s", c.Name()), nil, nil)
6363
t.AddField(repo, nil, nil)
64-
version := c.CurrentVersion()
65-
if !c.IsBinary() && len(version) > 8 {
66-
version = version[:8]
67-
}
68-
64+
version := displayExtensionVersion(c, c.CurrentVersion())
6965
if c.IsPinned() {
7066
t.AddField(version, nil, cs.Cyan)
7167
} else {
7268
t.AddField(version, nil, nil)
7369
}
7470

75-
var updateAvailable string
76-
if c.UpdateAvailable() {
77-
updateAvailable = "Upgrade available"
78-
}
79-
t.AddField(updateAvailable, nil, cs.Green)
8071
t.EndRow()
8172
}
8273
return t.Render()
@@ -152,6 +143,7 @@ func NewCmdExtension(f *cmdutil.Factory) *cobra.Command {
152143
func() *cobra.Command {
153144
var flagAll bool
154145
var flagForce bool
146+
var flagDryRun bool
155147
cmd := &cobra.Command{
156148
Use: "upgrade {<name> | --all}",
157149
Short: "Upgrade installed extensions",
@@ -172,6 +164,9 @@ func NewCmdExtension(f *cmdutil.Factory) *cobra.Command {
172164
if len(args) > 0 {
173165
name = normalizeExtensionSelector(args[0])
174166
}
167+
if flagDryRun {
168+
m.EnableDryRunMode()
169+
}
175170
cs := io.ColorScheme()
176171
err := m.Upgrade(name, flagForce)
177172
if err != nil && !errors.Is(err, upToDateError) {
@@ -186,19 +181,24 @@ func NewCmdExtension(f *cmdutil.Factory) *cobra.Command {
186181
return cmdutil.SilentError
187182
}
188183
if io.IsStdoutTTY() {
184+
successStr := "Successfully"
185+
if flagDryRun {
186+
successStr = "Would have"
187+
}
189188
if errors.Is(err, upToDateError) {
190189
fmt.Fprintf(io.Out, "%s Extension already up to date\n", cs.SuccessIcon())
191190
} else if name != "" {
192-
fmt.Fprintf(io.Out, "%s Successfully upgraded extension %s\n", cs.SuccessIcon(), name)
191+
fmt.Fprintf(io.Out, "%s %s upgraded extension %s\n", cs.SuccessIcon(), successStr, name)
193192
} else {
194-
fmt.Fprintf(io.Out, "%s Successfully upgraded extensions\n", cs.SuccessIcon())
193+
fmt.Fprintf(io.Out, "%s %s upgraded extensions\n", cs.SuccessIcon(), successStr)
195194
}
196195
}
197196
return nil
198197
},
199198
}
200199
cmd.Flags().BoolVar(&flagAll, "all", false, "Upgrade all extensions")
201200
cmd.Flags().BoolVar(&flagForce, "force", false, "Force upgrade extension")
201+
cmd.Flags().BoolVar(&flagDryRun, "dry-run", false, "Only display upgrades")
202202
return cmd
203203
}(),
204204
&cobra.Command{
@@ -355,7 +355,7 @@ func checkValidExtension(rootCmd *cobra.Command, m extensions.ExtensionManager,
355355
return fmt.Errorf("%q matches the name of a built-in command", commandName)
356356
}
357357

358-
for _, ext := range m.List(false) {
358+
for _, ext := range m.List() {
359359
if ext.Name() == commandName {
360360
return fmt.Errorf("there is already an installed extension that provides the %q command", commandName)
361361
}
@@ -370,3 +370,10 @@ func normalizeExtensionSelector(n string) string {
370370
}
371371
return strings.TrimPrefix(n, "gh-")
372372
}
373+
374+
func displayExtensionVersion(ext extensions.Extension, version string) string {
375+
if !ext.IsBinary() && len(version) > 8 {
376+
return version[:8]
377+
}
378+
return version
379+
}

‎pkg/cmd/extension/command_test.go‎

Lines changed: 55 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func TestNewCmdExtension(t *testing.T) {
4141
name: "install an extension",
4242
args: []string{"install", "owner/gh-some-ext"},
4343
managerStubs: func(em *extensions.ExtensionManagerMock) func(*testing.T) {
44-
em.ListFunc = func(bool) []extensions.Extension {
44+
em.ListFunc = func() []extensions.Extension {
4545
return []extensions.Extension{}
4646
}
4747
em.InstallFunc = func(_ ghrepo.Interface, _ string) error {
@@ -60,7 +60,7 @@ func TestNewCmdExtension(t *testing.T) {
6060
name: "install an extension with same name as existing extension",
6161
args: []string{"install", "owner/gh-existing-ext"},
6262
managerStubs: func(em *extensions.ExtensionManagerMock) func(*testing.T) {
63-
em.ListFunc = func(bool) []extensions.Extension {
63+
em.ListFunc = func() []extensions.Extension {
6464
e := &Extension{path: "owner2/gh-existing-ext"}
6565
return []extensions.Extension{e}
6666
}
@@ -99,6 +99,12 @@ func TestNewCmdExtension(t *testing.T) {
9999
wantErr: true,
100100
errMsg: "specify an extension to upgrade or `--all`",
101101
},
102+
{
103+
name: "upgrade --all with extension name error",
104+
args: []string{"upgrade", "test", "--all"},
105+
wantErr: true,
106+
errMsg: "cannot use `--all` with extension name",
107+
},
102108
{
103109
name: "upgrade an extension",
104110
args: []string{"upgrade", "hello"},
@@ -115,6 +121,26 @@ func TestNewCmdExtension(t *testing.T) {
115121
isTTY: true,
116122
wantStdout: "✓ Successfully upgraded extension hello\n",
117123
},
124+
{
125+
name: "upgrade an extension dry run",
126+
args: []string{"upgrade", "hello", "--dry-run"},
127+
managerStubs: func(em *extensions.ExtensionManagerMock) func(*testing.T) {
128+
em.EnableDryRunModeFunc = func() {}
129+
em.UpgradeFunc = func(name string, force bool) error {
130+
return nil
131+
}
132+
return func(t *testing.T) {
133+
dryRunCalls := em.EnableDryRunModeCalls()
134+
assert.Equal(t, 1, len(dryRunCalls))
135+
upgradeCalls := em.UpgradeCalls()
136+
assert.Equal(t, 1, len(upgradeCalls))
137+
assert.Equal(t, "hello", upgradeCalls[0].Name)
138+
assert.False(t, upgradeCalls[0].Force)
139+
}
140+
},
141+
isTTY: true,
142+
wantStdout: "✓ Would have upgraded extension hello\n",
143+
},
118144
{
119145
name: "upgrade an extension notty",
120146
args: []string{"upgrade", "hello"},
@@ -214,6 +240,26 @@ func TestNewCmdExtension(t *testing.T) {
214240
isTTY: true,
215241
wantStdout: "✓ Successfully upgraded extensions\n",
216242
},
243+
{
244+
name: "upgrade all dry run",
245+
args: []string{"upgrade", "--all", "--dry-run"},
246+
managerStubs: func(em *extensions.ExtensionManagerMock) func(*testing.T) {
247+
em.EnableDryRunModeFunc = func() {}
248+
em.UpgradeFunc = func(name string, force bool) error {
249+
return nil
250+
}
251+
return func(t *testing.T) {
252+
dryRunCalls := em.EnableDryRunModeCalls()
253+
assert.Equal(t, 1, len(dryRunCalls))
254+
upgradeCalls := em.UpgradeCalls()
255+
assert.Equal(t, 1, len(upgradeCalls))
256+
assert.Equal(t, "", upgradeCalls[0].Name)
257+
assert.False(t, upgradeCalls[0].Force)
258+
}
259+
},
260+
isTTY: true,
261+
wantStdout: "✓ Would have upgraded extensions\n",
262+
},
217263
{
218264
name: "upgrade all none installed",
219265
args: []string{"upgrade", "--all"},
@@ -313,16 +359,17 @@ func TestNewCmdExtension(t *testing.T) {
313359
name: "list extensions",
314360
args: []string{"list"},
315361
managerStubs: func(em *extensions.ExtensionManagerMock) func(*testing.T) {
316-
em.ListFunc = func(bool) []extensions.Extension {
317-
ex1 := &Extension{path: "cli/gh-test", url: "https://github.com/cli/gh-test", currentVersion: "1", latestVersion: "1"}
318-
ex2 := &Extension{path: "cli/gh-test2", url: "https://github.com/cli/gh-test2", currentVersion: "1", latestVersion: "2"}
362+
em.ListFunc = func() []extensions.Extension {
363+
ex1 := &Extension{path: "cli/gh-test", url: "https://github.com/cli/gh-test", currentVersion: "1"}
364+
ex2 := &Extension{path: "cli/gh-test2", url: "https://github.com/cli/gh-test2", currentVersion: "1"}
319365
return []extensions.Extension{ex1, ex2}
320366
}
321367
return func(t *testing.T) {
322-
assert.Equal(t, 1, len(em.ListCalls()))
368+
calls := em.ListCalls()
369+
assert.Equal(t, 1, len(calls))
323370
}
324371
},
325-
wantStdout: "gh test\tcli/gh-test\t1\t\ngh test2\tcli/gh-test2\t1\tUpgrade available\n",
372+
wantStdout: "gh test\tcli/gh-test\t1\ngh test2\tcli/gh-test2\t1\n",
326373
},
327374
{
328375
name: "create extension interactive",
@@ -533,7 +580,7 @@ func Test_checkValidExtension(t *testing.T) {
533580
rootCmd.AddCommand(&cobra.Command{Use: "auth"})
534581

535582
m := &extensions.ExtensionManagerMock{
536-
ListFunc: func(bool) []extensions.Extension {
583+
ListFunc: func() []extensions.Extension {
537584
return []extensions.Extension{
538585
&extensions.ExtensionMock{
539586
NameFunc: func() string { return "screensaver" },

‎pkg/cmd/extension/manager.go‎

Lines changed: 42 additions & 20 deletions

0 commit comments

Comments
 (0)