From ca9884b44e9a8b931da8f417a214ac2949177e4b Mon Sep 17 00:00:00 2001 From: Doug Hellmann Date: Fri, 4 Aug 2017 09:58:15 -0400 Subject: [PATCH] add watched queries to list-changes Add a data file for defining gerrit queries so we can track incomplete work for known initiatives when reviewing releases. Include a query for patches owned by the proposal bot (to watch for requirements updates and other automated changes) and another to watch for documentation file updates (to let us monitor the doc migration initiative for pike). Change-Id: I12c59d83267bf80773876e81b3470bfe3062ad27 Signed-off-by: Doug Hellmann --- openstack_releases/cmds/list_changes.py | 40 +++++++++++++++++++++++++ watched_queries.yml | 36 ++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 watched_queries.yml diff --git a/openstack_releases/cmds/list_changes.py b/openstack_releases/cmds/list_changes.py index cb26c0f762..60785ac950 100644 --- a/openstack_releases/cmds/list_changes.py +++ b/openstack_releases/cmds/list_changes.py @@ -20,6 +20,7 @@ from __future__ import print_function import argparse import atexit import glob +import json import os import os.path import shutil @@ -27,6 +28,8 @@ import subprocess import sys import tempfile +import requests + from openstack_releases import defaults from openstack_releases import gitutils from openstack_releases import governance @@ -106,6 +109,41 @@ def git_diff(workdir, repo, git_range, file_pattern): print() +def gerrit_query(*query): + url = 'https://review.openstack.org/changes/?q=' + '+'.join(query) + response = requests.get(url) + if response.content[:4] == b")]}'": + content = response.content[5:].decode('utf-8') + return json.loads(content) + else: + print('could not parse response from %s' % url) + print(repr(content)) + raise RuntimeError('failed to parse gerrit response') + + +def list_gerrit_patches(title, template, query): + header('{}: "{}"'.format(title, query)) + reviews = gerrit_query(query) + for r in reviews: + print(template.format(**r)) + print('{} results\n'.format(len(reviews))) + + +def show_watched_queries(branch, repo): + with open('watched_queries.yml', 'r', encoding='utf-8') as f: + watched_queries = yamlutils.loads(f.read()) + template = watched_queries['template'] + for q in watched_queries['queries']: + list_gerrit_patches( + q['title'], + q.get('template', template), + q['query'].format( + branch=branch, + project=repo, + ), + ) + + def main(): if not sys.stdout.encoding: # Wrap sys.stdout with a writer that knows how to handle @@ -342,6 +380,8 @@ def main(): '%s..%s' % (requested_sha, head_sha), extra_args=['--format=%h %ci %s']) + show_watched_queries(branch, project['repo']) + # Show any requirements changes in the upcoming release. # Include setup.cfg, in case the project uses "extras". if start_range: diff --git a/watched_queries.yml b/watched_queries.yml new file mode 100644 index 0000000000..aa9a4466bc --- /dev/null +++ b/watched_queries.yml @@ -0,0 +1,36 @@ +--- +# The template string shows how to format the info for each review. +# A review contains: +# {'_number': 490743, +# 'mergeable': True, +# 'subject': 'Updated from global requirements', +# 'project': 'openstack/congress', +# 'owner': {'_account_id': 11131}, +# 'branch': 'master', +# 'insertions': 1, +# 'created': '2017-08-04 04:31:47.000000000', +# 'deletions': 1, +# 'id': 'openstack%2Fcongress~master~I52e06d42a25e1780984fbf37fe9cd2c7e4bc8a9f', +# 'hashtags': [], +# 'topic': 'openstack/requirements', +# 'status': 'NEW', +# 'updated': '2017-08-04 11:12:50.000000000', +# 'change_id': 'I52e06d42a25e1780984fbf37fe9cd2c7e4bc8a9f'} + +template: | + [{status}] {subject} + Updated: {updated} + Topic: {topic} + https://review.openstack.org/{_number} + + +# The query items need a title, to be displayed above the output, and +# a query string. The query string can include {branch} and {project}, +# which will be replaced with the full branch name and the git +# repository name respectively. + +queries: + - title: Open patches from the proposal bot + query: "is:open branch:{branch} project:{project} owner:proposal-bot" + - title: Documentation patches + query: "is:open branch:{branch} project:{project} path:^doc/source/.*"