#!/usr/bin/env python3 # # quick-bump.py - Quickly bumps a release version for a rebuild. This is mostly # used in cases of */src/* package rebuilds like for SIG's. It # should be rare that the base distribution needs this. import os import subprocess import sys import argparse import shutil parser = argparse.ArgumentParser() parser.add_argument("--pkg", help="Package name to bump (can be comma delimited list)", required=True) parser.add_argument("--branch", help="Package branch", required=True) parser.add_argument("--sig", help="Name of SIG that holds this package") parser.add_argument("--peridot-import", help="Tell peridot to import", required=False, action='store_true') parser.add_argument("--peridot-endpoint", help="Peridot API Endpoint (PERIDOT_ENDPOINT)", required=False, default="peridot-api.build.resf.org") parser.add_argument("--peridot-hdr-endpoint", help="Peridot HDR Endpoint (PERIDOT_HDR_ENDPOINT)", required=False, default="hdr.build.resf.org") parser.add_argument("--peridot-project-id", help="Peridot project ID (PERIDOT_PROJECT_ID)", required=False) parser.add_argument("--peridot-client-id", help="Peridot client ID (PERIDOT_CLIENT_ID)", required=False) parser.add_argument("--peridot-client-secret", help="Peridot client secret (PERIDOT_CLIENT_SECRET)", required=False) parser.add_argument("--dry",help="Do a dry bump for testing", required=False, action='store_true') parser.add_argument("--git-user", default="Release Engineering") parser.add_argument("--git-email", default="releng@rockylinux.org") parser.add_argument("--change-user", help="Sets the user for the rpm changelog (first last )", default="Release Engineering ") parser.add_argument("--change-comment", help="Sets the comment that will appear in the changelog and commit message", default="Release tag bump for rebuild (https://sig-core.rocky.page/rebuild/)") args = parser.parse_args(args=None if sys.argv[1:] else ['--help']) user = args.change_user comment = args.change_comment if args.peridot_import: peridot_api_endpoint = os.environ.get('PERIDOT_ENDPOINT') or args.peridot_endpoint peridot_hdr_endpoint = os.environ.get('PERIDOT_HDR_ENDPOINT') or args.peridot_hdr_endpoint peridot_project_id = os.environ.get('PERIDOT_PROJECT_ID') or args.peridot_project_id peridot_client_id = os.environ.get('PERIDOT_CLIENT_ID') or args.peridot_client_id peridot_client_secret = os.environ.get('PERIDOT_CLIENT_SECRET') or args.peridot_client_secret print('Peridot import not supported yet') sys.exit(1) if os.geteuid() == 0: print('DO NOT RUN AS ROOT') sys.exit(1) default_url = 'ssh://git@git.rockylinux.org:22220/staging/src/%s.git' % args.pkg if args.sig: default_url = 'ssh://git@git.rockylinux.org:22220/sig/%s/src/%s.git' % (args.sig, args.pkg) # functions workdir = '/var/tmp' environment = os.environ pkgs = args.pkg.split(',') def runcmd(cmd, action, package, env, pwd=workdir): """ Runs a command using subprocess and returns 0 or 1 """ try: subprocess.check_call(cmd, env=env, cwd=pwd) except subprocess.CalledProcessError as err: sys.stderr.write('%s failed %s: %s\n' % (package, action, err)) return 1 return 0 for pkg in pkgs: joined_dir = os.path.join(workdir, pkg) spec_dir = os.path.join(workdir, pkg, 'SPECS') print('Checking out ' + pkg) gitcmd = ['git', 'clone', default_url, '--branch', args.branch, joined_dir] if runcmd(gitcmd, 'git clone', pkg, environment): continue files = os.listdir(spec_dir) spec = '' for file in files: if file.endswith('.spec'): spec = os.path.join(spec_dir, file) break if not spec: sys.stderr.write('Failed to find a spec for %s\n' % pkg) continue print('Bumping release of %s' % spec) bumprel = ['rpmdev-bumpspec', '-D', '-u', user, '-c', comment, spec] bumprel_old = ['rpmdev-bumpspec', '-u', user, '-c', comment, spec] if runcmd(bumprel, 'rpmdev-bumpspec', pkg, environment): print('Potentially old bumpspec version. Trying again.') if runcmd(bumprel_old, 'rpmdev-bumpspec', pkg, environment): continue print('Setting git user and email for this operation') git_name = ['git', 'config', 'user.name', args.git_user] git_mail = ['git', 'config', 'user.email', args.git_email] if runcmd(git_name, 'git_name', pkg, environment, pwd=joined_dir): continue if runcmd(git_mail, 'git_mail', pkg, environment, pwd=joined_dir): continue print('Committing changes') commit = ['git', 'commit', '-asm', comment, '--allow-empty'] if runcmd(commit, 'commit', pkg, environment, pwd=joined_dir): continue if not args.dry: push = ['git', 'push'] print('Pushing changes for %s' % pkg) if runcmd(push, 'push', pkg, environment, pwd=joined_dir): continue shutil.rmtree(joined_dir)