principia/utils/set_version.lua

244 lines
6.6 KiB
Lua

#!/usr/bin/luajit
-- set_version.lua: Helper script for updating Principia version info.
-- Helper functions
--------------------------------------------------------------------------------
-- Split string on separator
local function split(inputstr, sep)
local t = {}
for str in string.gmatch(inputstr, '([^'..sep..']+)') do
table.insert(t, str)
end
return t
end
-- Split up a version name into a table with digits.
local function split_vername(vername)
-- Also trim any trash we may have on the version name.
return split(vername:gsub(' Beta', ''):gsub('%s+', ''), '.')
end
-- Turn a version table with digits into a combined string.
local function combine_verdigits(verdigits)
return verdigits[1]..'.'..verdigits[2]..'.'..verdigits[3]
end
-- Read lines into a table from a filepath.
local function read_lines_from_file(path)
local file = io.open(path, 'r')
local filecontent = {}
for line in file:lines() do
filecontent[#filecontent+1] = line
end
file:close()
return filecontent
end
-- Write lines as a table to a filepath.
local function write_lines_to_file(path, lines)
local file = io.open(path, 'w')
file:write(table.concat(lines, "\n").."\n")
file:close()
end
-- Just write a string to a file.
local function write_to_file(path, text)
local file = io.open(path, 'w')
file:write(text)
file:close()
end
-- Replace lines that contain 'needle' in them.
--
-- **Arguments:**
-- - `lines`: Table of lines, which will be modified in-place by the function
-- - `replaces`: Table of replacements, the key is the needle that will be
-- checked for in the line, and the value is the replacement string FOR
-- THE ENTIRE LINE!
local function lines_replace(lines, replaces)
for i,line in ipairs(lines) do
for needle,replacement in pairs(replaces) do
if line:find(needle) then
lines[i] = replacement
end
end
end
end
-- Functions for writing to files to update version information...
--------------------------------------------------------------------------------
local version_info_txt = 'packaging/version_info.txt'
local gradle_build = 'build-android/principia/build.gradle'
local nsi_file = 'packaging/principia_install.nsi'
local rc_file = 'packaging/principia.rc'
-- Read the current version info from version_info.txt
local function read_version_info()
local file = io.open(version_info_txt)
local current_version = {}
local i = 1
for line in file:lines() do
if i == 2 then current_version.code = line end
if i == 3 then current_version.name = line end
i = i + 1
end
return current_version
end
-- Write `verinfo` into version_info.txt
local function write_version_info(verinfo)
print("Writing version_info.txt...")
write_lines_to_file(version_info_txt, {
'# This file is used by set_version.lua to keep track of version info.'
..' DO NOT EDIT IT MANUALLY, USE THE SCRIPT!',
verinfo.code, verinfo.name
})
end
-- Update the version code and version name in the Android Gradle build file.
local function update_android_version(verinfo)
print("Updating Android version metadata...")
local lines = read_lines_from_file(gradle_build)
lines_replace(lines, {
['versionCode'] = ' versionCode '..verinfo.code,
['versionName'] = ' versionName "'..verinfo.name..'"'
})
write_lines_to_file(gradle_build, lines)
end
-- Write the version with the appropriate version info (`version.hh`).
local function write_version_header(verinfo)
print("Writing version header...")
local content = string.format([[
#pragma once
#ifdef DEBUG
#define VER_EXTRA " [Debug]"
#else
#define VER_EXTRA
#endif
#define PRINCIPIA_VERSION_CODE %s
#define PRINCIPIA_VERSION_STRING "%s" VER_EXTRA
]], verinfo.code, verinfo.name)
write_to_file('src/src/version.hh', content)
end
-- Update version info in the Windows NSIS installer file (`principia_install.nsi`).
local function update_nsis_version(verinfo)
print("Updating NSIS installer version...")
local verdigits = split_vername(verinfo.name)
local lines = read_lines_from_file(nsi_file)
lines_replace(lines, {
['!define VER_MAJOR'] = '!define VER_MAJOR '..verdigits[1],
['!define VER_MINOR'] = '!define VER_MINOR '..verdigits[2],
['!define VER_BUILD'] = '!define VER_BUILD '..verdigits[3],
['!define VERSION'] = '!define VERSION "' ..verinfo.name..'"',
})
write_lines_to_file(nsi_file, lines)
end
-- Update version info in the Windows executable resource file (`principia.rc`)
local function update_windows_resource(verinfo)
print("Updating Windows resource file...")
local verdigits = split_vername(verinfo.name)
local lines = read_lines_from_file(rc_file)
lines_replace(lines, {
['#define VER_MAJOR'] = '#define VER_MAJOR '..verdigits[1],
['#define VER_MINOR'] = '#define VER_MINOR '..verdigits[2],
['#define VER_PATCH'] = '#define VER_PATCH '..verdigits[3],
['#define VER_STRING'] =
'#define VER_STRING "'..combine_verdigits(verdigits)..'"',
['#define PRODUCT_VER_STRING'] =
'#define PRODUCT_VER_STRING "'..verinfo.name..'"'
})
write_lines_to_file(rc_file, lines)
end
-- Entrypoint functions...
--------------------------------------------------------------------------------
-- Main local function
local function main()
print("set_version.lua - Helper script for updating Principia version info")
print("-------------------------------------------------------------------")
local cur_version_info = read_version_info()
print("- Current version code: "..cur_version_info.code)
print("- Current version name: "..cur_version_info.name)
local newver = {}
print("\nInput the new version code: ")
newver.code = io.read('*l')
print("Input the new version name: ")
newver.name = io.read('*l')
if newver.code == '' or newver.name == '' then
print("Empty inputs, aborting.")
return
end
print("")
update_android_version(newver)
write_version_header(newver)
update_nsis_version(newver)
update_windows_resource(newver)
write_version_info(newver)
print("")
print("Done. Check the changes with git diff and commit when you're ready.")
print("For more information about making a new Principia release see")
print("https://principia-web.se/wiki/Making_a_Release")
end
local function test()
print("Running set_version.lua tests...")
-- Test by setting a custom version and then resetting,
-- there should be no results in the Git diff by this if it works.
local versions = {
{code = 621, name = '6.2.1'},
read_version_info()
}
for _,ver in ipairs(versions) do
print("Setting to: ", ver.code, ver.name)
update_android_version(ver)
write_version_header(ver)
update_nsis_version(ver)
update_windows_resource(ver)
write_version_info(ver)
end
end
if #arg == 0 then
main()
elseif #arg == 1 and arg[1] == "run_test_func" then
test()
end