mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-04 05:18:25 +00:00 
			
		
		
		
	Fix bug on pull requests when transfer head repository (#8564)
* fix bug on pull requests when transfer head repository * add migration and fix lint * fix tests and add a cache check on LoadBaseRepo
This commit is contained in:
		@@ -66,7 +66,6 @@ type PullRequest struct {
 | 
			
		||||
	HeadRepo        *Repository `xorm:"-"`
 | 
			
		||||
	BaseRepoID      int64       `xorm:"INDEX"`
 | 
			
		||||
	BaseRepo        *Repository `xorm:"-"`
 | 
			
		||||
	HeadUserName    string
 | 
			
		||||
	HeadBranch      string
 | 
			
		||||
	BaseBranch      string
 | 
			
		||||
	ProtectedBranch *ProtectedBranch `xorm:"-"`
 | 
			
		||||
@@ -79,6 +78,15 @@ type PullRequest struct {
 | 
			
		||||
	MergedUnix     timeutil.TimeStamp `xorm:"updated INDEX"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MustHeadUserName returns the HeadRepo's username if failed return blank
 | 
			
		||||
func (pr *PullRequest) MustHeadUserName() string {
 | 
			
		||||
	if err := pr.LoadHeadRepo(); err != nil {
 | 
			
		||||
		log.Error("LoadHeadRepo: %v", err)
 | 
			
		||||
		return ""
 | 
			
		||||
	}
 | 
			
		||||
	return pr.HeadRepo.MustOwnerName()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Note: don't try to get Issue because will end up recursive querying.
 | 
			
		||||
func (pr *PullRequest) loadAttributes(e Engine) (err error) {
 | 
			
		||||
	if pr.HasMerged && pr.Merger == nil {
 | 
			
		||||
@@ -102,6 +110,10 @@ func (pr *PullRequest) LoadAttributes() error {
 | 
			
		||||
// LoadBaseRepo loads pull request base repository from database
 | 
			
		||||
func (pr *PullRequest) LoadBaseRepo() error {
 | 
			
		||||
	if pr.BaseRepo == nil {
 | 
			
		||||
		if pr.HeadRepoID == pr.BaseRepoID && pr.HeadRepo != nil {
 | 
			
		||||
			pr.BaseRepo = pr.HeadRepo
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		var repo Repository
 | 
			
		||||
		if has, err := x.ID(pr.BaseRepoID).Get(&repo); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
@@ -113,6 +125,24 @@ func (pr *PullRequest) LoadBaseRepo() error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LoadHeadRepo loads pull request head repository from database
 | 
			
		||||
func (pr *PullRequest) LoadHeadRepo() error {
 | 
			
		||||
	if pr.HeadRepo == nil {
 | 
			
		||||
		if pr.HeadRepoID == pr.BaseRepoID && pr.BaseRepo != nil {
 | 
			
		||||
			pr.HeadRepo = pr.BaseRepo
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		var repo Repository
 | 
			
		||||
		if has, err := x.ID(pr.HeadRepoID).Get(&repo); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		} else if !has {
 | 
			
		||||
			return ErrRepoNotExist{ID: pr.BaseRepoID}
 | 
			
		||||
		}
 | 
			
		||||
		pr.HeadRepo = &repo
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LoadIssue loads issue information from database
 | 
			
		||||
func (pr *PullRequest) LoadIssue() (err error) {
 | 
			
		||||
	return pr.loadIssue(x)
 | 
			
		||||
@@ -152,7 +182,7 @@ func (pr *PullRequest) GetDefaultMergeMessage() string {
 | 
			
		||||
			return ""
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return fmt.Sprintf("Merge branch '%s' of %s/%s into %s", pr.HeadBranch, pr.HeadUserName, pr.HeadRepo.Name, pr.BaseBranch)
 | 
			
		||||
	return fmt.Sprintf("Merge branch '%s' of %s/%s into %s", pr.HeadBranch, pr.MustHeadUserName(), pr.HeadRepo.Name, pr.BaseBranch)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetDefaultSquashMessage returns default message used when squash and merging pull request
 | 
			
		||||
@@ -1072,18 +1102,6 @@ func (prs PullRequestList) InvalidateCodeComments(doer *User, repo *git.Reposito
 | 
			
		||||
	return prs.invalidateCodeComments(x, doer, repo, branch)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ChangeUsernameInPullRequests changes the name of head_user_name
 | 
			
		||||
func ChangeUsernameInPullRequests(oldUserName, newUserName string) error {
 | 
			
		||||
	pr := PullRequest{
 | 
			
		||||
		HeadUserName: strings.ToLower(newUserName),
 | 
			
		||||
	}
 | 
			
		||||
	_, err := x.
 | 
			
		||||
		Cols("head_user_name").
 | 
			
		||||
		Where("head_user_name = ?", strings.ToLower(oldUserName)).
 | 
			
		||||
		Update(pr)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// checkAndUpdateStatus checks if pull request is possible to leaving checking status,
 | 
			
		||||
// and set to be either conflict or mergeable.
 | 
			
		||||
func (pr *PullRequest) checkAndUpdateStatus() {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user