Module: tools Branch: master Commit: 538a9f53d13c1ad1f503a71f9490c4a9d0e4d33d URL: https://source.winehq.org/git/tools.git/?a=commit;h=538a9f53d13c1ad1f503a71f...
Author: Jeremy White jwhite@codeweavers.com Date: Thu Apr 28 07:15:36 2022 -0500
Refactor to create a function that handles MRs.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
gitlab/gitlab-to-mail/gitlabtomail.py | 131 ++++++++++++++++++---------------- 1 file changed, 69 insertions(+), 62 deletions(-)
diff --git a/gitlab/gitlab-to-mail/gitlabtomail.py b/gitlab/gitlab-to-mail/gitlabtomail.py index 19eafa3..c46cc98 100755 --- a/gitlab/gitlab-to-mail/gitlabtomail.py +++ b/gitlab/gitlab-to-mail/gitlabtomail.py @@ -536,7 +536,75 @@ def create_cover(mr_id, mr_iid, mr_version, versions, nr_patches, author_name, t return mail
+def process_mr(mr, update_db): + iid = mr['iid'] + log(f"MR{iid} updated - processing") + + if mr['merged_at']: + log(f"MR{iid} merged - skipping") + return + + # We jump through some hoops because the fetch_mr_patches + # entry point on GitLab does not allow one + # to specify a particular version. You can only get + # a nice set of patches for the most current version. + # Out of an abundance of caution, we make sure that the + # last sha1 matches a known version and then we use that. + updated_at = parse_gitlab_datetime(mr['updated_at']) + patches = split_mbox_into_messages(fetch_mr_patches(iid)) + sha1s = [get_patch_sha1(patch) for patch in patches] + versions = fetch_mr_versions(iid) + version = get_mr_version(versions, sha1s[-1]) + if not version: + # We can get an unusual case where we do not have a patch + # to go with the start of the versions chain. Andrew + # was able to do this in wine-demo MR 13, by somehow + # having a commit message only commit. Arek believes that + # this is not a sensible MR, and we should flag it as such. + log(f"Error: MR {iid} patch {sha1s[-1]} not in versions") + error = ("This merge request appears to be malformed.\n" + "This can be caused by a commit with no content.\n" + "Please check your merge request for errors.") + + if not error_in_notes(iid, error): + post_note(iid, error) + if update_db: + db.set_last_mr_updated_at(updated_at) + return + + date = get_mr_version_date(versions, version) + if db.was_mr_version_processed(iid, version): + log(f"MR{iid}v{version} - skipping, already processed") + return + + nr_patches = len(patches) + author = f"{mr['author']['name']} (@{mr['author']['username']})" + cover = create_cover(mr['id'], iid, version, versions, nr_patches, author, mr['title'], mr['description']) + if cover is None: + log(f"MR{iid}v{version} - skipping, has no changes") + return + + fixup_date(cover, date) + create_headers_from_mr(cover, mr) + send_email(cover) + if nr_patches <= settings.MAXIMUM_PATCHES: + for nr, mail in enumerate(patches): + fixup_patch(mail, iid, version, nr+1) + date = date + datetime.timedelta(seconds=1) + fixup_date(mail, date) + fixup_version(mail, version) + create_headers_from_mr(mail, mr) + mail['References'] = create_reference(mr['id'], gitlab_hostname) + log(f"MR{iid}v{version} - sent email") + send_email(mail) + if update_db: + db.mark_mr_version_processed(iid, version) + db.set_last_mr_updated_at(updated_at) + + def main(): + + # Process any new merge requests last_mr_updated_at = db.get_last_mr_updated_at() if not last_mr_updated_at: last_mr_updated_at = datetime.datetime.now() - datetime.timedelta(days=settings.INITIAL_BACKLOG_DAYS) @@ -544,68 +612,7 @@ def main(): db.set_last_mr_updated_at(last_mr_updated_at)
for mr in fetch_recently_updated_mrs(last_mr_updated_at): - iid = mr['iid'] - - log(f"MR{iid} updated - processing") - if mr['merged_at']: - log(f"MR{iid} merged - skipping") - continue - - - # We jump through some hoops because the fetch_mr_patches - # entry point on GitLab does not allow one - # to specify a particular version. You can only get - # a nice set of patches for the most current version. - # Out of an abundance of caution, we make sure that the - # last sha1 matches a known version and then we use that. - updated_at = parse_gitlab_datetime(mr['updated_at']) - patches = split_mbox_into_messages(fetch_mr_patches(iid)) - sha1s = [get_patch_sha1(patch) for patch in patches] - versions = fetch_mr_versions(iid) - version = get_mr_version(versions, sha1s[-1]) - if not version: - # We can get an unusual case where we do not have a patch - # to go with the start of the versions chain. Andrew - # was able to do this in wine-demo MR 13, by somehow - # having a commit message only commit. Arek believes that - # this is not a sensible MR, and we should flag it as such. - log(f"Error: MR {iid} patch {sha1s[-1]} not in versions") - error = ("This merge request appears to be malformed.\n" - "This can be caused by a commit with no content.\n" - "Please check your merge request for errors.") - - if not error_in_notes(iid, error): - post_note(iid, error) - if not settings.READ_ONLY: - db.set_last_mr_updated_at(updated_at) - continue - - date = get_mr_version_date(versions, version) - if not db.was_mr_version_processed(iid, version): - nr_patches = len(patches) - author = f"{mr['author']['name']} (@{mr['author']['username']})" - cover = create_cover(mr['id'], iid, version, versions, nr_patches, author, mr['title'], mr['description']) - if cover is None: - log(f"MR{iid}v{version} - skipping, has no changes") - continue - fixup_date(cover, date) - create_headers_from_mr(cover, mr) - send_email(cover) - if nr_patches <= settings.MAXIMUM_PATCHES: - for nr, mail in enumerate(patches): - fixup_patch(mail, iid, version, nr+1) - date = date + datetime.timedelta(seconds=1) - fixup_date(mail, date) - fixup_version(mail, version) - create_headers_from_mr(mail, mr) - mail['References'] = create_reference(mr['id'], gitlab_hostname) - log(f"MR{iid}v{version} - sent email") - send_email(mail) - if not settings.READ_ONLY: - db.mark_mr_version_processed(iid, version) - db.set_last_mr_updated_at(updated_at) - else: - log(f"MR{iid}v{version} - skipping, already processed") + process_mr(mr, not settings.READ_ONLY)
date = db.get_last_event_date() if not date: