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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
--!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-present, Xmake Open Source Community.
--
-- @author ruki
-- @file statistics.lua
--
-- imports
import("core.base.option")
import("core.base.process")
import("core.project.config")
import("core.platform.platform")
import("utils.ci.is_running", {alias = "ci_is_running"})
import("private.action.update.fetch_version")
import("private.action.require.impl.packagenv")
-- statistics is enabled?
function _is_enabled()
-- disable statistics? need not post it
local stats = (os.getenv("XMAKE_STATS") or ""):lower()
if option.boolean(stats) == false then
return false
end
-- is running on ci(travis/appveyor/...)? need not post it
if ci_is_running() then
os.setenv("XMAKE_STATS", "false")
return false
end
return true
end
-- post statistics info and only post once everyday when building each project
--
-- clone the xmake-stats(only an empty repo) to update the traffic(git clones) info in github
--
-- the traffic info in github (just be approximate numbers):
--
-- Clones: the number of projects which build using xmake everyday
-- Unique cloners: the number of users everyday
--
function post()
-- enter project directory
local oldir = os.cd(os.projectdir())
-- get the project directory name
local projectname = path.basename(os.projectdir())
-- has been posted today or statistics is disable?
local outputdir = path.join(os.tmpdir(), "stats", os.date("%y%m%d"), projectname)
local markfile = outputdir .. ".mark"
if os.isdir(outputdir) or os.isfile(markfile) or not _is_enabled() then
return
end
-- mark as posted first, avoid posting it repeatly
io.writefile(markfile, "ok")
-- init argument list
local argv = {"lua", path.join(os.scriptdir(), "statistics.lua")}
for _, name in ipairs({"root", "file", "project", "diagnosis", "verbose", "quiet", "yes", "confirm"}) do
local value = option.get(name)
if type(value) == "string" then
table.insert(argv, "--" .. name .. "=" .. value)
elseif value then
table.insert(argv, "--" .. name)
end
end
-- try to post it in background
try
{
function ()
process.openv(os.programfile(), argv, {stdout = path.join(os.tmpdir(), projectname .. ".stats.log"), detach = true}):close()
end
}
-- leave project directory
os.cd(oldir)
end
-- the main function
function main()
-- in project?
if not os.isfile(os.projectfile()) then
return
end
-- load config
config.load()
-- load platform
platform.load(config.plat())
-- enter the environments of git
local oldenvs = packagenv.enter("git")
-- get the project directory name
local projectname = path.basename(os.projectdir())
-- clone the xmake-stats repo to update the traffic(git clones) info in github
local outputdir = path.join(os.tmpdir(), "stats", os.date("%y%m%d"), projectname)
if not os.isdir(outputdir) then
try
{
function ()
import("devel.git.clone")
clone("https://github.com/xmake-io/xmake-stats.git", {depth = 1, branch = "master", outputdir = outputdir})
print("post to traffic ok!")
end
}
end
-- fetch the latest version
local versionfile = path.join(os.tmpdir(), "latest_version")
if not os.isfile(versionfile) then
local fetchinfo = try { function () return fetch_version() end }
if fetchinfo then
io.save(versionfile, fetchinfo)
end
end
-- leave the environments of git
os.setenvs(oldenvs)
end
|