Only use "master" as default branch if not set

So far we've used "master" as default branch when we encounter a project
configuration that doesn't have a default branch set. The problem here
is, that later project stanzas that do define a default branch won't
have any effect.

To fix this, we will only fall back on using "master" in the project
metadata if none of the project definitions declares a default branch.

Change-Id: Iddd5ef906c2bdbcc472615ffe25033c4ca961df7
This commit is contained in:
Simon Westphahl 2023-04-04 11:39:33 +02:00
parent b2dc863b44
commit 3b0cc02f11
No known key found for this signature in database
5 changed files with 78 additions and 4 deletions

View File

@ -0,0 +1,40 @@
- pipeline:
name: check
manager: independent
trigger:
gerrit:
- event: patchset-created
success:
gerrit:
Verified: 1
failure:
gerrit:
Verified: -1
- project:
name: '^org/regex-default.*'
- project:
name: '^org/regex-override.*'
default-branch: regex
- project:
name: org/project-default
- project:
# This should be the default
name: org/regex-default-project-empty
- project:
# This should be 'develop' because the regex doesn't specify
name: org/regex-default-project-develop
default-branch: develop
- project:
# This should be 'regex' because of the regex
name: org/regex-override-project-empty
- project:
# This should be 'develop' because it is more specific than the regex
name: org/regex-override-project-develop
default-branch: develop

View File

@ -1249,3 +1249,26 @@ class TestMergeMode(ZuulTestCase):
def test_default_merge_mode_github(self):
self._test_default_merge_mode(model.MERGER_MERGE,
'github.com')
class TestDefaultBranch(ZuulTestCase):
config_file = 'zuul-connections-gerrit-and-github.conf'
@simple_layout('layouts/default-branch.yaml')
def test_default_branch(self):
layout = self.scheds.first.sched.abide.tenants.get('tenant-one').layout
md = layout.getProjectMetadata(
'review.example.com/org/project-default')
self.assertEqual('master', md.default_branch)
md = layout.getProjectMetadata(
'review.example.com/org/regex-default-project-empty')
self.assertEqual('master', md.default_branch)
md = layout.getProjectMetadata(
'review.example.com/org/regex-default-project-develop')
self.assertEqual('develop', md.default_branch)
md = layout.getProjectMetadata(
'review.example.com/org/regex-override-project-empty')
self.assertEqual('regex', md.default_branch)
md = layout.getProjectMetadata(
'review.example.com/org/regex-override-project-develop')
self.assertEqual('develop', md.default_branch)

View File

@ -856,7 +856,7 @@ class TestWeb(BaseTestWeb):
'path': 'zuul.yaml',
'project': 'common-config'},
'templates': [],
'default_branch': 'master',
'default_branch': None,
'queue_name': 'integrated',
'merge_mode': None,
'pipelines': [{

View File

@ -1253,7 +1253,7 @@ class ProjectParser(object):
if mode is not None:
project_config.merge_mode = model.MERGER_MAP[mode]
default_branch = conf.get('default-branch', 'master')
default_branch = conf.get('default-branch')
project_config.default_branch = default_branch
project_config.queue_name = conf.get('queue', None)

View File

@ -7306,9 +7306,20 @@ class ProjectMetadata:
def __init__(self):
self.merge_mode = None
self.default_branch = None
self._default_branch = None
self.queue_name = None
def isDefaultBranchSet(self):
return self._default_branch is not None
@property
def default_branch(self):
return self._default_branch or "master"
@default_branch.setter
def default_branch(self, default_branch):
self._default_branch = default_branch
def toDict(self):
return {
'merge_mode': self.merge_mode,
@ -7946,7 +7957,7 @@ class Layout(object):
md = self.project_metadata[project_config.name]
if md.merge_mode is None and project_config.merge_mode is not None:
md.merge_mode = project_config.merge_mode
if (md.default_branch is None and
if (not md.isDefaultBranchSet() and
project_config.default_branch is not None):
md.default_branch = project_config.default_branch
if (