X-Git-Url: https://git.arvados.org/rnaseq-cwl-training.git/blobdiff_plain/9a5ab181b0ee63b72319678370de7b77c6dd895d..337a6e8fa1df0a6f611f479be4cc9b1653443925:/bin/repo_check.py diff --git a/bin/repo_check.py b/bin/repo_check.py index 42f4428..fd04ce9 100755 --- a/bin/repo_check.py +++ b/bin/repo_check.py @@ -4,8 +4,10 @@ Check repository settings. """ +from __future__ import print_function import sys import os +from subprocess import Popen, PIPE import re from optparse import OptionParser @@ -19,7 +21,13 @@ except ImportError: sys.exit(1) -# Pattern to match repository URLs and extract username and project name. +# Pattern to match Git command-line output for remotes => (user name, project name). +P_GIT_REMOTE = re.compile(r'upstream\s+[^:]+:([^/]+)/([^.]+)\.git\s+\(fetch\)') + +# Repository URL format string. +F_REPO_URL = 'https://github.com/{0}/{1}/' + +# Pattern to match repository URLs => (user name, project name) P_REPO_URL = re.compile(r'https?://github\.com/([^.]+)/([^/]+)/?') # API URL format string. @@ -46,7 +54,7 @@ def main(): args = parse_args() reporter = Reporter() - repo_url = get_repo_url(args.source_dir) + repo_url = get_repo_url(args.source_dir, args.repo_url) check_labels(reporter, repo_url) reporter.report() @@ -57,6 +65,10 @@ def parse_args(): """ parser = OptionParser() + parser.add_option('-r', '--repo', + default=None, + dest='repo_url', + help='repository URL') parser.add_option('-s', '--source', default=os.curdir, dest='source_dir', @@ -69,18 +81,33 @@ def parse_args(): return args -def get_repo_url(source_dir): +def get_repo_url(source_dir, repo_url): """ Figure out which repository to query. """ - config_file = os.path.join(source_dir, '_config.yml') - config = load_yaml(config_file) - if 'repo' not in config: - print('"repo" not found in {0}'.format(config_file), file=sys.stderr) - sys.exit(1) + # Explicitly specified. + if repo_url is not None: + return repo_url + + # Guess. + cmd = 'git remote -v' + p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, close_fds=True, universal_newlines=True) + stdout_data, stderr_data = p.communicate() + stdout_data = stdout_data.split('\n') + matches = [P_GIT_REMOTE.match(line) for line in stdout_data] + matches = [m for m in matches if m is not None] + require(len(matches) == 1, + 'Unexpected output from git remote command: "{0}"'.format(matches)) + + username = matches[0].group(1) + require(username, 'empty username in git remote output {0}'.format(matches[0])) + + project_name = matches[0].group(2) + require(username, 'empty project name in git remote output {0}'.format(matches[0])) - return config['repo'] + url = F_REPO_URL.format(username, project_name) + return url def check_labels(reporter, repo_url):