Files
nuwiki/scripts/download_bin.vim
T
gffranco 3c1ed48a2f
CI / cargo fmt --check (push) Successful in 29s
CI / cargo clippy (push) Successful in 40s
CI / cargo test (push) Successful in 46s
CI / editor keymaps (push) Successful in 1m40s
fix(install): resolve release asset via Gitea API (download was always 404)
:NuwikiInstall always fell back to building from source because the
download URL used the GitHub-only shape
`/releases/latest/download/<asset>`, which this Gitea instance serves as
404. The release assets exist and are correctly named; only the URL was
wrong.

Resolve the asset's real download URL through the Gitea API instead: GET
`/api/v1/repos/.../releases/latest`, find the asset matching
`nuwiki-ls-<target>.tar.gz`, and download its `browser_download_url`
(`/releases/download/<tag>/<asset>`, which returns 200). Fixed in both
install paths — lua/nuwiki/install.lua (vim.json.decode) and
scripts/download_bin.vim (json_decode). Verified end to end: resolve →
download → extract → executable binary.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 01:41:21 +00:00

115 lines
3.7 KiB
VimL

" scripts/download_bin.vim — install `nuwiki-ls` from a release tarball,
" falling back to `cargo build --release` on failure.
"
" Invoked by Dein / vim-plug build hooks:
" vim -e -s -c "source scripts/download_bin.vim" -c "q"
let s:plugin_dir = fnamemodify(resolve(expand('<sfile>:p')), ':h:h')
let s:bin_dir = s:plugin_dir . '/bin'
let s:suffix = has('win32') ? '.exe' : ''
let s:bin = s:bin_dir . '/nuwiki-ls' . s:suffix
call mkdir(s:bin_dir, 'p')
function! s:target() abort
if has('win32')
return 'x86_64-pc-windows-msvc'
elseif has('mac')
if has('arm64')
return 'aarch64-apple-darwin'
endif
return 'x86_64-apple-darwin'
elseif has('linux')
let l:ldd = system('ldd --version 2>&1')
let l:musl = stridx(l:ldd, 'musl') >= 0
let l:uname_m = trim(system('uname -m'))
if l:uname_m ==# 'aarch64' || l:uname_m ==# 'arm64'
return l:musl ? 'aarch64-unknown-linux-musl' : 'aarch64-unknown-linux-gnu'
endif
return l:musl ? 'x86_64-unknown-linux-musl' : 'x86_64-unknown-linux-gnu'
endif
return ''
endfunction
function! s:build_from_source() abort
if !executable('cargo')
echohl ErrorMsg | echom 'nuwiki: cargo not found, cannot build from source' | echohl None
return 0
endif
echom 'nuwiki: cargo build --release …'
call system('cargo build --release -p nuwiki-ls --manifest-path ' . shellescape(s:plugin_dir . '/Cargo.toml'))
if v:shell_error != 0
echohl ErrorMsg | echom 'nuwiki: cargo build failed' | echohl None
return 0
endif
let l:built = s:plugin_dir . '/target/release/nuwiki-ls' . s:suffix
call system('cp ' . shellescape(l:built) . ' ' . shellescape(s:bin))
call system('chmod +x ' . shellescape(s:bin))
return executable(s:bin)
endfunction
" Gitea has no GitHub-style /releases/latest/download/<asset> 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)
return 0
endif
if !executable('curl') || !executable('tar')
return 0
endif
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
return 0
endif
let l:extract = tempname()
call mkdir(l:extract, 'p')
call system('tar -xzf ' . shellescape(l:archive) . ' -C ' . shellescape(l:extract))
if v:shell_error != 0
return 0
endif
call system('cp ' . shellescape(l:extract . '/nuwiki-ls' . s:suffix) . ' ' . shellescape(s:bin))
call system('chmod +x ' . shellescape(s:bin))
return executable(s:bin)
endfunction
if get(g:, 'nuwiki_build_from_source', 0)
if !s:build_from_source()
echohl ErrorMsg | echom 'nuwiki: source build failed' | echohl None
endif
elseif s:download_release()
echom 'nuwiki: installed ' . s:bin
else
echohl WarningMsg | echom 'nuwiki: download failed, falling back to source build' | echohl None
if !s:build_from_source()
echohl ErrorMsg | echom 'nuwiki: install failed' | echohl None
endif
endif