cloner to easily clone dependent repositories
The intent is to replace the devstack shell script with a python utility which would be easy to reuse. Change-Id: I3c8748e2544af80e72fdd0b2e3627b4fc2212c01
This commit is contained in:
143
zuul/cmd/cloner.py
Executable file
143
zuul/cmd/cloner.py
Executable file
@@ -0,0 +1,143 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright 2014 Antoine "hashar" Musso
|
||||
# Copyright 2014 Wikimedia Foundation Inc.
|
||||
#
|
||||
# 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 argparse
|
||||
import logging
|
||||
import os
|
||||
import sys
|
||||
|
||||
import zuul.cmd
|
||||
import zuul.lib.cloner
|
||||
|
||||
ZUUL_ENV_SUFFIXES = (
|
||||
'branch',
|
||||
'change',
|
||||
'patchset',
|
||||
'pipeline',
|
||||
'project',
|
||||
'ref',
|
||||
'url',
|
||||
)
|
||||
|
||||
|
||||
class Cloner(zuul.cmd.ZuulApp):
|
||||
log = logging.getLogger("zuul.Cloner")
|
||||
|
||||
def parse_arguments(self):
|
||||
"""Parse command line arguments and returns argparse structure"""
|
||||
parser = argparse.ArgumentParser(
|
||||
description='Zuul Project Gating System Cloner.')
|
||||
parser.add_argument('-m', '--map', dest='clone_map_file',
|
||||
help='specifiy clone map file')
|
||||
parser.add_argument('--workspace', dest='workspace',
|
||||
default=os.getcwd(),
|
||||
help='where to clone repositories too')
|
||||
parser.add_argument('-v', '--verbose', dest='verbose',
|
||||
action='store_true',
|
||||
help='verbose output')
|
||||
parser.add_argument('--color', dest='color', action='store_true',
|
||||
help='use color output')
|
||||
parser.add_argument('--version', dest='version', action='version',
|
||||
version=self._get_version(),
|
||||
help='show zuul version')
|
||||
parser.add_argument('git_base_url',
|
||||
help='reference repo to clone from')
|
||||
parser.add_argument('projects', nargs='+',
|
||||
help='list of Gerrit projects to clone')
|
||||
|
||||
project_env = parser.add_argument_group(
|
||||
'project tuning'
|
||||
)
|
||||
project_env.add_argument(
|
||||
'--branch',
|
||||
help=('branch to checkout instead of Zuul selected branch, '
|
||||
'for example to specify an alternate branch to test '
|
||||
'client library compatibility.')
|
||||
)
|
||||
|
||||
zuul_env = parser.add_argument_group(
|
||||
'zuul environnement',
|
||||
'Let you override $ZUUL_* environnement variables.'
|
||||
)
|
||||
for zuul_suffix in ZUUL_ENV_SUFFIXES:
|
||||
env_name = 'ZUUL_%s' % zuul_suffix.upper()
|
||||
zuul_env.add_argument(
|
||||
'--zuul-%s' % zuul_suffix, metavar='$' + env_name,
|
||||
default=os.environ.get(env_name)
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# Validate ZUUL_* arguments
|
||||
zuul_missing = [zuul_opt for zuul_opt, val in vars(args).items()
|
||||
if zuul_opt.startswith('zuul') and val is None]
|
||||
if zuul_missing:
|
||||
parser.error(("Some Zuul parameters are not properly set:\n\t%s\n"
|
||||
"Define them either via environment variables or "
|
||||
"using options above." %
|
||||
"\n\t".join(sorted(zuul_missing))))
|
||||
self.args = args
|
||||
|
||||
def setup_logging(self, color=False, verbose=False):
|
||||
"""Cloner logging does not rely on conf file"""
|
||||
if verbose:
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
else:
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
|
||||
if color:
|
||||
# Color codes http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html
|
||||
logging.addLevelName( # cyan
|
||||
logging.DEBUG, "\033[36m%s\033[0m" %
|
||||
logging.getLevelName(logging.DEBUG))
|
||||
logging.addLevelName( # green
|
||||
logging.INFO, "\033[32m%s\033[0m" %
|
||||
logging.getLevelName(logging.INFO))
|
||||
logging.addLevelName( # yellow
|
||||
logging.WARNING, "\033[33m%s\033[0m" %
|
||||
logging.getLevelName(logging.WARNING))
|
||||
logging.addLevelName( # red
|
||||
logging.ERROR, "\033[31m%s\033[0m" %
|
||||
logging.getLevelName(logging.ERROR))
|
||||
logging.addLevelName( # red background
|
||||
logging.CRITICAL, "\033[41m%s\033[0m" %
|
||||
logging.getLevelName(logging.CRITICAL))
|
||||
|
||||
def main(self):
|
||||
self.parse_arguments()
|
||||
self.setup_logging(color=self.args.color, verbose=self.args.verbose)
|
||||
cloner = zuul.lib.cloner.Cloner(
|
||||
git_base_url=self.args.git_base_url,
|
||||
projects=self.args.projects,
|
||||
workspace=self.args.workspace,
|
||||
zuul_branch=self.args.zuul_branch,
|
||||
zuul_ref=self.args.zuul_ref,
|
||||
zuul_url=self.args.zuul_url,
|
||||
branch=self.args.branch,
|
||||
clone_map_file=self.args.clone_map_file
|
||||
)
|
||||
cloner.execute()
|
||||
|
||||
|
||||
def main():
|
||||
cloner = Cloner()
|
||||
cloner.main()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.path.insert(0, '.')
|
||||
main()
|
||||
Reference in New Issue
Block a user