diff options
Diffstat (limited to 'src/documentation/content/xdocs/status.copy_module_from_bugzilla.py')
-rw-r--r-- | src/documentation/content/xdocs/status.copy_module_from_bugzilla.py | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/src/documentation/content/xdocs/status.copy_module_from_bugzilla.py b/src/documentation/content/xdocs/status.copy_module_from_bugzilla.py new file mode 100644 index 0000000000..b7bf8f979e --- /dev/null +++ b/src/documentation/content/xdocs/status.copy_module_from_bugzilla.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python3 +""" + ==================================================================== + 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. + ==================================================================== +""" + +"""This is a really crude throwaway script to get data out of Bugzilla and into status.xml +It'd be far better to have Forrest look this information up whenever the site is rebuilt. +Hopefully this is a one time effort +If a closed bug's component is changed in Bugzilla, this script could be used to keep the changelog in sync. + +requires Python 3.1+ +(Python 2.x doesn't do Unicode in CSVs nicely) +""" + +import csv, io +import sys +import requests + +def get_fixesbug_attr(line): + pieces = [x.strip() for x in line.split('"')] + bugs = pieces[pieces.index('fixes-bug=') + 1] + return bugs + +def get_bugzilla_bug_to_component(): + print("Fetching details of POI bugs, please wait...") + bugzilla_bug_to_component = {} + r = requests.get('https://bz.apache.org/bugzilla/buglist.cgi?bug_status=__all__&limit=0&no_redirect=1&product=POI&query_format=advanced&ctype=csv&human=1') + with io.StringIO(r.text) as f: + csvreader = csv.DictReader(f) + for row in csvreader: + bugzilla_bug_to_component[row['Bug ID']] = row['Component'] + return bugzilla_bug_to_component + + +def unique(seq): + seen = set() + for x in seq: + if x not in seen: + seen.add(x) + yield x + +def add_module_frombugzilla_attr(line): + """Add module_frombugzilla="XSSF" to <action ...> tag + + line is a string, containing the <action> opening tag + """ + global bugzilla_bug_to_component + assert 'module=' not in line, \ + "Invalid action line, should not already contain module: %s" % line + + bugs = [x.strip() for x in get_fixesbug_attr(line).split(',')] + modules = filter(bool, [bugzilla_bug_to_component.get(bug) for bug in bugs]) + module_frombugzilla = ','.join(unique(modules)) + line_with_module_frombugzilla = line.replace('>', ' module="{}">'.format(module_frombugzilla), 1) + return line_with_module_frombugzilla + +def add_module_attribute(inputfile, outputfile): + print("Generating %s from %s and Bugzilla details"%(outputfile,inputfile)) + with open(inputfile, 'r') as infile, open(outputfile, 'w') as outfile: + for line in infile: + if '<action ' in line and ' fixes-bug=' in line and ' module=' not in line: + # append "module="XXXX" at end of <action> tag + outfile.write(add_module_frombugzilla_attr(line)) + else: + outfile.write(line) + + +if __name__ == '__main__': + if len(sys.argv) != 3: + print('Usage: python changelog.py inputfile outputfile') + else: + bugzilla_bug_to_component = get_bugzilla_bug_to_component() + add_module_attribute(sys.argv[1], sys.argv[2]) + print("Generation complete!") |