From 6a59e9ca450ba8c71f4e83918e8130905c316b62 Mon Sep 17 00:00:00 2001 From: Rui Marques Date: Tue, 6 Jul 2021 20:13:29 +0100 Subject: [PATCH] feat: generate repo's homepage --- README.md | 16 ++++ doc/gitlinker.txt | 17 ++++ lua/gitlinker.lua | 47 +++++++++-- lua/gitlinker/git.lua | 2 +- lua/gitlinker/hosts.lua | 169 +++++++++++++++++++++------------------- 5 files changed, 160 insertions(+), 91 deletions(-) diff --git a/README.md b/README.md index cd68644..72a6b0f 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,8 @@ In your `init.lua` or in a lua-here-doc in your `init.vim`: require"gitlinker".setup() ``` +### buffer url with (optional line range) + **By default, the following mappings are defined:** - `gy` for normal and visual mode @@ -93,6 +95,20 @@ looking for is `require"gitlinker".get_buf_range_url(mode, user_opts)` where: vim.api.nvim_set_keymap('v', 'gb', ':lua require"gitlinker".get_buf_range_url("v", {action_callback = require"gitlinker.actions".open_in_browser})') ``` +### Repo home page url + +For convenience, the function +`require"gitlinker".get_buf_range_url(mode, user_opts)` allows one to generate +the url for the repository homepage. You can map it like so: + + ``` lua + vim.api.nvim_set_keymap('n', 'gY', 'lua require"gitlinker".get_repo_url()', {silent = true}) + vim.api.nvim_set_keymap('n', 'gB', 'lua require"gitlinker".get_repo_url({action_callback = require"gitlinker.actions".open_in_browser})', {silent = true}) + ``` + +And use `gY` to copy the repo's homepage to your clipboard or +`gB` to open it in your browser. + ## Configuration To configure `gitlinker.nvim`, call `require"gitlinker".setup(config)` in your diff --git a/doc/gitlinker.txt b/doc/gitlinker.txt index ec6cdfe..875273b 100644 --- a/doc/gitlinker.txt +++ b/doc/gitlinker.txt @@ -57,6 +57,8 @@ In your `init.lua` or in a `:lua-heredoc` in your `init.vim`: > require"gitlinker".setup() < +============================================================================== +buffer url *gitlinker-buf-url* By default, the following mapping is defined: @@ -89,6 +91,21 @@ looking for is `require"gitlinker".get_buf_range_url(mode, user_opts)` where: vim.api.nvim_set_keymap('v', 'gb', ':lua require"gitlinker".get_buf_range_url("v", {action_callback = require"gitlinker.actions".open_in_browser})')) < +============================================================================== +repo url *gitlinker-repo-url* + +For convenience, the function +`require"gitlinker".get_buf_range_url(mode, user_opts)` allows one to generate +the url for the repository homepage. You can map it like so: + +> + vim.api.nvim_set_keymap('n', 'gY', 'lua require"gitlinker".get_repo_url()', {silent = true}) + vim.api.nvim_set_keymap('n', 'gB', 'lua require"gitlinker".get_repo_url({action_callback = require"gitlinker.actions".open_in_browser})', {silent = true}) +< + +And use `gY` to copy the repo's homepage to your clipboard or +`gB` to open it in your browser. + ============================================================================== Configuration *gitlinker-config* diff --git a/lua/gitlinker.lua b/lua/gitlinker.lua index cdcfeba..9d77961 100644 --- a/lua/gitlinker.lua +++ b/lua/gitlinker.lua @@ -44,8 +44,8 @@ function M.setup(config) end end -local function get_url_data(mode, user_opts) - local remote = user_opts.remote or git.get_branch_remote() +local function get_repo_url_data(remote) + remote = remote or git.get_branch_remote() if not remote then return nil end @@ -54,6 +54,15 @@ local function get_url_data(mode, user_opts) if not repo or vim.tbl_isempty(repo) then return nil end + return repo +end + +local function get_buf_range_url_data(mode, user_opts) + local remote = user_opts.remote or git.get_branch_remote() + local repo_url_data = get_repo_url_data(remote) + if not repo_url_data then + return nil + end local buf_repo_path = buffer.get_relative_path(git.get_git_root()) @@ -67,15 +76,12 @@ local function get_url_data(mode, user_opts) user_opts.add_current_line_on_normal_mode ) - return { - host = repo.host, - repo = repo.path, - port = repo.port, + return vim.tbl_extend("force", repo_url_data, { rev = rev, file = buf_repo_path, lstart = range.lstart, lend = range.lend, - } + }) end --- Retrieves the url for the selected buffer range @@ -93,7 +99,7 @@ end function M.get_buf_range_url(mode, user_opts) user_opts = vim.tbl_deep_extend("force", opts.get(), user_opts or {}) - local url_data = get_url_data(mode, user_opts) + local url_data = get_buf_range_url_data(mode, user_opts) if not url_data then return nil end @@ -115,4 +121,29 @@ function M.get_buf_range_url(mode, user_opts) return url end +function M.get_repo_url(user_opts) + user_opts = vim.tbl_deep_extend("force", opts.get(), user_opts or {}) + + local repo_url_data = get_repo_url_data(user_opts.remote) + if not repo_url_data then + return nil + end + + local matching_callback = M.hosts.get_matching_callback(repo_url_data.host) + if not matching_callback then + return nil + end + + local url = matching_callback(repo_url_data) + + if user_opts.action_callback then + user_opts.action_callback(url) + end + if user_opts.print_url then + print(url) + end + + return url +end + return M diff --git a/lua/gitlinker/git.lua b/lua/gitlinker/git.lua index f99137d..6c2b7e4 100644 --- a/lua/gitlinker/git.lua +++ b/lua/gitlinker/git.lua @@ -181,7 +181,7 @@ local function parse_uri(uri, errs) port = nil end - return { host = host, port = port, path = repo_path } + return { host = host, port = port, repo = repo_path } end local function is_file_compatible_with_revspec(buf_repo_path, revspec, errs) diff --git a/lua/gitlinker/hosts.lua b/lua/gitlinker/hosts.lua index 1a6d818..721a9dd 100644 --- a/lua/gitlinker/hosts.lua +++ b/lua/gitlinker/hosts.lua @@ -5,22 +5,23 @@ function M.get_base_https_url(url_data) if url_data.port then url = url .. ":" .. url_data.port end - return url .. "/" + return url .. "/" .. url_data.repo end --- Constructs a github style url function M.get_github_type_url(url_data) local url = M.get_base_https_url(url_data) - .. url_data.repo - .. "/blob/" - .. url_data.rev - .. "/" - .. url_data.file - if url_data.lstart then - url = url .. "#L" .. url_data.lstart - if url_data.lend then - url = url .. "-L" .. url_data.lend - end + if not url_data.file or not url_data.rev then + return url + end + url = url .. "/blob/" .. url_data.rev .. "/" .. url_data.file + + if not url_data.lstart then + return url + end + url = url .. "#L" .. url_data.lstart + if url_data.lend then + url = url .. "-L" .. url_data.lend end return url end @@ -28,16 +29,17 @@ end --- Constructs a gitea style url function M.get_gitea_type_url(url_data) local url = M.get_base_https_url(url_data) - .. url_data.repo - .. "/src/commit/" - .. url_data.rev - .. "/" - .. url_data.file - if url_data.lstart then - url = url .. "#L" .. url_data.lstart - if url_data.lend then - url = url .. "-L" .. url_data.lend - end + if not url_data.file or not url_data.rev then + return url + end + url = url .. "/src/commit/" .. url_data.rev .. "/" .. url_data.file + + if not url_data.lstart then + return url + end + url = url .. "#L" .. url_data.lstart + if url_data.lend then + url = url .. "-L" .. url_data.lend end return url end @@ -45,16 +47,17 @@ end --- Constructs a gitlab style url function M.get_gitlab_type_url(url_data) local url = M.get_base_https_url(url_data) - .. url_data.repo - .. "/-/blob/" - .. url_data.rev - .. "/" - .. url_data.file - if url_data.lstart then - url = url .. "#L" .. url_data.lstart - if url_data.lend then - url = url .. "-" .. url_data.lend - end + if not url_data.file or not url_data.rev then + return url + end + url = url .. "/-/blob/" .. url_data.rev .. "/" .. url_data.file + + if not url_data.lstart then + return url + end + url = url .. "#L" .. url_data.lstart + if url_data.lend then + url = url .. "-" .. url_data.lend end return url end @@ -62,51 +65,52 @@ end --- Constructs a bitbucket style url function M.get_bitbucket_type_url(url_data) local url = M.get_base_https_url(url_data) - .. url_data.repo - .. "/src/" - .. url_data.rev - .. "/" - .. url_data.file - if url_data.lstart then - url = url .. "#lines-" .. url_data.lstart - if url_data.lend then - url = url .. ":" .. url_data.lend - end + if not url_data.file or not url_data.rev then + return url + end + url = url .. "/src/" .. url_data.rev .. "/" .. url_data.file + + if not url_data.lstart then + return url end + url = url .. "#lines-" .. url_data.lstart + if url_data.lend then + url = url .. ":" .. url_data.lend + end + return url end --- Constructs a gogs style url function M.get_gogs_type_url(url_data) local url = M.get_base_https_url(url_data) - .. url_data.repo - .. "/src/" - .. url_data.rev - .. "/" - .. url_data.file - if url_data.lstart then - url = url .. "#L" .. url_data.lstart - if url_data.lend then - url = url .. "-L" .. url_data.lend - end + if not url_data.file or not url_data.rev then + return url + end + url = url .. "/src/" .. url_data.rev .. "/" .. url_data.file + + if not url_data.lstart then + return url + end + url = url .. "#L" .. url_data.lstart + if url_data.lend then + url = url .. "-L" .. url_data.lend end + return url end --- Constructs a cgit style url function M.get_cgit_type_url(url_data) - local repo = "" if url_data.repo then - repo = url_data.repo .. ".git/" - end - local url = "https://" - .. url_data.host - .. "/cgit/" - .. repo - .. "tree/" - .. url_data.file - .. "?id=" - .. url_data.rev + url_data.repo = url_data.repo .. ".git/" + end + + local url = "https://" .. url_data.host + if url_data.port then + url = url .. ":" .. url_data.port + end + url = url .. "/tree/" .. url_data.file .. "?id=" .. url_data.rev if url_data.lstart then url = url .. "#n" .. url_data.lstart end @@ -116,28 +120,30 @@ end --- Constructs a sourcehut style url function M.get_srht_type_url(url_data) local url = M.get_base_https_url(url_data) - .. url_data.repo - .. "/tree/" - .. url_data.rev - .. "/item/" - .. url_data.file - if url_data.lstart then - url = url .. "#L" .. url_data.lstart - if url_data.lend then - url = url .. "-" .. url_data.lend - end + if not url_data.file or not url_data.rev then + return url + end + url = url .. "/tree/" .. url_data.rev .. "/item/" .. url_data.file + + if not url_data.lstart then + return url end + url = url .. "#L" .. url_data.lstart + if url_data.lend then + url = url .. "-" .. url_data.lend + end + return url end --- Constructs a launchpad style url function M.get_launchpad_type_url(url_data) local url = M.get_base_https_url(url_data) - .. url_data.repo - .. "/tree/" - .. url_data.file - .. "?id=" - .. url_data.rev + if not url_data.file or not url_data.rev then + return url + end + url = url .. "/tree/" .. url_data.file .. "?id=" .. url_data.rev + if url_data.lstart then url = url .. "#n" .. url_data.lstart end @@ -147,11 +153,10 @@ end --- Constructs a repo.or.cz style url function M.get_repoorcz_type_url(url_data) local url = M.get_base_https_url(url_data) - .. url_data.repo - .. "/blob/" - .. url_data.rev - .. ":/" - .. url_data.file + if not url_data.file or not url_data.rev then + return url + end + url = url .. "/blob/" .. url_data.rev .. ":/" .. url_data.file if url_data.lstart then url = url .. "#l" .. url_data.lstart end