summaryrefslogtreecommitdiff
path: root/utils/ci
diff options
context:
space:
mode:
authorkylo252 <[email protected]>2022-06-23 16:12:26 +0200
committerkylo252 <[email protected]>2022-06-23 16:12:26 +0200
commit57bebb5c51a4e93b283a5c65563254b9bfb492cf (patch)
tree8a6f0a3596e534002833038bea79d5ede57dc563 /utils/ci
parentf1a672f8674f68d6a610b95fef29ed15339b3cbd (diff)
parent8989984b781367b2744c4857e73d8943311db241 (diff)
Merge branch 'rolling'
Diffstat (limited to 'utils/ci')
-rw-r--r--utils/ci/generate_new_lockfile.lua35
-rw-r--r--utils/ci/verify_plugins.lua134
-rw-r--r--utils/ci/verify_plugins.sh5
3 files changed, 157 insertions, 17 deletions
diff --git a/utils/ci/generate_new_lockfile.lua b/utils/ci/generate_new_lockfile.lua
index 9f274597..fd10775c 100644
--- a/utils/ci/generate_new_lockfile.lua
+++ b/utils/ci/generate_new_lockfile.lua
@@ -1,18 +1,18 @@
local sp = os.getenv "SNAPSHOT_PATH"
local function call_proc(process, opts, cb)
- local std_output = ""
- local error_output = ""
-
- local function onread(_, is_stderr)
- return function(err, data)
- if data then
- if is_stderr then
- error_output = (error_output or "") .. err
- else
- std_output = (std_output or "") .. data
- end
- end
+ local output, error_output = "", ""
+ local handle_stdout = function(err, chunk)
+ assert(not err, err)
+ if chunk then
+ output = output .. chunk
+ end
+ end
+
+ local handle_stderr = function(err, chunk)
+ assert(not err, err)
+ if chunk then
+ error_output = error_output .. chunk
end
end
@@ -26,7 +26,7 @@ local function call_proc(process, opts, cb)
handle = uv.spawn(
process,
- { args = opts.args, cwd = uv.cwd(), stdio = stdio },
+ { args = opts.args, cwd = opts.cwd or uv.cwd(), stdio = stdio },
vim.schedule_wrap(function(code)
if code ~= 0 then
stdout:read_stop()
@@ -42,13 +42,13 @@ local function call_proc(process, opts, cb)
end
check:stop()
handle:close()
- cb(code, std_output, error_output)
+ cb(code, output, error_output)
end)
end)
)
- uv.read_start(stdout, onread(handle, false))
- uv.read_start(stderr, onread(handle, true))
+ uv.read_start(stdout, handle_stdout)
+ uv.read_start(stderr, handle_stderr)
return handle
end
@@ -91,11 +91,12 @@ local function write_lockfile(verbose)
end
local handle = call_proc("git", { args = { "ls-remote", entry.url, "HEAD" } }, on_done)
+ assert(handle)
table.insert(active_jobs, handle)
end
print("active: " .. #active_jobs)
- print("parsers: " .. #default_plugins)
+ print("plugins: " .. #default_plugins)
vim.wait(#active_jobs * 60 * 1000, function()
return completed == #active_jobs
diff --git a/utils/ci/verify_plugins.lua b/utils/ci/verify_plugins.lua
new file mode 100644
index 00000000..c56d85d1
--- /dev/null
+++ b/utils/ci/verify_plugins.lua
@@ -0,0 +1,134 @@
+local completed = 0
+local collection = {}
+local active_jobs = {}
+
+local fmt = string.format
+local core_plugins = require "lvim.plugins"
+
+local default_snapshot_path = join_paths(get_lvim_base_dir(), "snapshots", "default.json")
+local fd = io.open(default_snapshot_path, "rb")
+local content
+if fd then
+ content = fd:read "*a"
+end
+local default_sha1 = vim.json.decode(content)
+
+local get_short_name = function(spec)
+ return spec[1]:match "/(%S*)"
+end
+
+local get_default_sha1 = function(spec)
+ local short_name, _ = get_short_name(spec)
+ assert(default_sha1[short_name])
+ return default_sha1[short_name].commit
+end
+
+local is_directory = require("lvim.utils").is_directory
+-- see packer.init()
+local packdir = join_paths(get_runtime_dir(), "site", "pack", "packer")
+local packer_config = { opt_dir = join_paths(packdir, "opt"), start_dir = join_paths(packdir, "start") }
+local is_optional = function(spec)
+ return spec.opt or spec.event or spec.cmd or spec.module
+end
+local get_install_path = function(spec)
+ local prefix = is_optional(spec) and packer_config.opt_dir or packer_config.start_dir
+ local path = join_paths(prefix, get_short_name(spec))
+ assert(is_directory(path))
+ return path
+end
+
+local function call_proc(process, opts, cb)
+ local output, error_output = "", ""
+ local handle_stdout = function(err, chunk)
+ assert(not err, err)
+ if chunk then
+ output = output .. chunk
+ end
+ end
+
+ local handle_stderr = function(err, chunk)
+ assert(not err, err)
+ if chunk then
+ error_output = error_output .. chunk
+ end
+ end
+
+ local uv = vim.loop
+ local handle
+
+ local stdout = uv.new_pipe(false)
+ local stderr = uv.new_pipe(false)
+
+ local stdio = { nil, stdout, stderr }
+
+ handle = uv.spawn(
+ process,
+ { args = opts.args, cwd = opts.cwd or uv.cwd(), stdio = stdio },
+ vim.schedule_wrap(function(code)
+ if code ~= 0 then
+ stdout:read_stop()
+ stderr:read_stop()
+ end
+
+ local check = uv.new_check()
+ check:start(function()
+ for _, pipe in ipairs(stdio) do
+ if pipe and not pipe:is_closing() then
+ return
+ end
+ end
+ check:stop()
+ handle:close()
+ cb(code, output, error_output)
+ end)
+ end)
+ )
+
+ uv.read_start(stdout, handle_stdout)
+ uv.read_start(stderr, handle_stderr)
+
+ return handle
+end
+
+local function verify_core_plugins(verbose)
+ for _, spec in pairs(core_plugins) do
+ if not spec.disable then
+ table.insert(collection, {
+ name = get_short_name(spec),
+ commit = get_default_sha1(spec),
+ path = get_install_path(spec),
+ })
+ end
+ end
+
+ for _, entry in pairs(collection) do
+ local on_done = function(code, result, errors)
+ completed = completed + 1
+ if code ~= 0 then
+ io.write(errors .. "\n")
+ -- os.exit(code)
+ else
+ if verbose then
+ io.write(fmt("verified [%s]\n", entry.name))
+ end
+ end
+ local current_commit = result:gsub("\n", ""):gsub([[']], [[]])
+ -- just in case there are some extra qutoes or it's a longer commit hash
+ if current_commit ~= entry.commit then
+ io.write(fmt("mismatch at [%s]: expected [%s], got [%s]\n", entry.name, entry.commit, current_commit))
+ os.exit(1)
+ end
+ end
+
+ local handle = call_proc("git", { args = { "log", "--pretty='%h'", "-1" }, cwd = entry.path }, on_done)
+ assert(handle)
+ table.insert(active_jobs, handle)
+ end
+
+ vim.wait(#active_jobs * 60 * 1000, function()
+ return completed == #active_jobs
+ end)
+end
+
+verify_core_plugins()
+vim.cmd "q"
diff --git a/utils/ci/verify_plugins.sh b/utils/ci/verify_plugins.sh
new file mode 100644
index 00000000..7d0d764b
--- /dev/null
+++ b/utils/ci/verify_plugins.sh
@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+set -e
+
+lvim --headless \
+ -c "luafile ./utils/ci/verify_plugins.lua"