This is an automated email from the ASF dual-hosted git repository.
dsmiley pushed a commit to branch branch_9_8
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/branch_9_8 by this push:
new 3f84cd62a11 New dev-tools/scripts/parseContributorsFromChanges.py
(#2424)
3f84cd62a11 is described below
commit 3f84cd62a117d889f8016541272d7d7643fa698e
Author: David Smiley <[email protected]>
AuthorDate: Wed Jan 8 17:02:23 2025 -0500
New dev-tools/scripts/parseContributorsFromChanges.py (#2424)
Parses a CHANGES.txt section passed in, in order to identify all
contributors.
Future: integrate with the release wizard, to include providing only the
versioned section of CHANGES.txt to the script.
(cherry picked from commit 35b27d3642797df345233b0c1f1a5cda9855b120)
---
dev-tools/scripts/parseContributorsFromChanges.py | 63 +++++++++++++++++++++++
1 file changed, 63 insertions(+)
diff --git a/dev-tools/scripts/parseContributorsFromChanges.py
b/dev-tools/scripts/parseContributorsFromChanges.py
new file mode 100644
index 00000000000..9ce1a5e19ae
--- /dev/null
+++ b/dev-tools/scripts/parseContributorsFromChanges.py
@@ -0,0 +1,63 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import sys
+import re
+from collections import defaultdict
+
+# Read data from standard input
+data = sys.stdin.read()
+
+# Replace all carriage return line feed (Windows) with line feed
+data = data.replace('\r\n', '\n')
+
+# Replace all carriage return (Mac OS before X) with line feed
+data = data.replace('\r', '\n')
+
+# Split data at blank lines
+paras = data.split('\n\n')
+
+# Initialize a default dictionary to store contributors and their counts
+contributors = defaultdict(int)
+
+# Regular expression to find the attribution in parentheses at the end of a
line
+pattern = re.compile(r"\(([^()]*)\)$")
+
+for para in paras:
+ # Normalize whitespace (replace all whitespace with a single space)
+ para = re.sub('\s+', ' ', para).strip()
+ #print(f'> {para}')
+
+ # Find all contributors in the line
+ match = pattern.search(para.strip())
+ if match:
+ attribution = match.group(1)
+ # might have a "via" committer; we only want the author here
+ attribution = attribution.split(" via ")[0] # keep left side
+ # Split the contributors by comma and strip whitespace
+ for contributor in attribution.split(','):
+ contributor = contributor.strip()
+ contributors[contributor] += 1
+
+del contributors['solrbot']
+
+sorted_contributors = sorted(contributors.items(), key=lambda item: item[1],
reverse=True)
+
+# Print the contributors and their counts
+for contributor, count in sorted_contributors:
+ print(f'{contributor}: {count}')
+
+print('\n\nThanks to all contributors!: ')
+print(', '.join([contributor for contributor, count in sorted_contributors]))
\ No newline at end of file