mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-26 12:27:06 +00: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 | 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) { | ||||||
|  | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Nanguan Lin
					Nanguan Lin