blob: ddf2f61967ba2bb0c509fa3962dce2e8971b56c1 [file] [log] [blame]
# Copyright 2016 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.
"""Fetch repo configs."""
import base64
import httplib2
import json
import logging
from google.protobuf import text_format
from import creds_service
from import repo_config_pb2
DEFAULT_NO_MERGE_REFS = ['refs/heads/master', 'refs/heads/git-svn']
def get_repos(credentials_db, configfile=None):
if configfile:'Read repo configs from local file %s', configfile)
with open(configfile, 'r') as f:
content_text =
else:'Read repo configs from luci-config.')
credentials = creds_service.get_credentials(
credentials_db, 'bugdroid-config-service')
if not credentials:
logging.error('Invalid credentail file')
return None
http = httplib2.Http()
http = credentials.authorize(http)
headers={'Content-Type': 'application/json; charset=UTF-8'}
resp, content = http.request(LUCI_CONFIG_URL, headers=headers)
if resp.status != 200:
logging.error('Invalid response from luci-config: %d', resp.status)
return None
content_json = json.loads(content)
config_content = content_json['content']
content_text = base64.b64decode(config_content)
cfg = repo_config_pb2.RepoConfigs()
text_format.Merge(content_text, cfg)
for repo in cfg.repos:
if not repo.no_merge_refs:
return cfg
def _decode_enum(enum_type, enum_val):
desc = getattr(enum_type, 'DESCRIPTOR', None)
if not desc:
return None
val = desc.values_by_number.get(enum_val)
if val:
return None
def decode_url_template(enum_val):
return _decode_enum(repo_config_pb2.UrlTemplate, enum_val)
def decode_path_url_template(enum_val):
return _decode_enum(repo_config_pb2.PathUrlTemplate, enum_val)
def decode_repo_type(enum_val):
return _decode_enum(repo_config_pb2.RepoType, enum_val)