summary refs log tree commit diff
path: root/bin/semver
blob: e2b51e7579a82a30cffe0374e854178f83916f0b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/usr/bin/env python3

# src:
# https://git.sr.ht/~sircmpwn/dotfiles/blob/f9e7e88a72c2b87e5ab823205cb3a3aa8f3babd0/bin/semver
# usage: semver [patch|minor|major|<new_version>]
# desc: will tag a new version either based on last tag or <new_version>
#
# patch(robertgzr)
# allow simply tagging a new non-annotated release

import os
import subprocess
import sys
import tempfile

if subprocess.run(["git", "branch", "--show-current"],
                  stdout=subprocess.PIPE).stdout.decode().strip() != "master":
    print("WARNING! Not on the master branch.")

subprocess.run(["git", "pull", "--rebase"])

if sys.argv[1] == "-t":
    sys.argv = [sys.argv[0]] + sys.argv[2:]
    simple_tag = True
    describe_args = "--tag"
else:
    describe_args = "--abbrev=0"

p = subprocess.run(["git", "describe", describe_args], stdout=subprocess.PIPE)
describe = p.stdout.decode().strip()
old_version = describe.split("-")[0].split(".")
if len(old_version) == 2:
    [major, minor] = old_version
    [major, minor] = map(int, [major, minor])
    patch = 0
else:
    [major, minor, patch] = old_version
    [major, minor, patch] = map(int, [major, minor, patch])

p = subprocess.run(["git", "shortlog", "--no-merges", f"{describe}..HEAD"],
                   stdout=subprocess.PIPE)
shortlog = p.stdout.decode()

new_version = None

if sys.argv[1] == "patch":
    patch += 1
elif sys.argv[1] == "minor":
    minor += 1
    patch = 0
elif sys.argv[1] == "major":
    major += 1
    minor = patch = 0
else:
    new_version = sys.argv[1]

if new_version is None:
    if len(old_version) == 2 and patch == 0:
        new_version = f"{major}.{minor}"
    else:
        new_version = f"{major}.{minor}.{patch}"

p = None
if os.path.exists("contrib/_incr_version"):
    p = subprocess.run(["contrib/_incr_version", describe, new_version])
elif os.path.exists(".git/_incr_version"):
    print("Warning: _incr_version found at legacy path")
    p = subprocess.run([".git/_incr_version", describe, new_version])
else:
    print("Warning: no _incr_version script. " +
          "Does this project have any specific release requirements?")

if p and p.returncode != 0:
    print("Error: _incr_version returned nonzero exit code")
    sys.exit(1)

if simple_tag:
    subprocess.run(["git", "tag", new_version])

else:
    with tempfile.NamedTemporaryFile() as f:
        basename = os.path.basename(os.getcwd())
        f.write(f"{basename} {new_version}\n\n".encode())
        f.write(shortlog.encode())
        f.flush()
        subprocess.run(["git", "tag", "-e", "-F", f.name, "-a", new_version])

print(new_version)