mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Add commits dropdown in PR files view and allow commit by commit review (#25528)
This PR adds a new dropdown to select a commit or a commit range (shift-click like github) of a Pull Request. After selection of a commit only the changes of this commit will be shown. When selecting a range of commits the diff of this range is shown. This allows to review a PR commit by commit or by viewing only commit ranges. The "Show changes since your last review" mechanism github uses is implemented, too. When reviewing a single commit or a commit range the "Viewed" functionality is disabled. ## Screenshots ### The commit dropdown  ### Selecting a commit range  ### Show changes of a single commit only  ### Show changes of a commit range  Fixes https://github.com/go-gitea/gitea/issues/20989 Fixes https://github.com/go-gitea/gitea/issues/19263 --------- Co-authored-by: silverwind <me@silverwind.io> Co-authored-by: KN4CK3R <admin@oldschoolhack.me> Co-authored-by: wxiaoguang <wxiaoguang@gmail.com> Co-authored-by: delvh <dev.lh@web.de>
This commit is contained in:
		@@ -10,6 +10,7 @@ import (
 | 
			
		||||
	"os"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models"
 | 
			
		||||
	"code.gitea.io/gitea/models/db"
 | 
			
		||||
@@ -17,7 +18,9 @@ import (
 | 
			
		||||
	issues_model "code.gitea.io/gitea/models/issues"
 | 
			
		||||
	repo_model "code.gitea.io/gitea/models/repo"
 | 
			
		||||
	user_model "code.gitea.io/gitea/models/user"
 | 
			
		||||
	"code.gitea.io/gitea/modules/base"
 | 
			
		||||
	"code.gitea.io/gitea/modules/container"
 | 
			
		||||
	gitea_context "code.gitea.io/gitea/modules/context"
 | 
			
		||||
	"code.gitea.io/gitea/modules/git"
 | 
			
		||||
	"code.gitea.io/gitea/modules/graceful"
 | 
			
		||||
	"code.gitea.io/gitea/modules/json"
 | 
			
		||||
@@ -856,3 +859,71 @@ func IsHeadEqualWithBranch(ctx context.Context, pr *issues_model.PullRequest, br
 | 
			
		||||
	}
 | 
			
		||||
	return baseCommit.HasPreviousCommit(headCommit.ID)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type CommitInfo struct {
 | 
			
		||||
	Summary               string `json:"summary"`
 | 
			
		||||
	CommitterOrAuthorName string `json:"committer_or_author_name"`
 | 
			
		||||
	ID                    string `json:"id"`
 | 
			
		||||
	ShortSha              string `json:"short_sha"`
 | 
			
		||||
	Time                  string `json:"time"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetPullCommits returns all commits on given pull request and the last review commit sha
 | 
			
		||||
func GetPullCommits(ctx *gitea_context.Context, issue *issues_model.Issue) ([]CommitInfo, string, error) {
 | 
			
		||||
	pull := issue.PullRequest
 | 
			
		||||
 | 
			
		||||
	baseGitRepo := ctx.Repo.GitRepo
 | 
			
		||||
 | 
			
		||||
	if err := pull.LoadBaseRepo(ctx); err != nil {
 | 
			
		||||
		return nil, "", err
 | 
			
		||||
	}
 | 
			
		||||
	baseBranch := pull.BaseBranch
 | 
			
		||||
	if pull.HasMerged {
 | 
			
		||||
		baseBranch = pull.MergeBase
 | 
			
		||||
	}
 | 
			
		||||
	prInfo, err := baseGitRepo.GetCompareInfo(pull.BaseRepo.RepoPath(), baseBranch, pull.GetGitRefName(), true, false)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, "", err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	commits := make([]CommitInfo, 0, len(prInfo.Commits))
 | 
			
		||||
 | 
			
		||||
	for _, commit := range prInfo.Commits {
 | 
			
		||||
		var committerOrAuthorName string
 | 
			
		||||
		var commitTime time.Time
 | 
			
		||||
		if commit.Committer != nil {
 | 
			
		||||
			committerOrAuthorName = commit.Committer.Name
 | 
			
		||||
			commitTime = commit.Committer.When
 | 
			
		||||
		} else {
 | 
			
		||||
			committerOrAuthorName = commit.Author.Name
 | 
			
		||||
			commitTime = commit.Author.When
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		commits = append(commits, CommitInfo{
 | 
			
		||||
			Summary:               commit.Summary(),
 | 
			
		||||
			CommitterOrAuthorName: committerOrAuthorName,
 | 
			
		||||
			ID:                    commit.ID.String(),
 | 
			
		||||
			ShortSha:              base.ShortSha(commit.ID.String()),
 | 
			
		||||
			Time:                  commitTime.Format(time.RFC3339),
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var lastReviewCommitID string
 | 
			
		||||
	if ctx.IsSigned {
 | 
			
		||||
		// get last review of current user and store information in context (if available)
 | 
			
		||||
		lastreview, err := issues_model.FindLatestReviews(ctx, issues_model.FindReviewOptions{
 | 
			
		||||
			IssueID:    issue.ID,
 | 
			
		||||
			ReviewerID: ctx.Doer.ID,
 | 
			
		||||
			Type:       issues_model.ReviewTypeUnknown,
 | 
			
		||||
		})
 | 
			
		||||
 | 
			
		||||
		if err != nil && !issues_model.IsErrReviewNotExist(err) {
 | 
			
		||||
			return nil, "", err
 | 
			
		||||
		}
 | 
			
		||||
		if len(lastreview) > 0 {
 | 
			
		||||
			lastReviewCommitID = lastreview[0].CommitID
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return commits, lastReviewCommitID, nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user