From 5a92982893a0eb8c07755a3777035046ddb0b053 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Soko=C5=82owski?= Date: Wed, 15 Feb 2023 14:14:03 +0100 Subject: [PATCH] ansible/update.py: handle entries without version MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jakub SokoĊ‚owski --- ansible/update.py | 69 +++++++++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 32 deletions(-) diff --git a/ansible/update.py b/ansible/update.py index 5cb73fd..b8c959c 100755 --- a/ansible/update.py +++ b/ansible/update.py @@ -8,69 +8,74 @@ from subprocess import check_output path = 'ansible/requirements.yml' repos_path = getenv('ANSIBLE_REPOS_PATH', '~/work') +def extractKeyValue(line, keys): + for key in keys: + matches = re.match(('[- ] %s: (.*)' % key), line) + if not matches: + continue + else: + return (key, matches.group(1)) + + return (None, None) + with open(path, 'r') as f: contents = f.readlines() # Read file lines = iter(contents) entries = [] +entry = {} +keys_possible = ['name', 'src', 'version', 'scm'] + for line in lines: - matches = re.match('- name: (.*)', line) - if not matches: + if line.strip() == '---': continue - name = matches.group(1) - matches = re.match(' src: (.*)', next(lines)) - if not matches: - raise Exception('Unable to find source URL: %s' % name) - src = matches.group(1) + key, value = extractKeyValue(line, keys_possible) - matches = re.match('^git@github.com:[^/]+/(.+).git$', src) - if not matches: - raise Exception('Unable to find full repo name: %s' % name) - full_name = matches.group(1) + if key is None: + entries.append(entry.copy()) + else: + entry[key] = value - matches = re.match(' version: (.*)', next(lines)) - if not matches: - raise Exception('Unable to find current version: %s' % name) - version = matches.group(1) - - matches = re.match(' scm: (.*)', next(lines)) - if not matches: - raise Exception('Unable to find version control type: %s' % name) - scm = matches.group(1) - - entries.append({ - 'name': name, - 'full_name': full_name, - 'src': src, - 'version': version, - 'scm': scm, - }) +# Append last entry due to lack of last newline. +entries.append(entry) # Read commits from repos for entry in entries: + matches = re.match('^git@github.com:[^/]+/(.+).git$', entry['src']) + if not matches: + raise Exception('Unable to find full repo name: %s' % name) + entry['full_name'] = matches.group(1) + cwd = expanduser('%s/%s' % (repos_path, entry['full_name'])) if not isdir(cwd): print('No such repo: %s' % cwd) continue + commit = check_output(['git', 'rev-parse', 'HEAD'], cwd=cwd) new_version = commit.decode().strip() - if new_version != entry['version']: + if entry.get('version') is None: + print('untrack: %s - %s' % (new_version, entry['full_name'])) + elif new_version != entry['version']: entry['version'] = new_version - print('Updated: %s - %s' % (new_version, entry['full_name'])) + print('UPDATED: %s - %s' % (new_version, entry['full_name'])) + else: + print('current: %s - %s' % (new_version, entry['full_name'])) lines = ['---\n'] for entry in entries: lines.extend([ ('- name: %s\n' % entry['name']), (' src: %s\n' % entry['src']), - (' version: %s\n' % entry['version']), + (' version: %s\n' % entry['version']) if entry.get('version') else None, (' scm: %s\n' % entry['scm']), '\n', ]) +# remove empty lines +lines = list(filter(lambda l: l is not None, lines)) -# Write file +# write file with open(path, 'w') as f: contents = f.writelines(lines[:-1])