From: Andrey Albershteyn <aalbersh@redhat.com>
To: linux-xfs@vger.kernel.org
Cc: "Darrick J. Wong" <djwong@kernel.org>,
Andrey Albershteyn <aalbersh@kernel.org>
Subject: [PATCH v4 04/10] Add git-contributors script to notify about merges
Date: Thu, 13 Feb 2025 21:14:26 +0100 [thread overview]
Message-ID: <20250213-update-release-v4-4-c06883a8bbd6@kernel.org> (raw)
In-Reply-To: <20250213-update-release-v4-0-c06883a8bbd6@kernel.org>
Add python script used to collect emails over all changes merged in
the next release.
CC: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Andrey Albershteyn <aalbersh@kernel.org>
---
tools/git-contributors.py | 101 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 101 insertions(+)
diff --git a/tools/git-contributors.py b/tools/git-contributors.py
new file mode 100755
index 0000000000000000000000000000000000000000..70ac8abb26c8ce65de336c5ae48abcfee39508b2
--- /dev/null
+++ b/tools/git-contributors.py
@@ -0,0 +1,101 @@
+#!/usr/bin/python3
+
+# List all contributors to a series of git commits.
+# Copyright(C) 2025 Oracle, All Rights Reserved.
+# Licensed under GPL 2.0 or later
+
+import re
+import subprocess
+import io
+import sys
+import argparse
+import email.utils
+
+DEBUG = False
+
+def backtick(args):
+ '''Generator function that yields lines of a program's stdout.'''
+ if DEBUG:
+ print(' '.join(args))
+ p = subprocess.Popen(args, stdout = subprocess.PIPE)
+ for line in io.TextIOWrapper(p.stdout, encoding="utf-8"):
+ yield line
+
+class find_developers(object):
+ def __init__(self):
+ tags = '%s|%s|%s|%s|%s|%s|%s|%s' % (
+ 'signed-off-by',
+ 'acked-by',
+ 'cc',
+ 'reviewed-by',
+ 'reported-by',
+ 'tested-by',
+ 'suggested-by',
+ 'reported-and-tested-by')
+ # some tag, a colon, a space, and everything after that
+ regex1 = r'^(%s):\s+(.+)$' % tags
+
+ self.r1 = re.compile(regex1, re.I)
+
+ def run(self, lines):
+ addr_list = []
+
+ for line in lines:
+ l = line.strip()
+
+ # emailutils can handle abominations like:
+ #
+ # Reviewed-by: Bogus J. Simpson <bogus@simpson.com>
+ # Reviewed-by: "Bogus J. Simpson" <bogus@simpson.com>
+ # Reviewed-by: bogus@simpson.com
+ # Cc: <stable@vger.kernel.org> # v6.9
+ # Tested-by: Moo Cow <foo@bar.com> # powerpc
+ m = self.r1.match(l)
+ if not m:
+ continue
+ (name, addr) = email.utils.parseaddr(m.expand(r'\g<2>'))
+
+ # This last split removes anything after a hash mark,
+ # because someone could have provided an improperly
+ # formatted email address:
+ #
+ # Cc: stable@vger.kernel.org # v6.19+
+ #
+ # emailutils doesn't seem to catch this, and I can't
+ # fully tell from RFC2822 that this isn't allowed. I
+ # think it is because dtext doesn't forbid spaces or
+ # hash marks.
+ addr_list.append(addr.split('#')[0])
+
+ return sorted(set(addr_list))
+
+def main():
+ global DEBUG
+
+ parser = argparse.ArgumentParser(description = "List email addresses of contributors to a series of git commits.")
+ parser.add_argument("revspec", nargs = '?', default = None, \
+ help = "git revisions to process.")
+ parser.add_argument("--separator", type = str, default = '\n', \
+ help = "Separate each email address with this string.")
+ parser.add_argument('--debug', action = 'store_true', default = False, \
+ help = argparse.SUPPRESS)
+ args = parser.parse_args()
+
+ if args.debug:
+ DEBUG = True
+
+ fd = find_developers()
+ if args.revspec:
+ # read git commits from repo
+ contributors = fd.run(backtick(['git', 'log', '--pretty=medium',
+ args.revspec]))
+ else:
+ # read patch from stdin
+ contributors = fd.run(sys.stdin.readlines())
+
+ print(args.separator.join(sorted(contributors)))
+ return 0
+
+if __name__ == '__main__':
+ sys.exit(main())
+
--
2.47.2
next prev parent reply other threads:[~2025-02-13 20:16 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-13 20:14 [PATCH v4 00/10] Update release.sh Andrey Albershteyn
2025-02-13 20:14 ` [PATCH v4 01/10] release.sh: add signing and fix outdated commands Andrey Albershteyn
2025-02-13 20:14 ` [PATCH v4 02/10] release.sh: add --kup to upload release tarball to kernel.org Andrey Albershteyn
2025-02-13 20:14 ` [PATCH v4 03/10] release.sh: update version files make commit optional Andrey Albershteyn
2025-02-13 20:14 ` Andrey Albershteyn [this message]
2025-02-13 20:14 ` [PATCH v4 05/10] git-contributors: better handling of hash mark/multiple emails Andrey Albershteyn
2025-02-13 21:47 ` Darrick J. Wong
2025-02-13 20:14 ` [PATCH v4 06/10] git-contributors: make revspec required and shebang fix Andrey Albershteyn
2025-02-13 21:45 ` Darrick J. Wong
2025-02-13 20:14 ` [PATCH v4 07/10] release.sh: generate ANNOUNCE email Andrey Albershteyn
2025-02-13 20:14 ` [PATCH v4 08/10] release.sh: add -f to generate for-next update email Andrey Albershteyn
2025-02-13 20:14 ` [PATCH v4 09/10] libxfs-apply: drop Cc: to stable release list Andrey Albershteyn
2025-02-13 21:45 ` Darrick J. Wong
2025-02-13 22:27 ` Andrey Albershteyn
2025-02-13 22:47 ` Darrick J. Wong
2025-02-13 20:14 ` [PATCH v4 10/10] gitignore: ignore a few newly generated files Andrey Albershteyn
2025-02-13 20:20 ` Darrick J. Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250213-update-release-v4-4-c06883a8bbd6@kernel.org \
--to=aalbersh@redhat.com \
--cc=aalbersh@kernel.org \
--cc=djwong@kernel.org \
--cc=linux-xfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.