Jeremy White : Do not send MR changes on apparent maintainer.
Alexandre Julliard
julliard at winehq.org
Thu Apr 28 16:02:18 CDT 2022
Module: tools
Branch: master
Commit: 894a49d2cb0069a98b962e5136a5d86d17230340
URL: https://source.winehq.org/git/tools.git/?a=commit;h=894a49d2cb0069a98b962e5136a5d86d17230340
Author: Jeremy White <jwhite at codeweavers.com>
Date: Thu Apr 28 10:13:46 2022 -0500
Do not send MR changes on apparent maintainer.
If we think that it was a maintainer and they only changed meta
information, then do not send a new copy of the MR.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
gitlab/gitlab-to-mail/gitlabtomail.py | 41 +++++++++++++++++++++++++++--------
1 file changed, 32 insertions(+), 9 deletions(-)
diff --git a/gitlab/gitlab-to-mail/gitlabtomail.py b/gitlab/gitlab-to-mail/gitlabtomail.py
index 3708679..a2f7079 100755
--- a/gitlab/gitlab-to-mail/gitlabtomail.py
+++ b/gitlab/gitlab-to-mail/gitlabtomail.py
@@ -467,7 +467,14 @@ def fixup_version(mail, version):
mail['Subject'] = re.sub(r'PATCH ([0-9])', f"PATCH v{version} \\1", subject)
-def commits_changed(new, old):
+def done_by_maintainer(author, commits):
+ for commit in commits:
+ if commit['committer_name'] != author:
+ return True
+ return False
+
+
+def commits_meta_changed(new, old):
if len(old) != len(new):
return True
for i in range(0, len(old)):
@@ -477,7 +484,7 @@ def commits_changed(new, old):
return False
-def get_changes(iid, version, versionid, old_versionid):
+def get_changes(iid, version, versionid, old_versionid, mr):
current_changes = fetch_mr_version(iid, versionid)
old_changes = fetch_mr_version(iid, old_versionid)
old_commits = []
@@ -487,12 +494,25 @@ def get_changes(iid, version, versionid, old_versionid):
version_string = f" v{version}: "
vstring_len = len(version_string)
+ # After a merge, the source branch is deleted, which will short
+ # circuit this logic. We cannot do any analysis on an MR in
+ # that condition.
+ if len(old_changes['diffs']) == 0:
+ return None
+
# We don't want to send an email notice on a rebase or other innocuous change
+ # But this gets complicated. There is a strong sense that if an
+ # author makes a change to their commit messages or description,
+ # that warrants another email. But if a maintainer adds a signed off
+ # or makes a similar small change at merge time, we *don't* want that.
+ # So we try to figure out if this is a maintainer merge, and if so
+ # we want to more aggressively 'quiet' this logic. So basically,
+ # if the messages are not changed, or only changed by a maintainer, let's be quiet.
if 'commits' in current_changes and 'commits' in old_changes:
- # If the commit messages / composition has not changed and
- if not commits_changed(current_changes['commits'], old_changes['commits']):
+ changed = commits_meta_changed(current_changes['commits'], old_changes['commits'])
+ maintainer = done_by_maintainer(mr['author']['name'], current_changes['commits'])
+ if maintainer or not changed:
if 'diffs' in current_changes and 'diffs' in old_changes:
- # The diff is unchanged, then...
if current_changes['diffs'] == old_changes['diffs']:
return None
@@ -510,7 +530,11 @@ def get_changes(iid, version, versionid, old_versionid):
return "\n" + version_string + changes
-def create_cover(mr_id, mr_iid, mr_version, versions, nr_patches, author_name, title, description):
+def create_cover(mr_id, mr_iid, mr_version, versions, nr_patches, mr):
+ author_name = f"{mr['author']['name']} (@{mr['author']['username']})"
+ title = mr['title']
+ description = mr['description']
+
mail = email.message.Message()
mail['From'] = email.utils.formataddr((author_name, settings.BRIDGE_FROM_EMAIL))
vstring = ""
@@ -523,7 +547,7 @@ def create_cover(mr_id, mr_iid, mr_version, versions, nr_patches, author_name, t
# versions array is ordered, which Arek seems to not have found
vindex = mr_version * -1
oindex = (mr_version - 1) * -1
- changes = get_changes(mr_iid, mr_version, versions[vindex]['id'], versions[oindex]['id'])
+ changes = get_changes(mr_iid, mr_version, versions[vindex]['id'], versions[oindex]['id'], mr)
if changes is None:
return None
@@ -583,8 +607,7 @@ def process_mr(mr, update_db):
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'])
+ cover = create_cover(mr['id'], iid, version, versions, nr_patches, mr)
if cover is None:
log(f"MR{iid}v{version} - skipping, has no changes")
return
More information about the wine-cvs
mailing list