@@ -66,6 +66,52 @@ git::ensure-release-branch() {
66
66
fi
67
67
}
68
68
69
+ # git::export-version-from-branch outputs the current version
70
+ # for the given branch (as the argument) as exported variables
71
+ # (${maj,min,patch} _ver, last_tag).
72
+ git::export-version-from-branch() {
73
+ local target_branch=${1?must specify a branch}
74
+ local current_branch=$(git branch --show-current -q)
75
+
76
+ local expected_maj_ver
77
+ local expected_min_ver
78
+ if [[ ${target_branch} =~ release- 0 .([[: digit: ]]+ ) ]]; then
79
+ expected_maj_ver=0
80
+ expected_min_ver=${BASH_REMATCH[1]}
81
+ elif [[ ${target_branch} =~ release- ([[: digit: ]]+ ) ]]; then
82
+ expected_maj_ver=${BASH_REMATCH[1]}
83
+ else
84
+ echo "branch ${target_branch} does not appear to be for a release -- it should be release- X or release- 0 .Y" >& 2
85
+ exit 1
86
+ fi
87
+
88
+ local tag_pattern='v([[:digit:]]+).([[:digit:]]+).([[:digit:]]+)'
89
+
90
+ git checkout -q ${target_branch}
91
+
92
+ # make sure we've got a tag that matches *some* release
93
+ last_tag=$(git describe --tags --abbrev=0 ) # try to fetch just the "current" tag name
94
+ if [[ ! ${last_tag} =~ ${tag_pattern} ]]; then
95
+ # it's probably for a previous version
96
+ echo "tag ${last_tag} does not appear to be for a release -- it should be vX.Y.Z" >& 2
97
+ git checkout -q ${current_branch}
98
+ exit 1
99
+ fi
100
+
101
+ export min_ver=${BASH_REMATCH[2]}
102
+ export patch_ver=${BASH_REMATCH[3]}
103
+ export maj_ver=${BASH_REMATCH[1]}
104
+ export last_tag=${last_tag}
105
+
106
+ if ${2:- 1} && ([[ ${maj_ver} != ${expected_maj_ver} ]] || [[ ${maj_ver} == 0 && ${min_ver} != ${expected_min_ver} ]]); then
107
+ echo "tag ${last_tag} does not appear to be for a the right release (${target_branch} )" >& 2
108
+ git checkout ${current_branch}
109
+ exit 1
110
+ fi
111
+
112
+ git checkout -q ${current_branch}
113
+ }
114
+
69
115
# git::export-current-version outputs the current version
70
116
# as exported variables (${maj,min,patch} _ver, last_tag) after
71
117
# checking that we're on the right release branch.
@@ -75,25 +121,26 @@ git::export-current-version() {
75
121
76
122
# deal with the release-0 .1 branch, or similar
77
123
local release_ver=${BASH_REMATCH[1]}
78
- maj_ver=${release_ver}
79
- local tag_pattern='v${maj_ver} .([[: digit: ]]+ ).([[: digit]]+ )'
80
- if [[ ${maj_ver} =~ 0 \.([[: digit: ]]+ ) ]]; then
81
- maj_ver=0
82
- min_ver=${BASH_REMATCH[1]}
83
- local tag_pattern="v0 .(${min_ver} ).([[: digit: ]]+ )"
124
+ local expected_maj_ver=${release_ver}
125
+ if [[ ${expected_maj_ver} =~ 0 \.([[: digit: ]]+ ) ]]; then
126
+ expected_maj_ver=0
127
+ local expected_min_ver=${BASH_REMATCH[1]}
84
128
fi
85
129
86
- # make sure we've got a tag that matches our release branch
87
- last_tag=$(git describe --tags --abbrev=0 ) # try to fetch just the "current" tag name
88
- if [[ ! ${last_tag} =~ ${tag_pattern} ]]; then
89
- echo "tag ${last_tag} does not appear to be a release for this release (${release_ver} )-- it should be v${maj_ver} .Y.Z" >& 2
90
- exit 1
130
+ git::export-version-from-branch "release-${release_ver} " false
131
+
132
+ local last_tag_branch=""
133
+ if [[ ${maj_ver} == "0 " && ${min_ver} - eq $((expected_min_ver- 1 )) ]]; then
134
+ echo " most recent tag is a release behind (${last_tag} ), checking previous release branch to be safe" >&2
135
+ last_tag_branch=" release-0.${min_ver} "
136
+ elif [[ ${maj_ver} -eq $(( expected_maj_ver- 1 )) ]]; then
137
+ echo " most recent tag is a release behind (${last_tag} ), checking previous release branch to be safe" >&2
138
+ last_tag_branch=" release-${maj_ver} "
91
139
fi
92
140
93
- export min_ver=${BASH_REMATCH[1]}
94
- export patch_ver=${BASH_REMATCH[2]}
95
- export maj_ver=${maj_ver}
96
- export last_tag=${last_tag}
141
+ if [[ -n " ${last_tag_branch} " ]]; then
142
+ git::export-version-from-branch ${last_tag_branch} true
143
+ fi
97
144
}
98
145
99
146
# git::next-version figures out the next version to tag
0 commit comments