Always checking upstream
authorGreg Wilson <gvwilson@third-bit.com>
Fri, 15 Jul 2016 14:44:29 +0000 (10:44 -0400)
committerGreg Wilson <gvwilson@third-bit.com>
Fri, 15 Jul 2016 14:44:29 +0000 (10:44 -0400)
bin/repo_check.py

index 42f4428294b471b81144bf78be940eb8a8468f76..4a8d98b1071733fc0a26572f0a689b4e6ac561c7 100755 (executable)
@@ -6,6 +6,7 @@ Check repository settings.
 
 import sys
 import os
+from subprocess import Popen, PIPE
 import re
 from optparse import OptionParser
 
@@ -19,7 +20,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 +53,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 +64,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 +80,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):