This is an automated email from the ASF dual-hosted git repository.

brondsem pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/allura.git


The following commit(s) were added to refs/heads/master by this push:
     new be9f33ff1 [#8518] update git head reference when setting a default 
branch
be9f33ff1 is described below

commit be9f33ff1953b17d309b2f78c1c823bd922fc189
Author: Guillermo Cruz <[email protected]>
AuthorDate: Tue Aug 8 15:54:13 2023 -0600

    [#8518] update git head reference when setting a default branch
---
 Allura/allura/lib/repository.py                  |  2 +-
 Allura/allura/tasks/repo_tasks.py                | 19 +++++++++++++++++++
 ForgeGit/forgegit/model/git_repo.py              |  2 ++
 ForgeGit/forgegit/tests/model/test_repository.py | 14 +++++++++++++-
 4 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/Allura/allura/lib/repository.py b/Allura/allura/lib/repository.py
index a64f2c6dd..bd7bf0a6e 100644
--- a/Allura/allura/lib/repository.py
+++ b/Allura/allura/lib/repository.py
@@ -295,7 +295,7 @@ class RepoAdminController(DefaultAdminController):
     def set_default_branch_name(self, branch_name=None, **kw):
         if (request.method == 'POST') and branch_name:
             self.repo.set_default_branch(branch_name)
-            redirect(six.ensure_text(request.referer or '/'))
+            redirect(six.ensure_text(c.app.url))
         else:
             return dict(app=self.app,
                         default_branch_name=self.app.default_branch_name)
diff --git a/Allura/allura/tasks/repo_tasks.py 
b/Allura/allura/tasks/repo_tasks.py
index e38ea26e7..296358fde 100644
--- a/Allura/allura/tasks/repo_tasks.py
+++ b/Allura/allura/tasks/repo_tasks.py
@@ -25,6 +25,8 @@ from ming.odm import session
 from allura.lib.decorators import task
 from allura.lib.repository import RepositoryApp
 from allura.lib.utils import skip_mod_date
+import git
+from git import SymbolicReference
 
 
 @task
@@ -178,3 +180,20 @@ def determine_mr_commits(merge_request_id):
     from allura import model as M
     mr = M.MergeRequest.query.get(_id=merge_request_id)
     mr.commits  # build & cache the commits
+
+
+@task
+def update_head_reference(fs_path, branch_name):
+    repo = git.Repo(fs_path, odbt=git.GitCmdObjectDB)
+    if not repo.head.is_detached:
+        new_branch = [ref for ref in repo.refs if ref.name == branch_name]
+        _ref = SymbolicReference.create(repo, 'HEAD', repo.head.reference)
+        _ref.reference = new_branch[0]
+    else:
+        # it is detached there's no refs in repo.refs default to first
+        repo.head.reference = repo.refs[0]
+        #lookup for new default branch
+        new_branch = [ref for ref in repo.refs if ref.name == branch_name]
+        _ref = SymbolicReference.create(repo, 'HEAD', repo.head.reference)
+        _ref.reference = new_branch[0]
+
diff --git a/ForgeGit/forgegit/model/git_repo.py 
b/ForgeGit/forgegit/model/git_repo.py
index 37758f5d6..b0aa83e90 100644
--- a/ForgeGit/forgegit/model/git_repo.py
+++ b/ForgeGit/forgegit/model/git_repo.py
@@ -43,6 +43,7 @@ from ming.utils import LazyProperty
 from allura.lib import helpers as h
 from allura.model.repository import topological_sort, prefix_paths_union
 from allura import model as M
+import allura.tasks
 
 if typing.TYPE_CHECKING:
     from ming.odm.mapper import Query
@@ -636,6 +637,7 @@ class GitImplementation(M.RepositoryImplementation):
         if not name:
             return
         self._repo.default_branch_name = name
+        
allura.tasks.repo_tasks.update_head_reference.post(self._repo.full_fs_path, 
name)
         session(self._repo).flush(self._repo)
 
     def _get_last_commit(self, commit_id, paths):
diff --git a/ForgeGit/forgegit/tests/model/test_repository.py 
b/ForgeGit/forgegit/tests/model/test_repository.py
index 0dd8a9fc0..ce2118f7e 100644
--- a/ForgeGit/forgegit/tests/model/test_repository.py
+++ b/ForgeGit/forgegit/tests/model/test_repository.py
@@ -33,7 +33,7 @@ from testfixtures import TempDirectory
 
 from alluratest.controller import setup_basic_test, setup_global_objects
 from allura.lib import helpers as h
-from allura.tasks.repo_tasks import tarball
+from allura.tasks.repo_tasks import tarball, update_head_reference
 from allura.tests import decorators as td
 from allura.tests.model.test_repo import RepoImplTestBase
 from allura import model as M
@@ -605,6 +605,18 @@ By Dave Brondsema''' in text_body
         self.repo.default_branch_name = 'zz'
         assert self.repo.get_default_branch(('main', 'master')) == 'zz'
 
+    def test_update_default_branch(self):
+        repo_dir = pkg_resources.resource_filename('forgegit', 
'tests/data/testgit.git')
+        repo = mock.Mock(full_fs_path=repo_dir)
+        repo.__ming__ = mock.Mock()
+        impl = GM.git_repo.GitImplementation(repo)
+        try:
+            update_head_reference(self.repo.full_fs_path, 'zz')
+            assert impl._git.head.reference.name == 'zz'
+        finally:
+            update_head_reference(self.repo.full_fs_path, 'master')
+            assert impl._git.head.reference.name == 'master'
+
     def test_default_branch_non_standard_unset(self):
         with mock.patch.object(self.repo, 'get_branches') as gb,\
                 mock.patch.object(self.repo, 'set_default_branch') as set_db:

Reply via email to