From 5ca985edb3d429967cd40d34229db19a1b7c6b0a Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Wed, 18 Mar 2015 18:13:51 +0000 Subject: Add functions for checking which tags/branches contain a ref Change-Id: Ic6e613c21ed26c528ad7c75f41af01d7552729fd --- morphlib/gitdir.py | 26 ++++++++++++++++++++++++++ morphlib/gitdir_tests.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/morphlib/gitdir.py b/morphlib/gitdir.py index 03640a22..1c286720 100644 --- a/morphlib/gitdir.py +++ b/morphlib/gitdir.py @@ -681,6 +681,32 @@ class GitDirectory(object): if not morphlib.git.is_valid_sha1(string): raise ExpectedSha1Error(string) + def _check_ref_exists(self, ref): + self._rev_parse('%s^{commit}' % ref) + + def _gitcmd_output_list(self, *args): + output = morphlib.git.gitcmd(self._runcmd, *args) + separated = [l.strip() for l in output.splitlines()] + prefix = '* ' + for i, l in enumerate(separated): + if l.startswith(prefix): + separated[i] = l[len(prefix):] + return separated + + def tags_containing_sha1(self, ref): # pragma: no cover + self._check_is_sha1(ref) + self._check_ref_exists(ref) + + args = ['tag', '--contains', ref] + return self._gitcmd_output_list(*args) + + def branches_containing_sha1(self, ref): + self._check_is_sha1(ref) + self._check_ref_exists(ref) + + args = ['branch', '--contains', ref] + return self._gitcmd_output_list(*args) + def _update_ref(self, ref_args, message): args = ['update-ref'] # No test coverage, since while this functionality is useful, diff --git a/morphlib/gitdir_tests.py b/morphlib/gitdir_tests.py index a6e1921d..f606dfe7 100644 --- a/morphlib/gitdir_tests.py +++ b/morphlib/gitdir_tests.py @@ -95,6 +95,38 @@ class GitDirectoryTests(unittest.TestCase): self.assertIsInstance(gitdir.get_index(), morphlib.gitindex.GitIndex) +class GitDirectoryAnchoredRefTests(unittest.TestCase): + + def setUp(self): + self.tempdir = tempfile.mkdtemp() + self.dirname = os.path.join(self.tempdir, 'foo') + os.mkdir(self.dirname) + gd = morphlib.gitdir.init(self.dirname) + with open(os.path.join(self.dirname, 'test_file.morph'), "w") as f: + f.write('dummy morphology text') + morphlib.git.gitcmd(gd._runcmd, 'add', '.') + morphlib.git.gitcmd(gd._runcmd, 'commit', '-m', 'Initial commit') + + def tearDown(self): + shutil.rmtree(self.tempdir) + + def test_ref_anchored_in_branch(self): + gd = morphlib.gitdir.GitDirectory(self.dirname) + output = morphlib.git.gitcmd(gd._runcmd, 'rev-parse', 'HEAD') + ref = output.strip() + + self.assertEqual(len(gd.branches_containing_sha1(ref)), 1) + self.assertEqual(gd.branches_containing_sha1(ref)[0], 'master') + + def test_ref_not_anchored_in_branch(self): + gd = morphlib.gitdir.GitDirectory(self.dirname) + output = morphlib.git.gitcmd(gd._runcmd, 'rev-parse', 'HEAD') + ref = output.strip() + + morphlib.git.gitcmd(gd._runcmd, 'commit', '--amend', '-m', + 'New commit message') + self.assertEqual(len(gd.branches_containing_sha1(ref)), 0) + class GitDirectoryContentsTests(unittest.TestCase): def setUp(self): -- cgit v1.2.1