mirror of
https://gitlab.wikimedia.org/ladsgroup/Phabricator-maintenance-bot
synced 2024-11-08 13:12:38 +01:00
patchforreview_remover.py: Handle bot comments for Gitlab status updates
Handle change status report for both Gerrit and Gitlab. Bug: T325297
This commit is contained in:
parent
10c6aace45
commit
ae3f603e50
1 changed files with 56 additions and 25 deletions
|
@ -19,6 +19,37 @@ class Checker():
|
||||||
phid = self.client.lookupPhid(t_id)
|
phid = self.client.lookupPhid(t_id)
|
||||||
return self.phid_check(phid)
|
return self.phid_check(phid)
|
||||||
|
|
||||||
|
def get_change_url(self, raw_comment):
|
||||||
|
m = re.search(r'https://gerrit(?:-test|)\.wikimedia\.org/r/\d+', raw_comment)
|
||||||
|
if m:
|
||||||
|
return m[0]
|
||||||
|
m = re.search(r'https://gitlab\.wikimedia\.org/repos/.*/-/merge_requests/\d+', raw_comment)
|
||||||
|
if m:
|
||||||
|
return m[0]
|
||||||
|
return None
|
||||||
|
|
||||||
|
def get_operation_type(self, raw_comment, url):
|
||||||
|
"""
|
||||||
|
If the operation type can be determined from raw_comment, return
|
||||||
|
it. It will be the string "open" (first patchset created or merge
|
||||||
|
request created) or "close" (merge or abandon)
|
||||||
|
"""
|
||||||
|
# Gitlab style
|
||||||
|
if re.search(r"opened " + re.escape(url), raw_comment):
|
||||||
|
return "open"
|
||||||
|
|
||||||
|
if re.search(r"(merged|closed) " + re.escape(url), raw_comment):
|
||||||
|
return "close"
|
||||||
|
|
||||||
|
# Gerrit style
|
||||||
|
if re.search(r"Change \d+ had a related patch set uploaded", raw_comment):
|
||||||
|
return "open"
|
||||||
|
|
||||||
|
if re.search(r'Change \d+ \*\*(?:merged|abandoned)\*\* by ', raw_comment):
|
||||||
|
return "close"
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
def phid_check(self, phid) -> bool:
|
def phid_check(self, phid) -> bool:
|
||||||
"""
|
"""
|
||||||
Returns true if the Patch-For-Review project should be removed from the Phabricator
|
Returns true if the Patch-For-Review project should be removed from the Phabricator
|
||||||
|
@ -50,15 +81,14 @@ class Checker():
|
||||||
if len(case['comments']) != 1:
|
if len(case['comments']) != 1:
|
||||||
return False
|
return False
|
||||||
raw_comment = case['comments'][0]['content']['raw']
|
raw_comment = case['comments'][0]['content']['raw']
|
||||||
gerrit_patch_id = re.findall(
|
|
||||||
r'https://gerrit(?:-test|)\.wikimedia\.org/r/(\d+)(?:$|\]\])', raw_comment)[0]
|
|
||||||
merged = re.findall(
|
|
||||||
r'Change \d+ \*\*(?:merged|abandoned)\*\* by ',
|
|
||||||
raw_comment)
|
|
||||||
|
|
||||||
# Append True or False depending on whether the action was to
|
change_url = self.get_change_url(raw_comment)
|
||||||
# open a patch (True) or merge a patch (False)
|
if change_url:
|
||||||
gerrit_patch_status[gerrit_patch_id].append(not(bool(merged)))
|
op = self.get_operation_type(raw_comment, change_url)
|
||||||
|
|
||||||
|
# Append True or False depending on whether the action was to
|
||||||
|
# open/reopen a change (True) or merge a change (False)
|
||||||
|
gerrit_patch_status[change_url].append(op in ["open", "reopen"])
|
||||||
|
|
||||||
for patch in gerrit_patch_status:
|
for patch in gerrit_patch_status:
|
||||||
# The normal sequence of GerritBot transactions for a Gerrit change is "Change
|
# The normal sequence of GerritBot transactions for a Gerrit change is "Change
|
||||||
|
@ -67,25 +97,26 @@ class Checker():
|
||||||
# by whoever" (indicated by False in gerrit_patch_status). The transactions
|
# by whoever" (indicated by False in gerrit_patch_status). The transactions
|
||||||
# are returned in reverse order so the opened/merged pattern will appear as
|
# are returned in reverse order so the opened/merged pattern will appear as
|
||||||
# the reverse of [True, False], which is [False, True].
|
# the reverse of [True, False], which is [False, True].
|
||||||
|
# FIXME: This logic can't handle a open/close/reopen/merge situation.
|
||||||
if gerrit_patch_status[patch] != [False, True]:
|
if gerrit_patch_status[patch] != [False, True]:
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
client = Client.newFromCreds()
|
||||||
|
|
||||||
client = Client.newFromCreds()
|
gerrit_bot_phid = 'PHID-USER-idceizaw6elwiwm5xshb'
|
||||||
|
project_patch_for_review_phid = 'PHID-PROJ-onnxucoedheq3jevknyr'
|
||||||
gerrit_bot_phid = 'PHID-USER-idceizaw6elwiwm5xshb'
|
checker = Checker(
|
||||||
project_patch_for_review_phid = 'PHID-PROJ-onnxucoedheq3jevknyr'
|
gerrit_bot_phid,
|
||||||
checker = Checker(
|
project_patch_for_review_phid,
|
||||||
gerrit_bot_phid,
|
client)
|
||||||
project_patch_for_review_phid,
|
gen = client.getTasksWithProject(project_patch_for_review_phid)
|
||||||
client)
|
for phid in gen:
|
||||||
gen = client.getTasksWithProject(project_patch_for_review_phid)
|
if checker.phid_check(phid):
|
||||||
for phid in gen:
|
print(client.taskDetails(phid)['id'])
|
||||||
if checker.phid_check(phid):
|
try:
|
||||||
print(client.taskDetails(phid)['id'])
|
client.removeProjectByPhid(project_patch_for_review_phid, phid)
|
||||||
try:
|
except BaseException:
|
||||||
client.removeProjectByPhid(project_patch_for_review_phid, phid)
|
continue
|
||||||
except BaseException:
|
time.sleep(10)
|
||||||
continue
|
|
||||||
time.sleep(10)
|
|
||||||
|
|
Loading…
Reference in a new issue