diff --git a/lua/nuwiki/install.lua b/lua/nuwiki/install.lua index 690445d..85b1d5f 100644 --- a/lua/nuwiki/install.lua +++ b/lua/nuwiki/install.lua @@ -66,6 +66,28 @@ local function build_from_source(dest) return vim.fn.executable(dest) == 1 end +-- Gitea API base for this repo. Gitea has no GitHub-style +-- `/releases/latest/download/` shortcut, so resolve the asset's real +-- download URL (`browser_download_url`) through the API instead. +local REPO_API = 'https://code.gfran.co/api/v1/repos/gffranco/nuwiki' + +local function latest_asset_url(asset_name) + local body = vim.fn.system({ 'curl', '-fsSL', REPO_API .. '/releases/latest' }) + if vim.v.shell_error ~= 0 then + return nil + end + local ok, release = pcall(vim.json.decode, body) + if not ok or type(release) ~= 'table' or type(release.assets) ~= 'table' then + return nil + end + for _, a in ipairs(release.assets) do + if a.name == asset_name then + return a.browser_download_url + end + end + return nil +end + local function download_release(dest) local target = target_triple() if not target then @@ -74,10 +96,10 @@ local function download_release(dest) if vim.fn.executable('curl') ~= 1 or vim.fn.executable('tar') ~= 1 then return false end - local url = string.format( - 'https://code.gfran.co/gffranco/nuwiki/releases/latest/download/nuwiki-ls-%s.tar.gz', - target - ) + local url = latest_asset_url('nuwiki-ls-' .. target .. '.tar.gz') + if not url then + return false + end local archive = vim.fn.tempname() .. '.tar.gz' vim.fn.system({ 'curl', '-fsSL', '-o', archive, url }) if vim.v.shell_error ~= 0 then diff --git a/scripts/download_bin.vim b/scripts/download_bin.vim index 96475f0..da9e4e1 100644 --- a/scripts/download_bin.vim +++ b/scripts/download_bin.vim @@ -48,6 +48,30 @@ function! s:build_from_source() abort return executable(s:bin) endfunction +" Gitea has no GitHub-style /releases/latest/download/ shortcut, so +" resolve the asset's real download URL (browser_download_url) via the API. +function! s:latest_asset_url(asset) abort + let l:api = 'https://code.gfran.co/api/v1/repos/gffranco/nuwiki/releases/latest' + let l:body = system('curl -fsSL ' . shellescape(l:api)) + if v:shell_error != 0 + return '' + endif + try + let l:release = json_decode(l:body) + catch + return '' + endtry + if type(l:release) != type({}) || !has_key(l:release, 'assets') + return '' + endif + for l:item in l:release.assets + if get(l:item, 'name', '') ==# a:asset + return get(l:item, 'browser_download_url', '') + endif + endfor + return '' +endfunction + function! s:download_release() abort let l:target = s:target() if empty(l:target) @@ -56,8 +80,10 @@ function! s:download_release() abort if !executable('curl') || !executable('tar') return 0 endif - let l:url = 'https://code.gfran.co/gffranco/nuwiki/releases/latest/download/nuwiki-ls-' - \ . l:target . '.tar.gz' + let l:url = s:latest_asset_url('nuwiki-ls-' . l:target . '.tar.gz') + if empty(l:url) + return 0 + endif let l:archive = tempname() . '.tar.gz' call system('curl -fsSL -o ' . shellescape(l:archive) . ' ' . shellescape(l:url)) if v:shell_error != 0