Skip to content

Commit e9283ae

Browse files
committed
project: Add support for multi stage release cycles
To ensure better stability of future releases, we need to adopt multiple stages in the release cycle. As we already label Alpha, Beta, Candidate and Stable differently, simply adopting this classification system already does everything for us. This also allows us to maintain compatibility with the existing system, while offering something new entirely.
1 parent ba15203 commit e9283ae

File tree

7 files changed

+549
-412
lines changed

7 files changed

+549
-412
lines changed

CMakeLists.txt

Lines changed: 140 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,88 @@ endif()
5050
# Versioning
5151
################################################################################
5252

53-
set(VERSION_MAJOR 0)
54-
set(VERSION_MINOR 12)
55-
set(VERSION_PATCH 0)
56-
set(VERSION_TWEAK 0)
57-
set(VERSION_SUFFIX "a1")
53+
# Variables for Versioning
54+
set(VERSION_MAJOR 0) # Major
55+
set(VERSION_MINOR 0) # Minor
56+
set(VERSION_PATCH 0) # Patch
57+
set(VERSION_STAGE "") # Prefix for Tweak, if left empty will assume '.'.
58+
set(VERSION_TWEAK 0) # Tweak
5859
set(VERSION_COMMIT "00000000")
60+
# Final format will be [MAJOR].[MINOR].[PATCH]([TYPE][TWEAK])(-[COMMIT])
61+
62+
function(parse_version_string)
63+
# Parses a version in the format A.B.C[.|a|b|rc]D-E
64+
cmake_parse_arguments(
65+
PARSE_ARGV 0
66+
_ARGS
67+
""
68+
"INPUT;OUTPUT"
69+
""
70+
)
71+
72+
set(_tmp_MAJOR 0)
73+
set(_tmp_MINOR 0)
74+
set(_tmp_PATCH 0)
75+
set(_tmp_STAGE "")
76+
set(_tmp_TWEAK "")
77+
set(_tmp_COMMIT "")
78+
79+
# Replace separators with list separators
80+
string(REPLACE "-" "." _tmp "${_ARGS_INPUT}")
81+
string(REPLACE "." ";" _tmp "${_tmp}")
82+
83+
# Parse version differently depending on total string length.
84+
list(LENGTH _tmp _tmp_len)
85+
if(_tmp_len GREATER_EQUAL 1) # A[...]
86+
list(GET _tmp 0 _tmp_MAJOR)
87+
endif()
88+
if(_tmp_len GREATER_EQUAL 2) # A.B[...]
89+
list(GET _tmp 1 _tmp_MINOR)
90+
endif()
91+
if(_tmp_len GREATER_EQUAL 3) # A.B.C[...]
92+
list(GET _tmp 2 _tmp_PATCH)
93+
endif()
94+
if(_tmp_len EQUAL 4) # A.B.C.D or A.B.C-gEEEEEEEE
95+
list(GET _tmp 3 _tmp2)
96+
# No support for '{N,M}' in CMake-Regex!
97+
if(_tmp2 MATCHES "^g[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]")
98+
# A.B.C-gEEEEEEEE
99+
set(_tmp_COMMIT "${_tmp2}")
100+
else()
101+
# It is A.B.C.D
102+
set(_tmp_TWEAK "${_tmp2}")
103+
set(_tmp_STAGE "a")
104+
endif()
105+
elseif(_tmp_len EQUAL 5) # A.B.C.D-gEEEEEEEE
106+
set(_tmp_STAGE "a")
107+
list(GET _tmp 3 _tmp_TWEAK)
108+
list(GET _tmp 4 _tmp_COMMIT)
109+
endif()
110+
if(_tmp_TWEAK STREQUAL "") # Is A.B.C-gEEEEEEEE actually A.B.CxD-gEEEEEEEE?
111+
string(REGEX MATCHALL "^([0-9]+)([_a-c]+)([0-9]+)" T_MATCHES "${_tmp_PATCH}")
112+
if(T_MATCHES)
113+
set(_tmp_PATCH ${CMAKE_MATCH_1})
114+
set(_tmp_STAGE ${CMAKE_MATCH_2})
115+
set(_tmp_TWEAK ${CMAKE_MATCH_3})
116+
endif()
117+
endif()
118+
119+
set(${_ARGS_OUTPUT}_MAJOR ${_tmp_MAJOR} PARENT_SCOPE)
120+
set(${_ARGS_OUTPUT}_MINOR ${_tmp_MINOR} PARENT_SCOPE)
121+
set(${_ARGS_OUTPUT}_PATCH ${_tmp_PATCH} PARENT_SCOPE)
122+
set(${_ARGS_OUTPUT}_STAGE ${_tmp_STAGE} PARENT_SCOPE)
123+
set(${_ARGS_OUTPUT}_TWEAK ${_tmp_TWEAK} PARENT_SCOPE)
124+
set(${_ARGS_OUTPUT}_COMMIT ${_tmp_COMMIT} PARENT_SCOPE)
125+
endfunction()
59126

60127
# Check if we are in a git repository.
61128
if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/.git")
129+
set(VERSION_BASE "0.11.0") # Automatic versioning base
130+
set(VERSION_TARGET "0.12.0") # Automatic versioning target
131+
132+
# Parse target version as it is for output.
133+
parse_version_string(OUTPUT "VERSION" INPUT "${VERSION_TARGET}")
134+
62135
# Try and figure out where git is.
63136
find_program(GIT git
64137
PATHS
@@ -69,12 +142,9 @@ if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/.git")
69142
)
70143

71144
if(GIT)
72-
set(GIT_RESULT)
73-
set(GIT_OUTPUT)
74-
set(GIT_ERROR)
75-
145+
# Tweak
76146
execute_process(
77-
COMMAND "${GIT}" describe --tags --long --match "[0-9]*.[0-9]*.[0-9]*" --abbrev=8 HEAD
147+
COMMAND "${GIT}" describe --tags --long --match "${VERSION_BASE}" --abbrev=8 HEAD
78148
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
79149
RESULT_VARIABLE GIT_RESULT
80150
OUTPUT_VARIABLE GIT_OUTPUT
@@ -83,72 +153,51 @@ if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/.git")
83153
ERROR_STRIP_TRAILING_WHITESPACE
84154
ERROR_QUIET
85155
)
86-
87-
if(GIT_RESULT EQUAL 0)
88-
string(REPLACE "-" "." GIT_OUTPUT "${GIT_OUTPUT}")
89-
string(REPLACE "." ";" GIT_OUTPUT "${GIT_OUTPUT}")
90-
91-
# Parse Version
92-
list(GET GIT_OUTPUT 0 VERSION_MAJOR)
93-
list(GET GIT_OUTPUT 1 VERSION_MINOR)
94-
list(GET GIT_OUTPUT 2 VERSION_PATCH)
95-
list(GET GIT_OUTPUT 3 VERSION_TWEAK)
96-
list(GET GIT_OUTPUT 4 VERSION_COMMIT)
97-
98-
# Patch needs additional parsing.
99-
# This may be a [0-9]*[a-z]*[0-9]+ string.
100-
string(REGEX MATCHALL "^([0-9]+)([a-z]+[0-9]+)?" T_MATCHES "${VERSION_PATCH}")
101-
set(VERSION_PATCH "${CMAKE_MATCH_1}")
102-
if(CMAKE_MATCH_2)
103-
set(VERSION_SUFFIX "${CMAKE_MATCH_2}")
104-
else()
105-
set(VERSION_SUFFIX "")
106-
endif()
107-
else()
156+
if(NOT GIT_RESULT EQUAL 0)
108157
message(WARNING "${LOGPREFIX}Failed to detect version, using default instead.")
158+
else()
159+
parse_version_string(OUTPUT "GIT_VERSION" INPUT "${GIT_OUTPUT}")
160+
set(VERSION_STAGE ${GIT_VERSION_STAGE})
161+
set(VERSION_TWEAK ${GIT_VERSION_TWEAK})
162+
set(VERSION_COMMIT ${GIT_VERSION_COMMIT})
163+
endif()
164+
165+
# Is there a tag on the current commit?
166+
execute_process(
167+
COMMAND "${GIT}" tag "--sort=-v:refname" "--points-at" HEAD
168+
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
169+
RESULT_VARIABLE GIT_RESULT
170+
OUTPUT_VARIABLE TAG_OUTPUT
171+
ERROR_VARIABLE GIT_ERROR
172+
OUTPUT_STRIP_TRAILING_WHITESPACE
173+
ERROR_STRIP_TRAILING_WHITESPACE
174+
ERROR_QUIET
175+
)
176+
if((GIT_RESULT EQUAL 0) AND (NOT "${TAG_OUTPUT}" STREQUAL ""))
177+
string(REGEX REPLACE "[\r\n]+.*" "" T_MATCHES "${TAG_OUTPUT}")
178+
parse_version_string(OUTPUT "TAG_VERSION" INPUT "${T_MATCHES}")
179+
set(VERSION_MAJOR "${TAG_VERSION_MAJOR}")
180+
set(VERSION_MINOR "${TAG_VERSION_MINOR}")
181+
set(VERSION_PATCH "${TAG_VERSION_PATCH}")
182+
set(VERSION_STAGE "${TAG_VERSION_STAGE}")
183+
set(VERSION_TWEAK "${TAG_VERSION_TWEAK}")
109184
endif()
110185
endif()
111186
else()
112187
message(STATUS "${LOGPREFIX}Not a git repository, automatic version detection disabled.")
113188
endif()
114189

115190
# Allow manual overrides of the detected version.
116-
set(${PREFIX}VERSION "" CACHE STRING "Override StreamFX version with this string. Format: Major.Minor.Patch[Suffix][-Tweak[-Commit8c]]")
191+
set(${PREFIX}VERSION "" CACHE STRING "Override StreamFX version with this string. Format: Major.Minor.Patch[Stage][Tweak[-Commit8c]]")
117192
if(NOT (${PREFIX}VERSION STREQUAL ""))
118-
string(REPLACE "-" "." T_VERSION "${${PREFIX}VERSION}")
119-
string(REPLACE "." ";" T_VERSION "${${PREFIX}VERSION}")
120-
121-
list(LENGTH T_VERSION T_VERSIONLEN)
122-
list(GET T_VERSION 0 VERSION_MAJOR)
123-
list(GET T_VERSION 1 VERSION_MINOR)
124-
list(GET T_VERSION 2 VERSION_PATCH)
125-
if(T_VERSIONLEN GREATER_EQUAL 3)
126-
list(GET T_VERSION 3 VERSION_TWEAK)
127-
else()
128-
set(VERSION_BUILD 0)
129-
endif()
130-
if(T_VERSIONLEN GREATER_EQUAL 4)
131-
list(GET T_VERSION 4 VERSION_COMMIT)
132-
else()
133-
set(VERSION_COMMIT "")
134-
endif()
135-
136-
# Patch needs additional parsing.
137-
# This may be a [0-9]*[a-z]*[0-9]+ string.
138-
string(REGEX MATCHALL "^([0-9]+)([a-z]+[0-9]+)?" T_MATCHES "${VERSION_PATCH}")
139-
set(VERSION_PATCH "${CMAKE_MATCH_1}")
140-
if(CMAKE_MATCH_2)
141-
set(VERSION_SUFFIX "${CMAKE_MATCH_2}")
142-
else()
143-
set(VERSION_SUFFIX "")
144-
endif()
193+
parse_version_string(OUTPUT "VERSION" INPUT "${${PREFIX}VERSION}")
145194
endif()
146195

147196
# Generate Version String
148-
if(NOT (VERSION_COMMIT STREQUAL ""))
149-
set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_TWEAK}${VERSION_SUFFIX}-${VERSION_COMMIT}")
197+
if(VERSION_COMMIT)
198+
set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_STAGE}${VERSION_TWEAK}-${VERSION_COMMIT}")
150199
else()
151-
set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_TWEAK}${VERSION_SUFFIX}")
200+
set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_STAGE}${VERSION_TWEAK}")
152201
endif()
153202

154203
# Log the detected version.
@@ -157,13 +206,40 @@ message(STATUS "${LOGPREFIX}Version ${VERSION_STRING}")
157206
################################################################################
158207
# Project
159208
################################################################################
209+
set(_VERSION_TWEAK "0${VERSION_TWEAK}")
160210
project(
161211
StreamFX
162-
VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_TWEAK}
212+
VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${_VERSION_TWEAK}
163213
DESCRIPTION "Additional sources, filters, transitions and encoders for OBS Studio."
164214
HOMEPAGE_URL "https://streamfx.xaymar.com/"
165215
)
166216

217+
# Helpers for CI
218+
if(VERSION_STAGE STREQUAL "")
219+
file(
220+
GENERATE
221+
OUTPUT "$<TARGET_PROPERTY:${PROJECT_NAME},BINARY_DIR>/tag_name"
222+
CONTENT "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}"
223+
TARGET ${PROJECT_NAME}
224+
FILE_PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_READ GROUP_EXECUTE
225+
)
226+
else()
227+
file(
228+
GENERATE
229+
OUTPUT "$<TARGET_PROPERTY:${PROJECT_NAME},BINARY_DIR>/tag_name"
230+
CONTENT "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_STAGE}${VERSION_TWEAK}"
231+
TARGET ${PROJECT_NAME}
232+
FILE_PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_READ GROUP_EXECUTE
233+
)
234+
endif()
235+
file(
236+
GENERATE
237+
OUTPUT "$<TARGET_PROPERTY:${PROJECT_NAME},BINARY_DIR>/version"
238+
CONTENT "${VERSION_STRING}"
239+
TARGET ${PROJECT_NAME}
240+
FILE_PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_READ GROUP_EXECUTE
241+
)
242+
167243
# Full Project Name
168244
set(PROJECT_FULL_NAME "StreamFX (for OBS Studio)")
169245

data/locale/en-US.ini

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,10 @@ UI.Updater.GitHubPermission.Text="In order to provide manual or automated update
5959
UI.Updater.Menu.CheckForUpdates="Check for Updates"
6060
UI.Updater.Menu.CheckForUpdates.Automatically="Automatically check for Updates"
6161
UI.Updater.Menu.Channel="Update Channel"
62-
UI.Updater.Menu.Channel.Release="Release"
63-
UI.Updater.Menu.Channel.Testing="Testing"
62+
UI.Updater.Menu.Channel.Stable="Stable"
63+
UI.Updater.Menu.Channel.Candidate="Candidate"
64+
UI.Updater.Menu.Channel.Beta="Beta"
65+
UI.Updater.Menu.Channel.Alpha="Alpha"
6466

6567
# Encoder/AOM-AV1
6668
Encoder.AOM.AV1="AOM AV1 (direct)"

0 commit comments

Comments
 (0)