mirror of
https://github.com/koreader/koreader
synced 2024-10-31 21:20:20 +00:00
efd2df6f05
This PR will close #1257 and #3418.
135 lines
4.5 KiB
Lua
135 lines
4.5 KiB
Lua
--[[--
|
|
This module helps with retrieving version information.
|
|
]]
|
|
|
|
local VERSION_LOG_FILE = "version.log"
|
|
|
|
local Version = {}
|
|
|
|
--- Returns current KOReader git-rev.
|
|
-- @treturn string full KOReader git-rev such as `v2015.11-982-g704d4238`
|
|
function Version:getCurrentRevision()
|
|
if not self.rev then
|
|
local rev_file = io.open("git-rev", "r")
|
|
if rev_file then
|
|
self.rev = rev_file:read("*line")
|
|
rev_file:close()
|
|
end
|
|
-- sanity check in case `git describe` failed
|
|
if self.rev == "fatal: No names found, cannot describe anything." then
|
|
self.rev = nil
|
|
end
|
|
end
|
|
return self.rev
|
|
end
|
|
|
|
--- Returns normalized version of KOReader git-rev input string.
|
|
-- @string rev full KOReader git-rev such as `v2015.11-982-g704d4238`
|
|
-- @treturn int version in the form of a 10 digit number such as `2015110982`
|
|
-- @treturn string short git commit version hash such as `704d4238`
|
|
function Version:getNormalizedVersion(rev)
|
|
if not rev then return end
|
|
local year, month, point, revision = rev:match("v(%d%d%d%d)%.(%d%d)%.?(%d?%d?)-?(%d*)")
|
|
|
|
year = tonumber(year)
|
|
month = tonumber(month)
|
|
point = tonumber(point)
|
|
revision = tonumber(revision)
|
|
|
|
local commit = rev:match("-%d*-g(%x*)[%d_%-]*")
|
|
-- NOTE: * 10000 to handle at most 9999 commits since last tag ;).
|
|
return ((year or 0) * 100 + (month or 0)) * 1000000 + (point or 0) * 10000 + (revision or 0), commit
|
|
end
|
|
|
|
--- Returns current version of KOReader.
|
|
-- @treturn int version in the form of a 10 digit number such as `2015110982`
|
|
-- @treturn string short git commit version hash such as `704d4238`
|
|
-- @see getNormalizedVersion
|
|
function Version:getNormalizedCurrentVersion()
|
|
if not self.version or not self.commit then
|
|
self.version, self.commit = self:getNormalizedVersion(self:getCurrentRevision())
|
|
end
|
|
return self.version, self.commit
|
|
end
|
|
|
|
--- Returns current version of KOReader, in short form.
|
|
-- @treturn string version, without the git details (i.e., at most YYYY.MM.P-R)
|
|
function Version:getShortVersion()
|
|
if not self.short then
|
|
local rev = self:getCurrentRevision()
|
|
if (not rev or rev == "") then return "unknown" end
|
|
local year, month, point, revision = rev:match("v(%d%d%d%d)%.(%d%d)%.?(%d?%d?)-?(%d*)")
|
|
self.short = year .. "." .. month
|
|
if point and point ~= "" then
|
|
self.short = self.short .. "." .. point
|
|
end
|
|
if revision and revision ~= "" then
|
|
self.short = self.short .. "-" .. revision
|
|
end
|
|
end
|
|
return self.short
|
|
end
|
|
|
|
--- Returns the release date of the current version of KOReader, YYYYmmdd, in UTC.
|
|
--- Technically closer to the build date, but close enough where official builds are concerned ;).
|
|
-- @treturn int date
|
|
function Version:getBuildDate()
|
|
if not self.date then
|
|
local lfs = require("libs/libkoreader-lfs")
|
|
local mtime = lfs.attributes("git-rev", "modification")
|
|
if mtime then
|
|
local ts = os.date("!%Y%m%d", mtime)
|
|
self.date = tonumber(ts) or 0
|
|
else
|
|
-- No git-rev file?
|
|
self.date = 0
|
|
end
|
|
end
|
|
return self.date
|
|
end
|
|
|
|
--- Get last line in `VERSION_LOG_FILE`.
|
|
-- @treturn last line in `VERSION_LOG_FILE` or an empty string
|
|
function Version:getLastLogLine()
|
|
local log_file = io.open(VERSION_LOG_FILE, "r")
|
|
local last_log_line
|
|
if log_file then
|
|
for line in log_file:lines() do
|
|
last_log_line = line
|
|
end
|
|
log_file:close()
|
|
end
|
|
|
|
return last_log_line or ""
|
|
end
|
|
|
|
--- Append text to a `VERSION_LOG_FILE`.
|
|
-- @string text text to be appended
|
|
function Version:appendToLogFile(text)
|
|
local log_file = io.open(VERSION_LOG_FILE, "a")
|
|
if not log_file then
|
|
return
|
|
end
|
|
log_file:write(text, "\n")
|
|
log_file:close()
|
|
return true
|
|
end
|
|
|
|
--- Updates `VERSION_LOG_FILE` and keep the file small
|
|
-- @string model device model (may contain spaces)
|
|
function Version:updateVersionLog(current_model)
|
|
local last_line = Version:getLastLogLine()
|
|
|
|
local dummy, dummy, last_version, last_model = last_line:match("(.-), (.-), (.-), (.-)$")
|
|
self.last_version = last_version or "last version not found"
|
|
self.last_model = last_model or "last model not found"
|
|
|
|
if self.rev ~= last_version or current_model ~= last_model then
|
|
-- Appends KOReader git-rev, model and current date to the `VERSION_LOG_FILE`
|
|
-- in the format 'YYYY-mm-dd, HH:MM:SS, git-rev, model'
|
|
self:appendToLogFile(os.date("%Y-%m-%d, %X, ") .. self.rev .. ", " .. current_model)
|
|
end
|
|
end
|
|
|
|
return Version
|