mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Move repository model into models/repo (#17933)
* Some refactors related repository model * Move more methods out of repository * Move repository into models/repo * Fix test * Fix test * some improvements * Remove unnecessary function
This commit is contained in:
		@@ -16,6 +16,8 @@ import (
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models"
 | 
			
		||||
	"code.gitea.io/gitea/models/db"
 | 
			
		||||
	repo_model "code.gitea.io/gitea/models/repo"
 | 
			
		||||
	"code.gitea.io/gitea/models/unit"
 | 
			
		||||
	user_model "code.gitea.io/gitea/models/user"
 | 
			
		||||
	"code.gitea.io/gitea/modules/cache"
 | 
			
		||||
@@ -31,7 +33,7 @@ import (
 | 
			
		||||
// Merge merges pull request to base repository.
 | 
			
		||||
// Caller should check PR is ready to be merged (review and status checks)
 | 
			
		||||
// FIXME: add repoWorkingPull make sure two merges does not happen at same time.
 | 
			
		||||
func Merge(pr *models.PullRequest, doer *user_model.User, baseGitRepo *git.Repository, mergeStyle models.MergeStyle, message string) (err error) {
 | 
			
		||||
func Merge(pr *models.PullRequest, doer *user_model.User, baseGitRepo *git.Repository, mergeStyle repo_model.MergeStyle, message string) (err error) {
 | 
			
		||||
	if err = pr.LoadHeadRepo(); err != nil {
 | 
			
		||||
		log.Error("LoadHeadRepo: %v", err)
 | 
			
		||||
		return fmt.Errorf("LoadHeadRepo: %v", err)
 | 
			
		||||
@@ -76,7 +78,7 @@ func Merge(pr *models.PullRequest, doer *user_model.User, baseGitRepo *git.Repos
 | 
			
		||||
	if err := pr.Issue.LoadRepo(); err != nil {
 | 
			
		||||
		log.Error("loadRepo for issue [%d]: %v", pr.ID, err)
 | 
			
		||||
	}
 | 
			
		||||
	if err := pr.Issue.Repo.GetOwner(); err != nil {
 | 
			
		||||
	if err := pr.Issue.Repo.GetOwner(db.DefaultContext); err != nil {
 | 
			
		||||
		log.Error("GetOwner for issue repo [%d]: %v", pr.ID, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -111,7 +113,7 @@ func Merge(pr *models.PullRequest, doer *user_model.User, baseGitRepo *git.Repos
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// rawMerge perform the merge operation without changing any pull information in database
 | 
			
		||||
func rawMerge(pr *models.PullRequest, doer *user_model.User, mergeStyle models.MergeStyle, message string) (string, error) {
 | 
			
		||||
func rawMerge(pr *models.PullRequest, doer *user_model.User, mergeStyle repo_model.MergeStyle, message string) (string, error) {
 | 
			
		||||
	err := git.LoadGitVersion()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error("git.LoadGitVersion: %v", err)
 | 
			
		||||
@@ -219,7 +221,7 @@ func rawMerge(pr *models.PullRequest, doer *user_model.User, mergeStyle models.M
 | 
			
		||||
		sign, keyID, signer, _ := pr.SignMerge(doer, tmpBasePath, "HEAD", trackingBranch)
 | 
			
		||||
		if sign {
 | 
			
		||||
			signArg = "-S" + keyID
 | 
			
		||||
			if pr.BaseRepo.GetTrustModel() == models.CommitterTrustModel || pr.BaseRepo.GetTrustModel() == models.CollaboratorCommitterTrustModel {
 | 
			
		||||
			if pr.BaseRepo.GetTrustModel() == repo_model.CommitterTrustModel || pr.BaseRepo.GetTrustModel() == repo_model.CollaboratorCommitterTrustModel {
 | 
			
		||||
				committer = signer
 | 
			
		||||
			}
 | 
			
		||||
		} else if git.CheckGitVersionAtLeast("2.0.0") == nil {
 | 
			
		||||
@@ -241,7 +243,7 @@ func rawMerge(pr *models.PullRequest, doer *user_model.User, mergeStyle models.M
 | 
			
		||||
 | 
			
		||||
	// Merge commits.
 | 
			
		||||
	switch mergeStyle {
 | 
			
		||||
	case models.MergeStyleMerge:
 | 
			
		||||
	case repo_model.MergeStyleMerge:
 | 
			
		||||
		cmd := git.NewCommand("merge", "--no-ff", "--no-commit", trackingBranch)
 | 
			
		||||
		if err := runMergeCommand(pr, mergeStyle, cmd, tmpBasePath); err != nil {
 | 
			
		||||
			log.Error("Unable to merge tracking into base: %v", err)
 | 
			
		||||
@@ -252,11 +254,11 @@ func rawMerge(pr *models.PullRequest, doer *user_model.User, mergeStyle models.M
 | 
			
		||||
			log.Error("Unable to make final commit: %v", err)
 | 
			
		||||
			return "", err
 | 
			
		||||
		}
 | 
			
		||||
	case models.MergeStyleRebase:
 | 
			
		||||
	case repo_model.MergeStyleRebase:
 | 
			
		||||
		fallthrough
 | 
			
		||||
	case models.MergeStyleRebaseUpdate:
 | 
			
		||||
	case repo_model.MergeStyleRebaseUpdate:
 | 
			
		||||
		fallthrough
 | 
			
		||||
	case models.MergeStyleRebaseMerge:
 | 
			
		||||
	case repo_model.MergeStyleRebaseMerge:
 | 
			
		||||
		// Checkout head branch
 | 
			
		||||
		if err := git.NewCommand("checkout", "-b", stagingBranch, trackingBranch).RunInDirPipeline(tmpBasePath, &outbuf, &errbuf); err != nil {
 | 
			
		||||
			log.Error("git checkout base prior to merge post staging rebase [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String())
 | 
			
		||||
@@ -309,7 +311,7 @@ func rawMerge(pr *models.PullRequest, doer *user_model.User, mergeStyle models.M
 | 
			
		||||
		errbuf.Reset()
 | 
			
		||||
 | 
			
		||||
		// not need merge, just update by rebase. so skip
 | 
			
		||||
		if mergeStyle == models.MergeStyleRebaseUpdate {
 | 
			
		||||
		if mergeStyle == repo_model.MergeStyleRebaseUpdate {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@@ -322,7 +324,7 @@ func rawMerge(pr *models.PullRequest, doer *user_model.User, mergeStyle models.M
 | 
			
		||||
		errbuf.Reset()
 | 
			
		||||
 | 
			
		||||
		cmd := git.NewCommand("merge")
 | 
			
		||||
		if mergeStyle == models.MergeStyleRebase {
 | 
			
		||||
		if mergeStyle == repo_model.MergeStyleRebase {
 | 
			
		||||
			cmd.AddArguments("--ff-only")
 | 
			
		||||
		} else {
 | 
			
		||||
			cmd.AddArguments("--no-ff", "--no-commit")
 | 
			
		||||
@@ -334,13 +336,13 @@ func rawMerge(pr *models.PullRequest, doer *user_model.User, mergeStyle models.M
 | 
			
		||||
			log.Error("Unable to merge staging into base: %v", err)
 | 
			
		||||
			return "", err
 | 
			
		||||
		}
 | 
			
		||||
		if mergeStyle == models.MergeStyleRebaseMerge {
 | 
			
		||||
		if mergeStyle == repo_model.MergeStyleRebaseMerge {
 | 
			
		||||
			if err := commitAndSignNoAuthor(pr, message, signArg, tmpBasePath, env); err != nil {
 | 
			
		||||
				log.Error("Unable to make final commit: %v", err)
 | 
			
		||||
				return "", err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	case models.MergeStyleSquash:
 | 
			
		||||
	case repo_model.MergeStyleSquash:
 | 
			
		||||
		// Merge with squash
 | 
			
		||||
		cmd := git.NewCommand("merge", "--squash", trackingBranch)
 | 
			
		||||
		if err := runMergeCommand(pr, mergeStyle, cmd, tmpBasePath); err != nil {
 | 
			
		||||
@@ -398,7 +400,7 @@ func rawMerge(pr *models.PullRequest, doer *user_model.User, mergeStyle models.M
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var headUser *user_model.User
 | 
			
		||||
	err = pr.HeadRepo.GetOwner()
 | 
			
		||||
	err = pr.HeadRepo.GetOwner(db.DefaultContext)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if !user_model.IsErrUserNotExist(err) {
 | 
			
		||||
			log.Error("Can't find user: %d for head repository - %v", pr.HeadRepo.OwnerID, err)
 | 
			
		||||
@@ -419,7 +421,7 @@ func rawMerge(pr *models.PullRequest, doer *user_model.User, mergeStyle models.M
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	var pushCmd *git.Command
 | 
			
		||||
	if mergeStyle == models.MergeStyleRebaseUpdate {
 | 
			
		||||
	if mergeStyle == repo_model.MergeStyleRebaseUpdate {
 | 
			
		||||
		// force push the rebase result to head brach
 | 
			
		||||
		pushCmd = git.NewCommand("push", "-f", "head_repo", stagingBranch+":"+git.BranchPrefix+pr.HeadBranch)
 | 
			
		||||
	} else {
 | 
			
		||||
@@ -467,7 +469,7 @@ func commitAndSignNoAuthor(pr *models.PullRequest, message, signArg, tmpBasePath
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func runMergeCommand(pr *models.PullRequest, mergeStyle models.MergeStyle, cmd *git.Command, tmpBasePath string) error {
 | 
			
		||||
func runMergeCommand(pr *models.PullRequest, mergeStyle repo_model.MergeStyle, cmd *git.Command, tmpBasePath string) error {
 | 
			
		||||
	var outbuf, errbuf strings.Builder
 | 
			
		||||
	if err := cmd.RunInDirPipeline(tmpBasePath, &outbuf, &errbuf); err != nil {
 | 
			
		||||
		// Merge will leave a MERGE_HEAD file in the .git folder if there is a conflict
 | 
			
		||||
@@ -567,7 +569,7 @@ func IsUserAllowedToMerge(pr *models.PullRequest, p models.Permission, user *use
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (p.CanWrite(unit.TypeCode) && pr.ProtectedBranch == nil) || (pr.ProtectedBranch != nil && pr.ProtectedBranch.IsUserMergeWhitelisted(user.ID, p)) {
 | 
			
		||||
	if (p.CanWrite(unit.TypeCode) && pr.ProtectedBranch == nil) || (pr.ProtectedBranch != nil && models.IsUserMergeWhitelisted(pr.ProtectedBranch, user.ID, p)) {
 | 
			
		||||
		return true, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -641,8 +643,8 @@ func MergedManually(pr *models.PullRequest, doer *user_model.User, baseGitRepo *
 | 
			
		||||
	prConfig := prUnit.PullRequestsConfig()
 | 
			
		||||
 | 
			
		||||
	// Check if merge style is correct and allowed
 | 
			
		||||
	if !prConfig.IsMergeStyleAllowed(models.MergeStyleManuallyMerged) {
 | 
			
		||||
		return models.ErrInvalidMergeStyle{ID: pr.BaseRepo.ID, Style: models.MergeStyleManuallyMerged}
 | 
			
		||||
	if !prConfig.IsMergeStyleAllowed(repo_model.MergeStyleManuallyMerged) {
 | 
			
		||||
		return models.ErrInvalidMergeStyle{ID: pr.BaseRepo.ID, Style: repo_model.MergeStyleManuallyMerged}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(commitID) < 40 {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user