@@ -40,6 +40,9 @@ def getPullRequests(self):
40
40
retpr .append (newpr )
41
41
return retpr
42
42
43
+ def getPullRequest (self , number ):
44
+ return PullRequest (self , number )
45
+
43
46
def isContributor (self , username ):
44
47
if not self .contributors :
45
48
contributor_list = self .repository .iter_contributors ()
@@ -51,9 +54,12 @@ def isCollaborator(username):
51
54
self .collaborators [username ] = self .repository .is_collaborator (username )
52
55
return self .repository .is_collaborator (username )
53
56
57
+ def getConsensus (self ):
58
+ return Consensus (self .rules )
54
59
55
- class PullRequest :
56
60
61
+ class PullRequest :
62
+ labels = False
57
63
def __init__ (self , repository , number ):
58
64
self .repository = repository
59
65
self .number = number
@@ -84,7 +90,6 @@ def __init__(self, repository, number):
84
90
if username not in self .repository .rules ['whitelist' ]:
85
91
continue
86
92
87
-
88
93
if content == '+1' :
89
94
self .yes .append (user ['login' ])
90
95
elif content == '-1' :
@@ -107,13 +112,26 @@ def daysSinceLastCommit(self):
107
112
delta = commit_date - now
108
113
return delta .days
109
114
115
+ def daysSincePullOpened (self ):
116
+ now = datetime .datetime .now ()
117
+ delta = self .pr .created_at .replace (tzinfo = None ) - now
118
+ return delta .days
119
+
120
+ def daysSinceLastUpdate (self ):
121
+ daysOpen = self .daysSincePullOpened ()
122
+ daysSinceCommit = self .daysSinceLastCommit ()
123
+
124
+ if daysOpen < daysSinceCommit :
125
+ return daysOpen
126
+ return daysSinceCommit
127
+
110
128
def getIssue (self ):
111
129
return self .repository .repository .issue (self .number )
112
130
113
131
def validate (self ):
114
132
if self .repository .rules == False :
115
133
return False
116
- consenttest = Consensus ( self .repository .rules )
134
+ consenttest = self .repository .getConsensus ( )
117
135
return consenttest .validate (self )
118
136
119
137
def shouldClose (self ):
@@ -122,30 +140,66 @@ def shouldClose(self):
122
140
return True
123
141
return False
124
142
143
+ def close (self ):
144
+ self .pr .close ()
145
+ message = """
146
+ This Pull Request has been closed by [GitConsensus](https://github.com/tedivm/GitConsensus).
147
+
148
+ |||
149
+ | ------ | --- |
150
+ | Yes | %s |
151
+ | No | %s |
152
+ | Total | %s |
153
+
154
+ """ % (str (len (self .yes )), str (len (self .no )), str (len (self .users )))
155
+ self .addComment (message )
156
+
157
+
125
158
def vote_merge (self ):
126
- self .addLabels ([
127
- 'gc-merged' ,
128
- 'gc-voters %s' % (len (self .users ),),
129
- 'gc-yes %s' % (len (self .yes ),),
130
- 'gc-no %s' % (len (self .no ),),
131
- 'gc-age %s' % (self .daysSinceLastCommit (),)
132
- ])
159
+
133
160
self .pr .merge ('Consensus Merge' )
161
+ self .addLabels (['gc-merged' ])
162
+
163
+ if 'extra_labels' in self .repository .rules and self .repository .rules ['extra_labels' ]:
164
+ self .addLabels ([
165
+ 'gc-voters %s' % (len (self .users ),),
166
+ 'gc-yes %s' % (len (self .yes ),),
167
+ 'gc-no %s' % (len (self .no ),),
168
+ 'gc-age %s' % (self .daysSinceLastUpdate (),)
169
+ ])
170
+
171
+ message = """
172
+ This Pull Request has been merged by [GitConsensus](https://github.com/tedivm/GitConsensus).
173
+
174
+ |||
175
+ | ------ | --- |
176
+ | Yes | %s |
177
+ | No | %s |
178
+ | Total | %s |
179
+
180
+ """ % (str (len (self .yes )), str (len (self .no )), str (len (self .users )))
181
+ self .addComment (message )
182
+
134
183
135
184
def addLabels (self , labels ):
136
185
issue = self .getIssue ()
137
186
for label in labels :
138
187
issue .add_labels (label )
139
188
189
+ def addComment (self , comment_string ):
190
+ return self .getIssue ().create_comment (comment_string )
191
+
140
192
def getLabelList (self ):
141
- issue = self .getIssue ()
142
- return issue .labels
193
+ if not self .labels :
194
+ issue = self .getIssue ()
195
+ self .labels = [item .name for item in issue .labels ]
196
+ return self .labels
143
197
144
- def isBlocked (self , pr ):
198
+ def isBlocked (self ):
145
199
labels = [item .lower () for item in self .getLabelList ()]
146
200
if 'wip' in labels :
147
201
return True
148
- if 'dontmerge' :
202
+ if 'dontmerge' in labels :
149
203
return True
150
204
return False
151
205
@@ -180,14 +234,17 @@ def hasQuorum(self, pr):
180
234
181
235
def hasVotes (self , pr ):
182
236
if 'threshold' in self .rules :
183
- ratio = len (pr .yes ) / (len (pr .yes ) + len (pr .no ))
237
+ total = (len (pr .yes ) + len (pr .no ))
238
+ if total <= 0 :
239
+ return False
240
+ ratio = len (pr .yes ) / total
184
241
if ratio < self .rules ['threshold' ]:
185
242
return False
186
243
return True
187
244
188
245
def hasAged (self , pr ):
189
246
if 'mergedelay' in self .rules :
190
- days = pr .daysSinceLastCommit ()
191
- if days < self .rules ['mergdelay ' ]:
247
+ days = pr .daysSinceLastUpdate ()
248
+ if days < self .rules ['mergedelay ' ]:
192
249
return False
193
250
return True
0 commit comments