From 15d058edf0828e2a5500b9ec1cd41d91f39d5331 Mon Sep 17 00:00:00 2001 From: Chris Jerdonek Date: Tue, 22 Aug 2017 20:08:55 -0700 Subject: [PATCH] Start using Git.get_revision_sha(). --- src/pip/_internal/vcs/git.py | 60 ++++-------------- tests/functional/test_install_vcs_git.py | 77 +++--------------------- tests/unit/test_vcs.py | 12 ---- 3 files changed, 20 insertions(+), 129 deletions(-) diff --git a/src/pip/_internal/vcs/git.py b/src/pip/_internal/vcs/git.py index 7679ad6dc..92201bd18 100644 --- a/src/pip/_internal/vcs/git.py +++ b/src/pip/_internal/vcs/git.py @@ -113,34 +113,28 @@ class Git(VersionControl): return refs.get('refs/tags/{}'.format(rev)) def check_rev_options(self, dest, rev_options): - """Check the revision options before checkout to compensate that tags - and branches may need origin/ as a prefix. + """Check the revision options before checkout. + Returns a new RevOptions object for the SHA1 of the branch or tag if found. Args: rev_options: a RevOptions object. """ - revisions = self.get_short_refs(dest) - rev = rev_options.arg_rev - origin_rev = 'origin/%s' % rev - if origin_rev in revisions: - # remote branch - return rev_options.make_new(revisions[origin_rev]) - elif rev in revisions: - # a local tag or branch name - return rev_options.make_new(revisions[rev]) + sha = self.get_revision_sha(dest, rev) # Do not show a warning for the common case of something that has # the form of a Git commit hash. - if not looks_like_hash(rev): - logger.warning( - "Did not find branch or tag '%s', assuming ref or revision.", - rev, - ) + if sha is None: + if not looks_like_hash(rev): + logger.warning( + "Did not find branch or tag '%s', assuming revision or ref", + rev, + ) + return rev_options - return rev_options + return rev_options.make_new(sha) def is_commit_id_equal(self, dest, name): """ @@ -221,38 +215,6 @@ class Git(VersionControl): ['rev-parse', 'HEAD'], show_stdout=False, cwd=location) return current_rev.strip() - def get_full_refs(self, location): - """Yields tuples of (commit, ref) for branches and tags""" - output = self.run_command(['show-ref'], - show_stdout=False, cwd=location) - for line in output.strip().splitlines(): - commit, ref = line.split(' ', 1) - yield commit.strip(), ref.strip() - - def is_ref_remote(self, ref): - return ref.startswith('refs/remotes/') - - def is_ref_branch(self, ref): - return ref.startswith('refs/heads/') - - def is_ref_tag(self, ref): - return ref.startswith('refs/tags/') - - def get_short_refs(self, location): - """Return map of named refs (branches or tags) to commit hashes.""" - rv = {} - for commit, ref in self.get_full_refs(location): - ref_name = None - if self.is_ref_remote(ref): - ref_name = ref[len('refs/remotes/'):] - elif self.is_ref_branch(ref): - ref_name = ref[len('refs/heads/'):] - elif self.is_ref_tag(ref): - ref_name = ref[len('refs/tags/'):] - if ref_name is not None: - rv[ref_name] = commit - return rv - def _get_subdirectory(self, location): """Return the relative path of setup.py to the git repo root.""" # find the repo root diff --git a/tests/functional/test_install_vcs_git.py b/tests/functional/test_install_vcs_git.py index be6643904..1aa5d4fff 100644 --- a/tests/functional/test_install_vcs_git.py +++ b/tests/functional/test_install_vcs_git.py @@ -9,55 +9,6 @@ from tests.lib.git_submodule_helpers import ( ) -@pytest.mark.network -def test_get_short_refs_should_return_tag_name_and_commit_pair(script): - version_pkg_path = _create_test_package(script) - script.run('git', 'tag', '0.1', cwd=version_pkg_path) - script.run('git', 'tag', '0.2', cwd=version_pkg_path) - commit = script.run( - 'git', 'rev-parse', 'HEAD', - cwd=version_pkg_path - ).stdout.strip() - git = Git() - result = git.get_short_refs(version_pkg_path) - assert result['0.1'] == commit, result - assert result['0.2'] == commit, result - - -@pytest.mark.network -def test_get_short_refs_should_return_branch_name_and_commit_pair(script): - version_pkg_path = _create_test_package(script) - script.run('git', 'branch', 'branch0.1', cwd=version_pkg_path) - commit = script.run( - 'git', 'rev-parse', 'HEAD', - cwd=version_pkg_path - ).stdout.strip() - git = Git() - result = git.get_short_refs(version_pkg_path) - assert result['master'] == commit, result - assert result['branch0.1'] == commit, result - - -@pytest.mark.network -def test_get_short_refs_should_ignore_no_branch(script): - version_pkg_path = _create_test_package(script) - script.run('git', 'branch', 'branch0.1', cwd=version_pkg_path) - commit = script.run( - 'git', 'rev-parse', 'HEAD', - cwd=version_pkg_path - ).stdout.strip() - # current branch here is "* (nobranch)" - script.run( - 'git', 'checkout', commit, - cwd=version_pkg_path, - expect_stderr=True, - ) - git = Git() - result = git.get_short_refs(version_pkg_path) - assert result['master'] == commit, result - assert result['branch0.1'] == commit, result - - @pytest.mark.network def test_is_commit_id_equal(script): """ @@ -78,34 +29,24 @@ def test_is_commit_id_equal(script): assert not git.is_commit_id_equal(version_pkg_path, None) -@patch('pip._internal.vcs.git.Git.get_short_refs') -def test_check_rev_options_should_handle_branch_name(get_refs_mock): - get_refs_mock.return_value = {'master': '123456', '0.1': 'abc123'} +@patch('pip._internal.vcs.git.Git.get_revision_sha') +def test_check_rev_options_ref_exists(get_sha_mock): + get_sha_mock.return_value = '123456' git = Git() - rev_options = git.make_rev_options('master') + rev_options = git.make_rev_options('develop') new_options = git.check_rev_options('.', rev_options) assert new_options.rev == '123456' -@patch('pip._internal.vcs.git.Git.get_short_refs') -def test_check_rev_options_should_handle_tag_name(get_refs_mock): - get_refs_mock.return_value = {'master': '123456', '0.1': 'abc123'} +@patch('pip._internal.vcs.git.Git.get_revision_sha') +def test_check_rev_options_ref_not_found(get_sha_mock): + get_sha_mock.return_value = None git = Git() - rev_options = git.make_rev_options('0.1') + rev_options = git.make_rev_options('develop') new_options = git.check_rev_options('.', rev_options) - assert new_options.rev == 'abc123' - - -@patch('pip._internal.vcs.git.Git.get_short_refs') -def test_check_rev_options_should_handle_ambiguous_commit(get_refs_mock): - get_refs_mock.return_value = {'master': '123456', '0.1': '123456'} - git = Git() - rev_options = git.make_rev_options('0.1') - - new_options = git.check_rev_options('.', rev_options) - assert new_options.rev == '123456' + assert new_options.rev == 'develop' @patch('pip._internal.vcs.git.Git.get_short_refs') diff --git a/tests/unit/test_vcs.py b/tests/unit/test_vcs.py index 8f49e3ae1..540538f72 100644 --- a/tests/unit/test_vcs.py +++ b/tests/unit/test_vcs.py @@ -74,21 +74,9 @@ def test_rev_options_make_new(): def git(): git_url = 'http://github.com/pypa/pip-test-package' sha = '5547fa909e83df8bd743d3978d6667497983a4b7' - refs = { - '0.1': 'a8992fc7ee17e5b9ece022417b64594423caca7c', - '0.1.1': '7d654e66c8fa7149c165ddeffa5b56bc06619458', - '0.1.2': 'f1c1020ebac81f9aeb5c766ff7a772f709e696ee', - 'foo': sha, - 'bar': sha, - 'master': sha, - 'origin/master': sha, - 'origin/HEAD': sha, - } - git = Git() git.get_url = Mock(return_value=git_url) git.get_revision = Mock(return_value=sha) - git.get_short_refs = Mock(return_value=refs) return git -- GitLab