# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4

PortSystem              1.0
PortGroup               github 1.0
PortGroup               cmake 1.1

name                    neovim
categories              editors
platforms               {darwin >= 15}
maintainers             {l2dy @l2dy} \
                        {judaew @judaew} \
                        openmaintainer
license                 Apache-2 Vim GPL-2+

description             Neovim is a aggressively refactored fork of Vim

long_description \
    Neovim is a project that seeks to aggressively refactor Vim. It already adds \
    a new plugin architecture, job control, and a remote API.

homepage                https://neovim.io

depends_build-append    port:pkgconfig

depends_lib             port:gettext \
                        port:libuv \
                        port:unibilium \
                        path:lib/libluajit-5.1.2.dylib:luajit \
                        port:lua51-lpeg \
                        port:luv-luajit \
                        port:libiconv \
                        port:libutf8proc \
                        port:tree-sitter

cmake.build_type        Release

configure.args-append   -DLUA_PRG=${prefix}/bin/luajit

# Build auto-detects ccache if it is installed and attempts to write
# to CCACHE_DIR, which is not allowed if configure.ccache=off.
if {![option configure.ccache]} {
    configure.env-append   CCACHE_DIR=${workpath}/.ccache
    build.env-append       CCACHE_DIR=${workpath}/.ccache
    destroot.env-append    CCACHE_DIR=${workpath}/.ccache
}

patch.pre_args-replace  -p0 -p1

# Building parsers is normally an extra step, see https://github.com/neovim/neovim/issues/29042
patchfiles              0001-build-and-install-tree-sitter-parsers.patch \
                        0002-include-lua51-headers-to-build-properly.patch

post-patch {
    reinplace "s|@PREFIX@|${prefix}|g" ${worksrcpath}/CMakeLists.txt

    # workaround for https://github.com/neovim/neovim/pull/30749
    reinplace "s|lpeg.so lpeg\${CMAKE_SHARED_LIBRARY_SUFFIX}|lpeg\${CMAKE_SHARED_LIBRARY_SUFFIX} lpeg.so|g" ${worksrcpath}/cmake/FindLpeg.cmake
}

notes {
    If you would like to re-use your existing Vim configuration with Neovim,
    follow the advice in `:help nvim-from-vim`:

        nvim -c 'tab h nvim-from-vim'

    For a full list of differences with Vim, read `:help vim-differences`.
}

subport neovim-devel {}

if {${subport} eq ${name}} {
    # stable

    github.setup        neovim neovim 0.12.0 v
    github.tarball_from archive
    revision            0
    conflicts           neovim-devel

    # cat cmake.deps/deps.txt \
    #     | perl -n -e '/(TREESITTER_.*)_URL https:\/\/github.com\/([^\/]*)\/([^\/]*)\/archive\/([^\d]*)((?:\d+\.){2}\d+)([^\d\.]*)/ && print join(" ", $2, $3, $5, $4 || "\"\"", $6 || "\"\"", lc($1), "\n")' \
    #     | column -t
    set deps {
        tree-sitter           tree-sitter-c         0.24.1  v  ""  treesitter_c
        tree-sitter-grammars  tree-sitter-lua       0.5.0   v  ""  treesitter_lua
        tree-sitter-grammars  tree-sitter-vim       0.8.1   v  ""  treesitter_vim
        neovim                tree-sitter-vimdoc    4.1.0   v  ""  treesitter_vimdoc
        tree-sitter-grammars  tree-sitter-query     0.8.0   v  ""  treesitter_query
        tree-sitter-grammars  tree-sitter-markdown  0.5.3   v  ""  treesitter_markdown
    }

    checksums           ${name}-${version}.tar.gz \
                        rmd160  1f7f93ec0b8f0ba7383c94bb1d631430668a4cff \
                        sha256  76b4875fc1a4805a807a9fa53ff0c8fb081620137a40fb879b32436e375aeb65 \
                        size    13648075 \
                        tree-sitter-c-0.24.1.tar.gz \
                        rmd160  12c732f8ccc097fd1ef4f171c19a89d06cfb85cd \
                        sha256  25dd4bb3dec770769a407e0fc803f424ce02c494a56ce95fedc525316dcf9b48 \
                        size    379147 \
                        tree-sitter-lua-0.5.0.tar.gz \
                        rmd160  1756e61c79d12edbf6ef753ff64dbcd0a49f9409 \
                        sha256  cf01b93f4b61b96a6d27942cf28eeda4cbce7d503c3bef773a8930b3d778a2d9 \
                        size    69027 \
                        tree-sitter-vim-0.8.1.tar.gz \
                        rmd160  9fd83c5f0ce403980ba672f6d8a8dfa70ef027c8 \
                        sha256  93cafb9a0269420362454ace725a118ff1c3e08dcdfdc228aa86334b54d53c2a \
                        size    357464 \
                        tree-sitter-vimdoc-4.1.0.tar.gz \
                        rmd160  c801127ac229d5486fd35de126044d5262ead6ff \
                        sha256  020e8f117f648c8697fca967995c342e92dbd81dab137a115cc7555207fbc84f \
                        size    61551 \
                        tree-sitter-query-0.8.0.tar.gz \
                        rmd160  f557a6fdfff64f4e473f8e0a887e3543383fe9f6 \
                        sha256  c2b23b9a54cffcc999ded4a5d3949daf338bebb7945dece229f832332e6e6a7d \
                        size    40303 \
                        tree-sitter-markdown-0.5.3.tar.gz \
                        rmd160  f3dba82f10baaed2f2e3cb134f0f62f652fd1d42 \
                        sha256  df845b1ab7c7c163ec57d7fa17170c92b04be199bddab02523636efec5224ab6 \
                        size    422303
} else {
    # devel

    github.setup        neovim neovim 92a667c07fe1790292dbb51b015b027e2057a9d4
    github.tarball_from archive
    version             20260330-[string range ${github.version} 0 6]
    revision            0
    conflicts           neovim
    github.livecheck.branch \
                        nightly

    # see stable's version of `deps` for how to regenerate
    set deps {
        tree-sitter           tree-sitter-c         0.24.1  v  ""  treesitter_c
        tree-sitter-grammars  tree-sitter-lua       0.5.0   v  ""  treesitter_lua
        tree-sitter-grammars  tree-sitter-vim       0.8.1   v  ""  treesitter_vim
        neovim                tree-sitter-vimdoc    4.1.0   v  ""  treesitter_vimdoc
        tree-sitter-grammars  tree-sitter-query     0.8.0   v  ""  treesitter_query
        tree-sitter-grammars  tree-sitter-markdown  0.5.3   v  ""  treesitter_markdown
    }

    checksums           ${name}-${github.version}.tar.gz \
                        rmd160  471f14752ddd928b87c37ac603522de47891fc0d \
                        sha256  d2e64879830c90a109288ad511f524879360fb9421c3c94ea9252abafca8559b \
                        size    13660878 \
                        tree-sitter-c-0.24.1.tar.gz \
                        rmd160  12c732f8ccc097fd1ef4f171c19a89d06cfb85cd \
                        sha256  25dd4bb3dec770769a407e0fc803f424ce02c494a56ce95fedc525316dcf9b48 \
                        size    379147 \
                        tree-sitter-lua-0.5.0.tar.gz \
                        rmd160  1756e61c79d12edbf6ef753ff64dbcd0a49f9409 \
                        sha256  cf01b93f4b61b96a6d27942cf28eeda4cbce7d503c3bef773a8930b3d778a2d9 \
                        size    69027 \
                        tree-sitter-vim-0.8.1.tar.gz \
                        rmd160  9fd83c5f0ce403980ba672f6d8a8dfa70ef027c8 \
                        sha256  93cafb9a0269420362454ace725a118ff1c3e08dcdfdc228aa86334b54d53c2a \
                        size    357464 \
                        tree-sitter-vimdoc-4.1.0.tar.gz \
                        rmd160  c801127ac229d5486fd35de126044d5262ead6ff \
                        sha256  020e8f117f648c8697fca967995c342e92dbd81dab137a115cc7555207fbc84f \
                        size    61551 \
                        tree-sitter-query-0.8.0.tar.gz \
                        rmd160  f557a6fdfff64f4e473f8e0a887e3543383fe9f6 \
                        sha256  c2b23b9a54cffcc999ded4a5d3949daf338bebb7945dece229f832332e6e6a7d \
                        size    40303 \
                        tree-sitter-markdown-0.5.3.tar.gz \
                        rmd160  f3dba82f10baaed2f2e3cb134f0f62f652fd1d42 \
                        sha256  df845b1ab7c7c163ec57d7fa17170c92b04be199bddab02523636efec5224ab6 \
                        size    422303
}

# Add each dependency's master_site, tag it and associate it back to the distfile
# e.g.: master_sites-append https://github.com/tree-sitter/tree-sitter-c/archive/v0.23.4:treesitter_c
#       distfiles-append    tree-sitter-c-0.23.4.tar.gz:treesitter_c
foreach {gh_author gh_project gh_version gh_tag_prefix gh_tag_suffix dirname} ${deps} {
    master_sites-append https://github.com/${gh_author}/${gh_project}/archive/[join ${gh_tag_prefix}]${gh_version}[join ${gh_tag_suffix}]:${dirname}
    distfiles-append    ${gh_project}-${gh_version}${extract.suffix}:${dirname}
}

# Only extract Neovim's source and not its dependencies
extract.only        ${distname}${extract.suffix}
post-extract {
    # Create the file structure where the build job expects the dependencies
    # e.g. file mkdir ${workpath}/build/build/downloads/treesitter_c
    #      file copy \
    #          ${distpath}/tree-sitter-c-0.23.4.tar.gz \
    #          ${workpath}/build/build/downloads/treesitter_c/v0.23.4.tar.gz
    foreach {_ gh_project gh_version gh_tag_prefix gh_tag_suffix dirname} ${deps} {
        file mkdir ${workpath}/build/build/downloads/${dirname}
        file copy \
            ${distpath}/${gh_project}-${gh_version}${extract.suffix} \
            ${workpath}/build/build/downloads/${dirname}/[join ${gh_tag_prefix}]${gh_version}[join ${gh_tag_suffix}]${extract.suffix}
    }
}
