aboutsummaryrefslogtreecommitdiffstats
path: root/src/documentation/content/xdocs/status.copy_module_from_bugzilla.py
diff options
context:
space:
mode:
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.py89
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!")