Skip to content

Commit

Permalink
Add logging
Browse files Browse the repository at this point in the history
  • Loading branch information
erichlf committed Jun 4, 2024
1 parent 57b284d commit 9752059
Show file tree
Hide file tree
Showing 7 changed files with 189 additions and 28 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,6 @@ make test
(`:DevcontainerUp<cr>`) is closed when the process finishes successfully.
4. [x] [Give the possibility of defining custom dotfiles when setting up the devcontainer](https://github.com/erichlf/devcontainer-cli.nvim/issues/1)
5. [x] Add unit tests using plenary.busted lua module.
6. [ ] The logs printed in the floating window when preparing the Devcontainer
6. [x] The logs printed in the floating window when preparing the Devcontainer
are saved and easy to access.
7. [x] Convert bash scripts in lua code.
3 changes: 3 additions & 0 deletions lua/devcontainer-cli/config.lua
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-- SOFTWARE.
local log = require("devcontainer-cli.log")

local ConfigModule = {}
local file_path = debug.getinfo(1).source:sub(2)
Expand Down Expand Up @@ -54,8 +55,10 @@ local default_config = {
local options

function ConfigModule.setup(opts)
log.debug("Configuring devcontainer-cli")
opts = vim.tbl_deep_extend("force", default_config, opts or {})
options = opts
log.debug("Configuring devcontainer-cli complete")
end

return setmetatable(ConfigModule,
Expand Down
7 changes: 4 additions & 3 deletions lua/devcontainer-cli/devcontainer_cli.lua
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,11 @@
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-- SOFTWARE.
local utils = require("devcontainer-cli.devcontainer_utils")
local utils = require("devcontainer-cli.devcontainer_utils")
local terminal = require("devcontainer-cli.terminal")
local log = require("devcontainer-cli.log")

local M = {}
local M = {}

-- executes a given command in the devcontainer of the current project directory
---@param opts (table) options for executing the command
Expand Down Expand Up @@ -64,7 +65,7 @@ end
-- neovim window the devcontainer will be automatically open in a new terminal
function M.connect()
if not utils.create_connect_cmd() then
vim.notify("Failed to create autocommand", vim.log.levels.ERROR)
log.error("Failed to create autocommand")
return
end

Expand Down
7 changes: 3 additions & 4 deletions lua/devcontainer-cli/health.lua
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,9 @@

local M = {}

local start = vim.health.start or vim.health.report_start
local ok = vim.health.ok or vim.health.report_ok
local warn = vim.health.warn or vim.health.report_warn
local error = vim.health.error or vim.health.report_error
local start = vim.health.start or vim.health.start
local ok = vim.health.ok or vim.health.ok
local error = vim.health.error or vim.health.error

local function verify_binary(binary_name)
if vim.fn.executable(binary_name) ~= 1 then
Expand Down
8 changes: 6 additions & 2 deletions lua/devcontainer-cli/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,16 @@ local M = {}

local devcontainer_cli = require("devcontainer-cli.devcontainer_cli")
local config = require("devcontainer-cli.config")
local log = require("devcontainer-cli.log")

-- setup the devcontainer-cli plugin
---@param opts (table) the options to set (see config/init.lua)
function M.setup(opts)
config.setup(opts)

configured = true
log.debug("Setting up devcontainer-cli")
config.setup(opts)

log.debug("Creating devcontainer-cli user commands")
-- Docker
vim.api.nvim_create_user_command(
"DevcontainerUp",
Expand Down Expand Up @@ -66,6 +68,8 @@ function M.setup(opts)
desc = "Connect to devcontainer.",
}
)

log.debug("Finished setting up devcontainer-cli")
end

return M
156 changes: 156 additions & 0 deletions lua/devcontainer-cli/log.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
-- log.lua
--
-- Inspired by rxi/log.lua
-- Modified by tjdevries and can be found at github.com/tjdevries/vlog.nvim
--
-- This library is free software; you can redistribute it and/or modify it
-- under the terms of the MIT license. See LICENSE for details.

-- User configuration section
local default_config = {
-- Name of the plugin. Prepended to log messages
plugin = 'decontainer-cli',

-- Should print the output to neovim while running
use_console = true,

-- Should highlighting be used in console (using echohl)
highlights = true,

-- Should write to a file
use_file = true,

-- Any messages above this level will be logged.
level = "debug",

-- Level configuration
modes = {
{ name = "trace", hl = "Comment", },
{ name = "debug", hl = "Comment", },
{ name = "info", hl = "None", },
{ name = "warn", hl = "WarningMsg", },
{ name = "error", hl = "ErrorMsg", },
{ name = "fatal", hl = "ErrorMsg", },
},

-- Can limit the number of decimals displayed for floats
float_precision = 0.01,
}

-- {{{ NO NEED TO CHANGE
local log = {}

local unpack = unpack or table.unpack

log.new = function(config, standalone)
config = vim.tbl_deep_extend("force", default_config, config)

local outfile = string.format('%s/%s.log', vim.fn.stdpath("cache"), config.plugin)

local obj
if standalone then
obj = log
else
obj = {}
end

local levels = {}
for i, v in ipairs(config.modes) do
levels[v.name] = i
end

local round = function(x, increment)
increment = increment or 1
x = x / increment
return (x > 0 and math.floor(x + .5) or math.ceil(x - .5)) * increment
end

local make_string = function(...)
local t = {}
for i = 1, select('#', ...) do
local x = select(i, ...)

if type(x) == "number" and config.float_precision then
x = tostring(round(x, config.float_precision))
elseif type(x) == "table" then
x = vim.inspect(x)
else
x = tostring(x)
end

t[#t + 1] = x
end
return table.concat(t, " ")
end


local log_at_level = function(level, level_config, message_maker, ...)
-- Return early if we're below the config.level
if level < levels[config.level] then
return
end
local nameupper = level_config.name:upper()

local msg = message_maker(...)
local info = debug.getinfo(2, "Sl")
local lineinfo = info.short_src .. ":" .. info.currentline

-- Output to console
if config.use_console then
local console_string = string.format(
"[%-6s%s] %s: %s",
nameupper,
os.date("%H:%M:%S"),
lineinfo,
msg
)

if config.highlights and level_config.hl then
vim.cmd(string.format("echohl %s", level_config.hl))
end

local split_console = vim.split(console_string, "\n")
for _, v in ipairs(split_console) do
vim.cmd(string.format([[echom "[%s] %s"]], config.plugin, vim.fn.escape(v, '"')))
end

if config.highlights and level_config.hl then
vim.cmd("echohl NONE")
end
end

-- Output to log file
if config.use_file then
local fp = io.open(outfile, "a")
local str = string.format("[%-6s%s] %s: %s\n",
nameupper, os.date(), lineinfo, msg)
if fp ~= nil then
fp:write(str)
fp:close()
end
end
end

for i, x in ipairs(config.modes) do
obj[x.name] = function(...)
return log_at_level(i, x, make_string, ...)
end

obj[("fmt_%s" ):format(x.name)] = function()
return log_at_level(i, x, function(...)
local passed = {...}
local fmt = table.remove(passed, 1)
local inspected = {}
for _, v in ipairs(passed) do
table.insert(inspected, vim.inspect(v))
end
return string.format(fmt, unpack(inspected))
end)
end
end
end

log.new(default_config, true)
-- }}}

return log
34 changes: 16 additions & 18 deletions lua/devcontainer-cli/terminal.lua
Original file line number Diff line number Diff line change
@@ -1,46 +1,44 @@
local config = require("devcontainer-cli.config")
local folder_utils = require("devcontainer-cli.folder_utils")
local config = require("devcontainer-cli.config")
local folder_utils = require("devcontainer-cli.folder_utils")
local log = require("devcontainer-cli.log")

local Terminal = require('toggleterm.terminal').Terminal
local mode = require('toggleterm.terminal').mode
local Terminal = require('toggleterm.terminal').Terminal
local mode = require('toggleterm.terminal').mode

local M = {}
local M = {}

-- valid window directions
M.directions = {
M.directions = {
"float",
"horizontal",
"tab",
"vertical",
}

-- window management variables
local _terminal = nil
local _terminal = nil

-- when the created window detaches set things back to -1
local _on_detach = function()
local _on_detach = function()
_terminal = nil
end

-- on_fail callback
---@param exit_code (number) the exit code from the failed job
local _on_fail = function(exit_code)
vim.notify(
"Devcontainer process has failed! exit_code: " .. exit_code,
vim.log.levels.ERROR
)
local _on_fail = function(exit_code)
log.error("Devcontainer process has failed! exit_code: " .. exit_code)

vim.cmd("silent! :checktime")
end

local _on_success = function()
vim.notify("Devcontainer process succeeded!", vim.log.levels.INFO)
local _on_success = function()
log.INFO("Devcontainer process succeeded!")
end

-- on_exit callback function to delete the open buffer when devcontainer exits
-- in a neovim terminal
---@param code (number) the exit code
local _on_exit = function(code)
local _on_exit = function(code)
if code == 0 then
_on_success()
return
Expand All @@ -49,7 +47,7 @@ local _on_exit = function(code)
_on_fail(code)
end

local _on_open = function(term)
local _on_open = function(term)
-- ensure that we are not in insert mode
vim.cmd("stopinsert")
vim.api.nvim_buf_set_keymap(
Expand Down Expand Up @@ -90,7 +88,7 @@ M.columns = config.terminal_columns
function M.spawn(cmd, direction, size)
direction = vim.F.if_nil(direction, "float")
if tableContains(M.directions, direction) == false then
vim.notify("Invalid direction: " .. direction, vim.log.levels.ERROR)
log.error("Invalid direction: " .. direction)
return
end

Expand Down

0 comments on commit 9752059

Please sign in to comment.