@@ -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
@@ -69,6 +76,14 @@ func testPullMerge(t *testing.T, session *TestSession, user, repo, pullnum strin
6976
7077	assert .Equal (t , fmt .Sprintf ("/%s/%s/pulls/%s" , user , repo , pullnum ), respJSON .Redirect )
7178
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+ 
7287	return  resp 
7388}
7489
@@ -102,7 +117,10 @@ func TestPullMerge(t *testing.T) {
102117
103118		elem  :=  strings .Split (test .RedirectURL (resp ), "/" )
104119		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+ 		})
106124
107125		hookTasks , err  =  webhook .HookTasks (t .Context (), 1 , 1 )
108126		assert .NoError (t , err )
@@ -124,7 +142,10 @@ func TestPullRebase(t *testing.T) {
124142
125143		elem  :=  strings .Split (test .RedirectURL (resp ), "/" )
126144		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+ 		})
128149
129150		hookTasks , err  =  webhook .HookTasks (t .Context (), 1 , 1 )
130151		assert .NoError (t , err )
@@ -146,7 +167,10 @@ func TestPullRebaseMerge(t *testing.T) {
146167
147168		elem  :=  strings .Split (test .RedirectURL (resp ), "/" )
148169		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+ 		})
150174
151175		hookTasks , err  =  webhook .HookTasks (t .Context (), 1 , 1 )
152176		assert .NoError (t , err )
@@ -169,7 +193,42 @@ func TestPullSquash(t *testing.T) {
169193
170194		elem  :=  strings .Split (test .RedirectURL (resp ), "/" )
171195		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+ 		})
173232
174233		hookTasks , err  =  webhook .HookTasks (t .Context (), 1 , 1 )
175234		assert .NoError (t , err )
@@ -187,7 +246,10 @@ func TestPullCleanUpAfterMerge(t *testing.T) {
187246
188247		elem  :=  strings .Split (test .RedirectURL (resp ), "/" )
189248		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+ 		})
191253
192254		// Check PR branch deletion 
193255		resp  =  testPullCleanUp (t , session , elem [1 ], elem [2 ], elem [4 ])
@@ -556,7 +618,10 @@ func TestPullRetargetChildOnBranchDelete(t *testing.T) {
556618		elemChildPR  :=  strings .Split (test .RedirectURL (respChildPR ), "/" )
557619		assert .Equal (t , "pulls" , elemChildPR [3 ])
558620
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+ 		})
560625
561626		repo1  :=  unittest .AssertExistsAndLoadBean (t , & repo_model.Repository {OwnerName : "user2" , Name : "repo1" })
562627		branchBasePR  :=  unittest .AssertExistsAndLoadBean (t , & git_model.Branch {RepoID : repo1 .ID , Name : "base-pr" })
@@ -592,7 +657,10 @@ func TestPullDontRetargetChildOnWrongRepo(t *testing.T) {
592657
593658		defer  test .MockVariableValue (& setting .Repository .PullRequest .RetargetChildrenOnMerge , false )()
594659
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+ 		})
596664
597665		repo1  :=  unittest .AssertExistsAndLoadBean (t , & repo_model.Repository {OwnerName : "user1" , Name : "repo1" })
598666		branchBasePR  :=  unittest .AssertExistsAndLoadBean (t , & git_model.Branch {RepoID : repo1 .ID , Name : "base-pr" })
@@ -624,7 +692,10 @@ func TestPullRequestMergedWithNoPermissionDeleteBranch(t *testing.T) {
624692
625693		// user2 has no permission to delete branch of repo user1/repo1 
626694		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+ 		})
628699
629700		repo1  :=  unittest .AssertExistsAndLoadBean (t , & repo_model.Repository {OwnerName : "user4" , Name : "repo1" })
630701		branchBasePR  :=  unittest .AssertExistsAndLoadBean (t , & git_model.Branch {RepoID : repo1 .ID , Name : "base-pr" })
@@ -672,7 +743,10 @@ func TestPullMergeIndexerNotifier(t *testing.T) {
672743		// merge the pull request 
673744		elem  :=  strings .Split (test .RedirectURL (createPullResp ), "/" )
674745		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+ 		})
676750
677751		// check if the issue is closed 
678752		issue  =  unittest .AssertExistsAndLoadBean (t , & issues_model.Issue {
0 commit comments