election/openstack_election/check_candidacy.py

90 lines
3.4 KiB
Python
Executable File

# Licensed 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 datetime
import os
from openstack_election import utils
# FIXME: Printing from library function isn't great.
# change API to return the messages and let the consumer decide what to
# do with them
def check_candidate(project_name, email, projects, limit=1, verbose=0):
def pretty_datetime(dt_str):
dt = datetime.datetime.strptime(dt_str.split('.')[0],
'%Y-%m-%d %H:%M:%S')
return dt.strftime('%Y-%m-%d')
found = 0
branch = None
timeframe = utils.conf['timeframe']
owner = utils.get_gerrit_account(email)['username']
if project_name in ['Stable branch maintenance']:
project_list = projects.values()
branch = '^stable/.*'
else:
project_list = [projects[project_name]]
for project in project_list:
for atc in project.get('extra-atcs', []):
if (atc['email'] == email and utils.check_atc_date(atc)):
print("%2d: Valid extra ATC record:\n\t%s" % (found, atc))
found += 1
if found >= limit:
return found
for deliverable in project['deliverables'].values():
for repo_name in deliverable["repos"]:
query = ('is:merged after:"%s" before:"%s" '
'owner:%s project:%s' %
(utils.gerrit_datetime(timeframe['start']),
utils.gerrit_datetime(timeframe['end']),
owner, repo_name))
if branch:
query += (' branch:%s' % (branch))
if verbose >= 1:
print('Checking %s for merged changes by %s' %
(repo_name, email))
for review in utils.get_reviews(query, verbose=verbose):
print('Found: %s/%s merged on %s to %s for %s' % (
utils.GERRIT_BASE, review['_number'],
pretty_datetime(review['submitted']), repo_name,
project_name))
found += 1
if found >= limit:
return found
return found
def check_candidacy_review(change_id, limit=1, tag=utils.conf['tag'],
review=None):
projects = utils.get_projects(tag=tag)
# If there is more than one review that matches this change_id then all
# bets are off
review = review or utils.get_reviews(change_id)[0]
email = review.get('owner', {}).get('email')
found = 0
for filename in utils.candidate_files(review):
_, series, project_name, candidate_file = filename.split(os.sep)
if project_name != 'TC':
project_name = utils.dir2name(project_name, projects)
found += check_candidate(project_name, email, projects,
limit=(limit-found))
if found >= limit:
return True
return found > 0