Skip to content

Commit 1f3478d

Browse files
author
Nate Smith
authored
Merge pull request cli#4568 from cli/bin-ext-dispatch
dispatch binary extensions directly
2 parents 6759511 + f65c153 commit 1f3478d

File tree

5 files changed

+83
-16
lines changed

5 files changed

+83
-16
lines changed

pkg/cmd/extension/extension.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,7 @@ func (e *Extension) UpdateAvailable() bool {
4848
}
4949
return true
5050
}
51+
52+
func (e *Extension) IsBinary() bool {
53+
return e.kind == BinaryKind
54+
}

pkg/cmd/extension/manager.go

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,11 @@ func (m *Manager) Dispatch(args []string, stdin io.Reader, stdout, stderr io.Wri
6969
forwardArgs := args[1:]
7070

7171
exts, _ := m.list(false)
72+
var ext Extension
7273
for _, e := range exts {
7374
if e.Name() == extName {
74-
exe = e.Path()
75+
ext = e
76+
exe = ext.Path()
7577
break
7678
}
7779
}
@@ -81,7 +83,9 @@ func (m *Manager) Dispatch(args []string, stdin io.Reader, stdout, stderr io.Wri
8183

8284
var externalCmd *exec.Cmd
8385

84-
if runtime.GOOS == "windows" {
86+
if ext.IsBinary() || runtime.GOOS != "windows" {
87+
externalCmd = m.newCommand(exe, forwardArgs...)
88+
} else if runtime.GOOS == "windows" {
8589
// Dispatch all extension calls through the `sh` interpreter to support executable files with a
8690
// shebang line on Windows.
8791
shExe, err := m.findSh()
@@ -93,8 +97,6 @@ func (m *Manager) Dispatch(args []string, stdin io.Reader, stdout, stderr io.Wri
9397
}
9498
forwardArgs = append([]string{"-c", `command "$@"`, "--", exe}, forwardArgs...)
9599
externalCmd = m.newCommand(shExe, forwardArgs...)
96-
} else {
97-
externalCmd = m.newCommand(exe, forwardArgs...)
98100
}
99101
externalCmd.Stdin = stdin
100102
externalCmd.Stdout = stdout
@@ -268,30 +270,30 @@ func (m *Manager) getLatestVersion(ext Extension) (string, error) {
268270
if ext.isLocal {
269271
return "", fmt.Errorf("unable to get latest version for local extensions")
270272
}
271-
if ext.kind == GitKind {
272-
gitExe, err := m.lookPath("git")
273+
if ext.IsBinary() {
274+
repo, err := ghrepo.FromFullName(ext.url)
273275
if err != nil {
274276
return "", err
275277
}
276-
extDir := filepath.Dir(ext.path)
277-
gitDir := "--git-dir=" + filepath.Join(extDir, ".git")
278-
cmd := m.newCommand(gitExe, gitDir, "ls-remote", "origin", "HEAD")
279-
lsRemote, err := cmd.Output()
278+
r, err := fetchLatestRelease(m.client, repo)
280279
if err != nil {
281280
return "", err
282281
}
283-
remoteSha := bytes.SplitN(lsRemote, []byte("\t"), 2)[0]
284-
return string(remoteSha), nil
282+
return r.Tag, nil
285283
} else {
286-
repo, err := ghrepo.FromFullName(ext.url)
284+
gitExe, err := m.lookPath("git")
287285
if err != nil {
288286
return "", err
289287
}
290-
r, err := fetchLatestRelease(m.client, repo)
288+
extDir := filepath.Dir(ext.path)
289+
gitDir := "--git-dir=" + filepath.Join(extDir, ".git")
290+
cmd := m.newCommand(gitExe, gitDir, "ls-remote", "origin", "HEAD")
291+
lsRemote, err := cmd.Output()
291292
if err != nil {
292293
return "", err
293294
}
294-
return r.Tag, nil
295+
remoteSha := bytes.SplitN(lsRemote, []byte("\t"), 2)[0]
296+
return string(remoteSha), nil
295297
}
296298
}
297299

@@ -477,7 +479,7 @@ func (m *Manager) upgradeExtension(ext Extension, force bool) error {
477479
return upToDateError
478480
}
479481
var err error
480-
if ext.kind == BinaryKind {
482+
if ext.IsBinary() {
481483
err = m.upgradeBinExtension(ext)
482484
} else {
483485
err = m.upgradeGitExtension(ext, force)

pkg/cmd/extension/manager_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,30 @@ func TestManager_Dispatch(t *testing.T) {
139139
assert.Equal(t, "", stderr.String())
140140
}
141141

142+
func TestManager_Dispatch_binary(t *testing.T) {
143+
tempDir := t.TempDir()
144+
extPath := filepath.Join(tempDir, "extensions", "gh-hello")
145+
exePath := filepath.Join(extPath, "gh-hello")
146+
bm := binManifest{
147+
Owner: "owner",
148+
Name: "gh-hello",
149+
Host: "github.com",
150+
Tag: "v1.0.0",
151+
}
152+
assert.NoError(t, stubBinaryExtension(extPath, bm))
153+
154+
m := newTestManager(tempDir, nil, nil)
155+
156+
stdout := &bytes.Buffer{}
157+
stderr := &bytes.Buffer{}
158+
found, err := m.Dispatch([]string{"hello", "one", "two"}, nil, stdout, stderr)
159+
assert.NoError(t, err)
160+
assert.True(t, found)
161+
162+
assert.Equal(t, fmt.Sprintf("[%s one two]\n", exePath), stdout.String())
163+
assert.Equal(t, "", stderr.String())
164+
}
165+
142166
func TestManager_Remove(t *testing.T) {
143167
tempDir := t.TempDir()
144168
assert.NoError(t, stubExtension(filepath.Join(tempDir, "extensions", "gh-hello", "gh-hello")))

pkg/extensions/extension.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ type Extension interface {
1313
URL() string
1414
IsLocal() bool
1515
UpdateAvailable() bool
16+
IsBinary() bool
1617
}
1718

1819
//go:generate moq -rm -out manager_mock.go . ExtensionManager

pkg/extensions/extension_mock.go

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

0 commit comments

Comments
 (0)