blob: 28a53db7882e339d7a2ac7db8c733e2a567fdfaa [file] [log] [blame]
#!/usr/bin/env python3
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import subprocess
import re
import argparse
import sys
def tag_string(tags):
if len(tags) == 4:
return ".".join(str(i) for i in tags[:3]) + "-rc" + str(tags[3])
elif len(tags) == 3:
return ".".join(str(i) for i in tags)
else:
raise ValueError("malfomated tags %s" % ".".join(str(i) for i in tags))
def main(args):
# current version
last_tag = subprocess.run(
['git', 'describe', '--abbrev=0', '--tags'],
stdout=subprocess.PIPE).stdout.decode('utf-8').strip()
# last_tag="4.2.3-rc1"
# last_tag="3.2.1"
tags = re.split("\.|-rc", last_tag)
new_tags = [int(i) for i in tags]
# parse args
parser = argparse.ArgumentParser()
parser.add_argument(
'-y',
default=False,
dest='confirmed',
action='store_true',
help="In interactive mode, for user to confirm. Could be used in script")
parser.add_argument('type',
choices=['major', 'minor', 'patch', 'rc', 'stable'],
help="Release types")
args = parser.parse_args(args)
# check eligibility of arg
if args.type in ['major', 'minor', 'patch']:
if len(tags) == 4:
exit("Current type \"%s\" is not allowed in pre release(version %s)"
% (args.type, last_tag))
if args.type in ['stable', 'rc']:
if len(tags) == 3:
exit(
"Current type \"%s\" is not allowed in stable release(version %s)"
% (args.type, last_tag))
# new version
if args.type == 'major':
new_tags[0] += 1
new_tags[1] = 0
new_tags[2] = 0
new_tags.append(0)
elif args.type == 'minor':
new_tags[1] += 1
new_tags[2] = 0
new_tags.append(0)
elif args.type == 'patch':
new_tags[2] += 1
new_tags.append(0)
elif args.type == 'stable':
new_tags.pop(-1)
elif args.type == 'rc':
new_tags[3] += 1
# ask for confirmation
print("Please confirm bumping version from %s to %s" %
(last_tag, tag_string(new_tags)))
ans = "y" if args.confirmed else ""
while ans not in ['y', 'n']:
ans = input("OK to continue [Y/N]? ").lower()
if ans == "y":
print("Confirmed bumping version from %s to %s" %
(last_tag, tag_string(new_tags)))
else:
exit("Aborted")
# do the rest of the work
# git tag -a $NEW_VERSION -m "Version: $NEW_VERSION"
print(
subprocess.run(
['git', 'tag', '-a',
tag_string(new_tags), '-m', 'new version'],
stdout=subprocess.PIPE).stdout)
# git push dcslin -f --tags
# print( subprocess.run(['git', 'push', 'dcslin', '-f', '--tags'], stdout=subprocess.PIPE).stdout) # test
print( subprocess.run(['git', 'push', '--tags'], stdout=subprocess.PIPE).stdout)
print("Done. Pushed to remote")
if __name__ == "__main__":
main(sys.argv[1:])
# main(["-y","major"])
# main(["-y","patch"])
# main(["-y","minor"])
# main(["-y","stable"])
# main(["stable"])
# main(["-y","rc"])