@@ -43,19 +43,26 @@ import (
43
43
"github.com/stretchr/testify/assert"
44
44
)
45
45
46
- func testPullMerge (t * testing.T , session * TestSession , user , repo , pullnum string , mergeStyle repo_model.MergeStyle , deleteBranch bool ) * httptest.ResponseRecorder {
46
+ type MergeOptions struct {
47
+ Style repo_model.MergeStyle
48
+ HeadCommitID string
49
+ DeleteBranch bool
50
+ }
51
+
52
+ func testPullMerge (t * testing.T , session * TestSession , user , repo , pullnum string , mergeOptions MergeOptions ) * httptest.ResponseRecorder {
47
53
req := NewRequest (t , "GET" , path .Join (user , repo , "pulls" , pullnum ))
48
54
resp := session .MakeRequest (t , req , http .StatusOK )
49
55
50
56
htmlDoc := NewHTMLParser (t , resp .Body )
51
57
link := path .Join (user , repo , "pulls" , pullnum , "merge" )
52
58
53
59
options := map [string ]string {
54
- "_csrf" : htmlDoc .GetCSRF (),
55
- "do" : string (mergeStyle ),
60
+ "_csrf" : htmlDoc .GetCSRF (),
61
+ "do" : string (mergeOptions .Style ),
62
+ "head_commit_id" : mergeOptions .HeadCommitID ,
56
63
}
57
64
58
- if deleteBranch {
65
+ if mergeOptions . DeleteBranch {
59
66
options ["delete_branch_after_merge" ] = "on"
60
67
}
61
68
@@ -69,6 +76,14 @@ func testPullMerge(t *testing.T, session *TestSession, user, repo, pullnum strin
69
76
70
77
assert .Equal (t , fmt .Sprintf ("/%s/%s/pulls/%s" , user , repo , pullnum ), respJSON .Redirect )
71
78
79
+ pullnumInt , err := strconv .ParseInt (pullnum , 10 , 64 )
80
+ assert .NoError (t , err )
81
+ repository , err := repo_model .GetRepositoryByOwnerAndName (t .Context (), user , repo )
82
+ assert .NoError (t , err )
83
+ pull , err := issues_model .GetPullRequestByIndex (t .Context (), repository .ID , pullnumInt )
84
+ assert .NoError (t , err )
85
+ assert .True (t , pull .HasMerged )
86
+
72
87
return resp
73
88
}
74
89
@@ -102,7 +117,10 @@ func TestPullMerge(t *testing.T) {
102
117
103
118
elem := strings .Split (test .RedirectURL (resp ), "/" )
104
119
assert .Equal (t , "pulls" , elem [3 ])
105
- testPullMerge (t , session , elem [1 ], elem [2 ], elem [4 ], repo_model .MergeStyleMerge , false )
120
+ testPullMerge (t , session , elem [1 ], elem [2 ], elem [4 ], MergeOptions {
121
+ Style : repo_model .MergeStyleMerge ,
122
+ DeleteBranch : false ,
123
+ })
106
124
107
125
hookTasks , err = webhook .HookTasks (t .Context (), 1 , 1 )
108
126
assert .NoError (t , err )
@@ -124,7 +142,10 @@ func TestPullRebase(t *testing.T) {
124
142
125
143
elem := strings .Split (test .RedirectURL (resp ), "/" )
126
144
assert .Equal (t , "pulls" , elem [3 ])
127
- testPullMerge (t , session , elem [1 ], elem [2 ], elem [4 ], repo_model .MergeStyleRebase , false )
145
+ testPullMerge (t , session , elem [1 ], elem [2 ], elem [4 ], MergeOptions {
146
+ Style : repo_model .MergeStyleRebase ,
147
+ DeleteBranch : false ,
148
+ })
128
149
129
150
hookTasks , err = webhook .HookTasks (t .Context (), 1 , 1 )
130
151
assert .NoError (t , err )
@@ -146,7 +167,10 @@ func TestPullRebaseMerge(t *testing.T) {
146
167
147
168
elem := strings .Split (test .RedirectURL (resp ), "/" )
148
169
assert .Equal (t , "pulls" , elem [3 ])
149
- testPullMerge (t , session , elem [1 ], elem [2 ], elem [4 ], repo_model .MergeStyleRebaseMerge , false )
170
+ testPullMerge (t , session , elem [1 ], elem [2 ], elem [4 ], MergeOptions {
171
+ Style : repo_model .MergeStyleRebaseMerge ,
172
+ DeleteBranch : false ,
173
+ })
150
174
151
175
hookTasks , err = webhook .HookTasks (t .Context (), 1 , 1 )
152
176
assert .NoError (t , err )
@@ -169,7 +193,42 @@ func TestPullSquash(t *testing.T) {
169
193
170
194
elem := strings .Split (test .RedirectURL (resp ), "/" )
171
195
assert .Equal (t , "pulls" , elem [3 ])
172
- testPullMerge (t , session , elem [1 ], elem [2 ], elem [4 ], repo_model .MergeStyleSquash , false )
196
+ testPullMerge (t , session , elem [1 ], elem [2 ], elem [4 ], MergeOptions {
197
+ Style : repo_model .MergeStyleSquash ,
198
+ DeleteBranch : false ,
199
+ })
200
+
201
+ hookTasks , err = webhook .HookTasks (t .Context (), 1 , 1 )
202
+ assert .NoError (t , err )
203
+ assert .Len (t , hookTasks , hookTasksLenBefore + 1 )
204
+ })
205
+ }
206
+
207
+ func TestPullSquashWithHeadCommitID (t * testing.T ) {
208
+ onGiteaRun (t , func (t * testing.T , giteaURL * url.URL ) {
209
+ hookTasks , err := webhook .HookTasks (t .Context (), 1 , 1 ) // Retrieve previous hook number
210
+ assert .NoError (t , err )
211
+ hookTasksLenBefore := len (hookTasks )
212
+
213
+ session := loginUser (t , "user1" )
214
+ testRepoFork (t , session , "user2" , "repo1" , "user1" , "repo1" , "" )
215
+ testEditFile (t , session , "user1" , "repo1" , "master" , "README.md" , "Hello, World (Edited)\n " )
216
+ testEditFile (t , session , "user1" , "repo1" , "master" , "README.md" , "Hello, World (Edited!)\n " )
217
+
218
+ resp := testPullCreate (t , session , "user1" , "repo1" , false , "master" , "master" , "This is a pull title" )
219
+
220
+ repo1 := unittest .AssertExistsAndLoadBean (t , & repo_model.Repository {OwnerName : "user1" , Name : "repo1" })
221
+ headBranch , err := git_model .GetBranch (t .Context (), repo1 .ID , "master" )
222
+ assert .NoError (t , err )
223
+ assert .NotNil (t , headBranch )
224
+
225
+ elem := strings .Split (test .RedirectURL (resp ), "/" )
226
+ assert .Equal (t , "pulls" , elem [3 ])
227
+ testPullMerge (t , session , elem [1 ], elem [2 ], elem [4 ], MergeOptions {
228
+ Style : repo_model .MergeStyleSquash ,
229
+ DeleteBranch : false ,
230
+ HeadCommitID : headBranch .CommitID ,
231
+ })
173
232
174
233
hookTasks , err = webhook .HookTasks (t .Context (), 1 , 1 )
175
234
assert .NoError (t , err )
@@ -187,7 +246,10 @@ func TestPullCleanUpAfterMerge(t *testing.T) {
187
246
188
247
elem := strings .Split (test .RedirectURL (resp ), "/" )
189
248
assert .Equal (t , "pulls" , elem [3 ])
190
- testPullMerge (t , session , elem [1 ], elem [2 ], elem [4 ], repo_model .MergeStyleMerge , false )
249
+ testPullMerge (t , session , elem [1 ], elem [2 ], elem [4 ], MergeOptions {
250
+ Style : repo_model .MergeStyleMerge ,
251
+ DeleteBranch : false ,
252
+ })
191
253
192
254
// Check PR branch deletion
193
255
resp = testPullCleanUp (t , session , elem [1 ], elem [2 ], elem [4 ])
@@ -556,7 +618,10 @@ func TestPullRetargetChildOnBranchDelete(t *testing.T) {
556
618
elemChildPR := strings .Split (test .RedirectURL (respChildPR ), "/" )
557
619
assert .Equal (t , "pulls" , elemChildPR [3 ])
558
620
559
- testPullMerge (t , session , elemBasePR [1 ], elemBasePR [2 ], elemBasePR [4 ], repo_model .MergeStyleMerge , true )
621
+ testPullMerge (t , session , elemBasePR [1 ], elemBasePR [2 ], elemBasePR [4 ], MergeOptions {
622
+ Style : repo_model .MergeStyleMerge ,
623
+ DeleteBranch : true ,
624
+ })
560
625
561
626
repo1 := unittest .AssertExistsAndLoadBean (t , & repo_model.Repository {OwnerName : "user2" , Name : "repo1" })
562
627
branchBasePR := unittest .AssertExistsAndLoadBean (t , & git_model.Branch {RepoID : repo1 .ID , Name : "base-pr" })
@@ -592,7 +657,10 @@ func TestPullDontRetargetChildOnWrongRepo(t *testing.T) {
592
657
593
658
defer test .MockVariableValue (& setting .Repository .PullRequest .RetargetChildrenOnMerge , false )()
594
659
595
- testPullMerge (t , session , elemBasePR [1 ], elemBasePR [2 ], elemBasePR [4 ], repo_model .MergeStyleMerge , true )
660
+ testPullMerge (t , session , elemBasePR [1 ], elemBasePR [2 ], elemBasePR [4 ], MergeOptions {
661
+ Style : repo_model .MergeStyleMerge ,
662
+ DeleteBranch : true ,
663
+ })
596
664
597
665
repo1 := unittest .AssertExistsAndLoadBean (t , & repo_model.Repository {OwnerName : "user1" , Name : "repo1" })
598
666
branchBasePR := unittest .AssertExistsAndLoadBean (t , & git_model.Branch {RepoID : repo1 .ID , Name : "base-pr" })
@@ -624,7 +692,10 @@ func TestPullRequestMergedWithNoPermissionDeleteBranch(t *testing.T) {
624
692
625
693
// user2 has no permission to delete branch of repo user1/repo1
626
694
session2 := loginUser (t , "user2" )
627
- testPullMerge (t , session2 , elemBasePR [1 ], elemBasePR [2 ], elemBasePR [4 ], repo_model .MergeStyleMerge , true )
695
+ testPullMerge (t , session2 , elemBasePR [1 ], elemBasePR [2 ], elemBasePR [4 ], MergeOptions {
696
+ Style : repo_model .MergeStyleMerge ,
697
+ DeleteBranch : true ,
698
+ })
628
699
629
700
repo1 := unittest .AssertExistsAndLoadBean (t , & repo_model.Repository {OwnerName : "user4" , Name : "repo1" })
630
701
branchBasePR := unittest .AssertExistsAndLoadBean (t , & git_model.Branch {RepoID : repo1 .ID , Name : "base-pr" })
@@ -672,7 +743,10 @@ func TestPullMergeIndexerNotifier(t *testing.T) {
672
743
// merge the pull request
673
744
elem := strings .Split (test .RedirectURL (createPullResp ), "/" )
674
745
assert .Equal (t , "pulls" , elem [3 ])
675
- testPullMerge (t , session , elem [1 ], elem [2 ], elem [4 ], repo_model .MergeStyleMerge , false )
746
+ testPullMerge (t , session , elem [1 ], elem [2 ], elem [4 ], MergeOptions {
747
+ Style : repo_model .MergeStyleMerge ,
748
+ DeleteBranch : false ,
749
+ })
676
750
677
751
// check if the issue is closed
678
752
issue = unittest .AssertExistsAndLoadBean (t , & issues_model.Issue {
0 commit comments