From cfc8111f5e04ece139892bb9af4bd63aac2b75f3 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Sat, 29 Feb 2020 02:56:32 -0500 Subject: init: allow REPO_REV/--repo-rev to specify commits/tags While the help/usage suggested that revisions would work, they never actually did, and just throw confusing errors. Now that we warn if the checkout isn't tracking a branch, allow people to specify commits or tags explicitly. Hopefully our nags will be sufficient to keep most people on the right path. Bug: https://crbug.com/gerrit/11045 Change-Id: I6ea32c677912185f55ab20faaa23c6c0a4c483b3 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/259492 Tested-by: Mike Frysinger Reviewed-by: Jonathan Nieder --- tests/test_wrapper.py | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) (limited to 'tests') diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index c105a3ce..73c62cc1 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -20,6 +20,8 @@ from __future__ import print_function import os import re +import shutil +import tempfile import unittest from pyversion import is_python3 @@ -241,5 +243,90 @@ class CheckGitVersion(RepoWrapperTestCase): self.wrapper._CheckGitVersion() +class ResolveRepoRev(RepoWrapperTestCase): + """Check resolve_repo_rev behavior.""" + + GIT_DIR = None + REV_LIST = None + + @classmethod + def setUpClass(cls): + # Create a repo to operate on, but do it once per-class. + cls.GIT_DIR = tempfile.mkdtemp(prefix='repo-rev-tests') + run_git = wrapper.Wrapper().run_git + + remote = os.path.join(cls.GIT_DIR, 'remote') + os.mkdir(remote) + run_git('init', cwd=remote) + run_git('commit', '--allow-empty', '-minit', cwd=remote) + run_git('branch', 'stable', cwd=remote) + run_git('tag', 'v1.0', cwd=remote) + run_git('commit', '--allow-empty', '-m2nd commit', cwd=remote) + cls.REV_LIST = run_git('rev-list', 'HEAD', cwd=remote).stdout.splitlines() + + run_git('init', cwd=cls.GIT_DIR) + run_git('fetch', remote, '+refs/heads/*:refs/remotes/origin/*', cwd=cls.GIT_DIR) + + @classmethod + def tearDownClass(cls): + if not cls.GIT_DIR: + return + + shutil.rmtree(cls.GIT_DIR) + + def test_explicit_branch(self): + """Check refs/heads/branch argument.""" + rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'refs/heads/stable') + self.assertEqual('refs/heads/stable', rrev) + self.assertEqual(self.REV_LIST[1], lrev) + + with self.assertRaises(wrapper.CloneFailure): + self.wrapper.resolve_repo_rev(self.GIT_DIR, 'refs/heads/unknown') + + def test_explicit_tag(self): + """Check refs/tags/tag argument.""" + rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'refs/tags/v1.0') + self.assertEqual('refs/tags/v1.0', rrev) + self.assertEqual(self.REV_LIST[1], lrev) + + with self.assertRaises(wrapper.CloneFailure): + self.wrapper.resolve_repo_rev(self.GIT_DIR, 'refs/tags/unknown') + + def test_branch_name(self): + """Check branch argument.""" + rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'stable') + self.assertEqual('refs/heads/stable', rrev) + self.assertEqual(self.REV_LIST[1], lrev) + + rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'master') + self.assertEqual('refs/heads/master', rrev) + self.assertEqual(self.REV_LIST[0], lrev) + + def test_tag_name(self): + """Check tag argument.""" + rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'v1.0') + self.assertEqual('refs/tags/v1.0', rrev) + self.assertEqual(self.REV_LIST[1], lrev) + + def test_full_commit(self): + """Check specific commit argument.""" + commit = self.REV_LIST[0] + rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, commit) + self.assertEqual(commit, rrev) + self.assertEqual(commit, lrev) + + def test_partial_commit(self): + """Check specific (partial) commit argument.""" + commit = self.REV_LIST[0][0:20] + rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, commit) + self.assertEqual(self.REV_LIST[0], rrev) + self.assertEqual(self.REV_LIST[0], lrev) + + def test_unknown(self): + """Check unknown ref/commit argument.""" + with self.assertRaises(wrapper.CloneFailure): + self.wrapper.resolve_repo_rev(self.GIT_DIR, 'boooooooya') + + if __name__ == '__main__': unittest.main() -- cgit v1.2.3-54-g00ecf