diff options
| -rw-r--r-- | .github/workflows/autogenerate.yml (renamed from .github/workflows/run-autogen.yml) | 21 | ||||
| -rw-r--r-- | .github/workflows/check-generated-code-state.yml | 29 | ||||
| -rw-r--r-- | .github/workflows/metadata-diff.yml | 30 | ||||
| -rw-r--r-- | .github/workflows/stylua.yml | 1 | ||||
| -rw-r--r-- | Makefile | 15 | ||||
| -rw-r--r-- | lua/mason/mappings/language.lua | 2 | ||||
| -rw-r--r-- | scripts/autogen_metadata.lua | 150 | ||||
| -rwxr-xr-x | scripts/autogen_metadata.sh | 12 | ||||
| -rw-r--r-- | scripts/lua/mason-scripts/mason-lspconfig/generate.lua | 39 | ||||
| -rw-r--r-- | scripts/lua/mason-scripts/mason-schemas/generate.lua | 63 | ||||
| -rw-r--r-- | scripts/lua/mason-scripts/mason/generate.lua | 49 | ||||
| -rw-r--r-- | scripts/lua/mason-scripts/utils.lua | 21 | ||||
| -rwxr-xr-x | scripts/nvim.sh | 11 |
13 files changed, 237 insertions, 206 deletions
diff --git a/.github/workflows/run-autogen.yml b/.github/workflows/autogenerate.yml index 1a97114f..3c596ca0 100644 --- a/.github/workflows/run-autogen.yml +++ b/.github/workflows/autogenerate.yml @@ -1,9 +1,9 @@ -name: Run autogen script +name: Autogenerate code on: workflow_dispatch: schedule: - - cron: "15 13 * * *" + - cron: "0 10 * * *" jobs: run-autogen-script: @@ -15,13 +15,8 @@ jobs: neovim: true version: v0.7.0 - - name: Clone dependencies - run: | - mkdir -p ~/.local/share/nvim/site/pack/packer/start - git clone --depth 1 https://github.com/neovim/nvim-lspconfig ~/.local/share/nvim/site/pack/packer/start/nvim-lspconfig - - - name: Run autogen_metadata.sh script - run: ./scripts/autogen_metadata.sh + - name: make autogenerate + run: make autogenerate - name: Create Pull Request id: cpr @@ -30,13 +25,13 @@ jobs: token: ${{ secrets.PAT }} author: "William Botman <william+bot@redwill.se>" committer: "William Botman <william+bot@redwill.se>" - add-paths: lua/mason/_generated - commit-message: run autogen_metadata.lua - branch: chore/autogen_metadata + add-paths: lua/mason-lspconfig lua/mason-schemas + commit-message: "chore: update generated code" + branch: chore/autogenerate branch-suffix: short-commit-hash delete-branch: true labels: automerge - title: run autogen_metadata.lua + title: "chore: update generated code" - name: Enable Pull Request Automerge if: steps.cpr.outputs.pull-request-operation == 'created' diff --git a/.github/workflows/check-generated-code-state.yml b/.github/workflows/check-generated-code-state.yml new file mode 100644 index 00000000..e79e14fb --- /dev/null +++ b/.github/workflows/check-generated-code-state.yml @@ -0,0 +1,29 @@ +name: Check generated code state + +on: + push: + branches: + - "alpha" + pull_request: + +jobs: + check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: rhysd/action-setup-vim@v1 + with: + neovim: true + version: v0.7.0 + + - name: make generate + run: make generate + + - name: Ensure there are no diffs + run: | + git update-index -q --refresh + git diff + git diff-index --exit-code --quiet HEAD -- || { + echo '::error::Generated code is not up to date, run "make generate".'; + exit 1; + } diff --git a/.github/workflows/metadata-diff.yml b/.github/workflows/metadata-diff.yml deleted file mode 100644 index ddc129ac..00000000 --- a/.github/workflows/metadata-diff.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Metadata diff checker - -on: - push: - branches: - - "main" - pull_request: - -jobs: - metadata-diff-check: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: rhysd/action-setup-vim@v1 - with: - neovim: true - version: v0.7.0 - - - name: Clone dependencies - run: | - mkdir -p ~/.local/share/nvim/site/pack/packer/start - git clone --depth 1 https://github.com/neovim/nvim-lspconfig ~/.local/share/nvim/site/pack/packer/start/nvim-lspconfig - - - name: Run autogen_metadata.sh script - run: ./scripts/autogen_metadata.sh - - - name: Ensure there are no diffs - run: | - git update-index --refresh - git diff-index --quiet HEAD -- diff --git a/.github/workflows/stylua.yml b/.github/workflows/stylua.yml index 1532fc6f..877795de 100644 --- a/.github/workflows/stylua.yml +++ b/.github/workflows/stylua.yml @@ -3,6 +3,7 @@ name: Stylua check on: push: branches: + - "alpha" pull_request: jobs: @@ -20,4 +20,19 @@ clean: clean_fixtures clean_dependencies test: clean_fixtures dependencies INSTALL_ROOT_DIR=${INSTALL_ROOT_DIR} $(NVIM_HEADLESS) -c "call RunTests()" +.PHONY: lspconfig-generate +lspconfig-generate: dependencies + ./scripts/nvim.sh scripts/lua/mason-scripts/mason-lspconfig/generate.lua + +.PHONY: schemas-generate +schemas-generate: dependencies + ./scripts/nvim.sh scripts/lua/mason-scripts/mason-schemas/generate.lua + +.PHONY: autogenerate +autogenerate: schemas-generate lspconfig-generate + +.PHONY: generate +generate: dependencies + ./scripts/nvim.sh scripts/lua/mason-scripts/mason/generate.lua + # vim:noexpandtab diff --git a/lua/mason/mappings/language.lua b/lua/mason/mappings/language.lua index b005d2da..af245d7f 100644 --- a/lua/mason/mappings/language.lua +++ b/lua/mason/mappings/language.lua @@ -70,7 +70,7 @@ return { prisma = { "prisma-language-server" }, puppet = { "puppet-editor-services" }, purescript = { "purescript-language-server" }, - python = { "debugpy", "jedi-language-server", "pyright", "python-lsp-server", "sourcery" }, + python = { "black", "debugpy", "jedi-language-server", "pyright", "python-lsp-server", "sourcery" }, r = { "r-languageserver" }, reason = { "reason-language-server" }, rescript = { "rescript-lsp" }, diff --git a/scripts/autogen_metadata.lua b/scripts/autogen_metadata.lua deleted file mode 100644 index 736b1bcb..00000000 --- a/scripts/autogen_metadata.lua +++ /dev/null @@ -1,150 +0,0 @@ -local a = require "mason-core.async" -local Path = require "mason-core.path" -local fetch = require "mason-core.fetch" -local _ = require "mason-core.functional" -local fs = require "mason-core.fs" -local registry = require "mason-registry" -local lspconfig_server_mapping = require "mason-lspconfig.mappings.server" - ----@async ----@param path string ----@param contents string ----@param flags string -local function write_file(path, contents, flags) - fs.async.write_file( - path, - table.concat({ - "-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.", - "-- stylua: ignore start", - contents, - }, "\n"), - flags - ) -end - -local function get_lspconfig(name) - return require(("lspconfig.server_configurations.%s"):format(name)) -end - ----@async -local function create_lspconfig_filetype_map() - local filetype_map = {} - - for _, server_name in ipairs(_.keys(lspconfig_server_mapping.lspconfig_to_package)) do - local config = get_lspconfig(server_name) - for _, filetype in ipairs(config.default_config.filetypes or {}) do - if not filetype_map[filetype] then - filetype_map[filetype] = {} - end - table.insert(filetype_map[filetype], server_name) - table.sort(filetype_map[filetype]) - end - end - - write_file( - Path.concat { vim.loop.cwd(), "lua", "mason-lspconfig", "mappings", "filetype.lua" }, - "return " .. vim.inspect(filetype_map), - "w" - ) -end - ----@async -local function create_language_map() - local language_map = {} - local sorted_packages = _.sort_by(_.prop "name", registry.get_all_packages()) - _.each(function(pkg) - _.each(function(language) - local language_lc = language:lower() - language_map[language_lc] = _.append(pkg.name, language_map[language_lc] or {}) - end, pkg.spec.languages) - end, sorted_packages) - - write_file( - Path.concat { vim.loop.cwd(), "lua", "mason", "mappings", "language.lua" }, - "return " .. vim.inspect(language_map), - "w" - ) -end - ----@async -local function create_lsp_setting_schema_files() - local lsp_schemas_path = Path.concat { - vim.loop.cwd(), - "lua", - "mason-schemas", - "lsp", - } - - for _, file in - ipairs(vim.fn.glob( - Path.concat { - lsp_schemas_path, - "*", - }, - 1, - 1 - )) - do - print("Deleting " .. file) - vim.fn.delete(file) - end - - local gist_data = fetch( - "https://gist.githubusercontent.com/williamboman/a01c3ce1884d4b57cc93422e7eae7702/raw/lsp-packages.json" - ):get_or_throw() - local package_json_mappings = vim.json.decode(gist_data) - - for _, server_name in ipairs(_.keys(lspconfig_server_mapping.lspconfig_to_package)) do - local package_json_url = package_json_mappings[server_name] - if package_json_url then - print(("Fetching %q..."):format(package_json_url)) - local response = fetch(package_json_url):get_or_throw() - local schema = vim.json.decode(response) - if schema.contributes and schema.contributes.configuration then - schema = schema.contributes.configuration - end - if not schema.properties then - -- Some servers (like dartls) seem to provide an array of configurations (for more than just LSP stuff) - print(("Could not find appropriate schema structure for %s."):format(server_name)) - else - write_file( - Path.concat { - lsp_schemas_path, - ("%s.lua"):format(lspconfig_server_mapping.lspconfig_to_package[server_name]), - }, - "return " .. vim.inspect(schema, { newline = "", indent = "" }), - "w" - ) - end - end - end -end - ----@async -local function create_package_index() - a.scheduler() - local packages = {} - local to_lua_path = _.compose(_.gsub("/", "."), _.gsub("^lua/", "")) - for _, package_path in ipairs(vim.fn.glob("lua/mason-registry/*/init.lua", false, true)) do - local package_filename = vim.fn.fnamemodify(package_path, ":h:t") - local lua_path = to_lua_path(vim.fn.fnamemodify(package_path, ":h")) - local pkg = require(lua_path) - assert(package_filename == pkg.name, ("Package name is not the same as its module name %s"):format(lua_path)) - packages[pkg.name] = lua_path - end - - write_file( - Path.concat { vim.loop.cwd(), "lua", "mason-registry", "index.lua" }, - "return " .. vim.inspect(packages), - "w" - ) -end - -a.run_blocking(function() - a.wait_all(_.filter(_.identity, { - create_lspconfig_filetype_map, - create_language_map, - not vim.env.SKIP_SCHEMAS and create_lsp_setting_schema_files, - create_package_index, - })) -end) diff --git a/scripts/autogen_metadata.sh b/scripts/autogen_metadata.sh deleted file mode 100755 index 5e1b6ceb..00000000 --- a/scripts/autogen_metadata.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash -set -ex - -declare -x XDG_DATA_HOME="${XDG_DATA_HOME:-"$HOME/.local/share"}" -declare -x NVIM_PACK_DIR="$XDG_DATA_HOME/nvim/site/pack" - -declare -x LSP_CONFIG_DIR="$NVIM_PACK_DIR/packer/start/nvim-lspconfig" -declare -x MASON_DIR="$PWD" - -nvim -u NONE -E -R --headless \ - --cmd "set rtp+=${LSP_CONFIG_DIR},${MASON_DIR}" \ - +"luafile scripts/autogen_metadata.lua" +q diff --git a/scripts/lua/mason-scripts/mason-lspconfig/generate.lua b/scripts/lua/mason-scripts/mason-lspconfig/generate.lua new file mode 100644 index 00000000..2fa58692 --- /dev/null +++ b/scripts/lua/mason-scripts/mason-lspconfig/generate.lua @@ -0,0 +1,39 @@ +local a = require "mason-core.async" +local path = require "mason-core.path" +local _ = require "mason-core.functional" +local lspconfig_server_mapping = require "mason-lspconfig.mappings.server" +local script_utils = require "mason-scripts.utils" + +local MASON_LSPCONFIG_DIR = path.concat { vim.loop.cwd(), "lua", "mason-lspconfig" } + +local function get_lspconfig(name) + return require(("lspconfig.server_configurations.%s"):format(name)) +end + +---@async +local function create_lspconfig_filetype_map() + local filetype_map = {} + + for _, server_name in ipairs(_.keys(lspconfig_server_mapping.lspconfig_to_package)) do + local config = get_lspconfig(server_name) + for _, filetype in ipairs(config.default_config.filetypes or {}) do + if not filetype_map[filetype] then + filetype_map[filetype] = {} + end + table.insert(filetype_map[filetype], server_name) + table.sort(filetype_map[filetype]) + end + end + + script_utils.write_file( + path.concat { MASON_LSPCONFIG_DIR, "mappings", "filetype.lua" }, + "return " .. vim.inspect(filetype_map), + "w" + ) +end + +a.run_blocking(function() + a.wait_all { + create_lspconfig_filetype_map, + } +end) diff --git a/scripts/lua/mason-scripts/mason-schemas/generate.lua b/scripts/lua/mason-scripts/mason-schemas/generate.lua new file mode 100644 index 00000000..20793fcb --- /dev/null +++ b/scripts/lua/mason-scripts/mason-schemas/generate.lua @@ -0,0 +1,63 @@ +local a = require "mason-core.async" +local path = require "mason-core.path" +local fetch = require "mason-core.fetch" +local _ = require "mason-core.functional" +local lspconfig_server_mapping = require "mason-lspconfig.mappings.server" +local script_utils = require "mason-scripts.utils" + +local MASON_SCHEMAS_DIR = path.concat { vim.loop.cwd(), "lua", "mason-schemas" } + +---@async +local function create_lsp_setting_schema_files() + local lsp_schemas_path = path.concat { MASON_SCHEMAS_DIR, "lsp" } + + for _, file in + ipairs(vim.fn.glob( + path.concat { + lsp_schemas_path, + "*", + }, + 1, + 1 + )) + do + print("Deleting " .. file) + vim.fn.delete(file) + end + + local gist_data = fetch( + "https://gist.githubusercontent.com/williamboman/a01c3ce1884d4b57cc93422e7eae7702/raw/lsp-packages.json" + ):get_or_throw() + local package_json_mappings = vim.json.decode(gist_data) + + for _, server_name in ipairs(_.keys(lspconfig_server_mapping.lspconfig_to_package)) do + local package_json_url = package_json_mappings[server_name] + if package_json_url then + print(("Fetching %q..."):format(package_json_url)) + local response = fetch(package_json_url):get_or_throw() + local schema = vim.json.decode(response) + if schema.contributes and schema.contributes.configuration then + schema = schema.contributes.configuration + end + if not schema.properties then + -- Some servers (like dartls) seem to provide an array of configurations (for more than just LSP stuff) + print(("Could not find appropriate schema structure for %s."):format(server_name)) + else + script_utils.write_file( + path.concat { + lsp_schemas_path, + ("%s.lua"):format(lspconfig_server_mapping.lspconfig_to_package[server_name]), + }, + "return " .. vim.inspect(schema, { newline = "", indent = "" }), + "w" + ) + end + end + end +end + +a.run_blocking(function() + a.wait_all { + create_lsp_setting_schema_files, + } +end) diff --git a/scripts/lua/mason-scripts/mason/generate.lua b/scripts/lua/mason-scripts/mason/generate.lua new file mode 100644 index 00000000..5d02ab56 --- /dev/null +++ b/scripts/lua/mason-scripts/mason/generate.lua @@ -0,0 +1,49 @@ +local a = require "mason-core.async" +local path = require "mason-core.path" +local _ = require "mason-core.functional" +local registry = require "mason-registry" +local script_utils = require "mason-scripts.utils" + +local MASON_DIR = path.concat { vim.loop.cwd(), "lua", "mason" } +local MASON_REGISTRY_DIR = path.concat { vim.loop.cwd(), "lua", "mason-registry" } + +---@async +local function create_language_map() + local language_map = {} + local sorted_packages = _.sort_by(_.prop "name", registry.get_all_packages()) + _.each(function(pkg) + _.each(function(language) + local language_lc = language:lower() + language_map[language_lc] = _.append(pkg.name, language_map[language_lc] or {}) + end, pkg.spec.languages) + end, sorted_packages) + + script_utils.write_file( + path.concat { MASON_DIR, "mappings", "language.lua" }, + "return " .. vim.inspect(language_map), + "w" + ) +end + +---@async +local function create_package_index() + a.scheduler() + local packages = {} + local to_lua_path = _.compose(_.gsub("/", "."), _.gsub("^lua/", "")) + for _, package_path in ipairs(vim.fn.glob("lua/mason-registry/*/init.lua", false, true)) do + local package_filename = vim.fn.fnamemodify(package_path, ":h:t") + local lua_path = to_lua_path(vim.fn.fnamemodify(package_path, ":h")) + local pkg = require(lua_path) + assert(package_filename == pkg.name, ("Package name is not the same as its module name %s"):format(lua_path)) + packages[pkg.name] = lua_path + end + + script_utils.write_file(path.concat { MASON_REGISTRY_DIR, "index.lua" }, "return " .. vim.inspect(packages), "w") +end + +a.run_blocking(function() + a.wait_all { + create_language_map, + create_package_index, + } +end) diff --git a/scripts/lua/mason-scripts/utils.lua b/scripts/lua/mason-scripts/utils.lua new file mode 100644 index 00000000..771d419a --- /dev/null +++ b/scripts/lua/mason-scripts/utils.lua @@ -0,0 +1,21 @@ +local fs = require "mason-core.fs" + +local M = {} + +---@async +---@param path string +---@param contents string +---@param flags string +function M.write_file(path, contents, flags) + fs.async.write_file( + path, + table.concat({ + "-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY.", + "-- stylua: ignore start", + contents, + }, "\n"), + flags + ) +end + +return M diff --git a/scripts/nvim.sh b/scripts/nvim.sh new file mode 100755 index 00000000..e2ac55cd --- /dev/null +++ b/scripts/nvim.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +set -exuo pipefail + +declare -x DEPENDENCIES="${PWD}/dependencies" +declare -x MASON_DIR="$PWD" +declare -x MASON_SCRIPT_DIR="${PWD}/scripts" + +nvim -u NONE -E -R --headless \ + --cmd "set rtp+=${MASON_SCRIPT_DIR},${MASON_DIR},${DEPENDENCIES}" \ + +"luafile $1" +q |
