Skip to content

Commit

Permalink
Merge branch 'main' of github.com:olimorris/codecompanion.nvim
Browse files Browse the repository at this point in the history
  • Loading branch information
olimorris committed Mar 17, 2024
2 parents 550948c + f831051 commit 82a0459
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 7 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,8 @@ require("codecompanion").setup({
chat = require("codecompanion.adapters").use("openai", {
env = {
api_key = "DIFFERENT_OPENAI_KEY",
-- To execute a shell command, prefix it with "cmd:"
-- api_key = "cmd:gpg --decrypt ~/.openai-api-key.gpg 2>/dev/null",
},
}),
},
Expand Down
2 changes: 2 additions & 0 deletions doc/codecompanion.txt
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,8 @@ passing in a table to the `use` method:
chat = require("codecompanion.adapters").use("openai", {
env = {
api_key = "DIFFERENT_OPENAI_KEY",
-- To execute a shell command, prefix it with "cmd:"
-- api_key = "cmd:gpg --decrypt ~/.openai-api-key.gpg 2>/dev/null",
},
}),
},
Expand Down
37 changes: 30 additions & 7 deletions lua/codecompanion/adapter.lua
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
local log = require("codecompanion.utils.log")
local utils = require("codecompanion.utils.util")

---@class CodeCompanion.Adapter
---@field name string The name of the adapter
Expand Down Expand Up @@ -91,19 +92,41 @@ function Adapter:replace_header_vars()
if self.headers then
for k, v in pairs(self.headers) do
self.headers[k] = v:gsub("${(.-)}", function(var)
local env_var = self.env[var]
local env_var_or_cmd = self.env[var]

if not env_var_or_cmd then
log:error("Error: Could not find env var or command: %s", self.env[var])
return vim.notify(
string.format("[CodeCompanion.nvim]\nCould not find env var or command: %s", self.env[var]),
vim.log.levels.ERROR
)
end

if env_var then
env_var = os.getenv(env_var)
if not env_var then
log:error("Error: Could not find env var: %s", self.env[var])
if utils.is_cmd_var(env_var_or_cmd) then
local command = env_var_or_cmd:sub(5)
local handle = io.popen(command, "r")
if handle then
local result = handle:read("*a")
handle:close()
return result:gsub("%s+$", "")
else
log:error("Error: Could not execute command: %s", command)
return vim.notify(
string.format("[CodeCompanion.nvim]\nCould not find env var: %s", self.env[var]),
string.format("[CodeCompanion.nvim]\nCould not execute command: %s", command),
vim.log.levels.ERROR
)
end
return env_var
end

local env_var = os.getenv(env_var_or_cmd)
if not env_var then
log:error("Error: Could not find env var: %s", self.env[var])
return vim.notify(
string.format("[CodeCompanion.nvim]\nCould not find env var: %s", self.env[var]),
vim.log.levels.ERROR
)
end
return env_var
end)
end
end
Expand Down
7 changes: 7 additions & 0 deletions lua/codecompanion/utils/util.lua
Original file line number Diff line number Diff line change
Expand Up @@ -148,4 +148,11 @@ function M.replace_vars(msg, vars, mapping)
return string.format(msg, unpack(replacements))
end

---Check if value starts with "cmd:"
---@param value string
---@return boolean
function M.is_cmd_var(value)
return value:match("^cmd:")
end

return M

0 comments on commit 82a0459

Please sign in to comment.