@@ -11,16 +11,16 @@ import (
11
11
)
12
12
13
13
// SignMerge determines if we should sign a PR merge commit to the base repository
14
- func (pr * PullRequest ) SignMerge (u * User , tmpBasePath , baseCommit , headCommit string ) (bool , string ) {
14
+ func (pr * PullRequest ) SignMerge (u * User , tmpBasePath , baseCommit , headCommit string ) (bool , string , error ) {
15
15
if err := pr .GetBaseRepo (); err != nil {
16
16
log .Error ("Unable to get Base Repo for pull request" )
17
- return false , ""
17
+ return false , "" , err
18
18
}
19
19
repo := pr .BaseRepo
20
20
21
21
signingKey := signingKey (repo .RepoPath ())
22
22
if signingKey == "" {
23
- return false , ""
23
+ return false , "" , & ErrWontSign { noKey }
24
24
}
25
25
rules := signingModeFromStrings (setting .Repository .Signing .Merges )
26
26
@@ -30,92 +30,101 @@ func (pr *PullRequest) SignMerge(u *User, tmpBasePath, baseCommit, headCommit st
30
30
for _ , rule := range rules {
31
31
switch rule {
32
32
case never :
33
- return false , ""
33
+ return false , "" , & ErrWontSign { never }
34
34
case always :
35
35
break
36
36
case pubkey :
37
37
keys , err := ListGPGKeys (u .ID )
38
- if err != nil || len (keys ) == 0 {
39
- return false , ""
38
+ if err != nil {
39
+ return false , "" , err
40
+ }
41
+ if len (keys ) == 0 {
42
+ return false , "" , & ErrWontSign {pubkey }
40
43
}
41
44
case twofa :
42
- twofa , err := GetTwoFactorByUID (u .ID )
43
- if err != nil || twofa == nil {
44
- return false , ""
45
+ twofaModel , err := GetTwoFactorByUID (u .ID )
46
+ if err != nil {
47
+ return false , "" , err
48
+ }
49
+ if twofaModel == nil {
50
+ return false , "" , & ErrWontSign {twofa }
45
51
}
46
52
case approved :
47
53
protectedBranch , err := GetProtectedBranchBy (repo .ID , pr .BaseBranch )
48
- if err != nil || protectedBranch == nil {
49
- return false , ""
54
+ if err != nil {
55
+ return false , "" , err
56
+ }
57
+ if protectedBranch == nil {
58
+ return false , "" , & ErrWontSign {approved }
50
59
}
51
60
if protectedBranch .GetGrantedApprovalsCount (pr ) < 1 {
52
- return false , ""
61
+ return false , "" , & ErrWontSign { approved }
53
62
}
54
63
case baseSigned :
55
64
if gitRepo == nil {
56
65
gitRepo , err = git .OpenRepository (tmpBasePath )
57
66
if err != nil {
58
- return false , ""
67
+ return false , "" , err
59
68
}
60
69
defer gitRepo .Close ()
61
70
}
62
71
commit , err := gitRepo .GetCommit (baseCommit )
63
72
if err != nil {
64
- return false , ""
73
+ return false , "" , err
65
74
}
66
75
verification := ParseCommitWithSignature (commit )
67
76
if ! verification .Verified {
68
- return false , ""
77
+ return false , "" , & ErrWontSign { baseSigned }
69
78
}
70
79
case headSigned :
71
80
if gitRepo == nil {
72
81
gitRepo , err = git .OpenRepository (tmpBasePath )
73
82
if err != nil {
74
- return false , ""
83
+ return false , "" , err
75
84
}
76
85
defer gitRepo .Close ()
77
86
}
78
87
commit , err := gitRepo .GetCommit (headCommit )
79
88
if err != nil {
80
- return false , ""
89
+ return false , "" , err
81
90
}
82
91
verification := ParseCommitWithSignature (commit )
83
92
if ! verification .Verified {
84
- return false , ""
93
+ return false , "" , & ErrWontSign { headSigned }
85
94
}
86
95
case commitsSigned :
87
96
if gitRepo == nil {
88
97
gitRepo , err = git .OpenRepository (tmpBasePath )
89
98
if err != nil {
90
- return false , ""
99
+ return false , "" , err
91
100
}
92
101
defer gitRepo .Close ()
93
102
}
94
103
commit , err := gitRepo .GetCommit (headCommit )
95
104
if err != nil {
96
- return false , ""
105
+ return false , "" , err
97
106
}
98
107
verification := ParseCommitWithSignature (commit )
99
108
if ! verification .Verified {
100
- return false , ""
109
+ return false , "" , & ErrWontSign { commitsSigned }
101
110
}
102
111
// need to work out merge-base
103
112
mergeBaseCommit , _ , err := gitRepo .GetMergeBase ("" , baseCommit , headCommit )
104
113
if err != nil {
105
- return false , ""
114
+ return false , "" , err
106
115
}
107
116
commitList , err := commit .CommitsBeforeUntil (mergeBaseCommit )
108
117
if err != nil {
109
- return false , ""
118
+ return false , "" , err
110
119
}
111
120
for e := commitList .Front (); e != nil ; e = e .Next () {
112
121
commit = e .Value .(* git.Commit )
113
122
verification := ParseCommitWithSignature (commit )
114
123
if ! verification .Verified {
115
- return false , ""
124
+ return false , "" , & ErrWontSign { commitsSigned }
116
125
}
117
126
}
118
127
}
119
128
}
120
- return true , signingKey
129
+ return true , signingKey , nil
121
130
}
0 commit comments