| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 | 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    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 = 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, std_output, error_output)      end)    end)  )  uv.read_start(stdout, onread(handle, false))  uv.read_start(stderr, onread(handle, true))  return handleendlocal plugins_list = {}local completed = 0local function write_lockfile(verbose)  local default_plugins = {}  local active_jobs = {}  local core_plugins = require "lvim.plugins"  for _, plugin in pairs(core_plugins) do    local name = plugin[1]:match "/(%S*)"    local url = "https://github.com/" .. plugin[1]    local commit = ""    table.insert(default_plugins, {      name = name,      url = url,      commit = commit,    })  end  table.sort(default_plugins, function(a, b)    return a.name < b.name  end)  for _, entry in pairs(default_plugins) do    local on_done = function(success, result, errors)      completed = completed + 1      if not success then        print("error: " .. errors)        return      end      local latest_sha = result:gsub("\tHEAD\n", ""):sub(1, 7)      plugins_list[entry.name] = {        commit = latest_sha,      }    end    local handle = call_proc("git", { args = { "ls-remote", entry.url, "HEAD" } }, on_done)    table.insert(active_jobs, handle)  end  print("active: " .. #active_jobs)  print("parsers: " .. #default_plugins)  vim.wait(#active_jobs * 60 * 1000, function()    return completed == #active_jobs  end)  if verbose then    print(vim.inspect(plugins_list))  end  local fd = assert(io.open(sp, "w"))  fd:write(vim.json.encode(plugins_list), "\n")  fd:flush()endwrite_lockfile()vim.cmd "q"
 |