diff options
| author | Michele Calgaro <michele.calgaro@yahoo.it> | 2023-12-01 12:38:43 +0900 | 
|---|---|---|
| committer | Michele Calgaro <michele.calgaro@yahoo.it> | 2023-12-01 12:38:43 +0900 | 
| commit | b67b7f2b784c7105e88a5e639d9d84736ae2cbc1 (patch) | |
| tree | 0fd16d439c681c07d57d7f0d544c7582e04c3a31 /debian/uncrustify-trinity/uncrustify-trinity-0.78.1/scripts/release_tool.py | |
| parent | c0a6f1b84c84749908961579b84513fd9f9d9eac (diff) | |
| download | extra-dependencies-b67b7f2b784c7105e88a5e639d9d84736ae2cbc1.tar.gz extra-dependencies-b67b7f2b784c7105e88a5e639d9d84736ae2cbc1.zip | |
uncrustify-trinity: updated based on upstream version 0.78.1
Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
Diffstat (limited to 'debian/uncrustify-trinity/uncrustify-trinity-0.78.1/scripts/release_tool.py')
| -rwxr-xr-x | debian/uncrustify-trinity/uncrustify-trinity-0.78.1/scripts/release_tool.py | 313 | 
1 files changed, 313 insertions, 0 deletions
| diff --git a/debian/uncrustify-trinity/uncrustify-trinity-0.78.1/scripts/release_tool.py b/debian/uncrustify-trinity/uncrustify-trinity-0.78.1/scripts/release_tool.py new file mode 100755 index 00000000..32a6f89e --- /dev/null +++ b/debian/uncrustify-trinity/uncrustify-trinity-0.78.1/scripts/release_tool.py @@ -0,0 +1,313 @@ +#!/usr/bin/env python + +import argparse +import git  # /usr/lib/python3/dist-packages/git/__init__.py +import os +import re  # Support for regular expressions (RE). +import sys + +# use the variable DEBUG to get more output +DEBUG = 1 + +if sys.version_info[0] < 3: +    input = raw_input + +re_desc = re.compile(r'^uncrustify-([0-9]+[.][0-9]+[.][0-9]+)') +re_branch = re.compile(r'^uncrustify-RC-([0-9]+[.][0-9]+[.][0-9]+)') +re_merge = re.compile(r'^Merge pull request #[0-9]+ from [^/]+/(.*)') +re_version = re.compile(r'^[0-9]+[.][0-9]+[.][0-9]+$') +re_option_count = re.compile(r'There are currently ([0-9]+) options') + + +# ----------------------------------------------------------------------------- +def fatal(msg): +    raise Exception(msg) + + +# ----------------------------------------------------------------------------- +def get_version_str(repo, candidate=True, required=True): +    if candidate: +        if DEBUG: +            print('git.symbolic-ref("-q", "--short", "HEAD")') +        b = repo.git.symbolic_ref('-q', '--short', 'HEAD') +        m = re_branch.match(b) +        if m: +            return m.group(1) + +    if DEBUG: +        print('git.describe("HEAD")') + +    d = repo.git.describe('HEAD') +    m = re_desc.match(d) +    if m: +        return m.group(1) + +    if required: +        fatal('Unable to determine current version') + +    return None + + +# ----------------------------------------------------------------------------- +def get_version_info(repo, candidate=True, required=True): +    s = get_version_str(repo, candidate, required) +    return tuple(map(int, s.split('.'))) + + +# ----------------------------------------------------------------------------- +def get_option_count(executable): +    import subprocess + +    out = subprocess.check_output([executable, '--count-options']) +    m = re_option_count.match(out.decode('utf-8')) +    if m is None: +        fatal('Failed to get option count from \'{}\''.format(executable)) + +    return int(m.group(1)) + + +# ----------------------------------------------------------------------------- +def alter(repo, path, old, new): +    p = os.path.join(repo.working_tree_dir, path) +    with open(p, 'r') as f: +        content = f.read() +        content = re.sub(old, new, content) +    with open(p, 'w') as f: +        f.write(content) +    print('Updated: {}'.format(path)) + + +# ----------------------------------------------------------------------------- +def generate(repo, version, path, *args): +    import subprocess + +    p = os.path.join(repo.working_tree_dir, path) + +    if version is None: +        with open(p, 'r') as f: +            content = f.read() +            version = re.search(r'Uncrustify([a-z_]*)?-([0-9]+(\.[0-9]+)+(-[0-9]+)?)?(-?[0-9a-f]{6,})?', content) +            if version: +                version = version.group() +            else: +                version = 'Uncrustify' +            version += "-dev" +    else: +        version = 'Uncrustify-{}'.format(version) + +    with open(p, 'w') as f: +        c = subprocess.check_call(args, stdout=f) +    print('Created: {}'.format(path)) + +    alter(repo, path, +           r'Uncrustify([a-z_]*)?-([0-9]+(\.[0-9]+)+(-[0-9]+)?)?(-?[0-9a-f]{6,})?(-?dirty)?(-dev)?', +           r'{}'.format(version)) + + +# ----------------------------------------------------------------------------- +def cmd_init(repo, args): +    v = args.version +    if v is None: +        c = get_version_info(repo, candidate=False, required=False) +        if c: +            n = '.'.join(map(str, (c[0], c[1] + 1, 0))) +            v = input('Version to be created? [{}] '.format(n)) +            if len(v) == 0: +                v = n + +        else: +            v = input('Version to be created? ') + +    if DEBUG: +        print('The value for version is', v) + +    if not re_version.match(v): +        fatal('Bad version number, \'{}\''.format(v)) +    if DEBUG: +        s = 'git.checkout(-b, "uncrustify-RC-{}")'.format(v) +        print(s) + +    repo.git.checkout('-b', 'uncrustify-RC-{}'.format(v)) + + +# ----------------------------------------------------------------------------- +def cmd_update(repo, args): +    if args.keepversion: +        print('Not updating version info in docs') +        v = None +    else: +        v = get_version_str(repo) +    c = get_option_count(args.executable) + +    if not args.keepversion: +        alter(repo, 'CMakeLists.txt', +              r'(set *[(] *UNCRUSTIFY_VERSION +")[0-9.]+', +              r'\g<1>{}'.format(v)) +        alter(repo, 'package.json', +              r'("version" *): *"[0-9.]+"', +              r'\g<1>: "{}"'.format(v)) +        alter(repo, 'README.md', +              r'[0-9]+ configurable options as of version [0-9.]+', +              r'{} configurable options as of version {}'.format(c, v)) +        alter(repo, 'documentation/htdocs/index.html', +              r'[0-9]+ configurable options as of version [0-9.]+', +              r'{} configurable options as of version {}'.format(c, v)) +    else: +        alter(repo, 'README.md', +              r'[0-9]+ configurable options as of version ', +              r'{} configurable options as of version '.format(c)) +        alter(repo, 'documentation/htdocs/index.html', +              r'[0-9]+ configurable options as of version ', +              r'{} configurable options as of version '.format(c)) + +    generate(repo, v, 'etc/defaults.cfg', +             args.executable, '--show-config') +    generate(repo, v, 'documentation/htdocs/default.cfg', +             args.executable, '--show-config') +    generate(repo, v, 'documentation/htdocs/config.txt', +             args.executable, '--show-config') +    generate(repo, v, 'etc/uigui_uncrustify.ini', +             args.executable, '--universalindent') + +    # For 'optiondocs' command, update universalindent.cfg also, since +    # unit tests verify it. +    if args.keepversion: +        # Needs to be kept in sync with test_cli_options.py +        generate(repo, v, 'tests/cli/output/universalindent.cfg', +                 args.executable, '--universalindent') +        alter(repo, 'tests/cli/output/universalindent.cfg', +              r'(version=U.+)|(\(\d+\))|(\r)', +              r''); + +# ----------------------------------------------------------------------------- +def cmd_commit(repo, args): +    v = get_version_str(repo) +    message = 'Prepare Uncrustify v{} release'.format(v) + +    extra_args = [] +    if args.amend: +        extra_args += ['--amend', '--date=now'] + +    repo.git.commit('-m', message, *extra_args) + + +# ----------------------------------------------------------------------------- +def cmd_tag(repo, args): +    import uuid + +    # user_name = repo.config_reader().get_value('user', 'name') +    url = repo.config_reader().get_value('remote "origin"', 'url') +    print('The user account is', url) +    print('you need an "admin" account') +    v = input('Do you really want to use this account? (yes/no) ') +    if len(v) == 0: +        fatal("0 End") +    else: +        print(v) +        if v != "yes": +            fatal("2 End") + +    # Determine location of remote repository +    if args.ssh: +        s = 'git@{}:'.format(args.server) +    else: +        s = 'https://{}/'.format(args.server) +    r = '{}{}/{}.git'.format(s, args.organization, args.project) + +    # Fetch upstream +    u = repo.create_remote(str(uuid.uuid4()), r) +    try: +        u.fetch(refspec='master') + +        # Get log +        if hasattr(args, 'commit'): +            c = repo.commit(args.commit) +        else: +            c = repo.commit('{}/master'.format(u.name)) +        m = re_merge.match(c.message.split('\n')[0]) +        if m is None: +            fatal('Last commit is not a merge of a release candidate?') + +        m = re_branch.match(m.group(1)) +        if m is None: +            fatal('Failed to extract version from release candidate merge') +        v = m.group(1) + +        # Create and push tag +        extra_args = {} +        if args.force: +            extra_args['force_with_lease'] = True + +        tag = 'uncrustify-{}'.format(v) +        message = 'Create Uncrustify v{} release'.format(v) +        repo.git.tag('-a', tag, c, '-m', message, '--force') +        u.push(refspec=tag, **extra_args) + +    finally: +        repo.delete_remote(u) + + +# ----------------------------------------------------------------------------- +def main(): +    parser = argparse.ArgumentParser( +        description='Perform release-related actions') + +    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') + +    subparsers = parser.add_subparsers(title='subcommands', +                                       help='action to perform') + +    parser_init = subparsers.add_parser( +        'init', help='initialize new version') +    parser_init.set_defaults(func=cmd_init) +    parser_init.add_argument('-v', '--version', +                             help='version number for release') + +    parser_update = subparsers.add_parser( +        'optiondocs', help='update documentation from options') +    parser_update.set_defaults(func=cmd_update, keepversion=True) +    parser_update.add_argument('executable', +                               help='path to uncrustify executable') + +    parser_update = subparsers.add_parser( +        'update', help='update version information') +    parser_update.set_defaults(func=cmd_update, keepversion=False) +    parser_update.add_argument('executable', +                               help='path to uncrustify executable') + +    parser_commit = subparsers.add_parser( +        'commit', help='commit changes for new version') +    parser_commit.set_defaults(func=cmd_commit) +    parser_commit.add_argument('-a', '--amend', action='store_true', +                               help='amend a previous release commit') + +    parser_tag = subparsers.add_parser( +        'tag', help='tag release and push tag to github') +    parser_tag.set_defaults(func=cmd_tag) +    parser_tag.add_argument('--ssh', action='store_true', +                            help='use ssh (instead of HTTPS) to push') +    parser_tag.add_argument('-s', '--server', default='github.com', +                            help='push to specified server') +    parser_tag.add_argument('-o', '--organization', default='uncrustify', +                            help='push to specified user or organization') +    parser_tag.add_argument('-p', '--project', default='uncrustify', +                            help='push to specified project') +    parser_tag.add_argument('-c', '--commit', +                            help='tag specified commit ' +                                 '(instead of latest \'master\')') +    parser_tag.add_argument('-f', '--force', action='store_true', +                            help='force push the tag') + +    args = parser.parse_args() +    repo = git.Repo(args.repo) +    args.func(repo, args) + +    return 0 + + +# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +if __name__ == '__main__': +    sys.exit(main()) | 
