From 8c12a1ac8ae0d865c460e1796f8458bdee0b61f6 Mon Sep 17 00:00:00 2001 From: Mohan Boddu Date: Jan 14 2021 17:31:40 +0000 Subject: [PATCH 1/2] Changing the default dist-git branch to 'rawhide' Signed-off-by: Mohan Boddu --- diff --git a/fedscm_admin/__init__.py b/fedscm_admin/__init__.py index bba15a0..ccfa760 100644 --- a/fedscm_admin/__init__.py +++ b/fedscm_admin/__init__.py @@ -31,7 +31,7 @@ except pkg_resources.DistributionNotFound: MONITOR_CHOICES = ['no-monitoring', 'monitoring', 'monitoring-with-scratch'] STANDARD_BRANCH_SLAS = { - 'master': { + 'rawhide': { 'rawhide': '2222-01-01' }, 'epel8': { diff --git a/fedscm_admin/bugzilla.py b/fedscm_admin/bugzilla.py index 8336e8a..5cb7b16 100644 --- a/fedscm_admin/bugzilla.py +++ b/fedscm_admin/bugzilla.py @@ -99,8 +99,8 @@ class BugzillaClient(object): """ Checks the validity of a Bugzilla bug representing a Fedora package review. This function was inspired by: - https://github.com/fedora-infra/pkgdb2/blob/master/pkgdb2/api/extras.py - https://pagure.io/pkgdb-cli/blob/master/f/pkgdb2client/utils.py + https://github.com/fedora-infra/pkgdb2/blob/main/pkgdb2/api/extras.py + https://pagure.io/pkgdb-cli/blob/main/f/pkgdb2client/utils.py :param bug_id: string or integer of the Bugzilla bug ID :param pkg: string of the package name :param branch: string of the branch name @@ -125,7 +125,7 @@ class BugzillaClient(object): # Check that the bug is valid bz_proper_component = self.pagure_namespace_to_component.get(namespace) bz_proper_products = self.pagure_namespace_to_product.get(namespace) - if namespace == 'rpms' and branch != 'master': + if namespace == 'rpms' and (branch != 'rawhide' or branch != 'main'): if is_epel(branch) and bug.product != 'Fedora EPEL': raise ValidationError( 'The Bugzilla bug is for "{0}" but the ' diff --git a/fedscm_admin/fas.py b/fedscm_admin/fas.py index 80ce56f..35087a1 100644 --- a/fedscm_admin/fas.py +++ b/fedscm_admin/fas.py @@ -83,7 +83,7 @@ class FASClient(object): def get_fas_user(self, value, search_key='username'): """ Taken from: - https://pagure.io/pkgdb-cli/blob/master/f/pkgdb2client/utils.py + https://pagure.io/pkgdb-cli/blob/main/f/pkgdb2client/utils.py Get the FAS user associated with the provided key value If an email address is used, it can be either the FAS email address or diff --git a/fedscm_admin/git.py b/fedscm_admin/git.py index f9e2e21..4f73821 100644 --- a/fedscm_admin/git.py +++ b/fedscm_admin/git.py @@ -124,13 +124,13 @@ class GitRepo(object): """ command = ['git', 'ls-remote', self.git_url] output = self._run_git_cmd(command, return_stdout=True) - return 'refs/remotes/origin/master' in output or \ - 'refs/heads/master' in output + return 'refs/remotes/origin/rawhide' in output or \ + 'refs/heads/rawhide' in output @property def first_commit(self): """ - Get the first commit on the master branch + Get the first commit on the rawhide branch :return: a string of the first commit or None """ self._assert_cloned() @@ -138,7 +138,7 @@ class GitRepo(object): if not self.initialized: return None - command = ['git', 'rev-list', '--max-parents=0', 'master'] + command = ['git', 'rev-list', '--max-parents=0', 'rawhide'] commits = self._run_git_cmd(command, return_stdout=True) if commits: # Return the last one on the screen which is the first commit @@ -185,8 +185,8 @@ class GitRepo(object): self.checkout_branch(branch_name, new=True) # Push the new branch to the git server self._run_git_cmd(push_cmd) - # Checkout master once we're done pushing the new branch - self.checkout_branch('master') + # Checkout rawhide once we're done pushing the new branch + self.checkout_branch('rawhide') def add(self, file_name): """ diff --git a/fedscm_admin/utils.py b/fedscm_admin/utils.py index f576d73..d178033 100644 --- a/fedscm_admin/utils.py +++ b/fedscm_admin/utils.py @@ -378,16 +378,16 @@ def prompt_for_new_repo(issue_json, issue_body_json, force=False, description = issue_body_json.get('description', '').strip() upstreamurl = issue_body_json.get('upstreamurl', '').strip() component_type = pdc.component_type_to_singular(namespace) - master_branch = None - if branch_name != 'master': - click.echo('- Checking if master already exists in PDC.') - master_branch = pdc.get_branch( - repo, 'master', component_type) + rawhide_branch = None + if branch_name != 'rawhide': + click.echo('- Checking if rawhide branch already exists in PDC.') + rawhide_branch = pdc.get_branch( + repo, 'rawhide', component_type) click.echo('- Checking if {0} already exists in PDC.'.format(branch_name)) branch = pdc.get_branch(repo, branch_name, component_type) - if master_branch or branch: + if rawhide_branch or branch: prompt_to_close_bad_ticket( issue_json, 'The PDC branch already exists') return @@ -438,15 +438,15 @@ def prompt_for_new_repo(issue_json, issue_body_json, force=False, # Pagure uses plural names for namespaces, but PDC does not use the # plural version for branch types branch_type = pdc.component_type_to_singular(namespace) - # If the branch requested isn't master, still create a master branch + # If the branch requested isn't rawhide, still create a rawhide branch # in PDC anyways. # Skip pdc magic for tests namespace if namespace != 'tests': - if branch_name != 'master': - pdc.new_branch(repo, 'master', branch_type) - for sla, eol in STANDARD_BRANCH_SLAS['master'].items(): + if branch_name != 'rawhide': + pdc.new_branch(repo, 'rawhide', branch_type) + for sla, eol in STANDARD_BRANCH_SLAS['rawhide'].items(): pdc.new_sla_to_branch( - sla, eol, repo, 'master', branch_type) + sla, eol, repo, 'rawhide', branch_type) pdc.new_branch(repo, branch_name, branch_type) for sla, eol in issue_body_json['sls'].items(): @@ -457,17 +457,17 @@ def prompt_for_new_repo(issue_json, issue_body_json, force=False, pagure.new_project( namespace, repo, description, upstreamurl, initial_commit=initial_commit) - # If the branch requested isn't master, create that branch in git. The - # master branch is already created at this point. - if branch_name != 'master': - new_git_branch(namespace, repo, branch_name, use_master=True) + # If the branch requested isn't rawhide, create that branch in git. The + # rawhide branch is already created at this point. + if branch_name != 'rawhide': + new_git_branch(namespace, repo, branch_name, use_rawhide=True) pagure.set_monitoring_status( namespace, repo, issue_body_json['monitor'].strip()) pagure.change_project_main_admin( namespace, repo, issue_owner) - if branch_name == 'master': + if branch_name == 'rawhide': new_repo_comment = ('The Pagure repository was created at {0}' .format(dist_git_url)) else: @@ -793,21 +793,21 @@ def assert_git_repo_initialized_remotely(namespace, repo): 'branch can\'t be created.') -def new_git_branch(namespace, repo, branch, use_master=False): +def new_git_branch(namespace, repo, branch, use_rawhide=False): """ Create a new branch in git using Pagure. This does some sanity checking before sending off the API request. :param namespace: a string of the namespace of the project :param project: a string of the project name :param branch: a string of the branch to create - :param use_master: a boolean that determines whether to use the master - branch or the first commit of the master branch as the starting point for + :param use_rawhide: a boolean that determines whether to use the rawhide branch + branch or the first commit of the rawhide branch as the starting point for the new branch :return: None or ValidationError """ - if use_master is True: + if use_rawhide is True: pagure.new_branch( - namespace, repo, branch, from_branch='master') + namespace, repo, branch, from_branch='rawhide') else: # Even though the branches are created using pagure api which dont # require ssh, but the code supports adding package.cfg file. diff --git a/tests/test_admin.py b/tests/test_admin.py index ea1a7c0..69db508 100644 --- a/tests/test_admin.py +++ b/tests/test_admin.py @@ -94,7 +94,7 @@ class FedScmAdmin(TestCase): """ from fedscm_admin.fedscm_admin import cli as fedscm_admin_cli issue_title, issue_content = \ - mock_values.get_mock_new_repo_issue('master') + mock_values.get_mock_new_repo_issue('rawhide') issue = mock_values.build_issue(1, issue_title, issue_content) branch_issue_title, branch_issue_content = \ mock_values.get_mock_new_branch_issue( @@ -134,10 +134,10 @@ class FedScmAdmin(TestCase): mock_values.get_mock_users_query('akhairna'), mock_values.get_mock_pagure_project(exists=False), mock_values.get_mock_pdc_branch('abc', exists=False), - mock_values.get_mock_pdc_branch('master', exists=False), + mock_values.get_mock_pdc_branch('rawhide', exists=False), mock_values.get_mock_pdc_global_component(exists=True), mock_values.get_mock_pdc_branch('abc', exists=False), - mock_values.get_mock_pdc_branch('master', exists=False), + mock_values.get_mock_pdc_branch('rawhide', exists=False), mock_values.get_mock_pagure_git_urls() ] mock_session.post.return_value = mock_rv @@ -173,14 +173,14 @@ class FedScmAdmin(TestCase): mock_rv.json.return_value = {} mock_session.get.side_effect = [ mock_values.get_mock_issue_rv( - 'master', namespace='modules'), + 'rawhide', namespace='modules'), mock_values.get_mock_users_query('akhairna'), mock_values.get_mock_pagure_project(exists=False), mock_values.get_mock_pdc_branch('abc', exists=False), - mock_values.get_mock_pdc_branch('master', exists=False), + mock_values.get_mock_pdc_branch('rawhide', exists=False), mock_values.get_mock_pdc_global_component(exists=True), mock_values.get_mock_pdc_branch('abc', exists=False), - mock_values.get_mock_pdc_branch('master', exists=False), + mock_values.get_mock_pdc_branch('rawhide', exists=False), mock_values.get_mock_pagure_git_urls() ] mock_session.post.return_value = mock_rv @@ -209,14 +209,14 @@ class FedScmAdmin(TestCase): mock_rv.json.return_value = {} mock_session.get.side_effect = [ mock_values.get_mock_issue_rv( - 'master', namespace='tests'), + 'rawhide', namespace='tests'), mock_values.get_mock_users_query('akhairna'), mock_values.get_mock_pagure_project(exists=False), mock_values.get_mock_pdc_branch('abc', exists=False), - mock_values.get_mock_pdc_branch('master', exists=False), + mock_values.get_mock_pdc_branch('rawhide', exists=False), mock_values.get_mock_pdc_global_component(exists=True), mock_values.get_mock_pdc_branch('abc', exists=False), - mock_values.get_mock_pdc_branch('master', exists=False), + mock_values.get_mock_pdc_branch('rawhide', exists=False), mock_values.get_mock_pagure_git_urls() ] mock_session.post.return_value = mock_rv @@ -249,10 +249,10 @@ class FedScmAdmin(TestCase): mock_values.get_mock_users_query('akhairna'), mock_values.get_mock_pagure_project(exists=False), mock_values.get_mock_pdc_branch('abc', exists=False), - mock_values.get_mock_pdc_branch('master', exists=False), + mock_values.get_mock_pdc_branch('rawhide', exists=False), mock_values.get_mock_pdc_global_component(exists=True), mock_values.get_mock_pdc_branch('abc', exists=False), - mock_values.get_mock_pdc_branch('master', exists=False), + mock_values.get_mock_pdc_branch('rawhide', exists=False), mock_values.get_mock_pagure_git_urls() ] mock_session.post.return_value = mock_rv @@ -296,10 +296,10 @@ class FedScmAdmin(TestCase): mock_values.get_mock_users_query('akhairna'), mock_values.get_mock_pagure_project(exists=False), mock_values.get_mock_pdc_branch('abc', exists=False), - mock_values.get_mock_pdc_branch('master', exists=False), + mock_values.get_mock_pdc_branch('rawhide', exists=False), mock_values.get_mock_pdc_global_component(exists=True), mock_values.get_mock_pdc_branch('abc', exists=False), - mock_values.get_mock_pdc_branch('master', exists=False), + mock_values.get_mock_pdc_branch('rawhide', exists=False), mock_values.get_mock_pagure_git_urls() ] mock_session.post.return_value = mock_rv @@ -339,12 +339,12 @@ class FedScmAdmin(TestCase): mock_rv.ok = True mock_rv.json.return_value = {} mock_session.get.side_effect = [ - mock_values.get_mock_issue_rv('master'), + mock_values.get_mock_issue_rv('rawhide'), mock_values.get_mock_users_query('akhairna'), mock_values.get_mock_pagure_project(exists=False), - mock_values.get_mock_pdc_branch('master', exists=False), + mock_values.get_mock_pdc_branch('rawhide', exists=False), mock_values.get_mock_pdc_global_component(exists=True), - mock_values.get_mock_pdc_branch('master', exists=False), + mock_values.get_mock_pdc_branch('rawhide', exists=False), mock_values.get_mock_pagure_git_urls() ] mock_session.post.return_value = mock_rv @@ -384,10 +384,10 @@ class FedScmAdmin(TestCase): mock_values.get_mock_el_check_rv(), mock_values.get_mock_users_query('akhairna'), mock_values.get_mock_pagure_project(exists=False), - mock_values.get_mock_pdc_branch('master', exists=False), + mock_values.get_mock_pdc_branch('rawhide', exists=False), mock_values.get_mock_pdc_branch('epel7', exists=False), mock_values.get_mock_pdc_global_component(exists=True), - mock_values.get_mock_pdc_branch('master', exists=False), + mock_values.get_mock_pdc_branch('rawhide', exists=False), mock_values.get_mock_pdc_branch('epel7', exists=False), mock_values.get_mock_pagure_git_urls() ] @@ -407,11 +407,11 @@ class FedScmAdmin(TestCase): @patch('fedscm_admin.utils.verify_slas', return_value=None) @patch('fedscm_admin.request_utils.retry_session') - def test_fedscm_admin_process_master_epel_bz_prduct( + def test_fedscm_admin_process_rawhide_epel_bz_prduct( self, mock_retry_session, mock_slas): """ Tests fedscm-admin with the option "process" on a new repo request - for a repo with the master branch and the Bugzilla bug's product is + for a repo with the rawhide branch and the Bugzilla bug's product is "Fedora EPEL" """ from fedscm_admin.fedscm_admin import cli as fedscm_admin_cli @@ -426,12 +426,11 @@ class FedScmAdmin(TestCase): mock_rv.ok = True mock_rv.json.return_value = {} mock_session.get.side_effect = [ - mock_values.get_mock_issue_rv('master'), + mock_values.get_mock_issue_rv('rawhide'), mock_values.get_mock_users_query('akhairna'), mock_values.get_mock_pagure_project(exists=False), - mock_values.get_mock_pdc_branch('master', exists=False), + mock_values.get_mock_pdc_branch('rawhide', exists=False), mock_values.get_mock_pdc_global_component(exists=True), - mock_values.get_mock_pdc_branch('master', exists=False), mock_values.get_mock_pagure_git_urls() ] mock_session.post.return_value = mock_rv @@ -440,10 +439,12 @@ class FedScmAdmin(TestCase): runner = CliRunner() result = runner.invoke( fedscm_admin_cli, ['process', '2'], - input='mprahl\n12345\nmprahl\n12345\napprove\nn\n') + input='mprahl\n12345\nmprahl\n12345\ny\nn\n') + print(result.output) assert result.exit_code == 0 assert 'New Repo for "rpms/nethack"' in result.output - assert 'The Pagure repository was created' in result.output + assert 'The Bugzilla bug is for "Fedora EPEL" but the requested branch is "rawhide"' in \ + result.output assert self.mock_git_obj.clone_repo.call_count == 0 @patch('fedscm_admin.utils.verify_slas', return_value=None) @@ -460,10 +461,10 @@ class FedScmAdmin(TestCase): mock_post.ok = True mock_post.json.return_value = {} mock_session.get.side_effect = [ - mock_values.get_mock_issue_rv('master'), + mock_values.get_mock_issue_rv('rawhide'), mock_values.get_mock_users_query('akhairna'), mock_values.get_mock_pagure_project(exists=False), - mock_values.get_mock_pdc_branch('master', exists=False) + mock_values.get_mock_pdc_branch('rawhide', exists=False) ] mock_session.post.return_value = mock_post mock_retry_session.return_value = mock_session @@ -487,10 +488,10 @@ class FedScmAdmin(TestCase): from fedscm_admin.fedscm_admin import cli as fedscm_admin_cli mock_session = Mock() mock_session.get.side_effect = [ - mock_values.get_mock_issue_rv('master'), + mock_values.get_mock_issue_rv('rawhide'), mock_values.get_mock_users_query('akhairna'), mock_values.get_mock_pagure_project(exists=False), - mock_values.get_mock_pdc_branch('master', exists=False) + mock_values.get_mock_pdc_branch('rawhide', exists=False) ] mock_retry_session.return_value = mock_session runner = CliRunner() @@ -518,10 +519,10 @@ class FedScmAdmin(TestCase): mock_post.json.return_value = {} mock_session.get.side_effect = [ mock_values.get_mock_issue_rv( - 'master', ticket_type='new_branch'), + 'rawhide', ticket_type='new_branch'), mock_values.get_mock_pagure_project(exists=True), mock_values.get_mock_pagure_git_urls(is_project=True), - mock_values.get_mock_pdc_branch('master', exists=False) + mock_values.get_mock_pdc_branch('rawhide', exists=False) ] mock_session.post.return_value = mock_post mock_retry_session.return_value = mock_session @@ -530,7 +531,7 @@ class FedScmAdmin(TestCase): fedscm_admin_cli, ['process', '2', '--force'], input='mprahl\n12345\nmprahl\n12345\ndeny\nNA\n') assert result.exit_code == 0 - assert 'New Branch "master" for "rpms/nethack"' in result.output + assert 'New Branch "rawhide" for "rpms/nethack"' in result.output assert 'Please enter a comment explaining the denial' in result.output assert self.mock_git_obj.clone_repo.call_count == 0 @@ -546,10 +547,10 @@ class FedScmAdmin(TestCase): mock_session = Mock() mock_session.get.side_effect = [ mock_values.get_mock_issue_rv( - 'master', ticket_type='new_branch'), + 'rawhide', ticket_type='new_branch'), mock_values.get_mock_pagure_project(exists=True), mock_values.get_mock_pagure_git_urls(is_project=True), - mock_values.get_mock_pdc_branch('master', exists=False) + mock_values.get_mock_pdc_branch('rawhide', exists=False) ] mock_retry_session.return_value = mock_session runner = CliRunner() @@ -557,7 +558,7 @@ class FedScmAdmin(TestCase): fedscm_admin_cli, ['process', '1'], input='mprahl\n12345\nmprahl\n12345\nskip\nn\n') assert result.exit_code == 0 - assert 'New Branch "master" for "rpms/nethack"' in result.output + assert 'New Branch "rawhide" for "rpms/nethack"' in result.output assert 'The Pagure repository was created' not in result.output assert 'You may create the branch' not in result.output assert self.mock_git_obj.clone_repo.call_count == 0 @@ -703,7 +704,7 @@ class FedScmAdmin(TestCase): mock_post.ok = True mock_post.json.return_value = {} mock_session.get.side_effect = [ - mock_values.get_mock_issue_rv('master'), + mock_values.get_mock_issue_rv('rawhide'), mock_values.get_mock_users_query('akhairna'), mock_values.get_mock_pagure_project(True)] mock_session.post.return_value = mock_post @@ -733,10 +734,10 @@ class FedScmAdmin(TestCase): mock_post.ok = True mock_post.json.return_value = {} mock_session.get.side_effect = [ - mock_values.get_mock_issue_rv('master'), + mock_values.get_mock_issue_rv('rawhide'), mock_values.get_mock_users_query('akhairna'), mock_values.get_mock_pagure_project(exists=False), - mock_values.get_mock_pdc_branch('master', exists=True) + mock_values.get_mock_pdc_branch('rawhide', exists=True) ] mock_session.post.return_value = mock_post mock_retry_session.return_value = mock_session @@ -763,7 +764,7 @@ class FedScmAdmin(TestCase): mock_rv.ok = True mock_rv.json.return_value = {} issue_title, issue_content = mock_values.get_mock_new_repo_issue( - 'master', STANDARD_BRANCH_SLAS['master']) + 'rawhide', STANDARD_BRANCH_SLAS['rawhide']) issue = mock_values.build_issue(1, issue_title, issue_content) branch_issue_title, branch_issue_content = \ mock_values.get_mock_new_branch_issue( @@ -774,7 +775,7 @@ class FedScmAdmin(TestCase): mock_values.get_mock_issues_rv([issue, branch_issue]), mock_values.get_mock_users_query('akhairna'), mock_values.get_mock_pagure_project(exists=False), - mock_values.get_mock_pdc_branch('master', exists=False), + mock_values.get_mock_pdc_branch('rawhide', exists=False), mock_values.get_mock_pdc_global_component(exists=True), mock_values.get_mock_pdc_branch(None, exists=False), mock_values.get_mock_pagure_project(exists=True), @@ -931,11 +932,11 @@ class FedScmAdmin(TestCase): @patch('fedscm_admin.utils.verify_slas', return_value=None) @patch('fedscm_admin.request_utils.retry_session') - def test_fedscm_admin_process_master_wrong_bz_product( + def test_fedscm_admin_process_rawhide_wrong_bz_product( self, mock_retry_session, mock_slas): """ Tests fedscm-admin with the option "process" on a new repo request - for a repo with a master branch but the Bugzilla bug is for the product + for a repo with a rawhide branch but the Bugzilla bug is for the product "Fedora EPEL" and not "Fedora" """ from fedscm_admin.fedscm_admin import cli as fedscm_admin_cli @@ -963,7 +964,7 @@ class FedScmAdmin(TestCase): @patch('fedscm_admin.utils.verify_slas', return_value=None) @patch('fedscm_admin.request_utils.retry_session') - def test_fedscm_admin_process_master_wrong_bz_creator( + def test_fedscm_admin_process_rawhide_wrong_bz_creator( self, mock_retry_session, mock_slas): """ Tests fedscm-admin with the option "process" on a new repo request @@ -1018,7 +1019,7 @@ class FedScmAdmin(TestCase): @patch('fedscm_admin.utils.verify_slas', return_value=None) @patch('fedscm_admin.request_utils.retry_session') - def test_fedscm_admin_process_master_wrong_bz_approver( + def test_fedscm_admin_process_rawhide_wrong_bz_approver( self, mock_retry_session, mock_slas): """ Tests fedscm-admin with the option "process" on a new repo request diff --git a/tox.ini b/tox.ini index 3e03054..5b98659 100644 --- a/tox.ini +++ b/tox.ini @@ -4,7 +4,7 @@ # and then run "tox" from this directory. [tox] -envlist = lint, py35, py36, py37 +envlist = lint, py36, py37 # If the user is missing an interpreter, don't fail skip_missing_interpreters = True From 78394ca9c31ee972d2fb6d5e2731c40891bb1a90 Mon Sep 17 00:00:00 2001 From: Mohan Boddu Date: Jan 15 2021 16:57:14 +0000 Subject: [PATCH 2/2] Adding 'main' alias to 'rawhide' branch Signed-off-by: Mohan Boddu --- diff --git a/fedscm_admin/pagure.py b/fedscm_admin/pagure.py index 64241ff..633bfda 100644 --- a/fedscm_admin/pagure.py +++ b/fedscm_admin/pagure.py @@ -195,6 +195,8 @@ def new_project(namespace, repo, description, upstreamurl, pagure_url = get_config_item(CONFIG, 'pagure_dist_git_url') pagure_new_project_url = \ '{0}/api/0/new'.format(pagure_url.rstrip('/')) + pagure_new_git_alias_url = \ + '{0}/api/0/rpms/{1}/alias/new'.format(pagure_url.rstrip('/'), repo) headers = get_pagure_auth_header('global') payload = { @@ -214,6 +216,19 @@ def new_project(namespace, repo, description, upstreamurl, # We won't actually use the returned output from this function call but # it does error checking for us get_request_json(rv, 'creating a new project in Pagure') + + # Now create 'main' alias to the 'rawhide' branch it created + payload = { + 'alias_from': 'main', + 'alias_to': 'rawhide', + } + click.echo('- Creating main alias to rawhide branch') + rv = requests_wrapper( + pagure_new_git_alias_url, data=payload, headers=headers, timeout=90, + http_verb='post', service_name='Pagure') + # We won't actually use the returned output from this function call but + # it does error checking for us + get_request_json(rv, 'creating main alias to rawhide branch') return None