From 14529464633f7b642b0334ed54a72b492453cc17 Mon Sep 17 00:00:00 2001 From: nbe Date: Mon, 3 Jul 2023 04:31:47 +0300 Subject: [PATCH] feat: add Sourcegraph provider --- README.md | 3 +- lua/csgithub/init.lua | 6 ++- lua/csgithub/providers/github.lua | 42 ++++++++++++++++ lua/csgithub/providers/sourcegraph.lua | 29 +++++++++++ lua/csgithub/query.lua | 68 +++++++++++--------------- lua/csgithub/types/init.lua | 15 ++++++ 6 files changed, 120 insertions(+), 43 deletions(-) create mode 100644 lua/csgithub/providers/github.lua create mode 100644 lua/csgithub/providers/sourcegraph.lua create mode 100644 lua/csgithub/types/init.lua diff --git a/README.md b/README.md index 2473173..6aa4e61 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -A simple plugin to simplify searching for code on [Github Code Search](https://cs.github.com). +A simple plugin to quickly search for code on [Github Code Search](https://cs.github.com) or [Sourcegraph](https://sourcegraph.com/search) In `normal` mode, searches for the word under the cursor. @@ -24,6 +24,7 @@ https://user-images.githubusercontent.com/33713262/226383032-113b4db8-27a3-4b8f- includeFilename = false, includeExtension = true, betaSearch = true, -- set to false if you haven't opted in to GitHub Code Search (beta) + provider = "github", -- "github" | "sourcegraph" }) csgithub.open(url) diff --git a/lua/csgithub/init.lua b/lua/csgithub/init.lua index 545d36b..4327fcc 100644 --- a/lua/csgithub/init.lua +++ b/lua/csgithub/init.lua @@ -1,12 +1,14 @@ local M = {} -- Return search url ----@param args table|nil +---@param args SearchArgs|nil M.search = function(args) + ---@type SearchArgs local default_args = { includeFilename = false, includeExtension = true, betaSearch = true, + provider = "github", } local merged_args = vim.tbl_extend("force", default_args, args or {}) @@ -16,7 +18,7 @@ M.search = function(args) if q == nil then return nil end - local url = query.construct_url(q) + local url = query.construct_url(q, merged_args) return url end diff --git a/lua/csgithub/providers/github.lua b/lua/csgithub/providers/github.lua new file mode 100644 index 0000000..035123a --- /dev/null +++ b/lua/csgithub/providers/github.lua @@ -0,0 +1,42 @@ +---@type SearchProvider +local M = {} + +--- @param args SearchArgs +local construct_search_field = function(args) + if not args.betaSearch and args.includeFilename then + return "filename:" + elseif not args.betaSearch and args.includeExtension then + return "extension:" + else + return "path:" + end +end + +--- @param args SearchArgs +local construct_query_path = function(args) + local ext = vim.fn.expand("%:e") + + local onlyExtension = args.includeExtension and not args.includeFilename + + if onlyExtension and args.betaSearch then + return "*." .. ext + elseif onlyExtension then + return "." .. ext + else + return vim.fn.expand("%:t") + end +end + +M.construct_query_options = function(args) + local path = construct_query_path(args) + local search_field = construct_search_field(args) + return { search_field .. path } +end + +M.construct_url = function(encoded_query) + local base = "https://github.com/search?type=code&q=" + local url = base .. encoded_query + return url +end + +return M diff --git a/lua/csgithub/providers/sourcegraph.lua b/lua/csgithub/providers/sourcegraph.lua new file mode 100644 index 0000000..2991ce4 --- /dev/null +++ b/lua/csgithub/providers/sourcegraph.lua @@ -0,0 +1,29 @@ +---@type SearchProvider +local M = {} + +--- @param args SearchArgs +local construct_query_path = function(args) + local ext = vim.fn.expand("%:e") + + local onlyExtension = args.includeExtension and not args.includeFilename + + if onlyExtension then + return ".*\\." .. ext -- file:.*\.txt + else + return "(^|.*\\/)rc\\.lua$" -- file:(^|.*\/)rc\.lua$ + end +end + +M.construct_query_options = function(args) + local path = construct_query_path(args) + return { "file:" .. path } +end + +-- Example: https://sourcegraph.com/search?q=file:.*\.txt+term +M.construct_url = function(encoded_query) + local base = "https://sourcegraph.com/search?q=" + local url = base .. encoded_query + return url +end + +return M diff --git a/lua/csgithub/query.lua b/lua/csgithub/query.lua index cff2d38..30c6e83 100644 --- a/lua/csgithub/query.lua +++ b/lua/csgithub/query.lua @@ -7,30 +7,6 @@ local function trim_string(s) return (s:gsub("^%s*(.-)%s*$", "%1")) end -M.construct_query_path = function(args) - local ext = vim.fn.expand("%:e") - - local onlyExtension = args.includeExtension and not args.includeFilename - - if onlyExtension and args.betaSearch then - return "*." .. ext - elseif onlyExtension then - return "." .. ext - else - return vim.fn.expand("%:t") - end -end - -M.construct_search_field = function(args) - if not args.betaSearch and args.includeFilename then - return "filename:" - elseif not args.betaSearch and args.includeExtension then - return "extension:" - else - return "path:" - end -end - M.construct_query_text = function() local utils = require("csgithub.utils") local text = "" @@ -46,34 +22,46 @@ M.construct_query_text = function() end -- Return search url ----@param args table +---@param args SearchArgs M.construct_query = function(args) local query_parts = {} - local query_text = M.construct_query_text() - if query_text == "" then - return nil - end - -- path: + ---@type SearchProvider + local provider = M.get_provider(args) + + -- query options (eg. path:myfile.txt, extension:txt, etc.) if args.includeFilename or args.includeExtension then - local path = M.construct_query_path(args) - local search_field = M.construct_search_field(args) - table.insert(query_parts, search_field .. path) + query_parts = provider.construct_query_options(args) end -- text + local query_text = M.construct_query_text() + if query_text == "" then + return nil + end table.insert(query_parts, query_text) - return table.concat(query_parts, " ") + local query = table.concat(query_parts, " ") + return query +end + +---@param args SearchArgs +---@return SearchProvider +M.get_provider = function(args) + if args.provider == "sourcegraph" then + return require("csgithub.providers.sourcegraph") + else + return require("csgithub.providers.github") + end end ----@param query string -M.construct_url = function(query) +---@param url_query string +---@param args SearchArgs +M.construct_url = function(url_query, args) local utils = require("csgithub.utils") - local encoded_query = utils.url_encode(query) - local base = "https://github.com/search?type=code&q=" - local url = base .. encoded_query - return url + local encoded_query = utils.url_encode(url_query) + local provider = M.get_provider(args) + return provider.construct_url(encoded_query) end return M diff --git a/lua/csgithub/types/init.lua b/lua/csgithub/types/init.lua new file mode 100644 index 0000000..78bf736 --- /dev/null +++ b/lua/csgithub/types/init.lua @@ -0,0 +1,15 @@ +---@alias SearchProviderEnum +---| '"github"' +---| '"sourcegraph"' + +---@class SearchArgs +---@field includeFilename boolean +---@field includeExtension boolean +---@field betaSearch boolean Whether to use the newer "Github Code Search" (https://github.com/features/code-search) +---@field provider SearchProviderEnum + +---@alias ConstructQueryOptions fun(args: SearchArgs): table + +---@class SearchProvider +---@field construct_query_options ConstructQueryOptions +---@field construct_url fun(encoded_query: string): string