mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-02 20:06:06 +01:00 
			
		
		
		
	Update status and code index after changing the default branch (#27018)
Fix #26723 Add `ChangeDefaultBranch` to the `notifier` interface and implement it in `indexerNotifier`. So when changing the default branch, `indexerNotifier` sends a message to the `indexer queue` to update the index. --------- Co-authored-by: techknowlogick <matti@mdranta.net>
This commit is contained in:
		@@ -3,7 +3,9 @@
 | 
			
		||||
 | 
			
		||||
package repo
 | 
			
		||||
 | 
			
		||||
import "code.gitea.io/gitea/models/db"
 | 
			
		||||
import (
 | 
			
		||||
	"code.gitea.io/gitea/models/db"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// MergeStyle represents the approach to merge commits into base branch.
 | 
			
		||||
type MergeStyle string
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,14 @@ func getRepoChanges(ctx context.Context, repo *repo_model.Repository, revision s
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(status.CommitSha) == 0 {
 | 
			
		||||
	needGenesis := len(status.CommitSha) == 0
 | 
			
		||||
	if !needGenesis {
 | 
			
		||||
		hasAncestorCmd := git.NewCommand(ctx, "merge-base").AddDynamicArguments(repo.CodeIndexerStatus.CommitSha, revision)
 | 
			
		||||
		stdout, _, _ := hasAncestorCmd.RunStdString(&git.RunOpts{Dir: repo.RepoPath()})
 | 
			
		||||
		needGenesis = len(stdout) == 0
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if needGenesis {
 | 
			
		||||
		return genesisChanges(ctx, repo, revision)
 | 
			
		||||
	}
 | 
			
		||||
	return nonGenesisChanges(ctx, repo, revision)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										64
									
								
								routers/web/repo/setting/default_branch.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								routers/web/repo/setting/default_branch.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,64 @@
 | 
			
		||||
// Copyright 2023 The Gitea Authors. All rights reserved.
 | 
			
		||||
// SPDX-License-Identifier: MIT
 | 
			
		||||
 | 
			
		||||
package setting
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net/http"
 | 
			
		||||
 | 
			
		||||
	repo_model "code.gitea.io/gitea/models/repo"
 | 
			
		||||
	"code.gitea.io/gitea/modules/context"
 | 
			
		||||
	"code.gitea.io/gitea/modules/git"
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
	"code.gitea.io/gitea/routers/web/repo"
 | 
			
		||||
	notify_service "code.gitea.io/gitea/services/notify"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// SetDefaultBranchPost set default branch
 | 
			
		||||
func SetDefaultBranchPost(ctx *context.Context) {
 | 
			
		||||
	ctx.Data["Title"] = ctx.Tr("repo.settings.branches.update_default_branch")
 | 
			
		||||
	ctx.Data["PageIsSettingsBranches"] = true
 | 
			
		||||
 | 
			
		||||
	repo.PrepareBranchList(ctx)
 | 
			
		||||
	if ctx.Written() {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	repo := ctx.Repo.Repository
 | 
			
		||||
 | 
			
		||||
	switch ctx.FormString("action") {
 | 
			
		||||
	case "default_branch":
 | 
			
		||||
		if ctx.HasError() {
 | 
			
		||||
			ctx.HTML(http.StatusOK, tplBranches)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		branch := ctx.FormString("branch")
 | 
			
		||||
		if !ctx.Repo.GitRepo.IsBranchExist(branch) {
 | 
			
		||||
			ctx.Status(http.StatusNotFound)
 | 
			
		||||
			return
 | 
			
		||||
		} else if repo.DefaultBranch != branch {
 | 
			
		||||
			repo.DefaultBranch = branch
 | 
			
		||||
			if err := ctx.Repo.GitRepo.SetDefaultBranch(branch); err != nil {
 | 
			
		||||
				if !git.IsErrUnsupportedVersion(err) {
 | 
			
		||||
					ctx.ServerError("SetDefaultBranch", err)
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if err := repo_model.UpdateDefaultBranch(repo); err != nil {
 | 
			
		||||
				ctx.ServerError("SetDefaultBranch", err)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			notify_service.ChangeDefaultBranch(ctx, repo)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		log.Trace("Repository basic settings updated: %s/%s", ctx.Repo.Owner.Name, repo.Name)
 | 
			
		||||
 | 
			
		||||
		ctx.Flash.Success(ctx.Tr("repo.settings.update_settings_success"))
 | 
			
		||||
		ctx.Redirect(setting.AppSubURL + ctx.Req.URL.EscapedPath())
 | 
			
		||||
	default:
 | 
			
		||||
		ctx.NotFound("", nil)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -14,12 +14,8 @@ import (
 | 
			
		||||
	"code.gitea.io/gitea/models/organization"
 | 
			
		||||
	"code.gitea.io/gitea/models/perm"
 | 
			
		||||
	access_model "code.gitea.io/gitea/models/perm/access"
 | 
			
		||||
	repo_model "code.gitea.io/gitea/models/repo"
 | 
			
		||||
	"code.gitea.io/gitea/modules/base"
 | 
			
		||||
	"code.gitea.io/gitea/modules/context"
 | 
			
		||||
	"code.gitea.io/gitea/modules/git"
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
	"code.gitea.io/gitea/modules/web"
 | 
			
		||||
	"code.gitea.io/gitea/routers/web/repo"
 | 
			
		||||
	"code.gitea.io/gitea/services/forms"
 | 
			
		||||
@@ -53,52 +49,6 @@ func ProtectedBranchRules(ctx *context.Context) {
 | 
			
		||||
	ctx.HTML(http.StatusOK, tplBranches)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetDefaultBranchPost set default branch
 | 
			
		||||
func SetDefaultBranchPost(ctx *context.Context) {
 | 
			
		||||
	ctx.Data["Title"] = ctx.Tr("repo.settings.branches.update_default_branch")
 | 
			
		||||
	ctx.Data["PageIsSettingsBranches"] = true
 | 
			
		||||
 | 
			
		||||
	repo.PrepareBranchList(ctx)
 | 
			
		||||
	if ctx.Written() {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	repo := ctx.Repo.Repository
 | 
			
		||||
 | 
			
		||||
	switch ctx.FormString("action") {
 | 
			
		||||
	case "default_branch":
 | 
			
		||||
		if ctx.HasError() {
 | 
			
		||||
			ctx.HTML(http.StatusOK, tplBranches)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		branch := ctx.FormString("branch")
 | 
			
		||||
		if !ctx.Repo.GitRepo.IsBranchExist(branch) {
 | 
			
		||||
			ctx.Status(http.StatusNotFound)
 | 
			
		||||
			return
 | 
			
		||||
		} else if repo.DefaultBranch != branch {
 | 
			
		||||
			repo.DefaultBranch = branch
 | 
			
		||||
			if err := ctx.Repo.GitRepo.SetDefaultBranch(branch); err != nil {
 | 
			
		||||
				if !git.IsErrUnsupportedVersion(err) {
 | 
			
		||||
					ctx.ServerError("SetDefaultBranch", err)
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if err := repo_model.UpdateDefaultBranch(repo); err != nil {
 | 
			
		||||
				ctx.ServerError("SetDefaultBranch", err)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		log.Trace("Repository basic settings updated: %s/%s", ctx.Repo.Owner.Name, repo.Name)
 | 
			
		||||
 | 
			
		||||
		ctx.Flash.Success(ctx.Tr("repo.settings.update_settings_success"))
 | 
			
		||||
		ctx.Redirect(setting.AppSubURL + ctx.Req.URL.EscapedPath())
 | 
			
		||||
	default:
 | 
			
		||||
		ctx.NotFound("", nil)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SettingsProtectedBranch renders the protected branch setting page
 | 
			
		||||
func SettingsProtectedBranch(c *context.Context) {
 | 
			
		||||
	ruleName := c.FormString("rule_name")
 | 
			
		||||
 
 | 
			
		||||
@@ -110,6 +110,15 @@ func (r *indexerNotifier) SyncPushCommits(ctx context.Context, pusher *user_mode
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *indexerNotifier) ChangeDefaultBranch(ctx context.Context, repo *repo_model.Repository) {
 | 
			
		||||
	if setting.Indexer.RepoIndexerEnabled && !repo.IsEmpty {
 | 
			
		||||
		code_indexer.UpdateRepoIndexer(repo)
 | 
			
		||||
	}
 | 
			
		||||
	if err := stats_indexer.UpdateRepoIndexer(repo); err != nil {
 | 
			
		||||
		log.Error("stats_indexer.UpdateRepoIndexer(%d) failed: %v", repo.ID, err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *indexerNotifier) IssueChangeContent(ctx context.Context, doer *user_model.User, issue *issues_model.Issue, oldContent string) {
 | 
			
		||||
	issue_indexer.UpdateIssueIndexer(issue.ID)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -72,4 +72,6 @@ type Notifier interface {
 | 
			
		||||
 | 
			
		||||
	PackageCreate(ctx context.Context, doer *user_model.User, pd *packages_model.PackageDescriptor)
 | 
			
		||||
	PackageDelete(ctx context.Context, doer *user_model.User, pd *packages_model.PackageDescriptor)
 | 
			
		||||
 | 
			
		||||
	ChangeDefaultBranch(ctx context.Context, repo *repo_model.Repository)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -360,3 +360,10 @@ func PackageDelete(ctx context.Context, doer *user_model.User, pd *packages_mode
 | 
			
		||||
		notifier.PackageDelete(ctx, doer, pd)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ChangeDefaultBranch notifies change default branch to notifiers
 | 
			
		||||
func ChangeDefaultBranch(ctx context.Context, repo *repo_model.Repository) {
 | 
			
		||||
	for _, notifier := range notifiers {
 | 
			
		||||
		notifier.ChangeDefaultBranch(ctx, repo)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -204,3 +204,7 @@ func (*NullNotifier) PackageCreate(ctx context.Context, doer *user_model.User, p
 | 
			
		||||
// PackageDelete places a place holder function
 | 
			
		||||
func (*NullNotifier) PackageDelete(ctx context.Context, doer *user_model.User, pd *packages_model.PackageDescriptor) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ChangeDefaultBranch places a place holder function
 | 
			
		||||
func (*NullNotifier) ChangeDefaultBranch(ctx context.Context, repo *repo_model.Repository) {
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user