/tools/check-git-repo-availability.py
Python | 74 lines | 63 code | 8 blank | 3 comment | 16 complexity | a8c4b751eb3a484dfa593fc5a96b126c MD5 | raw file
- #!/usr/bin/env python3
- import glob
- import re
- import subprocess
- import sys
- import yaml
- if len(sys.argv) > 1:
- files = sys.argv[1:]
- else:
- files = sorted(glob.glob('metadata/*.yml'))
- errors = dict()
- for f in files:
- if not f.endswith('.yml'):
- print('\n' + f + ':\nThis only runs on YAML files (.yml), ignoring.')
- continue
- with open(f) as fp:
- data = yaml.load(fp)
- url = data.get('Repo')
- if not url or 'NoSourceSince' in data.keys():
- continue
- if data['RepoType'] != 'git':
- continue
- # from class vcs_git() in fdroidserver/common.py
- git_config = [
- '-c', 'core.askpass=/bin/true',
- '-c', 'core.sshCommand=/bin/false',
- '-c', 'url.https://.insteadOf=ssh://',
- ]
- for domain in ('bitbucket.org', 'github.com', 'gitlab.com'):
- git_config.append('-c')
- git_config.append('url.https://u:p@' + domain + '/.insteadOf=git@' + domain + ':')
- git_config.append('-c')
- git_config.append('url.https://u:p@' + domain + '.insteadOf=git://' + domain)
- git_config.append('-c')
- git_config.append('url.https://u:p@' + domain + '.insteadOf=https://' + domain)
- env = {
- 'GIT_TERMINAL_PROMPT': '0',
- 'GIT_ASKPASS': '/bin/true',
- 'SSH_ASKPASS': '/bin/true',
- 'GIT_SSH': '/bin/false', # for git < 2.3
- }
- p = subprocess.run(['git', ] + git_config + ['ls-remote', '--exit-code', '-h', url],
- env=env,
- capture_output=True)
- if p.returncode != 0:
- with open(f) as fp:
- raw = fp.read()
- with open(f, 'w') as fp:
- fp.write(re.sub(r'(Repo|RepoType):.*\n{1,2}', r'', raw))
- builds = data.get('Builds')
- if builds:
- versionName = str(builds[-1]['versionName'])
- # if YAML will think its a float, quote it
- try:
- float(versionName)
- fp.write("\nNoSourceSince: '" + versionName + "'")
- except ValueError:
- fp.write("\nNoSourceSince: " + versionName)
- fp.write('\n')
- print('\n' + f + ':')
- print(p.stderr.decode())
- errors[f] = p.stderr
- errorcount = len(errors)
- if errorcount > 0:
- print('\nFound', errorcount, 'errors.')
- sys.exit(errorcount)