@@ -3,21 +3,23 @@ local Process = require("lazy.manage.process")
3
3
4
4
--- @class LazyTaskDef
5
5
--- @field skip ? fun ( plugin : LazyPlugin , opts ?: TaskOptions ): any ?
6
- --- @field run fun ( task : LazyTask , opts : TaskOptions )
6
+ --- @field run async fun ( task : LazyTask , opts : TaskOptions )
7
7
8
8
--- @alias LazyTaskFn async fun ( task : LazyTask , opts : TaskOptions )
9
9
10
+ --- @class LazyMsg
11
+ --- @field msg string
12
+ --- @field level ? number
13
+
10
14
--- @class LazyTask
11
15
--- @field plugin LazyPlugin
12
16
--- @field name string
13
- --- @field output string
14
- --- @field status string
15
- --- @field error ? string
16
- --- @field warn ? string
17
+ --- @field private _log LazyMsg[]
17
18
--- @field private _started ? number
18
19
--- @field private _ended ? number
19
20
--- @field private _opts TaskOptions
20
21
--- @field private _running Async
22
+ --- @field private _level number
21
23
local Task = {}
22
24
23
25
--- @class TaskOptions : {[string ]: any }
@@ -30,10 +32,10 @@ local Task = {}
30
32
function Task .new (plugin , name , task , opts )
31
33
local self = setmetatable ({}, { __index = Task })
32
34
self ._opts = opts or {}
35
+ self ._log = {}
36
+ self ._level = vim .log .levels .TRACE
33
37
self .plugin = plugin
34
38
self .name = name
35
- self .output = " "
36
- self .status = " "
37
39
--- @param other LazyTask
38
40
plugin ._ .tasks = vim .tbl_filter (function (other )
39
41
return other .name ~= name or other :is_running ()
@@ -43,6 +45,31 @@ function Task.new(plugin, name, task, opts)
43
45
return self
44
46
end
45
47
48
+ --- @param level ? number
49
+ --- @return LazyMsg[]
50
+ function Task :get_log (level )
51
+ level = level or vim .log .levels .DEBUG
52
+ return vim .tbl_filter (function (msg )
53
+ return msg .level >= level
54
+ end , self ._log )
55
+ end
56
+
57
+ --- @param level ? number
58
+ function Task :output (level )
59
+ return table.concat (
60
+ --- @param m LazyMsg
61
+ vim .tbl_map (function (m )
62
+ return m .msg
63
+ end , self :get_log (level )),
64
+ " \n "
65
+ )
66
+ end
67
+
68
+ function Task :status ()
69
+ local ret = self ._log [# self ._log ]
70
+ return ret and ret .msg or " "
71
+ end
72
+
46
73
function Task :has_started ()
47
74
return self ._started ~= nil
48
75
end
@@ -55,6 +82,14 @@ function Task:is_running()
55
82
return not self :has_ended ()
56
83
end
57
84
85
+ function Task :has_errors ()
86
+ return self ._level >= vim .log .levels .ERROR
87
+ end
88
+
89
+ function Task :has_warnings ()
90
+ return self ._level >= vim .log .levels .WARN
91
+ end
92
+
58
93
--- @private
59
94
--- @param task LazyTaskFn
60
95
function Task :_start (task )
@@ -70,36 +105,33 @@ function Task:_start(task)
70
105
self :_done ()
71
106
end ,
72
107
on_error = function (err )
73
- self :notify_error (err )
108
+ self :error (err )
74
109
end ,
75
110
on_yield = function (res )
76
- self :notify (res )
111
+ self :log (res )
77
112
end ,
78
113
})
79
114
end
80
115
81
116
--- @param msg string | string[]
82
- --- @param severity ? vim.diagnostic.Severity
83
- function Task :notify (msg , severity )
84
- local var = severity == vim .diagnostic .severity .ERROR and " error"
85
- or severity == vim .diagnostic .severity .WARN and " warn"
86
- or " output"
117
+ --- @param level ? number
118
+ function Task :log (msg , level )
119
+ level = level or vim .log .levels .DEBUG
120
+ self ._level = math.max (self ._level or 0 , level or 0 )
87
121
msg = type (msg ) == " table" and table.concat (msg , " \n " ) or msg
88
122
--- @cast msg string
89
- --- @diagnostic disable-next-line : no-unknown
90
- self [var ] = self [var ] and (self [var ] .. " \n " .. msg ) or msg
91
- self .status = msg
123
+ table.insert (self ._log , { msg = msg , level = level })
92
124
vim .api .nvim_exec_autocmds (" User" , { pattern = " LazyRender" , modeline = false })
93
125
end
94
126
95
127
--- @param msg string | string[]
96
- function Task :notify_error (msg )
97
- self :notify (msg , vim .diagnostic . severity .ERROR )
128
+ function Task :error (msg )
129
+ self :log (msg , vim .log . levels .ERROR )
98
130
end
99
131
100
132
--- @param msg string | string[]
101
- function Task :notify_warn (msg )
102
- self :notify (msg , vim .diagnostic . severity .WARN )
133
+ function Task :warn (msg )
134
+ self :log (msg , vim .log . levels .WARN )
103
135
end
104
136
105
137
--- @private
@@ -141,20 +173,16 @@ function Task:spawn(cmd, opts)
141
173
local on_exit = opts .on_exit
142
174
143
175
function opts .on_line (line )
144
- self . status = line
176
+ self : log ( line , vim . log . levels . TRACE )
145
177
if on_line then
146
178
pcall (on_line , line )
147
179
end
148
- vim .api .nvim_exec_autocmds (" User" , { pattern = " LazyRender" , modeline = false })
149
180
end
150
181
151
182
local running = true
152
183
--- @param output string
153
184
function opts .on_exit (ok , output )
154
- self .output = self .output .. output
155
- if not ok then
156
- self .error = self .error and (self .error .. " \n " .. output ) or output
157
- end
185
+ self :log (output , ok and vim .log .levels .DEBUG or vim .log .levels .ERROR )
158
186
if on_exit then
159
187
pcall (on_exit , ok , output )
160
188
end
0 commit comments