1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
--!A cross-platform build utility based on Lua
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
--
-- Copyright (C) 2015 - 2019, TBOOX Open Source Group.
--
-- @author ruki
-- @file winos.lua
--
-- define module: winos
local winos = winos or {}
-- load modules
local os = require("base/os")
local semver = require("base/semver")
-- get windows version from name
function winos._version_from_name(name)
-- make defined values
winos._VERSIONS = winos._VERSIONS or
{
nt4 = "4.0"
, win2k = "5.0"
, winxp = "5.1"
, ws03 = "5.2"
, win6 = "6.0"
, vista = "6.0"
, ws08 = "6.0"
, longhorn = "6.0"
, win7 = "6.1"
, win8 = "6.2"
, winblue = "6.3"
, win81 = "6.3"
, win10 = "10.0"
}
return winos._VERSIONS[name]
end
-- v1 == v2 with name (winxp, win10, ..)?
function winos._version_eq(self, version)
if type(version) == "string" then
local namever = winos._version_from_name(version)
if namever then
return semver.compare(self:major() .. '.' .. self:minor(), namever) == 0
else
return semver.compare(self:rawstr(), version) == 0
end
elseif type(version) == "table" then
return semver.compare(self:rawstr(), version:rawstr()) == 0
end
end
-- v1 < v2 with name (winxp, win10, ..)?
function winos._version_lt(self, version)
if type(version) == "string" then
local namever = winos._version_from_name(version)
if namever then
return semver.compare(self:major() .. '.' .. self:minor(), namever) < 0
else
return semver.compare(self:rawstr(), version) < 0
end
elseif type(version) == "table" then
return semver.compare(self:rawstr(), version:rawstr()) < 0
end
end
-- v1 <= v2 with name (winxp, win10, ..)?
function winos._version_le(self, version)
if type(version) == "string" then
local namever = winos._version_from_name(version)
if namever then
return semver.compare(self:major() .. '.' .. self:minor(), namever) <= 0
else
return semver.compare(self:rawstr(), version) <= 0
end
elseif type(version) == "table" then
return semver.compare(self:rawstr(), version:rawstr()) <= 0
end
end
-- get system version
function winos.version()
-- get it from cache first
if winos._VERSION ~= nil then
return winos._VERSION
end
-- get winver
local winver = nil
local ok, verstr = os.iorun("cmd /c ver")
if ok and verstr then
winver = verstr:match("%[.-(%d+%.%d+%.%d+)]")
if winver then
winver = winver:trim()
end
winver = semver.new(winver)
end
-- rewrite comparator
if winver then
winver.eq = winos._version_eq
winver.lt = winos._version_lt
winver.le = winos._version_le
end
-- save to cache
winos._VERSION = winver or false
-- done
return winver
end
-- return module: winos
return winos
|