1
+ #! /bin/bash
2
+ set -e
3
+
4
+ YAML_FILE=" lib/info.yaml"
5
+ COMMIT_MSG=" $( git log -1 --pretty=%B) "
6
+ DATE=$( date +' %Y-%m-%d' )
7
+
8
+ if [ ! -f " $YAML_FILE " ]; then
9
+ echo " YAML file not found: $YAML_FILE "
10
+ exit 0
11
+ fi
12
+
13
+ # [info] auto-commit check
14
+ if [ " $COMMIT_MSG " == " [info]" ]; then
15
+ exit 0
16
+ fi
17
+
18
+ ESCAPED_COMMIT_MSG=$( printf ' %s' " $COMMIT_MSG " | sed ' s/"/\\"/g' )
19
+
20
+ # Update latest-commit-msg
21
+ if grep -q " ^latest-commit-msg:" " $YAML_FILE " ; then
22
+ sed -i " s/^latest-commit-msg:.*/latest-commit-msg: \" $ESCAPED_COMMIT_MSG \" /" " $YAML_FILE "
23
+ else
24
+ echo " latest-commit-msg: \" $ESCAPED_COMMIT_MSG \" " >> " $YAML_FILE "
25
+ fi
26
+
27
+ # [no v] — only update latest-commit-date
28
+ if echo " $COMMIT_MSG " | grep -q ' \[no v\]' ; then
29
+ sed -i " s/^latest-commit-date:.*/latest-commit-date: ${DATE} /" " $YAML_FILE "
30
+ exit 0
31
+ fi
32
+
33
+ CURRENT_VERSION=$( grep ' ^version:' " $YAML_FILE " | awk ' {print $2}' )
34
+ IFS=' .' read -r OLD_MAJOR OLD_MINOR OLD_PATCH <<< " $CURRENT_VERSION"
35
+
36
+ NEW_MAJOR=" $OLD_MAJOR "
37
+ NEW_MINOR=" $OLD_MINOR "
38
+ NEW_PATCH=" $OLD_PATCH "
39
+ NEW_VERSION=" "
40
+ USED_OVERRIDE=0
41
+
42
+ # Process [vX.Y.Z] version override
43
+ VERSION_OVERRIDE=$( echo " $COMMIT_MSG " | grep -o ' \[v[0-9]\+\.[0-9]\+\.[0-9]\+\]' | tr -d ' []v' )
44
+
45
+ if [ -n " $VERSION_OVERRIDE " ]; then
46
+ USED_OVERRIDE=1
47
+ if ! echo " $VERSION_OVERRIDE " | grep -qE ' ^[0-9]+\.[0-9]+\.[0-9]+$' ; then
48
+ echo " Error: Invalid version string: [v$VERSION_OVERRIDE ]"
49
+ exit 1
50
+ fi
51
+
52
+ IFS=' .' read -r NEW_MAJOR NEW_MINOR NEW_PATCH <<< " $VERSION_OVERRIDE"
53
+
54
+ # Reject same version unless [allow same version]
55
+ if [ " $NEW_MAJOR " -eq " $OLD_MAJOR " ] && [ " $NEW_MINOR " -eq " $OLD_MINOR " ] && [ " $NEW_PATCH " -eq " $OLD_PATCH " ]; then
56
+ if echo " $COMMIT_MSG " | grep -q ' \[allow same version\]' ; then
57
+ echo " Warning: Same version used again [$VERSION_OVERRIDE ] (allowed by tag)."
58
+ else
59
+ echo " Error: Version $VERSION_OVERRIDE is already current. Use [allow same version] to bypass."
60
+ exit 1
61
+ fi
62
+ fi
63
+
64
+ # Reject downgrades
65
+ if [ " $NEW_MAJOR " -lt " $OLD_MAJOR " ] || \
66
+ { [ " $NEW_MAJOR " -eq " $OLD_MAJOR " ] && [ " $NEW_MINOR " -lt " $OLD_MINOR " ]; } || \
67
+ { [ " $NEW_MAJOR " -eq " $OLD_MAJOR " ] && [ " $NEW_MINOR " -eq " $OLD_MINOR " ] && [ " $NEW_PATCH " -lt " $OLD_PATCH " ]; }
68
+ then
69
+ echo " Error: Version downgrade is not allowed."
70
+ echo " Old: $CURRENT_VERSION , New: $VERSION_OVERRIDE "
71
+ exit 1
72
+ fi
73
+
74
+ # Warn on large jumps
75
+ MAJOR_DIFF=$(( NEW_MAJOR - OLD_MAJOR))
76
+ MINOR_DIFF=$(( NEW_MINOR - OLD_MINOR))
77
+ PATCH_DIFF=$(( NEW_PATCH - OLD_PATCH))
78
+
79
+ if [ " $MAJOR_DIFF " -gt 1 ] || [ " $MINOR_DIFF " -gt 1 ] || [ " $PATCH_DIFF " -gt 1 ]; then
80
+ echo " Warning: Version increase greater than 1:"
81
+ [ " $MAJOR_DIFF " -gt 1 ] && echo " Major: $OLD_MAJOR → $NEW_MAJOR "
82
+ [ " $MINOR_DIFF " -gt 1 ] && echo " Minor: $OLD_MINOR → $NEW_MINOR "
83
+ [ " $PATCH_DIFF " -gt 1 ] && echo " Patch: $OLD_PATCH → $NEW_PATCH "
84
+ fi
85
+
86
+ NEW_VERSION=" $NEW_MAJOR .$NEW_MINOR .$NEW_PATCH "
87
+
88
+ else
89
+ # Auto semantic bump if tagged
90
+ BUMP_TAG_COUNT=$( echo " $COMMIT_MSG " | grep -o ' \[\(major\|minor\|patch\|bump\)\]' | wc -l)
91
+
92
+ if [ " $BUMP_TAG_COUNT " -gt 1 ]; then
93
+ echo " Warning: Multiple bump tags found. Using highest priority (major > minor > patch > bump)."
94
+ fi
95
+
96
+ if echo " $COMMIT_MSG " | grep -qE ' \[major\]|\[bump-major\]' ; then
97
+ NEW_MAJOR=$(( OLD_MAJOR+ 1 )) ; NEW_MINOR=0; NEW_PATCH=0
98
+ elif echo " $COMMIT_MSG " | grep -qE ' \[minor\]|\[bump-minor\]' ; then
99
+ NEW_MINOR=$(( OLD_MINOR+ 1 )) ; NEW_PATCH=0
100
+ elif echo " $COMMIT_MSG " | grep -qE ' \[patch\]|\[bump-patch\]|\[bump\]' ; then
101
+ NEW_PATCH=$(( OLD_PATCH+ 1 ))
102
+ else
103
+ sed -i " s/^latest-commit-date:.*/latest-commit-date: ${DATE} /" " $YAML_FILE "
104
+ exit 0
105
+ fi
106
+ NEW_VERSION=" $NEW_MAJOR .$NEW_MINOR .$NEW_PATCH "
107
+ fi
108
+
109
+ # Apply version update
110
+ sed -i " s/^version:.*/version: $NEW_VERSION /" " $YAML_FILE "
111
+
112
+ # Update release dates as needed
113
+ if [ " $NEW_MAJOR " != " $OLD_MAJOR " ]; then
114
+ sed -i " s/^releasedate-major:.*/releasedate-major: $DATE /" " $YAML_FILE "
115
+ fi
116
+ if [ " $NEW_MINOR " != " $OLD_MINOR " ]; then
117
+ sed -i " s/^releasedate-minor:.*/releasedate-minor: $DATE /" " $YAML_FILE "
118
+ fi
119
+ if [ " $NEW_PATCH " != " $OLD_PATCH " ]; then
120
+ sed -i " s/^releasedate-patch:.*/releasedate-patch: $DATE /" " $YAML_FILE "
121
+ fi
122
+
123
+ # Always update latest-commit-date
124
+ sed -i " s/^latest-commit-date:.*/latest-commit-date: ${DATE} /" " $YAML_FILE "
125
+
126
+ # Stage and commit if changed
127
+ git config --global user.name " github-actions[bot]"
128
+ git config --global user.email " github-actions[bot]@users.noreply.github.com"
129
+ git add " $YAML_FILE "
130
+ if ! git diff --cached --quiet; then
131
+ git commit -m " [info] Update info.yaml version to $NEW_VERSION "
132
+ git push
133
+ fi
134
+
135
+ # Tagging
136
+ TAG=" v${NEW_VERSION} "
137
+ if ! git rev-parse " $TAG " > /dev/null 2>&1 ; then
138
+ git tag " $TAG "
139
+ git push origin " $TAG "
140
+ else
141
+ echo " Tag $TAG already exists."
142
+ fi
143
+
144
+ echo " NEW_VERSION=$NEW_VERSION " >> " $GITHUB_ENV "
0 commit comments