mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-26 12:27:06 +00:00 
			
		
		
		
	remove package code.gitea.io/gitea/modules/git import out of models (#11025)
This commit is contained in:
		
							
								
								
									
										200
									
								
								models/pull.go
									
									
									
									
									
								
							
							
						
						
									
										200
									
								
								models/pull.go
									
									
									
									
									
								
							| @@ -10,7 +10,6 @@ import ( | |||||||
| 	"io" | 	"io" | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/modules/git" |  | ||||||
| 	"code.gitea.io/gitea/modules/log" | 	"code.gitea.io/gitea/modules/log" | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| 	"code.gitea.io/gitea/modules/timeutil" | 	"code.gitea.io/gitea/modules/timeutil" | ||||||
| @@ -215,143 +214,6 @@ func (pr *PullRequest) GetDefaultMergeMessage() string { | |||||||
| 	return fmt.Sprintf("Merge pull request '%s' (#%d) from %s:%s into %s", pr.Issue.Title, pr.Issue.Index, pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseBranch) | 	return fmt.Sprintf("Merge pull request '%s' (#%d) from %s:%s into %s", pr.Issue.Title, pr.Issue.Index, pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseBranch) | ||||||
| } | } | ||||||
|  |  | ||||||
| // GetCommitMessages returns the commit messages between head and merge base (if there is one) |  | ||||||
| func (pr *PullRequest) GetCommitMessages() string { |  | ||||||
| 	if err := pr.LoadIssue(); err != nil { |  | ||||||
| 		log.Error("Cannot load issue %d for PR id %d: Error: %v", pr.IssueID, pr.ID, err) |  | ||||||
| 		return "" |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if err := pr.Issue.LoadPoster(); err != nil { |  | ||||||
| 		log.Error("Cannot load poster %d for pr id %d, index %d Error: %v", pr.Issue.PosterID, pr.ID, pr.Index, err) |  | ||||||
| 		return "" |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if pr.HeadRepo == nil { |  | ||||||
| 		var err error |  | ||||||
| 		pr.HeadRepo, err = GetRepositoryByID(pr.HeadRepoID) |  | ||||||
| 		if err != nil { |  | ||||||
| 			log.Error("GetRepositoryById[%d]: %v", pr.HeadRepoID, err) |  | ||||||
| 			return "" |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	gitRepo, err := git.OpenRepository(pr.HeadRepo.RepoPath()) |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Error("Unable to open head repository: Error: %v", err) |  | ||||||
| 		return "" |  | ||||||
| 	} |  | ||||||
| 	defer gitRepo.Close() |  | ||||||
|  |  | ||||||
| 	headCommit, err := gitRepo.GetBranchCommit(pr.HeadBranch) |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Error("Unable to get head commit: %s Error: %v", pr.HeadBranch, err) |  | ||||||
| 		return "" |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	mergeBase, err := gitRepo.GetCommit(pr.MergeBase) |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Error("Unable to get merge base commit: %s Error: %v", pr.MergeBase, err) |  | ||||||
| 		return "" |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	limit := setting.Repository.PullRequest.DefaultMergeMessageCommitsLimit |  | ||||||
|  |  | ||||||
| 	list, err := gitRepo.CommitsBetweenLimit(headCommit, mergeBase, limit, 0) |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Error("Unable to get commits between: %s %s Error: %v", pr.HeadBranch, pr.MergeBase, err) |  | ||||||
| 		return "" |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	maxSize := setting.Repository.PullRequest.DefaultMergeMessageSize |  | ||||||
|  |  | ||||||
| 	posterSig := pr.Issue.Poster.NewGitSig().String() |  | ||||||
|  |  | ||||||
| 	authorsMap := map[string]bool{} |  | ||||||
| 	authors := make([]string, 0, list.Len()) |  | ||||||
| 	stringBuilder := strings.Builder{} |  | ||||||
| 	element := list.Front() |  | ||||||
| 	for element != nil { |  | ||||||
| 		commit := element.Value.(*git.Commit) |  | ||||||
|  |  | ||||||
| 		if maxSize < 0 || stringBuilder.Len() < maxSize { |  | ||||||
| 			toWrite := []byte(commit.CommitMessage) |  | ||||||
| 			if len(toWrite) > maxSize-stringBuilder.Len() && maxSize > -1 { |  | ||||||
| 				toWrite = append(toWrite[:maxSize-stringBuilder.Len()], "..."...) |  | ||||||
| 			} |  | ||||||
| 			if _, err := stringBuilder.Write(toWrite); err != nil { |  | ||||||
| 				log.Error("Unable to write commit message Error: %v", err) |  | ||||||
| 				return "" |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			if _, err := stringBuilder.WriteRune('\n'); err != nil { |  | ||||||
| 				log.Error("Unable to write commit message Error: %v", err) |  | ||||||
| 				return "" |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		authorString := commit.Author.String() |  | ||||||
| 		if !authorsMap[authorString] && authorString != posterSig { |  | ||||||
| 			authors = append(authors, authorString) |  | ||||||
| 			authorsMap[authorString] = true |  | ||||||
| 		} |  | ||||||
| 		element = element.Next() |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Consider collecting the remaining authors |  | ||||||
| 	if limit >= 0 && setting.Repository.PullRequest.DefaultMergeMessageAllAuthors { |  | ||||||
| 		skip := limit |  | ||||||
| 		limit = 30 |  | ||||||
| 		for { |  | ||||||
| 			list, err := gitRepo.CommitsBetweenLimit(headCommit, mergeBase, limit, skip) |  | ||||||
| 			if err != nil { |  | ||||||
| 				log.Error("Unable to get commits between: %s %s Error: %v", pr.HeadBranch, pr.MergeBase, err) |  | ||||||
| 				return "" |  | ||||||
|  |  | ||||||
| 			} |  | ||||||
| 			if list.Len() == 0 { |  | ||||||
| 				break |  | ||||||
| 			} |  | ||||||
| 			element := list.Front() |  | ||||||
| 			for element != nil { |  | ||||||
| 				commit := element.Value.(*git.Commit) |  | ||||||
|  |  | ||||||
| 				authorString := commit.Author.String() |  | ||||||
| 				if !authorsMap[authorString] && authorString != posterSig { |  | ||||||
| 					authors = append(authors, authorString) |  | ||||||
| 					authorsMap[authorString] = true |  | ||||||
| 				} |  | ||||||
| 				element = element.Next() |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if len(authors) > 0 { |  | ||||||
| 		if _, err := stringBuilder.WriteRune('\n'); err != nil { |  | ||||||
| 			log.Error("Unable to write to string builder Error: %v", err) |  | ||||||
| 			return "" |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	for _, author := range authors { |  | ||||||
| 		if _, err := stringBuilder.Write([]byte("Co-authored-by: ")); err != nil { |  | ||||||
| 			log.Error("Unable to write to string builder Error: %v", err) |  | ||||||
| 			return "" |  | ||||||
| 		} |  | ||||||
| 		if _, err := stringBuilder.Write([]byte(author)); err != nil { |  | ||||||
| 			log.Error("Unable to write to string builder Error: %v", err) |  | ||||||
| 			return "" |  | ||||||
| 		} |  | ||||||
| 		if _, err := stringBuilder.WriteRune('\n'); err != nil { |  | ||||||
| 			log.Error("Unable to write to string builder Error: %v", err) |  | ||||||
| 			return "" |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return stringBuilder.String() |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // ReviewCount represents a count of Reviews | // ReviewCount represents a count of Reviews | ||||||
| type ReviewCount struct { | type ReviewCount struct { | ||||||
| 	IssueID int64 | 	IssueID int64 | ||||||
| @@ -465,39 +327,6 @@ func (pr *PullRequest) CanAutoMerge() bool { | |||||||
| 	return pr.Status == PullRequestStatusMergeable | 	return pr.Status == PullRequestStatusMergeable | ||||||
| } | } | ||||||
|  |  | ||||||
| // GetLastCommitStatus returns the last commit status for this pull request. |  | ||||||
| func (pr *PullRequest) GetLastCommitStatus() (status *CommitStatus, err error) { |  | ||||||
| 	if err = pr.LoadHeadRepo(); err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if pr.HeadRepo == nil { |  | ||||||
| 		return nil, ErrPullRequestHeadRepoMissing{pr.ID, pr.HeadRepoID} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	headGitRepo, err := git.OpenRepository(pr.HeadRepo.RepoPath()) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	defer headGitRepo.Close() |  | ||||||
|  |  | ||||||
| 	lastCommitID, err := headGitRepo.GetBranchCommitID(pr.HeadBranch) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	err = pr.LoadBaseRepo() |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	statusList, err := GetLatestCommitStatus(pr.BaseRepo, lastCommitID, 0) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	return CalcCommitStatus(statusList), nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // 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 | ||||||
|  |  | ||||||
| @@ -786,35 +615,6 @@ func (pr *PullRequest) GetWorkInProgressPrefix() string { | |||||||
| 	return "" | 	return "" | ||||||
| } | } | ||||||
|  |  | ||||||
| // IsHeadEqualWithBranch returns if the commits of branchName are available in pull request head |  | ||||||
| func (pr *PullRequest) IsHeadEqualWithBranch(branchName string) (bool, error) { |  | ||||||
| 	var err error |  | ||||||
| 	if err = pr.LoadBaseRepo(); err != nil { |  | ||||||
| 		return false, err |  | ||||||
| 	} |  | ||||||
| 	baseGitRepo, err := git.OpenRepository(pr.BaseRepo.RepoPath()) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return false, err |  | ||||||
| 	} |  | ||||||
| 	baseCommit, err := baseGitRepo.GetBranchCommit(branchName) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return false, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if err = pr.LoadHeadRepo(); err != nil { |  | ||||||
| 		return false, err |  | ||||||
| 	} |  | ||||||
| 	headGitRepo, err := git.OpenRepository(pr.HeadRepo.RepoPath()) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return false, err |  | ||||||
| 	} |  | ||||||
| 	headCommit, err := headGitRepo.GetBranchCommit(pr.HeadBranch) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return false, err |  | ||||||
| 	} |  | ||||||
| 	return baseCommit.HasPreviousCommit(headCommit.ID) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // IsSameRepo returns true if base repo and head repo is the same | // IsSameRepo returns true if base repo and head repo is the same | ||||||
| func (pr *PullRequest) IsSameRepo() bool { | func (pr *PullRequest) IsSameRepo() bool { | ||||||
| 	return pr.BaseRepoID == pr.HeadRepoID | 	return pr.BaseRepoID == pr.HeadRepoID | ||||||
|   | |||||||
| @@ -240,7 +240,7 @@ func issues(ctx *context.Context, milestoneID int64, isPullOption util.OptionalB | |||||||
| 				return | 				return | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			commitStatus[issues[i].PullRequest.ID], _ = issues[i].PullRequest.GetLastCommitStatus() | 			commitStatus[issues[i].PullRequest.ID], _ = pull_service.GetLastCommitStatus(issues[i].PullRequest) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -433,6 +433,7 @@ func PrepareViewPullInfo(ctx *context.Context, issue *models.Issue) *git.Compare | |||||||
| 			return nil | 			return nil | ||||||
| 		} | 		} | ||||||
| 		ctx.Data["Divergence"] = divergence | 		ctx.Data["Divergence"] = divergence | ||||||
|  | 		ctx.Data["GetCommitMessages"] = pull_service.GetCommitMessages(pull) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	sha, err := baseGitRepo.GetRefCommitID(pull.GetGitRefName()) | 	sha, err := baseGitRepo.GetRefCommitID(pull.GetGitRefName()) | ||||||
|   | |||||||
| @@ -22,6 +22,7 @@ import ( | |||||||
| 	"code.gitea.io/gitea/modules/markup/markdown" | 	"code.gitea.io/gitea/modules/markup/markdown" | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| 	"code.gitea.io/gitea/modules/util" | 	"code.gitea.io/gitea/modules/util" | ||||||
|  | 	pull_service "code.gitea.io/gitea/services/pull" | ||||||
|  |  | ||||||
| 	"github.com/keybase/go-crypto/openpgp" | 	"github.com/keybase/go-crypto/openpgp" | ||||||
| 	"github.com/keybase/go-crypto/openpgp/armor" | 	"github.com/keybase/go-crypto/openpgp/armor" | ||||||
| @@ -553,7 +554,7 @@ func Issues(ctx *context.Context) { | |||||||
| 		issue.Repo = showReposMap[issue.RepoID] | 		issue.Repo = showReposMap[issue.RepoID] | ||||||
|  |  | ||||||
| 		if isPullList { | 		if isPullList { | ||||||
| 			commitStatus[issue.PullRequest.ID], _ = issue.PullRequest.GetLastCommitStatus() | 			commitStatus[issue.PullRequest.ID], _ = pull_service.GetLastCommitStatus(issue.PullRequest) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -19,6 +19,7 @@ import ( | |||||||
| 	"code.gitea.io/gitea/modules/graceful" | 	"code.gitea.io/gitea/modules/graceful" | ||||||
| 	"code.gitea.io/gitea/modules/log" | 	"code.gitea.io/gitea/modules/log" | ||||||
| 	"code.gitea.io/gitea/modules/notification" | 	"code.gitea.io/gitea/modules/notification" | ||||||
|  | 	"code.gitea.io/gitea/modules/setting" | ||||||
| 	issue_service "code.gitea.io/gitea/services/issue" | 	issue_service "code.gitea.io/gitea/services/issue" | ||||||
|  |  | ||||||
| 	"github.com/unknwon/com" | 	"github.com/unknwon/com" | ||||||
| @@ -79,7 +80,7 @@ func ChangeTargetBranch(pr *models.PullRequest, doer *models.User, targetBranch | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// Check if branches are equal | 	// Check if branches are equal | ||||||
| 	branchesEqual, err := pr.IsHeadEqualWithBranch(targetBranch) | 	branchesEqual, err := IsHeadEqualWithBranch(pr, targetBranch) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| @@ -454,3 +455,202 @@ func CloseRepoBranchesPulls(doer *models.User, repo *models.Repository) error { | |||||||
| 	} | 	} | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // GetCommitMessages returns the commit messages between head and merge base (if there is one) | ||||||
|  | func GetCommitMessages(pr *models.PullRequest) string { | ||||||
|  | 	if err := pr.LoadIssue(); err != nil { | ||||||
|  | 		log.Error("Cannot load issue %d for PR id %d: Error: %v", pr.IssueID, pr.ID, err) | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if err := pr.Issue.LoadPoster(); err != nil { | ||||||
|  | 		log.Error("Cannot load poster %d for pr id %d, index %d Error: %v", pr.Issue.PosterID, pr.ID, pr.Index, err) | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if pr.HeadRepo == nil { | ||||||
|  | 		var err error | ||||||
|  | 		pr.HeadRepo, err = models.GetRepositoryByID(pr.HeadRepoID) | ||||||
|  | 		if err != nil { | ||||||
|  | 			log.Error("GetRepositoryById[%d]: %v", pr.HeadRepoID, err) | ||||||
|  | 			return "" | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	gitRepo, err := git.OpenRepository(pr.HeadRepo.RepoPath()) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Error("Unable to open head repository: Error: %v", err) | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	defer gitRepo.Close() | ||||||
|  |  | ||||||
|  | 	headCommit, err := gitRepo.GetBranchCommit(pr.HeadBranch) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Error("Unable to get head commit: %s Error: %v", pr.HeadBranch, err) | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	mergeBase, err := gitRepo.GetCommit(pr.MergeBase) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Error("Unable to get merge base commit: %s Error: %v", pr.MergeBase, err) | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	limit := setting.Repository.PullRequest.DefaultMergeMessageCommitsLimit | ||||||
|  |  | ||||||
|  | 	list, err := gitRepo.CommitsBetweenLimit(headCommit, mergeBase, limit, 0) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Error("Unable to get commits between: %s %s Error: %v", pr.HeadBranch, pr.MergeBase, err) | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	maxSize := setting.Repository.PullRequest.DefaultMergeMessageSize | ||||||
|  |  | ||||||
|  | 	posterSig := pr.Issue.Poster.NewGitSig().String() | ||||||
|  |  | ||||||
|  | 	authorsMap := map[string]bool{} | ||||||
|  | 	authors := make([]string, 0, list.Len()) | ||||||
|  | 	stringBuilder := strings.Builder{} | ||||||
|  | 	element := list.Front() | ||||||
|  | 	for element != nil { | ||||||
|  | 		commit := element.Value.(*git.Commit) | ||||||
|  |  | ||||||
|  | 		if maxSize < 0 || stringBuilder.Len() < maxSize { | ||||||
|  | 			toWrite := []byte(commit.CommitMessage) | ||||||
|  | 			if len(toWrite) > maxSize-stringBuilder.Len() && maxSize > -1 { | ||||||
|  | 				toWrite = append(toWrite[:maxSize-stringBuilder.Len()], "..."...) | ||||||
|  | 			} | ||||||
|  | 			if _, err := stringBuilder.Write(toWrite); err != nil { | ||||||
|  | 				log.Error("Unable to write commit message Error: %v", err) | ||||||
|  | 				return "" | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			if _, err := stringBuilder.WriteRune('\n'); err != nil { | ||||||
|  | 				log.Error("Unable to write commit message Error: %v", err) | ||||||
|  | 				return "" | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		authorString := commit.Author.String() | ||||||
|  | 		if !authorsMap[authorString] && authorString != posterSig { | ||||||
|  | 			authors = append(authors, authorString) | ||||||
|  | 			authorsMap[authorString] = true | ||||||
|  | 		} | ||||||
|  | 		element = element.Next() | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Consider collecting the remaining authors | ||||||
|  | 	if limit >= 0 && setting.Repository.PullRequest.DefaultMergeMessageAllAuthors { | ||||||
|  | 		skip := limit | ||||||
|  | 		limit = 30 | ||||||
|  | 		for { | ||||||
|  | 			list, err := gitRepo.CommitsBetweenLimit(headCommit, mergeBase, limit, skip) | ||||||
|  | 			if err != nil { | ||||||
|  | 				log.Error("Unable to get commits between: %s %s Error: %v", pr.HeadBranch, pr.MergeBase, err) | ||||||
|  | 				return "" | ||||||
|  |  | ||||||
|  | 			} | ||||||
|  | 			if list.Len() == 0 { | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 			element := list.Front() | ||||||
|  | 			for element != nil { | ||||||
|  | 				commit := element.Value.(*git.Commit) | ||||||
|  |  | ||||||
|  | 				authorString := commit.Author.String() | ||||||
|  | 				if !authorsMap[authorString] && authorString != posterSig { | ||||||
|  | 					authors = append(authors, authorString) | ||||||
|  | 					authorsMap[authorString] = true | ||||||
|  | 				} | ||||||
|  | 				element = element.Next() | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if len(authors) > 0 { | ||||||
|  | 		if _, err := stringBuilder.WriteRune('\n'); err != nil { | ||||||
|  | 			log.Error("Unable to write to string builder Error: %v", err) | ||||||
|  | 			return "" | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for _, author := range authors { | ||||||
|  | 		if _, err := stringBuilder.Write([]byte("Co-authored-by: ")); err != nil { | ||||||
|  | 			log.Error("Unable to write to string builder Error: %v", err) | ||||||
|  | 			return "" | ||||||
|  | 		} | ||||||
|  | 		if _, err := stringBuilder.Write([]byte(author)); err != nil { | ||||||
|  | 			log.Error("Unable to write to string builder Error: %v", err) | ||||||
|  | 			return "" | ||||||
|  | 		} | ||||||
|  | 		if _, err := stringBuilder.WriteRune('\n'); err != nil { | ||||||
|  | 			log.Error("Unable to write to string builder Error: %v", err) | ||||||
|  | 			return "" | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return stringBuilder.String() | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetLastCommitStatus returns the last commit status for this pull request. | ||||||
|  | func GetLastCommitStatus(pr *models.PullRequest) (status *models.CommitStatus, err error) { | ||||||
|  | 	if err = pr.LoadHeadRepo(); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if pr.HeadRepo == nil { | ||||||
|  | 		return nil, models.ErrPullRequestHeadRepoMissing{ID: pr.ID, HeadRepoID: pr.HeadRepoID} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	headGitRepo, err := git.OpenRepository(pr.HeadRepo.RepoPath()) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	defer headGitRepo.Close() | ||||||
|  |  | ||||||
|  | 	lastCommitID, err := headGitRepo.GetBranchCommitID(pr.HeadBranch) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	err = pr.LoadBaseRepo() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	statusList, err := models.GetLatestCommitStatus(pr.BaseRepo, lastCommitID, 0) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return models.CalcCommitStatus(statusList), nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // IsHeadEqualWithBranch returns if the commits of branchName are available in pull request head | ||||||
|  | func IsHeadEqualWithBranch(pr *models.PullRequest, branchName string) (bool, error) { | ||||||
|  | 	var err error | ||||||
|  | 	if err = pr.LoadBaseRepo(); err != nil { | ||||||
|  | 		return false, err | ||||||
|  | 	} | ||||||
|  | 	baseGitRepo, err := git.OpenRepository(pr.BaseRepo.RepoPath()) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return false, err | ||||||
|  | 	} | ||||||
|  | 	baseCommit, err := baseGitRepo.GetBranchCommit(branchName) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return false, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if err = pr.LoadHeadRepo(); err != nil { | ||||||
|  | 		return false, err | ||||||
|  | 	} | ||||||
|  | 	headGitRepo, err := git.OpenRepository(pr.HeadRepo.RepoPath()) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return false, err | ||||||
|  | 	} | ||||||
|  | 	headCommit, err := headGitRepo.GetBranchCommit(pr.HeadBranch) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return false, err | ||||||
|  | 	} | ||||||
|  | 	return baseCommit.HasPreviousCommit(headCommit.ID) | ||||||
|  | } | ||||||
|   | |||||||
| @@ -234,7 +234,6 @@ | |||||||
| 							</div> | 							</div> | ||||||
| 							{{end}} | 							{{end}} | ||||||
| 							{{if $prUnit.PullRequestsConfig.AllowSquash}} | 							{{if $prUnit.PullRequestsConfig.AllowSquash}} | ||||||
| 							{{$commitMessages := .Issue.PullRequest.GetCommitMessages}} |  | ||||||
| 							<div class="ui form squash-fields" style="display: none"> | 							<div class="ui form squash-fields" style="display: none"> | ||||||
| 								<form action="{{.Link}}/merge" method="post"> | 								<form action="{{.Link}}/merge" method="post"> | ||||||
| 									{{.CsrfTokenHtml}} | 									{{.CsrfTokenHtml}} | ||||||
| @@ -242,7 +241,7 @@ | |||||||
| 										<input type="text" name="merge_title_field" value="{{.Issue.PullRequest.GetDefaultSquashMessage}}"> | 										<input type="text" name="merge_title_field" value="{{.Issue.PullRequest.GetDefaultSquashMessage}}"> | ||||||
| 									</div> | 									</div> | ||||||
| 									<div class="field"> | 									<div class="field"> | ||||||
| 										<textarea name="merge_message_field" rows="5" placeholder="{{$.i18n.Tr "repo.editor.commit_message_desc"}}">{{$commitMessages}}Reviewed-on: {{$.Issue.HTMLURL}}
{{$approvers}}</textarea> | 										<textarea name="merge_message_field" rows="5" placeholder="{{$.i18n.Tr "repo.editor.commit_message_desc"}}">{{.GetCommitMessages}}Reviewed-on: {{$.Issue.HTMLURL}}
{{$approvers}}</textarea> | ||||||
| 									</div> | 									</div> | ||||||
| 									<button class="ui green button" type="submit" name="do" value="squash"> | 									<button class="ui green button" type="submit" name="do" value="squash"> | ||||||
| 										{{$.i18n.Tr "repo.pulls.squash_merge_pull_request"}} | 										{{$.i18n.Tr "repo.pulls.squash_merge_pull_request"}} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 6543
					6543