From 1dbcfd5346e3d037331d0838d5220e6ec6ab62a0 Mon Sep 17 00:00:00 2001 From: Albin Vass Date: Fri, 23 Oct 2020 14:19:35 +0200 Subject: [PATCH] bugfix: branches with pattern 'refs/heads/..' fails merge jobs GitPython is trying to be nice and thinks that we want the head '' when trying to create the head 'refs/heads/'. Avoid this by always prepending 'refs/heads/'. Change-Id: I90768fd678b02a7fbfc0675456dc4105b51d7f06 --- tests/unit/test_merger_repo.py | 13 +++++++++++++ zuul/merger/merger.py | 6 ++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/tests/unit/test_merger_repo.py b/tests/unit/test_merger_repo.py index 9a626ea56b..8fdfdb20d4 100644 --- a/tests/unit/test_merger_repo.py +++ b/tests/unit/test_merger_repo.py @@ -35,6 +35,19 @@ class TestMergerRepo(ZuulTestCase): super(TestMergerRepo, self).setUp() self.workspace_root = os.path.join(self.test_root, 'workspace') + def test_create_head_path(self): + parent_path = os.path.join(self.upstream_root, 'org/project1') + parent_repo = git.Repo(parent_path) + parent_repo.create_head("refs/heads/foobar") + parent_repo.create_head("refs/heads/refs/heads/foobar") + + work_repo = Repo(parent_path, self.workspace_root, + 'none@example.org', 'User Name', '0', '0') + repo = work_repo.createRepoObject(None) + self.assertIn('foobar', repo.branches) + self.assertIn('refs/heads/foobar', repo.branches) + self.assertNotIn('refs/heads/refs/heads/foobar', repo.branches) + def test_ensure_cloned(self): parent_path = os.path.join(self.upstream_root, 'org/project1') diff --git a/zuul/merger/merger.py b/zuul/merger/merger.py index 72e2a2d77b..141d99212f 100644 --- a/zuul/merger/merger.py +++ b/zuul/merger/merger.py @@ -184,7 +184,9 @@ class Repo(object): for ref in origin.refs: if ref.remote_head == 'HEAD': continue - repo.create_head(ref.remote_head, ref, force=True) + repo.create_head('refs/heads/' + ref.remote_head, + ref, + force=True) with repo.config_writer() as config_writer: if self.email: config_writer.set_value('user', 'email', self.email) @@ -384,7 +386,7 @@ class Repo(object): for ref in origin.refs: if ref.remote_head == 'HEAD': continue - repo.create_head(ref.remote_head, ref, force=True) + repo.create_head('refs/heads/' + ref.remote_head, ref, force=True) return messages def reset(self, zuul_event_id=None, build=None, process_worker=None):