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:
parent
e6a059a3d0
commit
cda97a7253
|
@ -3,7 +3,9 @@
|
||||||
|
|
||||||
package repo
|
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.
|
// MergeStyle represents the approach to merge commits into base branch.
|
||||||
type MergeStyle string
|
type MergeStyle string
|
||||||
|
|
|
@ -30,7 +30,14 @@ func getRepoChanges(ctx context.Context, repo *repo_model.Repository, revision s
|
||||||
return nil, err
|
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 genesisChanges(ctx, repo, revision)
|
||||||
}
|
}
|
||||||
return nonGenesisChanges(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/organization"
|
||||||
"code.gitea.io/gitea/models/perm"
|
"code.gitea.io/gitea/models/perm"
|
||||||
access_model "code.gitea.io/gitea/models/perm/access"
|
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/base"
|
||||||
"code.gitea.io/gitea/modules/context"
|
"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/modules/web"
|
||||||
"code.gitea.io/gitea/routers/web/repo"
|
"code.gitea.io/gitea/routers/web/repo"
|
||||||
"code.gitea.io/gitea/services/forms"
|
"code.gitea.io/gitea/services/forms"
|
||||||
|
@ -53,52 +49,6 @@ func ProtectedBranchRules(ctx *context.Context) {
|
||||||
ctx.HTML(http.StatusOK, tplBranches)
|
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
|
// SettingsProtectedBranch renders the protected branch setting page
|
||||||
func SettingsProtectedBranch(c *context.Context) {
|
func SettingsProtectedBranch(c *context.Context) {
|
||||||
ruleName := c.FormString("rule_name")
|
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) {
|
func (r *indexerNotifier) IssueChangeContent(ctx context.Context, doer *user_model.User, issue *issues_model.Issue, oldContent string) {
|
||||||
issue_indexer.UpdateIssueIndexer(issue.ID)
|
issue_indexer.UpdateIssueIndexer(issue.ID)
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,4 +72,6 @@ type Notifier interface {
|
||||||
|
|
||||||
PackageCreate(ctx context.Context, doer *user_model.User, pd *packages_model.PackageDescriptor)
|
PackageCreate(ctx context.Context, doer *user_model.User, pd *packages_model.PackageDescriptor)
|
||||||
PackageDelete(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)
|
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
|
// PackageDelete places a place holder function
|
||||||
func (*NullNotifier) PackageDelete(ctx context.Context, doer *user_model.User, pd *packages_model.PackageDescriptor) {
|
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) {
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue