This commit is contained in:
2024-12-23 21:34:50 +01:00
parent 3d0d721896
commit dd6843091b
3 changed files with 242 additions and 172 deletions

View File

@@ -1,13 +1,19 @@
local config = require("gitea.config")
local auth = require("gitea.auth")
local curl = require("plenary.curl")
local auth = require("gitea.auth")
local curl = require("plenary.curl")
local M = {}
------------------------------------------------------------------------------
-- Helper: get base URL from config
------------------------------------------------------------------------------
local function get_base_url()
return config.values.server_url
end
------------------------------------------------------------------------------
-- Helper: get auth header by trimming token
------------------------------------------------------------------------------
local function get_auth_header()
local token = auth.get_token()
if not token or token == "" then
@@ -16,27 +22,39 @@ local function get_auth_header()
return "token " .. token
end
------------------------------------------------------------------------------
-- Main HTTP request helper (using plenary.curl)
------------------------------------------------------------------------------
local function request(method, endpoint, opts)
opts = opts or {}
local url = get_base_url() .. endpoint
local headers = opts.headers or {}
headers["Authorization"] = get_auth_header()
headers["Content-Type"] = "application/json"
headers["Content-Type"] = "application/json"
local body_data
if opts.body then
body_data = vim.json.encode(opts.body)
end
local result = curl.request({
url = url,
method = method,
url = url,
method = method,
headers = headers,
timeout = 10000,
body = opts.body and vim.json.encode(opts.body) or nil,
query = opts.query,
body = body_data,
query = opts.query,
})
return result
end
------------------------------------------------------------------------------
-- Issues
------------------------------------------------------------------------------
function M.list_issues(owner, repo, opts)
local endpoint = string.format("/api/v1/repos/%s/%s/issues", owner, repo)
local result = request("GET", endpoint, { query = opts })
local result = request("GET", endpoint, { query = opts })
if result and result.status == 200 then
return vim.json.decode(result.body)
end
@@ -45,7 +63,7 @@ end
function M.get_issue(owner, repo, number)
local endpoint = string.format("/api/v1/repos/%s/%s/issues/%d", owner, repo, number)
local result = request("GET", endpoint)
local result = request("GET", endpoint)
if result and result.status == 200 then
return vim.json.decode(result.body)
end
@@ -54,17 +72,18 @@ end
function M.create_issue(owner, repo, data)
local endpoint = string.format("/api/v1/repos/%s/%s/issues", owner, repo)
local result = request("POST", endpoint, { body = data })
local result = request("POST", endpoint, { body = data })
if result and result.status == 201 then
return vim.json.decode(result.body)
end
return nil, result and result.status
end
-- CHANGED: treat both 200 and 201 as success, in case Gitea returns 201
function M.edit_issue(owner, repo, number, data)
local endpoint = string.format("/api/v1/repos/%s/%s/issues/%d", owner, repo, number)
local result = request("PATCH", endpoint, { body = data })
if result and result.status == 200 then
local result = request("PATCH", endpoint, { body = data })
if result and (result.status == 200 or result.status == 201) then
return vim.json.decode(result.body)
end
return nil, result and result.status
@@ -80,38 +99,38 @@ end
function M.comment_issue(owner, repo, number, body)
local endpoint = string.format("/api/v1/repos/%s/%s/issues/%d/comments", owner, repo, number)
local result = request("POST", endpoint, { body = { body = body } })
local result = request("POST", endpoint, { body = { body = body } })
if result and result.status == 201 then
return vim.json.decode(result.body)
end
return nil, result and result.status
end
-- ADDED: edit_issue_comment
-- Gitea supports: PATCH /repos/{owner}/{repo}/issues/comments/{id}
-- CHANGED: treat both 200 and 201 as success
function M.edit_issue_comment(owner, repo, number, comment_id, body)
local endpoint = string.format("/api/v1/repos/%s/%s/issues/comments/%d", owner, repo, comment_id)
local result = request("PATCH", endpoint, { body = { body = body } })
if result and result.status == 200 then
local result = request("PATCH", endpoint, { body = { body = body } })
if result and (result.status == 200 or result.status == 201) then
return vim.json.decode(result.body)
end
return nil, result and result.status
end
-- ADDED: get_issue_comments
function M.get_issue_comments(owner, repo, number)
local endpoint = string.format("/api/v1/repos/%s/%s/issues/%d/comments", owner, repo, number)
local result = request("GET", endpoint)
local result = request("GET", endpoint)
if result and result.status == 200 then
return vim.json.decode(result.body)
end
return nil, result and result.status
end
-- PR
------------------------------------------------------------------------------
-- Pull Requests
------------------------------------------------------------------------------
function M.list_pull_requests(owner, repo, opts)
local endpoint = string.format("/api/v1/repos/%s/%s/pulls", owner, repo)
local result = request("GET", endpoint, { query = opts })
local result = request("GET", endpoint, { query = opts })
if result and result.status == 200 then
return vim.json.decode(result.body)
end
@@ -120,7 +139,7 @@ end
function M.get_pull_request(owner, repo, number)
local endpoint = string.format("/api/v1/repos/%s/%s/pulls/%d", owner, repo, number)
local result = request("GET", endpoint)
local result = request("GET", endpoint)
if result and result.status == 200 then
return vim.json.decode(result.body)
end
@@ -129,17 +148,18 @@ end
function M.create_pull_request(owner, repo, data)
local endpoint = string.format("/api/v1/repos/%s/%s/pulls", owner, repo)
local result = request("POST", endpoint, { body = data })
local result = request("POST", endpoint, { body = data })
if result and result.status == 201 then
return vim.json.decode(result.body)
end
return nil, result and result.status
end
-- CHANGED: treat both 200 and 201 as success for PR edits
function M.edit_pull_request(owner, repo, number, data)
local endpoint = string.format("/api/v1/repos/%s/%s/pulls/%d", owner, repo, number)
local result = request("PATCH", endpoint, { body = data })
if result and result.status == 200 then
local result = request("PATCH", endpoint, { body = data })
if result and (result.status == 200 or result.status == 201) then
return vim.json.decode(result.body)
end
return nil, result and result.status
@@ -147,10 +167,10 @@ end
function M.merge_pull_request(owner, repo, number, merge_style, merge_title, merge_message)
local endpoint = string.format("/api/v1/repos/%s/%s/pulls/%d/merge", owner, repo, number)
local result = request("POST", endpoint, {
local result = request("POST", endpoint, {
body = {
Do = merge_style or "merge",
MergeTitleField = merge_title or "",
Do = merge_style or "merge",
MergeTitleField = merge_title or "",
MergeMessageField = merge_message or "",
}
})
@@ -169,7 +189,8 @@ function M.reopen_pull_request(owner, repo, number)
end
function M.comment_pull_request(owner, repo, number, body)
-- Uses same logic as comment_issue
return M.comment_issue(owner, repo, number, body)
end
return M
return M