Skip to content

Commit 7ce5098

Browse files
committed
🚸 Support AUR
1 parent a057e99 commit 7ce5098

4 files changed

Lines changed: 41 additions & 7 deletions

File tree

pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "termux-language-server"
3-
version = "0.1.8"
3+
version = "0.1.9"
44
description = "language server for PKGBUILD/build.sh/ebuild"
55
readme = "README.md"
66
requires-python = ">=3.10"
@@ -31,6 +31,7 @@ pkgbuild = [
3131
# "git+https://gitlab.archlinux.org/pacman/namcap",
3232
"pyalpm>=0.10.0",
3333
"jinja2>=3",
34+
"marisa-trie>=1",
3435
"platformdirs>=4",
3536
]
3637

src/termux_language_server/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
`importlib.metadata.version() <https://docs.python.org/3/library/importlib.metadata.html#distribution-versions>`_.
33
"""
44

5-
__version__ = "0.1.8"
5+
__version__ = "0.1.9"

src/termux_language_server/queries/packages.scm

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@
1010
(raw_string) @package.PKGBUILD)
1111
(#any-of? @_name "depends" "makedepends" "optdepends" "conflicts" "provides" "replaces"))
1212

13+
(variable_assignment
14+
name: (variable_name) @_name
15+
value: (array
16+
(string
17+
(string_content) @package.PKGBUILD))
18+
(#any-of? @_name "depends" "makedepends" "optdepends" "conflicts" "provides" "replaces"))
19+
1320
(variable_assignment
1421
name: (variable_name) @_name
1522
value: (string

src/termux_language_server/searcher/pacman.py

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22
==========
33
"""
44

5+
import os
56
from dataclasses import dataclass, field
67
from pathlib import Path
78

89
from jinja2 import Template
910
from lsp_tree_sitter.completer import PackageSearcher
10-
from platformdirs import user_config_path
11+
from marisa_trie import Trie
12+
from platformdirs import user_cache_dir, user_config_path
1113
from pyalpm import DB, Handle, Package
1214
from tree_sitter import Node
1315

@@ -19,6 +21,15 @@ def get_template(name: str = "PKGBUILD.md.jinja") -> Template:
1921
return Template(path.read_text())
2022

2123

24+
def get_trie() -> Trie | None:
25+
path = os.path.join(user_cache_dir("paru"), "packages.aur")
26+
if not os.path.exists(path):
27+
return
28+
with open(path) as f:
29+
lines = f.readlines()
30+
return Trie(lines)
31+
32+
2233
@dataclass
2334
class PacmanSearcher(PackageSearcher):
2435
label: str = "package.PKGBUILD"
@@ -30,11 +41,11 @@ class PacmanSearcher(PackageSearcher):
3041
"provides",
3142
"replaces",
3243
)
33-
url_template: str = "https://archlinux.org/packages/{}"
3444
template: Template = field(default_factory=get_template)
3545
db: DB = field(
3646
default_factory=lambda: Handle(".", "/var/lib/pacman").get_localdb()
3747
)
48+
trie: Trie | None = field(default_factory=get_trie)
3849

3950
def __call__(self, node: Node | None) -> bool:
4051
node = node.parent if node and node.type == "string_content" else node
@@ -52,26 +63,41 @@ def get_pkgs(self, name: str) -> list[Package]:
5263
return pkgs
5364

5465
def has_package(self, name: str) -> bool:
55-
return self.get_pkgs(name) != []
66+
if self.get_pkgs(name):
67+
return True
68+
if self.trie:
69+
return name in self.trie.keys(name)
70+
return False
5671

5772
def get_package_url(self, name: str) -> str:
58-
return self.url_template.format(name)
73+
if self.get_pkgs(name):
74+
return f"https://archlinux.org/packages/{name}"
75+
return f"https://aur.archlinux.org/packages/{name}"
5976

6077
def get_package_version(self, name: str) -> str:
78+
if not self.get_pkgs(name):
79+
return ""
6180
pkg = self.get_pkgs(name)[0]
6281
version = pkg.version
6382
if pkg.name != name:
6483
version = pkg.name + " " + version
6584
return version
6685

6786
def get_package_names(self, name: str) -> dict[str, str]:
68-
return {
87+
names = {
6988
pkg.name: self.template.render(pkg=pkg)
7089
for pkg in self.db.search(name)
7190
if pkg.name.startswith(name)
7291
}
92+
if self.trie:
93+
for pkg in self.trie.keys(name):
94+
if pkg not in names:
95+
names[pkg] = ""
96+
return names
7397

7498
def get_package_document(self, name: str) -> str:
99+
if not self.get_pkgs(name):
100+
return ""
75101
docs = []
76102
for pkg in self.get_pkgs(name):
77103
docs += [self.template.render(pkg=pkg)]

0 commit comments

Comments
 (0)