On Mon, Jan 20, 2025 at 01:14:18PM +0100, Andrey Albershteyn wrote: > On 2025-01-16 14:41:48, Darrick J. Wong wrote: > > On Fri, Jan 10, 2025 at 12:05:09PM +0100, Andrey Albershteyn wrote: > > > Signed-off-by: Andrey Albershteyn <aalbersh@xxxxxxxxxx> > > > --- > > > release.sh | 46 +++++++++++++++++++++++++++++++++++++++++++++- > > > 1 file changed, 45 insertions(+), 1 deletion(-) > > > > > > diff --git a/release.sh b/release.sh > > > index c34efcbcdfcaf50a08853e65542e8f16214cfb4e..40ecfaff66c3e9f8d794e7543750bd9579b7c6c9 100755 > > > --- a/release.sh > > > +++ b/release.sh > > > @@ -13,11 +13,13 @@ set -e > > > > > > KUP=0 > > > COMMIT=1 > > > +LAST_HEAD="" > > > > > > help() { > > > echo "$(basename) - create xfsprogs release" > > > printf "\t[--kup|-k] upload final tarball with KUP\n" > > > printf "\t[--no-commit|-n] don't create release commit\n" > > > + printf "\t[--last-head|-h] commit of the last release\n" > > > } > > > > > > update_version() { > > > @@ -48,6 +50,10 @@ while [ $# -gt 0 ]; do > > > --no-commit|-n) > > > COMMIT=0 > > > ;; > > > + --last-head|-h) > > > + LAST_HEAD=$2 > > > + shift > > > + ;; > > > --help|-h) > > > help > > > exit 0 > > > @@ -122,7 +128,45 @@ if [ $KUP -eq 1 ]; then > > > pub/linux/utils/fs/xfs/xfsprogs/xfsprogs-${version}.tar.gz > > > fi; > > > > > > +mail_file=$(mktemp) > > > +subject="" > > > +if [ -n "$LAST_HEAD" ]; then > > > + subject="[ANNOUNCE] xfsprogs $(git describe --abbrev=0) released" > > > + > > > + cat << EOF > $mail_file > > > +Hi folks, > > > + > > > +The xfsprogs repository at: > > > + > > > + git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev.git > > > + > > > +has just been updated. > > > + > > > +Patches often get missed, so if your outstanding patches are properly reviewed > > > +on the list and not included in this update, please let me know. > > > + > > > +The for-next branch has also been updated to match the state of master. > > > + > > > +The new head of the master branch is commit: > > > + > > > +$(git log --oneline --format="%H" -1) > > > + > > > +New commits: > > > + > > > +$(git shortlog --format="[%h] %s" $LAST_HEAD..HEAD) > > > + > > > +Code Diffstat: > > > + > > > +$(git diff --stat --summary -C -M $LAST_HEAD..HEAD) > > > +EOF > > > +fi > > > > Looks pretty similar to my git-announce tool. ;) > > > > > + > > > echo "" > > > -echo "Done. Please remember to push out tags and the branch." > > > +echo "Done." > > > +echo "Please remember to push out tags and the branch." > > > printf "\tgit push origin v${version}\n" > > > printf "\tgit push origin master\n" > > > +if [ -n "$LAST_HEAD" ]; then > > > + echo "Command to send ANNOUNCE email" > > > + printf "\tneomutt linux-xfs@xxxxxxxxxxxxxxx -s \"$subject\" -i $mail_file\n" > > > > Note: if you put the headers in $mail_file, like this: > > > > cat << EOF > $mail_file > > To: linux-xfs@xxxxxxxxxxxxxxx > > Subject: $subject > > > > Hi folks, > > ... > > ENDL > > > > then you can do: > > > > neomutt -H $mail_file > > Neat, will update this > > > > > to edit the message and send it out. I also wonder if you'd like a copy > > of my git-contributors script that spits out a list of emails to cc > > based on the git diff? > > sure, is it small enough to be a part of this file? Er.... maybe part of the patch, but it's a python script: --D #!/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@xxxxxxxxxxx> # Reviewed-by: "Bogus J. Simpson" <bogus@xxxxxxxxxxx> # Reviewed-by: bogus@xxxxxxxxxxx # Cc: <stable@xxxxxxxxxxxxxxx> # v6.9 # Tested-by: Moo Cow <foo@xxxxxxx> # 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@xxxxxxxxxxxxxxx # 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(): 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("--delimiter", type = str, default = '\n', \ help = "Separate each email address with this string.") args = parser.parse_args() 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.delimiter.join(sorted(contributors))) return 0 if __name__ == '__main__': sys.exit(main())