summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Drake <michael.drake@codethink.co.uk>2015-03-18 18:13:51 +0000
committerBaserock Gerrit <gerrit@baserock.org>2015-04-01 16:44:51 +0000
commit5ca985edb3d429967cd40d34229db19a1b7c6b0a (patch)
tree51b11bee75997e5aff3eaecbb303081fcca0c0a2
parent59446059d430673c75561233d37d2a319e6188f3 (diff)
downloadmorph-5ca985edb3d429967cd40d34229db19a1b7c6b0a.tar.gz
Add functions for checking which tags/branches contain a ref
Change-Id: Ic6e613c21ed26c528ad7c75f41af01d7552729fd
-rw-r--r--morphlib/gitdir.py26
-rw-r--r--morphlib/gitdir_tests.py32
2 files changed, 58 insertions, 0 deletions
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):