diff options
Diffstat (limited to 'debian/uncrustify-trinity/uncrustify-trinity-0.73.0/scripts/gen_changelog.py')
-rwxr-xr-x | debian/uncrustify-trinity/uncrustify-trinity-0.73.0/scripts/gen_changelog.py | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/debian/uncrustify-trinity/uncrustify-trinity-0.73.0/scripts/gen_changelog.py b/debian/uncrustify-trinity/uncrustify-trinity-0.73.0/scripts/gen_changelog.py new file mode 100755 index 00000000..8e042385 --- /dev/null +++ b/debian/uncrustify-trinity/uncrustify-trinity-0.73.0/scripts/gen_changelog.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python + +''' +This script attempts to extract what options have been added since the +specified revision (usually a tag, but any revision that git recognizes may be +provided). It accepts an optional second revision to use as the cut-off. The +default is your LOCAL "master". Thus, you should ensure that this is up to date +before running this script. + +This script works by extracting the set of options before and after every +commit that affected ':src/options.h' and computing the differences. It should, +therefore, be fairly robust (for example, options that moved around won't show +up). However, if an option is removed and subsequently re-added, or if an +option was added and subsequently removed, the resulting records will need to +be reconciled manually. +''' + +import argparse +import git +import os +import re +import sys +import time + +re_option = re.compile(r'extern (Bounded)?Option<[^>]+>') + + +# ----------------------------------------------------------------------------- +def extract_options(repo, blob_id): + from git.util import hex_to_bin + + blob = git.Blob(repo, hex_to_bin(blob_id)) + content = blob.data_stream.stream + options = set() + + for line in iter(content.readline, b''): + line = line.decode('utf-8').strip() + + if re_option.match(line): + line = content.readline().decode('utf-8').strip() + options.add(line.split(';')[0]) + + return options + + +# ============================================================================= +class Changeset(object): + # ------------------------------------------------------------------------- + def __init__(self, repo, sha): + self.sha = sha + self.added_options = set() + self.removed_options = set() + + commit = repo.commit(sha) + ad = time.gmtime(commit.authored_date) + self.date = time.strftime('%b %d %Y', ad).replace(' 0', ' ') + + info = repo.git.log('-1', '--raw', '--abbrev=40', '--pretty=', + sha, '--', ':src/options.h').split(' ') + if len(info) < 5: + return + + old_options = extract_options(repo, info[2]) + new_options = extract_options(repo, info[3]) + self.added_options = new_options.difference(old_options) + self.removed_options = old_options.difference(new_options) + + +# ----------------------------------------------------------------------------- +def main(): + parser = argparse.ArgumentParser( + description='Generate changelog for new options') + + root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) + parser.add_argument('--repo', type=str, default=root, + help='Path to uncrustify git repository') + parser.add_argument('since', type=str, + help='Revision (tag) of previous uncrustify version') + parser.add_argument('until', type=str, default='master', nargs='?', + help='Revision (tag) of next uncrustify version') + + args = parser.parse_args() + repo = git.Repo(args.repo) + revs = repo.git.log('--pretty=%H', '--reverse', + '{}..{}'.format(args.since, args.until), + '--', ':src/options.h').split('\n') + + if revs == ['']: + print('No changes were found') + return 1 + + changes = [] + for r in revs: + c = Changeset(repo, r) + if len(c.added_options) or len(c.removed_options): + changes.append(c) + + for c in changes: + print(c.sha) + for o in c.added_options: + print(' Added : {:36} {}'.format(o, c.date)) + for o in c.removed_options: + print(' Removed : {:36} {}'.format(o, c.date)) + + return 0 + + +# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +if __name__ == '__main__': + sys.exit(main()) |