From 2fa3bb5bb8683e2b29cfbea31bf8ecff50a8c25f Mon Sep 17 00:00:00 2001 From: Scott Worley Date: Fri, 28 Jun 2024 23:50:27 -0700 Subject: [PATCH] Support "tag " syntax for fetching tags --- Changelog | 1 + git_cache.py | 12 +++++++++--- test_git_cache.py | 22 ++++++++++++++++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/Changelog b/Changelog index 8075597..59085ea 100644 --- a/Changelog +++ b/Changelog @@ -1,4 +1,5 @@ ## [Unreleased] +- Support "tag " syntax for fetching tags ## [1.4.4] - 2024-06-03 diff --git a/git_cache.py b/git_cache.py index 8171b48..76c0ed4 100644 --- a/git_cache.py +++ b/git_cache.py @@ -79,7 +79,7 @@ def is_ancestor(repo: Repo, descendant: RefOrRev, ancestor: RefOrRev) -> bool: 'merge-base', '--is-ancestor', ancestor, - descendant], + descendant.removeprefix('tag ')], check=False) return process.returncode == 0 @@ -178,9 +178,12 @@ def _git_fetch( repo: Repo, ref: Ref, force: bool = False) -> None: + refargs = (['tag', ref.removeprefix('tag ')] + if ref.startswith('tag ') + else [f'{ref}:{ref}']) subprocess.run(['git', '-C', cachedir, 'fetch'] + (['--force'] if force else []) + - [repo, f'{ref}:{ref}'], check=True) + [repo] + refargs, check=True) def fetch(repo: Repo, ref: Ref, force: bool = False) -> Tuple[Path, Rev]: @@ -201,7 +204,10 @@ def fetch(repo: Repo, ref: Ref, force: bool = False) -> Tuple[Path, Rev]: logging.debug('Fetching ref "%s" from %s', ref, repo) _git_fetch(cachedir, repo, ref, force=force) - with open(os.path.join(cachedir, 'refs', 'heads', ref), encoding='utf-8') as rev_file: + rev_path = (['tags', ref.removeprefix('tag ')] + if ref.startswith('tag ') + else ['heads', ref]) + with open(os.path.join(cachedir, 'refs', *rev_path), encoding='utf-8') as rev_file: rev = Rev(rev_file.read(999).strip()) verify_ancestry(repo, ref, rev, force=force) _log_fetch(repo, ref, rev, force=force) diff --git a/test_git_cache.py b/test_git_cache.py index 1845c01..3678171 100644 --- a/test_git_cache.py +++ b/test_git_cache.py @@ -261,6 +261,28 @@ class TestGitCache(unittest.TestCase): git_cache.ensure_rev_available( self.upstream, 'main', rev, force=True) + def test_fetch_tag(self) -> None: + _git(self.upstream, 'tag', 'v1.2.3') + d, rev = git_cache.fetch(self.upstream, 'tag v1.2.3') + self.assertEqual(_git(d, 'show', f'{rev}:file'), b'Contents') + + def test_ensure_tag(self) -> None: + rev = _git(self.upstream, 'log', '--format=%H', '-n1').strip().decode() + _git(self.upstream, 'tag', 'v1.2.3') + d = git_cache.ensure_rev_available(self.upstream, 'tag v1.2.3', rev) + self.assertEqual(_git(d, 'show', f'{rev}:file'), b'Contents') + + def test_fetch_annotated_tag(self) -> None: + _git(self.upstream, 'tag', '--annotate', '-m', 'Tag', 'v1.2.3') + d, rev = git_cache.fetch(self.upstream, 'tag v1.2.3') + self.assertEqual(_git(d, 'show', f'{rev}:file'), b'Contents') + + def test_ensure_annotated_tag(self) -> None: + rev = _git(self.upstream, 'log', '--format=%H', '-n1').strip().decode() + _git(self.upstream, 'tag', '--annotate', '-m', 'Tag', 'v1.2.3') + d = git_cache.ensure_rev_available(self.upstream, 'tag v1.2.3', rev) + self.assertEqual(_git(d, 'show', f'{rev}:file'), b'Contents') + if __name__ == '__main__': unittest.main() -- 2.44.1