94 lines · 2.4 KB · Go
RawDownload
// Copyright 2022 The Gitea Authors. All rights reserved.// SPDX-License-Identifier: MIT package pull import (	"context" 	issues_model "forgejo.org/models/issues"	repo_model "forgejo.org/models/repo"	user_model "forgejo.org/models/user"	"forgejo.org/modules/gitrepo"	"forgejo.org/modules/json") // getCommitIDsFromRepo get commit IDs from repo in between oldCommitID and newCommitID// isForcePush will be true if oldCommit isn't on the branch// Commit on baseBranch will skipfunc getCommitIDsFromRepo(ctx context.Context, repo *repo_model.Repository, oldCommitID, newCommitID, baseBranch string) (commitIDs []string, isForcePush bool, err error) {	gitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, repo)	if err != nil {		return nil, false, err	}	defer closer.Close() 	oldCommit, err := gitRepo.GetCommit(oldCommitID)	if err != nil {		return nil, false, err	} 	newCommit, err := gitRepo.GetCommit(newCommitID)	if err != nil {		return nil, false, err	} 	isForcePush, err = newCommit.IsForcePush(oldCommitID)	if err != nil {		return nil, false, err	} 	if isForcePush {		commitIDs = make([]string, 2)		commitIDs[0] = oldCommitID		commitIDs[1] = newCommitID 		return commitIDs, isForcePush, err	} 	// Find commits between new and old commit excluding base branch commits	commits, err := gitRepo.CommitsBetweenNotBase(newCommit, oldCommit, baseBranch)	if err != nil {		return nil, false, err	} 	commitIDs = make([]string, 0, len(commits))	for i := len(commits) - 1; i >= 0; i-- {		commitIDs = append(commitIDs, commits[i].ID.String())	} 	return commitIDs, isForcePush, err} // CreatePushPullComment create push code to pull base commentfunc CreatePushPullComment(ctx context.Context, pusher *user_model.User, pr *issues_model.PullRequest, oldCommitID, newCommitID string) (comment *issues_model.Comment, err error) {	if pr.HasMerged || oldCommitID == "" || newCommitID == "" {		return nil, nil	} 	ops := &issues_model.CreateCommentOptions{		Type: issues_model.CommentTypePullRequestPush,		Doer: pusher,		Repo: pr.BaseRepo,	} 	var data issues_model.PushActionContent 	data.CommitIDs, data.IsForcePush, err = getCommitIDsFromRepo(ctx, pr.BaseRepo, oldCommitID, newCommitID, pr.BaseBranch)	if err != nil {		return nil, err	} 	ops.Issue = pr.Issue 	dataJSON, err := json.Marshal(data)	if err != nil {		return nil, err	} 	ops.Content = string(dataJSON) 	comment, err = issues_model.CreateComment(ctx, ops) 	return comment, err}