From af9a2b98033918f0796c9838517771302b89ff62 Mon Sep 17 00:00:00 2001 From: Michael McCandless Date: Mon, 22 Jul 2024 11:37:34 -0400 Subject: [PATCH] Add simple tool to diff entries in lucene's CHANGES.txt that should be identical (#12860) * add simple tool to diff entries in lucene's CHANGES.txt that should be identical * remove temporary debugging code --- dev-tools/scripts/diff_lucene_changes.py | 78 ++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 dev-tools/scripts/diff_lucene_changes.py diff --git a/dev-tools/scripts/diff_lucene_changes.py b/dev-tools/scripts/diff_lucene_changes.py new file mode 100644 index 00000000000..91b7c84994d --- /dev/null +++ b/dev-tools/scripts/diff_lucene_changes.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# 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 os +import re +import subprocess +import sys +import tempfile +import urllib.request + +''' +A simple tool to see diffs between main's version of CHANGES.txt entries for +a given release vs the stable branch's version. It's best to keep these 1) +identical and 2) matching what changes were actually backported to be honest +to users and avoid future annoying conflicts on backport. +''' + +# e.g. python3 -u diff_lucene_changes.py branch_9_9 main 9.9.0 + +# + +def get_changes_url(branch_name): + if os.path.isdir(branch_name): + url = f'file://{branch_name}/lucene/CHANGES.txt' + else: + url = f'https://raw.githubusercontent.com/apache/lucene/{branch_name}/lucene/CHANGES.txt' + print(f'NOTE: resolving {branch_name} --> {url}') + return url + +def extract_release_section(changes_txt, release_name): + return re.search(f'=======+ Lucene {re.escape(release_name)} =======+(.*?)=======+ Lucene .*? =======+$', + changes_txt.decode('utf-8'), re.MULTILINE | re.DOTALL).group(1).encode('utf-8') + +def main(): + if len(sys.argv) < 3 or len(sys.argv) > 5: + print('\nUsage: python3 -u dev-tools/scripts/diff_lucene_changes.py [diff-commandline-extras]\n') + print(' e.g.: python3 -u dev-tools/scripts/diff_lucene_changes.py branch_9_9 /l/trunk 9.9.0 "-w"\n') + sys.exit(1) + + branch1 = sys.argv[1] + branch2 = sys.argv[2] + release_name = sys.argv[3] + + if len(sys.argv) > 4: + diff_cl_extras = [sys.argv[4]] + else: + diff_cl_extras = [] + + branch1_changes = extract_release_section(urllib.request.urlopen(get_changes_url(branch1)).read(), + release_name) + branch2_changes = extract_release_section(urllib.request.urlopen(get_changes_url(branch2)).read(), + release_name) + + with tempfile.NamedTemporaryFile() as f1, tempfile.NamedTemporaryFile() as f2: + f1.write(branch1_changes) + f2.write(branch2_changes) + + command = ['diff'] + diff_cl_extras + [f1.name, f2.name] + + # diff returns non-zero exit status when there are diffs, so don't pass check=True + print(subprocess.run(command, check=False, capture_output=True).stdout.decode('utf-8')) + +if __name__ == '__main__': + main()