@@ -43,19 +43,26 @@ import (
4343 "github.com/stretchr/testify/assert"
4444)
4545
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 {
4753 req := NewRequest (t , "GET" , path .Join (user , repo , "pulls" , pullnum ))
4854 resp := session .MakeRequest (t , req , http .StatusOK )
4955
5056 htmlDoc := NewHTMLParser (t , resp .Body )
5157 link := path .Join (user , repo , "pulls" , pullnum , "merge" )
5258
5359 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 ,
5663 }
5764
58- if deleteBranch {
65+ if mergeOptions . DeleteBranch {
5966 options ["delete_branch_after_merge" ] = "on"
6067 }
6168
@@ -110,7 +117,10 @@ func TestPullMerge(t *testing.T) {
110117
111118 elem := strings .Split (test .RedirectURL (resp ), "/" )
112119 assert .Equal (t , "pulls" , elem [3 ])
113- 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+ })
114124
115125 hookTasks , err = webhook .HookTasks (t .Context (), 1 , 1 )
116126 assert .NoError (t , err )
@@ -132,7 +142,10 @@ func TestPullRebase(t *testing.T) {
132142
133143 elem := strings .Split (test .RedirectURL (resp ), "/" )
134144 assert .Equal (t , "pulls" , elem [3 ])
135- 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+ })
136149
137150 hookTasks , err = webhook .HookTasks (t .Context (), 1 , 1 )
138151 assert .NoError (t , err )
@@ -154,7 +167,10 @@ func TestPullRebaseMerge(t *testing.T) {
154167
155168 elem := strings .Split (test .RedirectURL (resp ), "/" )
156169 assert .Equal (t , "pulls" , elem [3 ])
157- 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+ })
158174
159175 hookTasks , err = webhook .HookTasks (t .Context (), 1 , 1 )
160176 assert .NoError (t , err )
@@ -177,7 +193,42 @@ func TestPullSquash(t *testing.T) {
177193
178194 elem := strings .Split (test .RedirectURL (resp ), "/" )
179195 assert .Equal (t , "pulls" , elem [3 ])
180- 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+ })
181232
182233 hookTasks , err = webhook .HookTasks (t .Context (), 1 , 1 )
183234 assert .NoError (t , err )
@@ -195,7 +246,10 @@ func TestPullCleanUpAfterMerge(t *testing.T) {
195246
196247 elem := strings .Split (test .RedirectURL (resp ), "/" )
197248 assert .Equal (t , "pulls" , elem [3 ])
198- 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+ })
199253
200254 // Check PR branch deletion
201255 resp = testPullCleanUp (t , session , elem [1 ], elem [2 ], elem [4 ])
@@ -564,7 +618,10 @@ func TestPullRetargetChildOnBranchDelete(t *testing.T) {
564618 elemChildPR := strings .Split (test .RedirectURL (respChildPR ), "/" )
565619 assert .Equal (t , "pulls" , elemChildPR [3 ])
566620
567- 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+ })
568625
569626 repo1 := unittest .AssertExistsAndLoadBean (t , & repo_model.Repository {OwnerName : "user2" , Name : "repo1" })
570627 branchBasePR := unittest .AssertExistsAndLoadBean (t , & git_model.Branch {RepoID : repo1 .ID , Name : "base-pr" })
@@ -600,7 +657,10 @@ func TestPullDontRetargetChildOnWrongRepo(t *testing.T) {
600657
601658 defer test .MockVariableValue (& setting .Repository .PullRequest .RetargetChildrenOnMerge , false )()
602659
603- 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+ })
604664
605665 repo1 := unittest .AssertExistsAndLoadBean (t , & repo_model.Repository {OwnerName : "user1" , Name : "repo1" })
606666 branchBasePR := unittest .AssertExistsAndLoadBean (t , & git_model.Branch {RepoID : repo1 .ID , Name : "base-pr" })
@@ -632,7 +692,10 @@ func TestPullRequestMergedWithNoPermissionDeleteBranch(t *testing.T) {
632692
633693 // user2 has no permission to delete branch of repo user1/repo1
634694 session2 := loginUser (t , "user2" )
635- 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+ })
636699
637700 repo1 := unittest .AssertExistsAndLoadBean (t , & repo_model.Repository {OwnerName : "user4" , Name : "repo1" })
638701 branchBasePR := unittest .AssertExistsAndLoadBean (t , & git_model.Branch {RepoID : repo1 .ID , Name : "base-pr" })
@@ -680,7 +743,10 @@ func TestPullMergeIndexerNotifier(t *testing.T) {
680743 // merge the pull request
681744 elem := strings .Split (test .RedirectURL (createPullResp ), "/" )
682745 assert .Equal (t , "pulls" , elem [3 ])
683- 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+ })
684750
685751 // check if the issue is closed
686752 issue = unittest .AssertExistsAndLoadBean (t , & issues_model.Issue {
0 commit comments