summaryrefslogtreecommitdiff
path: root/xmake/modules/private/utils/statistics.lua
blob: 4672f4d82412a57659674333aee8afbd05444450 (plain)
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 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