| Index: third_party/cq_client/validate_config.py
|
| diff --git a/third_party/cq_client/validate_config.py b/third_party/cq_client/validate_config.py
|
| deleted file mode 100644
|
| index b6d73db9b1107af81f282f0692ad7b3c8f67350d..0000000000000000000000000000000000000000
|
| --- a/third_party/cq_client/validate_config.py
|
| +++ /dev/null
|
| @@ -1,125 +0,0 @@
|
| -#!/usr/bin/env python
|
| -# Copyright 2015 The Chromium Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -"""CQ config validation library."""
|
| -
|
| -import argparse
|
| -# This file was originally copied together with the cq_client library from the
|
| -# internal commit_queue repository and then modified to import protobuf26
|
| -# instead of google.protobuf to prevent conflicts with a different version of
|
| -# google.protobuf that some users of depot_tools have installed. If you need to
|
| -# update this file, please make similar changes again and add this comment back.
|
| -# More details on why we chose to rename the package can be found in the file
|
| -# depot_tools/third_party/protobuf26/README.chromium.
|
| -import protobuf26 as protobuf
|
| -import logging
|
| -import re
|
| -import sys
|
| -
|
| -from cq_client import cq_pb2
|
| -
|
| -
|
| -REQUIRED_FIELDS = [
|
| - 'version',
|
| - 'verifiers',
|
| - 'cq_name',
|
| -]
|
| -
|
| -LEGACY_FIELDS = [
|
| - 'svn_repo_url',
|
| -]
|
| -
|
| -EMAIL_REGEXP = '^[^@]+@[^@]+\.[^@]+$'
|
| -
|
| -
|
| -def _HasField(message, field_path):
|
| - """Checks that at least one field with given path exist in the proto message.
|
| -
|
| - This function correctly handles repeated fields and will make sure that each
|
| - repeated field will have required sub-path, e.g. if 'abc' is a repeated field
|
| - and field_path is 'abc.def', then the function will only return True when each
|
| - entry for 'abc' will contain at least one value for 'def'.
|
| -
|
| - Args:
|
| - message (google.protobuf.message.Message): Protocol Buffer message to check.
|
| - field_path (string): Path to the target field separated with ".".
|
| -
|
| - Return:
|
| - True if at least one such field is explicitly set in the message.
|
| - """
|
| - path_parts = field_path.split('.', 1)
|
| - field_name = path_parts[0]
|
| - sub_path = path_parts[1] if len(path_parts) == 2 else None
|
| -
|
| - field_labels = {fd.name: fd.label for fd in message.DESCRIPTOR.fields}
|
| - repeated_field = (field_labels[field_name] ==
|
| - protobuf.descriptor.FieldDescriptor.LABEL_REPEATED)
|
| -
|
| - if sub_path:
|
| - field = getattr(message, field_name)
|
| - if repeated_field:
|
| - if not field:
|
| - return False
|
| - return all(_HasField(entry, sub_path) for entry in field)
|
| - else:
|
| - return _HasField(field, sub_path)
|
| - else:
|
| - if repeated_field:
|
| - return len(getattr(message, field_name)) > 0
|
| - else:
|
| - return message.HasField(field_name)
|
| -
|
| -
|
| -def IsValid(cq_config):
|
| - """Validates a CQ config and prints errors/warnings to the screen.
|
| -
|
| - Args:
|
| - cq_config (string): Unparsed text format of the CQ config proto.
|
| -
|
| - Returns:
|
| - True if the config is valid.
|
| - """
|
| - try:
|
| - config = cq_pb2.Config()
|
| - protobuf.text_format.Merge(cq_config, config)
|
| - except protobuf.text_format.ParseError as e:
|
| - logging.error('Failed to parse config as protobuf:\n%s', e)
|
| - return False
|
| -
|
| - if _HasField(config, 'gerrit'):
|
| - if _HasField(config, 'rietveld'):
|
| - logging.error('gerrit and rietveld are not supported at the same time.')
|
| - return False
|
| - # TODO(tandrii): validate gerrit.
|
| - required_fields = REQUIRED_FIELDS + ['gerrit.cq_verified_label']
|
| - if _HasField(config, 'verifiers.reviewer_lgtm'):
|
| - logging.error('reviewer_lgtm verifier is not supported with Gerrit.')
|
| - return False
|
| - elif _HasField(config, 'rietveld'):
|
| - required_fields = REQUIRED_FIELDS + ['rietveld.url']
|
| - else:
|
| - logging.error('either rietveld gerrit are required fields.')
|
| - return False
|
| -
|
| - for fname in required_fields:
|
| - if not _HasField(config, fname):
|
| - logging.error('%s is a required field', fname)
|
| - return False
|
| -
|
| - for fname in LEGACY_FIELDS:
|
| - if _HasField(config, fname):
|
| - logging.warn('%s is a legacy field', fname)
|
| -
|
| -
|
| - for base in config.rietveld.project_bases:
|
| - try:
|
| - re.compile(base)
|
| - except re.error:
|
| - logging.error('failed to parse "%s" in project_bases as a regexp', base)
|
| - return False
|
| -
|
| - # TODO(sergiyb): For each field, check valid values depending on its
|
| - # semantics, e.g. email addresses, regular expressions etc.
|
| - return True
|
|
|