@@ -31,6 +31,7 @@ import (
31
31
"code.gitea.io/gitea/modules/git"
32
32
"code.gitea.io/gitea/modules/gitrepo"
33
33
"code.gitea.io/gitea/modules/queue"
34
+ "code.gitea.io/gitea/modules/setting"
34
35
api "code.gitea.io/gitea/modules/structs"
35
36
"code.gitea.io/gitea/modules/test"
36
37
"code.gitea.io/gitea/modules/translation"
@@ -846,3 +847,132 @@ func TestPullAutoMergeAfterCommitStatusSucceedAndApproval(t *testing.T) {
846
847
unittest .AssertNotExistsBean (t , & pull_model.AutoMerge {PullID : pr .ID })
847
848
})
848
849
}
850
+
851
+ func TestPullAutoMergeAfterCommitStatusSucceedAndApprovalForAgitFlow (t * testing.T ) {
852
+ onGiteaRun (t , func (t * testing.T , u * url.URL ) {
853
+ // create a pull request
854
+ baseAPITestContext := NewAPITestContext (t , "user2" , "repo1" , auth_model .AccessTokenScopeWriteRepository , auth_model .AccessTokenScopeWriteUser )
855
+
856
+ dstPath := t .TempDir ()
857
+
858
+ u .Path = baseAPITestContext .GitPath ()
859
+ u .User = url .UserPassword ("user2" , userPassword )
860
+
861
+ t .Run ("Clone" , doGitClone (dstPath , u ))
862
+
863
+ err := os .WriteFile (path .Join (dstPath , "test_file" ), []byte ("## test content" ), 0o666 )
864
+ assert .NoError (t , err )
865
+
866
+ err = git .AddChanges (dstPath , true )
867
+ assert .NoError (t , err )
868
+
869
+ err = git .CommitChanges (dstPath , git.CommitChangesOptions {
870
+ Committer : & git.Signature {
871
+
872
+ Name : "user2" ,
873
+ When : time .Now (),
874
+ },
875
+ Author : & git.Signature {
876
+
877
+ Name : "user2" ,
878
+ When : time .Now (),
879
+ },
880
+ Message : "Testing commit 1" ,
881
+ })
882
+ assert .NoError (t , err )
883
+
884
+ stderrBuf := & bytes.Buffer {}
885
+
886
+ err = git .NewCommand (git .DefaultContext , "push" , "origin" , "HEAD:refs/for/master" , "-o" ).
887
+ AddDynamicArguments (`topic=test/head2` ).
888
+ AddArguments ("-o" ).
889
+ AddDynamicArguments (`title="create a test pull request with agit"` ).
890
+ AddArguments ("-o" ).
891
+ AddDynamicArguments (`description="This PR is a test pull request which created with agit"` ).
892
+ Run (& git.RunOpts {Dir : dstPath , Stderr : stderrBuf })
893
+ assert .NoError (t , err )
894
+
895
+ assert .Contains (t , stderrBuf .String (), setting .AppURL + "user2/repo1/pulls/6" )
896
+
897
+ baseRepo := unittest .AssertExistsAndLoadBean (t , & repo_model.Repository {OwnerName : "user2" , Name : "repo1" })
898
+ pr := unittest .AssertExistsAndLoadBean (t , & issues_model.PullRequest {
899
+ Flow : issues_model .PullRequestFlowAGit ,
900
+ BaseRepoID : baseRepo .ID ,
901
+ BaseBranch : "master" ,
902
+ HeadRepoID : baseRepo .ID ,
903
+ HeadBranch : "user2/test/head2" ,
904
+ })
905
+
906
+ session := loginUser (t , "user1" )
907
+ // add protected branch for commit status
908
+ csrf := GetCSRF (t , session , "/user2/repo1/settings/branches" )
909
+ // Change master branch to protected
910
+ req := NewRequestWithValues (t , "POST" , "/user2/repo1/settings/branches/edit" , map [string ]string {
911
+ "_csrf" : csrf ,
912
+ "rule_name" : "master" ,
913
+ "enable_push" : "true" ,
914
+ "enable_status_check" : "true" ,
915
+ "status_check_contexts" : "gitea/actions" ,
916
+ "required_approvals" : "1" ,
917
+ })
918
+ session .MakeRequest (t , req , http .StatusSeeOther )
919
+
920
+ user1 := unittest .AssertExistsAndLoadBean (t , & user_model.User {ID : 1 })
921
+ // first time insert automerge record, return true
922
+ scheduled , err := automerge .ScheduleAutoMerge (db .DefaultContext , user1 , pr , repo_model .MergeStyleMerge , "auto merge test" )
923
+ assert .NoError (t , err )
924
+ assert .True (t , scheduled )
925
+
926
+ // second time insert automerge record, return false because it does exist
927
+ scheduled , err = automerge .ScheduleAutoMerge (db .DefaultContext , user1 , pr , repo_model .MergeStyleMerge , "auto merge test" )
928
+ assert .Error (t , err )
929
+ assert .False (t , scheduled )
930
+
931
+ // reload pr again
932
+ pr = unittest .AssertExistsAndLoadBean (t , & issues_model.PullRequest {ID : pr .ID })
933
+ assert .False (t , pr .HasMerged )
934
+ assert .Empty (t , pr .MergedCommitID )
935
+
936
+ // update commit status to success, then it should be merged automatically
937
+ baseGitRepo , err := gitrepo .OpenRepository (db .DefaultContext , baseRepo )
938
+ assert .NoError (t , err )
939
+ sha , err := baseGitRepo .GetRefCommitID (pr .GetGitRefName ())
940
+ assert .NoError (t , err )
941
+ masterCommitID , err := baseGitRepo .GetBranchCommitID ("master" )
942
+ assert .NoError (t , err )
943
+ baseGitRepo .Close ()
944
+ defer func () {
945
+ testResetRepo (t , baseRepo .RepoPath (), "master" , masterCommitID )
946
+ }()
947
+
948
+ err = commitstatus_service .CreateCommitStatus (db .DefaultContext , baseRepo , user1 , sha , & git_model.CommitStatus {
949
+ State : api .CommitStatusSuccess ,
950
+ TargetURL : "https://gitea.com" ,
951
+ Context : "gitea/actions" ,
952
+ })
953
+ assert .NoError (t , err )
954
+
955
+ time .Sleep (2 * time .Second )
956
+
957
+ // reload pr again
958
+ pr = unittest .AssertExistsAndLoadBean (t , & issues_model.PullRequest {ID : pr .ID })
959
+ assert .False (t , pr .HasMerged )
960
+ assert .Empty (t , pr .MergedCommitID )
961
+
962
+ // approve the PR from non-author
963
+ approveSession := loginUser (t , "user1" )
964
+ req = NewRequest (t , "GET" , fmt .Sprintf ("/user2/repo1/pulls/%d" , pr .Index ))
965
+ resp := approveSession .MakeRequest (t , req , http .StatusOK )
966
+ htmlDoc := NewHTMLParser (t , resp .Body )
967
+ testSubmitReview (t , approveSession , htmlDoc .GetCSRF (), "user2" , "repo1" , strconv .Itoa (int (pr .Index )), sha , "approve" , http .StatusOK )
968
+
969
+ time .Sleep (2 * time .Second )
970
+
971
+ // realod pr again
972
+ pr = unittest .AssertExistsAndLoadBean (t , & issues_model.PullRequest {ID : pr .ID })
973
+ assert .True (t , pr .HasMerged )
974
+ assert .NotEmpty (t , pr .MergedCommitID )
975
+
976
+ unittest .AssertNotExistsBean (t , & pull_model.AutoMerge {PullID : pr .ID })
977
+ })
978
+ }
0 commit comments