From f350b917e477280f89b8351331e2d55110399945 Mon Sep 17 00:00:00 2001 From: meiji163 Date: Thu, 3 Mar 2022 22:10:35 -0800 Subject: [PATCH] fix tests --- pkg/cmd/extension/command_test.go | 2 +- pkg/cmd/extension/http.go | 4 +- pkg/cmd/extension/manager.go | 31 +++++++------- pkg/cmd/extension/manager_test.go | 68 +++++++++++++++++++++++++++++-- 4 files changed, 84 insertions(+), 21 deletions(-) diff --git a/pkg/cmd/extension/command_test.go b/pkg/cmd/extension/command_test.go index 8f896eab0..1c7e4dd6d 100644 --- a/pkg/cmd/extension/command_test.go +++ b/pkg/cmd/extension/command_test.go @@ -44,7 +44,7 @@ func TestNewCmdExtension(t *testing.T) { em.ListFunc = func(bool) []extensions.Extension { return []extensions.Extension{} } - em.InstallFunc = func(_ ghrepo.Interface) error { + em.InstallFunc = func(_ ghrepo.Interface, _ string) error { return nil } return func(t *testing.T) { diff --git a/pkg/cmd/extension/http.go b/pkg/cmd/extension/http.go index 38ba9c5e5..7208b1569 100644 --- a/pkg/cmd/extension/http.go +++ b/pkg/cmd/extension/http.go @@ -128,11 +128,11 @@ func fetchReleaseFromTag(httpClient *http.Client, baseRepo ghrepo.Interface, tag } resp, err := httpClient.Do(req) - defer resp.Body.Close() if err != nil { return nil, err } + defer resp.Body.Close() if resp.StatusCode == 404 { return nil, releaseNotFoundErr } @@ -165,11 +165,11 @@ func fetchCommitSHA(httpClient *http.Client, baseRepo ghrepo.Interface, targetRe req.Header.Set("Accept", "application/vnd.github.VERSION.sha") resp, err := httpClient.Do(req) - defer resp.Body.Close() if err != nil { return "", err } + defer resp.Body.Close() if resp.StatusCode == 422 { return "", commitNotFoundErr } diff --git a/pkg/cmd/extension/manager.go b/pkg/cmd/extension/manager.go index 34db89a10..b6067fb7d 100644 --- a/pkg/cmd/extension/manager.go +++ b/pkg/cmd/extension/manager.go @@ -212,7 +212,7 @@ func (m *Manager) parseGitExtensionDir(fi fs.FileInfo) (Extension, error) { var pinnedVersion string pinPath := filepath.Join(id, fi.Name(), fmt.Sprintf(".pin-%s", currentVersion)) - if _, err := os.Stat(pinPath); err == nil { + if _, err := os.Stat(pinPath); err == nil && len(currentVersion) > 6 { pinnedVersion = currentVersion[:7] } @@ -235,6 +235,7 @@ func (m *Manager) getCurrentVersion(extension string) string { dir := m.installDir() gitDir := "--git-dir=" + filepath.Join(dir, extension, ".git") cmd := m.newCommand(gitExe, gitDir, "rev-parse", "HEAD") + localSha, err := cmd.Output() if err != nil { return "" @@ -333,13 +334,13 @@ type binManifest struct { } // Install installs an extension from repo, and pins to commitish if provided -func (m *Manager) Install(repo ghrepo.Interface, targetCommitish string) error { +func (m *Manager) Install(repo ghrepo.Interface, target string) error { isBin, err := isBinExtension(m.client, repo) if err != nil { return fmt.Errorf("could not check for binary extension: %w", err) } if isBin { - return m.installBin(repo, targetCommitish) + return m.installBin(repo, target) } hs, err := hasScript(m.client, repo) @@ -350,17 +351,17 @@ func (m *Manager) Install(repo ghrepo.Interface, targetCommitish string) error { return errors.New("extension is not installable: missing executable") } - return m.installGit(repo, targetCommitish, m.io.Out, m.io.ErrOut) + return m.installGit(repo, target, m.io.Out, m.io.ErrOut) } -func (m *Manager) installBin(repo ghrepo.Interface, targetCommitish string) error { +func (m *Manager) installBin(repo ghrepo.Interface, target string) error { var r *release var err error - isPinned := targetCommitish != "" + isPinned := target != "" if isPinned { - r, err = fetchLatestRelease(m.client, repo) + r, err = fetchReleaseFromTag(m.client, repo, target) } else { - r, err = fetchReleaseFromTag(m.client, repo, targetCommitish) + r, err = fetchLatestRelease(m.client, repo) } if err != nil { return err @@ -428,7 +429,7 @@ func (m *Manager) installBin(repo ghrepo.Interface, targetCommitish string) erro return nil } -func (m *Manager) installGit(repo ghrepo.Interface, targetCommitish string, stdout, stderr io.Writer) error { +func (m *Manager) installGit(repo ghrepo.Interface, target string, stdout, stderr io.Writer) error { protocol, _ := m.config.GetOrDefault(repo.RepoHost(), "git_protocol") cloneURL := ghrepo.FormatRemoteURL(repo, protocol) @@ -438,8 +439,8 @@ func (m *Manager) installGit(repo ghrepo.Interface, targetCommitish string, stdo } var commitSHA string - if targetCommitish != "" { - commitSHA, err = fetchCommitSHA(m.client, repo, targetCommitish) + if target != "" { + commitSHA, err = fetchCommitSHA(m.client, repo, target) if err != nil { return err } @@ -466,12 +467,11 @@ func (m *Manager) installGit(repo ghrepo.Interface, targetCommitish string, stdo } pinPath := filepath.Join(targetDir, fmt.Sprintf(".pin-%s", commitSHA)) - f, err := os.OpenFile(pinPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) - defer f.Close() + f, err := os.OpenFile(pinPath, os.O_WRONLY|os.O_CREATE, 0600) if err != nil { return fmt.Errorf("failed to create pin in directory: %w", err) } - return nil + return f.Close() } var pinnedExtensionUpgradeError = errors.New("pinned extensions can not be upgraded") @@ -514,7 +514,8 @@ func (m *Manager) upgradeExtensions(exts []Extension, force bool) error { err := m.upgradeExtension(f, force) if err != nil { if !errors.Is(err, localExtensionUpgradeError) && - !errors.Is(err, upToDateError) { + !errors.Is(err, upToDateError) && + !errors.Is(err, pinnedExtensionUpgradeError) { failed = true } fmt.Fprintf(m.io.Out, "%s\n", err) diff --git a/pkg/cmd/extension/manager_test.go b/pkg/cmd/extension/manager_test.go index 47f11d348..e1fc45f49 100644 --- a/pkg/cmd/extension/manager_test.go +++ b/pkg/cmd/extension/manager_test.go @@ -445,6 +445,50 @@ func TestManager_UpgradeExtension_BinaryExtension(t *testing.T) { assert.Equal(t, "", stderr.String()) } +func TestManager_UpgradeExtension_PinnedBinaryExtension(t *testing.T) { + tempDir := t.TempDir() + + assert.NoError(t, stubBinaryExtension( + filepath.Join(tempDir, "extensions", "gh-bin-ext"), + binManifest{ + Owner: "owner", + Name: "gh-bin-ext", + Host: "example.com", + Tag: "v1.6.3", + Pinned: true, + })) + + io, _, _, _ := iostreams.Test() + m := newTestManager(tempDir, nil, io) + exts, err := m.list(false) + assert.Nil(t, err) + assert.Equal(t, 1, len(exts)) + ext := exts[0] + + err = m.upgradeExtension(ext, false) + assert.NotNil(t, err) + assert.Equal(t, err, pinnedExtensionUpgradeError) +} + +func TestManager_UpgradeExtenion_PinnedGitExtension(t *testing.T) { + tempDir := t.TempDir() + extDir := filepath.Join(tempDir, "extensions", "gh-remote") + assert.NoError(t, stubPinnedExtension(filepath.Join(extDir, "gh-remote"), "abc1234")) + + io, _, _, _ := iostreams.Test() + m := newTestManager(tempDir, nil, io) + exts, err := m.list(false) + assert.NoError(t, err) + assert.Equal(t, 1, len(exts)) + ext := exts[0] + ext.latestVersion = "new version" + ext.pin = "abc1234" + + err = m.upgradeExtension(ext, false) + assert.NotNil(t, err) + assert.Equal(t, err, pinnedExtensionUpgradeError) +} + func TestManager_Install_git(t *testing.T) { tempDir := t.TempDir() @@ -472,7 +516,7 @@ func TestManager_Install_git(t *testing.T) { repo := ghrepo.New("owner", "gh-some-ext") - err := m.Install(repo) + err := m.Install(repo, "") assert.NoError(t, err) assert.Equal(t, fmt.Sprintf("[git clone https://github.com/owner/gh-some-ext.git %s]\n", filepath.Join(tempDir, "extensions", "gh-some-ext")), stdout.String()) assert.Equal(t, "", stderr.String()) @@ -514,7 +558,7 @@ func TestManager_Install_binary_unsupported(t *testing.T) { m := newTestManager(tempDir, &client, io) - err := m.Install(repo) + err := m.Install(repo, "") assert.EqualError(t, err, "gh-bin-ext unsupported for windows-amd64. Open an issue: `gh issue create -R owner/gh-bin-ext -t'Support windows-amd64'`") assert.Equal(t, "", stdout.String()) @@ -559,7 +603,7 @@ func TestManager_Install_binary(t *testing.T) { m := newTestManager(tempDir, &http.Client{Transport: ®}, io) - err := m.Install(repo) + err := m.Install(repo, "") assert.NoError(t, err) manifest, err := os.ReadFile(filepath.Join(tempDir, "extensions/gh-bin-ext", manifestName)) @@ -702,6 +746,24 @@ func stubExtension(path string) error { return f.Close() } +func stubPinnedExtension(path string, pinnedVersion string) error { + if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil { + return err + } + f, err := os.OpenFile(path, os.O_CREATE, 0755) + if err != nil { + return err + } + f.Close() + + pinPath := filepath.Join(filepath.Dir(path), fmt.Sprintf(".pin-%s", pinnedVersion)) + f, err = os.OpenFile(pinPath, os.O_WRONLY|os.O_CREATE, 0600) + if err != nil { + return err + } + return f.Close() +} + func stubLocalExtension(tempDir, path string) error { extDir, err := ioutil.TempDir(tempDir, "local-ext") if err != nil {