def test_candidate_files(self):
        review = {'revisions': {
                  'Ifake': {
                      'files': {
                          'some/file': {},
                          'candidates/some/file': {}}
                      }
                  }}

        self.assertEqual(utils.candidate_files(review),
                         ['candidates/some/file'])
def main():
    description = ('Check if the owner of open changes are valid candidates as'
                   ' described in the change')
    parser = argparse.ArgumentParser(description)
    parser.add_argument('--limit',
                        dest='limit',
                        type=int,
                        default=1,
                        help=('How many validating changes to report.  '
                              'A negative value means report many.  '
                              'Default: %(default)s'))
    parser.add_argument('--tag',
                        dest='tag',
                        default=utils.conf['tag'],
                        help=('The governance tag to validate against.  '
                              'Default: %(default)s'))

    args = parser.parse_args()
    for review in get_reviews():
        if review['status'] != 'NEW':
            continue

        print('Checking %s/%d' % (utils.GERRIT_BASE, review['_number']))

        if not len(utils.candidate_files(review)):
            print("[E] No candidacy added")
            continue

        owner = review.get('owner', {})
        try:
            found = check_candidacy.check_candidacy_review(review['change_id'],
                                                           tag=args.tag,
                                                           limit=args.limit,
                                                           review=review)
        except Exception as exc:
            print("[E] %s\n\n" % (exc))
        else:
            if found:
                print('SUCESS: %s is a valid candidate\n\n' % (owner['email']))
            else:
                print('[E]: %s is not a valid candidate\n\n' %
                      (owner['email']))
    return 0
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
def main():
    description = ('Check if the owner of open changes are valid candidates as'
                   ' described in the change')
    parser = argparse.ArgumentParser(description)
    parser.add_argument('--limit', dest='limit', type=int, default=1,
                        help=('How many validating changes to report.  '
                              'A negative value means report many.  '
                              'Default: %(default)s'))
    parser.add_argument('--tag', dest='tag', default=utils.conf['tag'],
                        help=('The governance tag to validate against.  '
                              'Default: %(default)s'))

    args = parser.parse_args()
    for review in get_reviews():
        if review['status'] != 'NEW':
            continue

        print('Checking %s/%d' %
              (utils.GERRIT_BASE, review['_number']))

        if not len(utils.candidate_files(review)):
            print("[E] No candidacy added")
            continue

        owner = review.get('owner', {})
        try:
            found = check_candidacy.check_candidacy_review(review['change_id'],
                                                           tag=args.tag,
                                                           limit=args.limit,
                                                           review=review)
        except Exception as exc:
            print("[E] %s\n\n" % (exc))
        else:
            if found:
                print('SUCESS: %s is a valid candidate\n\n' %
                      (owner['email']))
            else:
                print('[E]: %s is not a valid candidate\n\n' %
                      (owner['email']))
    return 0
Exemple #5
0
def check_candidacy_review(change_id,
                           limit=1,
                           tag=utils.PROJECTS_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
def main():
    description = ('Check all open reviews for candidacies')
    parser = argparse.ArgumentParser(description)
    parser.add_argument('--limit', dest='limit', type=int, default=1,
                        help=('How many validating changes to report.  '
                              'A negative value means report many.  '
                              'Default: %(default)s'))
    parser.add_argument('--tag', dest='tag', default=utils.conf['tag'],
                        help=('The governance tag to validate against.  '
                              'Default: %(default)s'))
    parser.add_argument('--interactive', dest='interactive', default=False,
                        action='store_true',
                        help=('Pause after each review to manually post '
                              'results'))
    parser.add_argument('-v', '--verbose', action="count", default=0,
                        help='Increase program verbosity')

    args = parser.parse_args()
    projects = utils.get_projects(tag=args.tag, fallback_to_master=True)
    election_type = utils.conf.get('election_type', '').lower()

    for review in get_reviews(verbose=args.verbose):
        if review['status'] != 'NEW':
            continue

        review_url = '%s/%d' % (utils.GERRIT_BASE, review['_number'])
        print('\n\nChecking %s' % (review_url))

        for filepath in utils.candidate_files(review):
            email = utils.get_email(filepath)
            team = os.path.basename(os.path.dirname(filepath))

            # Some kind souls remove the .placeholder file when they upload
            # a candidacy
            if email == '.placeholder':
                continue

            candiate_ok = checks.validate_filename(filepath)
            if candiate_ok:
                candiate_ok = checks.validate_member(filepath,
                                                     verbose=args.verbose)

            if candiate_ok:
                # If we're a PTL election OR if the team is not TC we need
                # to check for validating changes
                if (election_type == 'ptl'
                        or (election_type == 'combined' and team != 'TC')):
                    if args.interactive:
                        print('The following commit and profile validate this '
                              'candidate:')
                    candiate_ok = checks.check_for_changes(
                        projects, filepath, args.limit,
                        verbose=args.verbose)
                    print_member(filepath, verbose=args.verbose)
                else:
                    print('Not checking for changes as this is a TC election')
            else:
                print('Not checking for changes as %s doesn\'t seem to '
                      'describe a valid candidacy' % (filepath))

            if args.interactive:
                try:
                    input('Next review?')
                except KeyboardInterrupt:
                    print('')
                    return 0

            results.append((review_url, email, team, candiate_ok))

    print('\n\n\n')
    print('*' * 80)
    for result in results:
        (review_url, email, team, candiate_ok) = result
        print(review_url)
        if candiate_ok:
            print(' SUCCESS: %s is a valid candidate for %s' % (email, team))
        else:
            print(' ERROR: Candidate %s is not valid, please review '
                  'previous messages for details.' % (email))
    print('*' * 80)
    return 0