@@ -13,7 +13,9 @@ import (
13
13
user_model "code.gitea.io/gitea/models/user"
14
14
"code.gitea.io/gitea/modules/git"
15
15
"code.gitea.io/gitea/modules/log"
16
+ "code.gitea.io/gitea/modules/setting"
16
17
api "code.gitea.io/gitea/modules/structs"
18
+ "code.gitea.io/gitea/services/gitdiff"
17
19
)
18
20
19
21
// ToAPIPullRequest assumes following fields have been assigned with valid values:
@@ -50,29 +52,31 @@ func ToAPIPullRequest(ctx context.Context, pr *issues_model.PullRequest, doer *u
50
52
}
51
53
52
54
apiPullRequest := & api.PullRequest {
53
- ID : pr .ID ,
54
- URL : pr .Issue .HTMLURL (),
55
- Index : pr .Index ,
56
- Poster : apiIssue .Poster ,
57
- Title : apiIssue .Title ,
58
- Body : apiIssue .Body ,
59
- Labels : apiIssue .Labels ,
60
- Milestone : apiIssue .Milestone ,
61
- Assignee : apiIssue .Assignee ,
62
- Assignees : apiIssue .Assignees ,
63
- State : apiIssue .State ,
64
- IsLocked : apiIssue .IsLocked ,
65
- Comments : apiIssue .Comments ,
66
- HTMLURL : pr .Issue .HTMLURL (),
67
- DiffURL : pr .Issue .DiffURL (),
68
- PatchURL : pr .Issue .PatchURL (),
69
- HasMerged : pr .HasMerged ,
70
- MergeBase : pr .MergeBase ,
71
- Mergeable : pr .Mergeable (ctx ),
72
- Deadline : apiIssue .Deadline ,
73
- Created : pr .Issue .CreatedUnix .AsTimePtr (),
74
- Updated : pr .Issue .UpdatedUnix .AsTimePtr (),
75
- PinOrder : apiIssue .PinOrder ,
55
+ ID : pr .ID ,
56
+ URL : pr .Issue .HTMLURL (),
57
+ Index : pr .Index ,
58
+ Poster : apiIssue .Poster ,
59
+ Title : apiIssue .Title ,
60
+ Body : apiIssue .Body ,
61
+ Labels : apiIssue .Labels ,
62
+ Milestone : apiIssue .Milestone ,
63
+ Assignee : apiIssue .Assignee ,
64
+ Assignees : apiIssue .Assignees ,
65
+ State : apiIssue .State ,
66
+ Draft : pr .IsWorkInProgress (ctx ),
67
+ IsLocked : apiIssue .IsLocked ,
68
+ Comments : apiIssue .Comments ,
69
+ ReviewComments : pr .GetReviewCommentsCount (ctx ),
70
+ HTMLURL : pr .Issue .HTMLURL (),
71
+ DiffURL : pr .Issue .DiffURL (),
72
+ PatchURL : pr .Issue .PatchURL (),
73
+ HasMerged : pr .HasMerged ,
74
+ MergeBase : pr .MergeBase ,
75
+ Mergeable : pr .Mergeable (ctx ),
76
+ Deadline : apiIssue .Deadline ,
77
+ Created : pr .Issue .CreatedUnix .AsTimePtr (),
78
+ Updated : pr .Issue .UpdatedUnix .AsTimePtr (),
79
+ PinOrder : apiIssue .PinOrder ,
76
80
77
81
AllowMaintainerEdit : pr .AllowMaintainerEdit ,
78
82
@@ -187,6 +191,34 @@ func ToAPIPullRequest(ctx context.Context, pr *issues_model.PullRequest, doer *u
187
191
apiPullRequest .Head .Sha = commit .ID .String ()
188
192
}
189
193
}
194
+
195
+ startCommitID := pr .MergeBase
196
+ endCommitID , err := headGitRepo .GetRefCommitID (apiPullRequest .Head .Ref )
197
+ if err != nil {
198
+ log .Error ("GetRefCommitID[%s]: %v" , apiPullRequest .Head .Ref , err )
199
+ }
200
+
201
+ maxLines := setting .Git .MaxGitDiffLines
202
+
203
+ // FIXME: If there are too many files in the repo, may cause some unpredictable issues.
204
+ diff , err := gitdiff .GetDiff (ctx , gitRepo ,
205
+ & gitdiff.DiffOptions {
206
+ BeforeCommitID : startCommitID ,
207
+ AfterCommitID : endCommitID ,
208
+ SkipTo : "" , // ctx.FormString("skip-to"),
209
+ MaxLines : maxLines ,
210
+ MaxLineCharacters : setting .Git .MaxGitDiffLineCharacters ,
211
+ MaxFiles : - 1 , // GetDiff() will return all files
212
+ WhitespaceBehavior : gitdiff .GetWhitespaceFlag ("show-all" ),
213
+ })
214
+ if err != nil {
215
+ log .Error ("GetDiff: %v" , err )
216
+ return nil
217
+ }
218
+
219
+ apiPullRequest .Additions = diff .TotalAddition
220
+ apiPullRequest .Deletions = diff .TotalDeletion
221
+ apiPullRequest .ChangedFiles = diff .NumFiles
190
222
}
191
223
192
224
if len (apiPullRequest .Head .Sha ) == 0 && len (apiPullRequest .Head .Ref ) != 0 {
0 commit comments