From 6da17751ca4e3b90834ca763f448ddc39b32651b Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Wed, 11 Sep 2019 18:43:17 -0400 Subject: prune: handle branches that track missing branches Series of steps: * Create a local "b1" branch with `repo start b1` that tracks a remote branch (totally fine) * Manually create a local "b2" branch with `git branch --track b1 b2` that tracks the local "b1" (uh-oh...) * Delete the local "b1" branch manually or via `repo prune` (....) * Try to process the "b2" branch with `repo prune` Since b2 tracks a branch that no longer exists, everything blows up at this point as we try to probe the non-existent ref. Instead, we should flag this as unknown and leave it up to the user to resolve. This probably could come up if a local branch was tracking a remote branch that was deleted from the server, and users ran something like `repo sync --prune` which cleaned up the remote refs. Bug: https://crbug.com/gerrit/11485 Change-Id: I6b6b6041943944b8efa6e2ad0b8b10f13a75a5c2 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/236793 Reviewed-by: David Pursehouse Reviewed-by: Kirtika Ruchandani Reviewed-by: Mike Frysinger Tested-by: Mike Frysinger --- tests/test_project.py | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) (limited to 'tests/test_project.py') diff --git a/tests/test_project.py b/tests/test_project.py index 9b289e11..77126dff 100644 --- a/tests/test_project.py +++ b/tests/test_project.py @@ -18,11 +18,30 @@ from __future__ import print_function +import contextlib +import os +import shutil +import subprocess +import tempfile import unittest +import git_config import project +@contextlib.contextmanager +def TempGitTree(): + """Create a new empty git checkout for testing.""" + # TODO(vapier): Convert this to tempfile.TemporaryDirectory once we drop + # Python 2 support entirely. + try: + tempdir = tempfile.mkdtemp(prefix='repo-tests') + subprocess.check_call(['git', 'init'], cwd=tempdir) + yield tempdir + finally: + shutil.rmtree(tempdir) + + class RepoHookShebang(unittest.TestCase): """Check shebang parsing in RepoHook.""" @@ -60,3 +79,58 @@ class RepoHookShebang(unittest.TestCase): for shebang, interp in DATA: self.assertEqual(project.RepoHook._ExtractInterpFromShebang(shebang), interp) + + +class FakeProject(object): + """A fake for Project for basic functionality.""" + + def __init__(self, worktree): + self.worktree = worktree + self.gitdir = os.path.join(worktree, '.git') + self.name = 'fakeproject' + self.work_git = project.Project._GitGetByExec( + self, bare=False, gitdir=self.gitdir) + self.bare_git = project.Project._GitGetByExec( + self, bare=True, gitdir=self.gitdir) + self.config = git_config.GitConfig.ForRepository(gitdir=self.gitdir) + + +class ReviewableBranchTests(unittest.TestCase): + """Check ReviewableBranch behavior.""" + + def test_smoke(self): + """A quick run through everything.""" + with TempGitTree() as tempdir: + fakeproj = FakeProject(tempdir) + + # Generate some commits. + with open(os.path.join(tempdir, 'readme'), 'w') as fp: + fp.write('txt') + fakeproj.work_git.add('readme') + fakeproj.work_git.commit('-mAdd file') + fakeproj.work_git.checkout('-b', 'work') + fakeproj.work_git.rm('-f', 'readme') + fakeproj.work_git.commit('-mDel file') + + # Start off with the normal details. + rb = project.ReviewableBranch( + fakeproj, fakeproj.config.GetBranch('work'), 'master') + self.assertEqual('work', rb.name) + self.assertEqual(1, len(rb.commits)) + self.assertIn('Del file', rb.commits[0]) + d = rb.unabbrev_commits + self.assertEqual(1, len(d)) + short, long = next(iter(d.items())) + self.assertTrue(long.startswith(short)) + self.assertTrue(rb.base_exists) + # Hard to assert anything useful about this. + self.assertTrue(rb.date) + + # Now delete the tracking branch! + fakeproj.work_git.branch('-D', 'master') + rb = project.ReviewableBranch( + fakeproj, fakeproj.config.GetBranch('work'), 'master') + self.assertEqual(0, len(rb.commits)) + self.assertFalse(rb.base_exists) + # Hard to assert anything useful about this. + self.assertTrue(rb.date) -- cgit v1.2.3-54-g00ecf