X Tutup
Skip to content

Commit 340a1fd

Browse files
committed
Add --force flag for extensions upgrade
1 parent fa354a9 commit 340a1fd

File tree

6 files changed

+68
-17
lines changed

6 files changed

+68
-17
lines changed

pkg/cmd/extensions/command.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ func NewCmdExtensions(f *cmdutil.Factory) *cobra.Command {
9696
},
9797
func() *cobra.Command {
9898
var flagAll bool
99+
var flagForce bool
99100
cmd := &cobra.Command{
100101
Use: "upgrade {<name> | --all}",
101102
Short: "Upgrade installed extensions",
@@ -116,10 +117,11 @@ func NewCmdExtensions(f *cmdutil.Factory) *cobra.Command {
116117
if len(args) > 0 {
117118
name = args[0]
118119
}
119-
return m.Upgrade(name, io.Out, io.ErrOut)
120+
return m.Upgrade(name, flagForce, io.Out, io.ErrOut)
120121
},
121122
}
122123
cmd.Flags().BoolVar(&flagAll, "all", false, "Upgrade all extensions")
124+
cmd.Flags().BoolVar(&flagForce, "force", false, "Force upgrade extension")
123125
return cmd
124126
}(),
125127
&cobra.Command{

pkg/cmd/extensions/command_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func TestNewCmdExtensions(t *testing.T) {
9090
name: "upgrade an extension",
9191
args: []string{"upgrade", "hello"},
9292
managerStubs: func(em *extensions.ExtensionManagerMock) func(*testing.T) {
93-
em.UpgradeFunc = func(name string, out, errOut io.Writer) error {
93+
em.UpgradeFunc = func(name string, force bool, out, errOut io.Writer) error {
9494
return nil
9595
}
9696
return func(t *testing.T) {
@@ -104,7 +104,7 @@ func TestNewCmdExtensions(t *testing.T) {
104104
name: "upgrade all",
105105
args: []string{"upgrade", "--all"},
106106
managerStubs: func(em *extensions.ExtensionManagerMock) func(*testing.T) {
107-
em.UpgradeFunc = func(name string, out, errOut io.Writer) error {
107+
em.UpgradeFunc = func(name string, force bool, out, errOut io.Writer) error {
108108
return nil
109109
}
110110
return func(t *testing.T) {

pkg/cmd/extensions/manager.go

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ func (m *Manager) Install(cloneURL string, stdout, stderr io.Writer) error {
167167

168168
var localExtensionUpgradeError = errors.New("local extensions can not be upgraded")
169169

170-
func (m *Manager) Upgrade(name string, stdout, stderr io.Writer) error {
170+
func (m *Manager) Upgrade(name string, force bool, stdout, stderr io.Writer) error {
171171
exe, err := m.lookPath("git")
172172
if err != nil {
173173
return err
@@ -195,11 +195,17 @@ func (m *Manager) Upgrade(name string, stdout, stderr io.Writer) error {
195195
continue
196196
}
197197

198+
var cmds []*exec.Cmd
198199
dir := filepath.Dir(f.Path())
199-
externalCmd := m.newCommand(exe, "-C", dir, "--git-dir="+filepath.Join(dir, ".git"), "pull", "--ff-only")
200-
externalCmd.Stdout = stdout
201-
externalCmd.Stderr = stderr
202-
if e := externalCmd.Run(); e != nil {
200+
if force {
201+
fetchCmd := m.newCommand(exe, "-C", dir, "--git-dir="+filepath.Join(dir, ".git"), "fetch", "origin", "HEAD")
202+
resetCmd := m.newCommand(exe, "-C", dir, "--git-dir="+filepath.Join(dir, ".git"), "reset", "--hard", "origin/HEAD")
203+
cmds = []*exec.Cmd{fetchCmd, resetCmd}
204+
} else {
205+
pullCmd := m.newCommand(exe, "-C", dir, "--git-dir="+filepath.Join(dir, ".git"), "pull", "--ff-only")
206+
cmds = []*exec.Cmd{pullCmd}
207+
}
208+
if e := runCmds(cmds, stdout, stderr); e != nil {
203209
err = e
204210
}
205211
someUpgraded = true
@@ -221,3 +227,14 @@ func (m *Manager) Remove(name string) error {
221227
func (m *Manager) installDir() string {
222228
return filepath.Join(m.dataDir(), "extensions")
223229
}
230+
231+
func runCmds(cmds []*exec.Cmd, stdout, stderr io.Writer) error {
232+
for _, cmd := range cmds {
233+
cmd.Stdout = stdout
234+
cmd.Stderr = stderr
235+
if err := cmd.Run(); err != nil {
236+
return err
237+
}
238+
}
239+
return nil
240+
}

pkg/cmd/extensions/manager_test.go

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ func TestManager_Upgrade_AllExtensions(t *testing.T) {
100100

101101
stdout := &bytes.Buffer{}
102102
stderr := &bytes.Buffer{}
103-
err := m.Upgrade("", stdout, stderr)
103+
err := m.Upgrade("", false, stdout, stderr)
104104
assert.NoError(t, err)
105105

106106
assert.Equal(t, heredoc.Docf(
@@ -125,7 +125,7 @@ func TestManager_Upgrade_RemoteExtension(t *testing.T) {
125125

126126
stdout := &bytes.Buffer{}
127127
stderr := &bytes.Buffer{}
128-
err := m.Upgrade("remote", stdout, stderr)
128+
err := m.Upgrade("remote", false, stdout, stderr)
129129
assert.NoError(t, err)
130130
assert.Equal(t, heredoc.Docf(
131131
`
@@ -145,20 +145,46 @@ func TestManager_Upgrade_LocalExtension(t *testing.T) {
145145

146146
stdout := &bytes.Buffer{}
147147
stderr := &bytes.Buffer{}
148-
err := m.Upgrade("local", stdout, stderr)
148+
err := m.Upgrade("local", false, stdout, stderr)
149149
assert.EqualError(t, err, "local extensions can not be upgraded")
150150
assert.Equal(t, "", stdout.String())
151151
assert.Equal(t, "", stderr.String())
152152
}
153153

154+
func TestManager_Upgrade_Force(t *testing.T) {
155+
tempDir := t.TempDir()
156+
extensionDir := filepath.Join(tempDir, "extensions", "gh-remote")
157+
gitDir := filepath.Join(tempDir, "extensions", "gh-remote", ".git")
158+
159+
assert.NoError(t, stubExtension(filepath.Join(tempDir, "extensions", "gh-remote", "gh-remote")))
160+
161+
m := newTestManager(tempDir)
162+
163+
stdout := &bytes.Buffer{}
164+
stderr := &bytes.Buffer{}
165+
err := m.Upgrade("remote", true, stdout, stderr)
166+
assert.NoError(t, err)
167+
assert.Equal(t, heredoc.Docf(
168+
`
169+
[git -C %s --git-dir=%s fetch origin HEAD]
170+
[git -C %s --git-dir=%s reset --hard origin/HEAD]
171+
`,
172+
extensionDir,
173+
gitDir,
174+
extensionDir,
175+
gitDir,
176+
), stdout.String())
177+
assert.Equal(t, "", stderr.String())
178+
}
179+
154180
func TestManager_Upgrade_NoExtensions(t *testing.T) {
155181
tempDir := t.TempDir()
156182

157183
m := newTestManager(tempDir)
158184

159185
stdout := &bytes.Buffer{}
160186
stderr := &bytes.Buffer{}
161-
err := m.Upgrade("", stdout, stderr)
187+
err := m.Upgrade("", false, stdout, stderr)
162188
assert.EqualError(t, err, "no extensions installed")
163189
assert.Equal(t, "", stdout.String())
164190
assert.Equal(t, "", stderr.String())

pkg/extensions/extension.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ type ExtensionManager interface {
1818
List() []Extension
1919
Install(url string, stdout, stderr io.Writer) error
2020
InstallLocal(dir string) error
21-
Upgrade(name string, stdout, stderr io.Writer) error
21+
Upgrade(name string, force bool, stdout, stderr io.Writer) error
2222
Remove(name string) error
2323
Dispatch(args []string, stdin io.Reader, stdout, stderr io.Writer) (bool, error)
2424
}

pkg/extensions/manager_mock.go

Lines changed: 10 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)
X Tutup