summaryrefslogtreecommitdiffstats
path: root/release-notes/rtems_trac.py
diff options
context:
space:
mode:
Diffstat (limited to 'release-notes/rtems_trac.py')
-rw-r--r--release-notes/rtems_trac.py96
1 files changed, 96 insertions, 0 deletions
diff --git a/release-notes/rtems_trac.py b/release-notes/rtems_trac.py
new file mode 100644
index 0000000..4d233f9
--- /dev/null
+++ b/release-notes/rtems_trac.py
@@ -0,0 +1,96 @@
+#
+# RTEMS Tools Project (http://www.rtems.org/)
+# Copyright 2018 Danxue Huang (danxue.huang@gmail.com)
+# Copyright 2022 Chris Johns (chris@contemporary.software)
+# All rights reserved.
+#
+# This file is part of the RTEMS Tools package in 'rtems-tools'.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following disclaimer in the documentation
+# and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+import codecs
+import csv
+import time
+
+trac_base = 'https://devel.rtems.org'
+ticket_base = trac_base + '/ticket'
+format_rss = 'format=rss'
+format_csv = 'format=csv'
+query = 'query'
+all_cols = [
+ 'id', 'summary', 'milestone', 'owner', 'type', 'status', 'priority',
+ 'component', 'version', 'severity', 'resolution', 'time', 'changetime',
+ 'blockedby', 'blocking', 'reporter', 'keywords', 'cc'
+]
+aggregate_cols = [
+ 'owner', 'type', 'priority', 'component', 'severity', 'reporter', 'version'
+]
+
+
+def gen_ticket_url(ticket_id):
+ return ticket_base + '/' + str(ticket_id)
+
+
+def gen_ticket_rss_url(ticket_id):
+ return gen_ticket_url(ticket_id) + '?' + format_rss
+
+
+def gen_ticket_csv_url(ticket_id):
+ return gen_ticket_url(ticket_id) + '?' + format_csv
+
+
+def gen_trac_query_csv_url(cols, **filters):
+ return gen_trac_query_url(cols, **filters) + '&' + format_csv
+
+
+def gen_attachment_link(attachment_name, ticket_number):
+ return '/'.join([
+ trac_base, 'attachment', 'ticket',
+ str(ticket_number), attachment_name
+ ])
+
+
+def gen_trac_query_url(cols, **filters):
+ constraints = []
+ for col in cols:
+ constraints.append('col={c}'.format(c=col))
+ for key, value in filters.items():
+ constraints.append('{k}={v}'.format(k=key, v=value))
+ constraints_str = '&'.join(constraints)
+ return trac_base + '/' + query + '?' + constraints_str
+
+
+def open_ticket(ticket_id, cache, part='csv'):
+ if part == 'csv':
+ url = gen_ticket_csv_url(ticket_id)
+ elif part == 'rss':
+ url = gen_ticket_rss_url(ticket_id)
+ else:
+ raise RuntimeError('unknown part of ticket: ' + part)
+ return cache.open_page(url)
+
+
+def parse_csv_as_dict_iter(url, cache):
+ csv_response = cache.open_page(url)
+ return csv.DictReader(codecs.iterdecode(csv_response, 'utf-8-sig'))