Compare commits

...
12 Commits
Author SHA1 Message Date
arcanis d3b569bfa2 Release 2.23.6 2026-10-30 16:33:14 +02:00
arcanis 64a7e9b288 docs: take note on parametrized tests 2026-10-30 16:17:07 +02:00
arcanis 5ad8a2a7d0 fix: improve parsing of escaped symbols inside string 2026-10-30 16:16:50 +02:00
arcanis c56a319267 fix: handle array expansion without regex 2026-10-30 13:25:39 +02:00
arcanis 96558886bd fix: handle array append correctly 2026-10-29 14:27:14 +02:00
arcanis 4a745321ec docs: update contribution guide with ai policy 2026-10-26 13:05:18 +02:00
arcanis 4446c950ec Release 2.23.5 2026-10-25 02:17:21 +03:00
arcanis 8d569e6075 fix: pylint check 2026-10-25 02:16:59 +03:00
arcanis c375236327 Release 2.23.4 2026-10-25 02:12:43 +03:00
arcanis ddbb4b06ff fix: commit forgotten test file 2026-10-25 02:12:24 +03:00
arcanis 2d66b67123 Release 2.23.3 2026-10-25 02:09:35 +03:00
arcanis 27cfcd07eb fix: handle empty assignment correctly in PKGBUILD 2026-10-25 02:09:13 +03:00
12 changed files with 652 additions and 215 deletions

No files matched your search

+12
View File
@@ -222,6 +222,7 @@ Again, the most checks can be performed by `tox` command, though some additional
* On the other hand, it is allowed to change method signatures, however, it is recommended to add new parameters as optional if possible. Deprecated API can be dropped during major release.
* Enumerations (`Enum` classes) are allowed and recommended. However, it is recommended to use `StrEnum` class if there are from/to string conversions and `IntEnum` otherwise.
* `Generator` return type is not allowed. Generator functions must return generic `Iterator` object. Documentation should be described as `Yields`, however, because of pylint checks. Unfortunately, `Iterable` return type is not available for generators also, because of specific `contextlib.contextmanager` case.
* Tests must not be parametrized. It is better to write separate test, which covers specific line of code rather than testing all over again.
### Other checks
@@ -229,6 +230,17 @@ The projects also uses typing checks (provided by `mypy`) and some linter checks
Frontend checks normally are performed by `eslint` (e.g. `npx run eslint`).
## AI usage policy
AI tools may be used when working on the project, including writing code, tests, and documentation, debugging problems, and preparing issue reports. Contributors remain responsible for everything they submit, including content generated or suggested by AI.
* Review and understand every submitted change. You must be able to explain the implementation, respond to review feedback, and correct any problems.
* Do not list AI tools as commit authors or co-authors, including in `Co-authored-by` trailers. Authorship must remain with the human contributors responsible for the changes.
* Discussions in issues and pull requests must be led by humans. Participate personally, explain your reasoning, and respond to questions and review feedback yourself. AI tools may help with wording or translation, but must not conduct discussions on your behalf.
* Verify claims, references, and reproduction steps before submitting an issue or pull request. Do not submit unreviewed AI output or claim that checks passed unless they were run and you verified the results.
Maintainers may close submissions that do not meet these requirements. Using AI does not transfer responsibility for reviewing or fixing a contribution to maintainers.
## Developers how to
### Run automated checks
@@ -1,4 +1,4 @@
.TH AHRIMAN "1" "2026\-10\-25" "ahriman 2.23.2" "ArcH linux ReposItory MANager"
.TH AHRIMAN "1" "2026\-10\-30" "ahriman 2.23.6" "ArcH linux ReposItory MANager"
.SH NAME
ahriman \- ArcH linux ReposItory MANager
.SH SYNOPSIS
+1 -1
View File
@@ -17,4 +17,4 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
__version__ = "2.23.2"
__version__ = "2.23.6"
@@ -17,7 +17,6 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import re
import shlex
import tree_sitter_bash
@@ -26,6 +25,7 @@ from enum import StrEnum
from tree_sitter import Language, Node, Parser
from typing import IO, cast
from ahriman.core.configuration.shell_interpolator import ShellInterpolator
from ahriman.core.exceptions import PkgbuildParserError
from ahriman.models.pkgbuild_patch import PkgbuildPatch
@@ -113,7 +113,12 @@ class PkgbuildParser(Iterable[PkgbuildPatch]):
... print(patch.key, patch.value)
"""
_BRACE_EXPANSION = re.compile(r"(.*)\{([^{}]+)\}(.*)")
_ESCAPED_CHARACTERS = {
"\\$": "$",
"\\`": "`",
"\\\"": "\"",
"\\\n": "",
}
def __init__(self, stream: IO[bytes]) -> None:
"""
@@ -123,27 +128,7 @@ class PkgbuildParser(Iterable[PkgbuildPatch]):
self._content = stream.read()
@staticmethod
def _expand_array(value: str, *, expand: bool = True) -> list[str]:
"""
expand comma-separated brace expressions in a value
Args:
value(str): value that may contain a brace expression
expand(bool, optional): whether brace expansion is allowed (Default value = True)
Returns:
list[str]: expanded values if applicable
"""
match = PkgbuildParser._BRACE_EXPANSION.fullmatch(value)
# if there is no comma inside it should be treated as normal value
if match is None or not expand or "," not in match.group(2):
return [value]
prefix, values, suffix = match.groups()
return [f"{prefix}{item}{suffix}" for item in values.split(",")]
@staticmethod
def _text(node: Node) -> str:
def text(node: Node) -> str:
"""
read the original source text represented by a syntax tree node
@@ -155,6 +140,50 @@ class PkgbuildParser(Iterable[PkgbuildPatch]):
"""
return cast(bytes, node.text).decode("utf8", errors="backslashreplace")
@staticmethod
def unquote(value: str) -> str:
"""
remove shell quotes and escapes from a single value
Args:
value(str): shell value to unquote
Returns:
str: unquoted value
"""
return "".join(shlex.split(value, comments=False, posix=True))
@staticmethod
def value(node: Node) -> str:
"""
extract a string value from a syntax tree node
Args:
node(Node): syntax tree node to extract
Returns:
str: extracted string value
"""
def unescape(source: str) -> str:
for original, replacement in PkgbuildParser._ESCAPED_CHARACTERS.items():
source = source.replace(original, replacement)
return source
if node.type == PkgbuildNodeType.Concatenation:
return "".join(PkgbuildParser.value(child) for child in node.named_children)
value = PkgbuildParser.text(node)
match node.type:
case PkgbuildNodeType.String | PkgbuildNodeType.StringContent:
if node.type == PkgbuildNodeType.String:
value = PkgbuildParser.unquote(value)
# protect escaped backslashes from being interpreted a second time.
return "\\".join(unescape(part) for part in value.split("\\\\"))
case PkgbuildNodeType.Number | PkgbuildNodeType.RawString | PkgbuildNodeType.Word:
return PkgbuildParser.unquote(value)
case _:
return value
def _assignment(self, node: Node) -> PkgbuildPatch:
"""
convert an assignment node
@@ -165,40 +194,91 @@ class PkgbuildParser(Iterable[PkgbuildPatch]):
Returns:
PkgbuildPatch: parsed assignment
"""
name = cast(Node, node.child_by_field_name(PkgbuildNodeField.Name))
value = cast(Node, node.child_by_field_name(PkgbuildNodeField.Value))
key = self._text(name)
key = self.text(cast(Node, node.child_by_field_name(PkgbuildNodeField.Name)))
value = node.child_by_field_name(PkgbuildNodeField.Value)
# bash permits assignments without a value (for example ``IFS=``).
# tree-sitter represents those assignments without a value node.
if value is None:
return PkgbuildPatch(key, "")
match value.type:
case PkgbuildNodeType.Array:
array_values = []
values = []
for element in filter(lambda child: child.type != PkgbuildNodeType.Comment, value.named_children):
item = self._value(element)
values = self._expand_array(item, expand=element.type == PkgbuildNodeType.Concatenation)
array_values.extend(values)
return PkgbuildPatch(key, array_values)
values.extend(self._expand_array(element))
return PkgbuildPatch(key, values)
case _:
return PkgbuildPatch(key, self._value(value))
return PkgbuildPatch(key, self.value(value))
def _read(self, node: Node) -> Iterator[PkgbuildPatch]:
def _expand_array(self, node: Node) -> list[str]:
"""
expand simple comma-separated brace groups in an array element
Args:
node(Node): array element to expand
Returns:
list[str]: expanded element values
"""
if node.type != PkgbuildNodeType.Concatenation:
return [self.value(node)]
values = [""]
children = node.named_children
while children:
match children[:3]:
case [
Node(type=PkgbuildNodeType.Word, text=b"{"),
Node(type=PkgbuildNodeType.Word) as content,
Node(type=PkgbuildNodeType.Word, text=b"}"),
] if "," in (escaped := self.text(content).replace("\\,", ShellInterpolator.DATA_LINK_ESCAPE)):
parts = [
self.unquote(part).replace(ShellInterpolator.DATA_LINK_ESCAPE, ",")
for part in escaped.split(",")
]
children = children[3:]
case _:
parts = [self.value(children.pop(0))]
values = [prefix + part for prefix in values for part in parts]
return values
def _read(self, node: Node, values: dict[str | None, PkgbuildPatch]) -> Iterator[PkgbuildPatch]:
"""
find assignments and functions in a syntax tree node
Args:
node(Node): syntax tree node to inspect
values(dict[str | None, PkgbuildPatch]): cached assignments
Yields:
PkgbuildPatch: parsed entries
"""
match node.type:
case PkgbuildNodeType.VariableAssignment if not any(child.type == PkgbuildNodeType.Append for child in node.children):
yield self._assignment(node)
case PkgbuildNodeType.VariableAssignment if any(child.type == PkgbuildNodeType.Append for child in node.children):
patch = self._assignment(node)
match values.get(patch.key), patch.value:
case PkgbuildPatch(value=str() as previous), str() as appended:
patch = PkgbuildPatch(patch.key, previous + appended)
case PkgbuildPatch(value=str() as previous), list() as appended:
patch = PkgbuildPatch(patch.key, [previous, *appended])
case PkgbuildPatch(value=list() as previous), list() as appended:
patch = PkgbuildPatch(patch.key, previous + appended)
values[patch.key] = patch
yield patch
case PkgbuildNodeType.VariableAssignment:
patch = self._assignment(node)
values[patch.key] = patch
yield patch
case PkgbuildNodeType.FunctionDefinition:
name = cast(Node, node.child_by_field_name(PkgbuildNodeField.Name))
body = cast(Node, node.child_by_field_name(PkgbuildNodeField.Body))
yield PkgbuildPatch(f"{self._text(name)}()", self._text(body))
yield PkgbuildPatch(f"{self.text(name)}()", self.text(body))
case _:
# descend into statements, but skip command arguments and values
@@ -210,31 +290,7 @@ class PkgbuildParser(Iterable[PkgbuildPatch]):
PkgbuildNodeType.String,
PkgbuildNodeType.Word,
):
yield from self._read(child)
def _value(self, node: Node) -> str:
"""
extract a string value from a syntax tree node
Args:
node(Node): syntax tree node to extract
Returns:
str: extracted string value
"""
if node.type in (PkgbuildNodeType.Concatenation, PkgbuildNodeType.String):
return "".join(self._value(child) for child in node.named_children)
value = self._text(node)
match node.type:
case PkgbuildNodeType.StringContent:
value = f'"{value}"'
case PkgbuildNodeType.Number | PkgbuildNodeType.RawString | PkgbuildNodeType.Word:
pass
case _:
return value
return "".join(shlex.split(value, comments=False, posix=True))
yield from self._read(child, values)
def parse(self) -> Iterator[PkgbuildPatch]:
"""
@@ -260,7 +316,7 @@ class PkgbuildParser(Iterable[PkgbuildPatch]):
f"syntax error at line {error.start_point.row + 1}, column {error.start_point.column + 1}"
)
yield from self._read(tree.root_node)
yield from self._read(tree.root_node, {})
def __iter__(self) -> Iterator[PkgbuildPatch]:
"""
@@ -18,9 +18,48 @@ def test_expand_array() -> None:
parser = PkgbuildParser(BytesIO(b"array=(prefix{first,second}suffix)"))
assert list(parser.parse()) == [PkgbuildPatch("array", ["prefixfirstsuffix", "prefixsecondsuffix"])]
parser = PkgbuildParser(BytesIO(br"array=(prefix{first\,second,third}suffix)"))
assert list(parser.parse()) == [PkgbuildPatch("array", ["prefixfirst,secondsuffix", "prefixthirdsuffix"])]
parser = PkgbuildParser(BytesIO(b"""array=("prefix{first,second}suffix")"""))
assert list(parser.parse()) == [PkgbuildPatch("array", ["prefix{first,second}suffix"])]
parser = PkgbuildParser(BytesIO(b"""array=(x"{a,b}" x'{a,b}' "{x,y}"{a,b})"""))
assert list(parser) == [PkgbuildPatch("array", ["x{a,b}", "x{a,b}", "{x,y}a", "{x,y}b"])]
parser = PkgbuildParser(BytesIO(b"""array=(${v:-a,b}suffix ${v:-a,b}{,.sig} $(echo '{a,b}')suffix)"""))
assert list(parser) == [PkgbuildPatch("array", [
"${v:-a,b}suffix", "${v:-a,b}", "${v:-a,b}.sig", "$(echo '{a,b}')suffix",
])]
def test_parse_append_array() -> None:
"""
must retain original array elements when appending and iterating again
"""
parser = PkgbuildParser(BytesIO(
b"source=(base.patch)\nsource+=(extra.patch)\nsource+=(last.patch)\nsource=(reset.patch)\nsource+=(extra.patch)"
))
expected = [
PkgbuildPatch("source", ["base.patch"]),
PkgbuildPatch("source", ["base.patch", "extra.patch"]),
PkgbuildPatch("source", ["base.patch", "extra.patch", "last.patch"]),
PkgbuildPatch("source", ["reset.patch"]),
PkgbuildPatch("source", ["reset.patch", "extra.patch"]),
]
assert list(parser) == expected
def test_parse_append_array_to_string() -> None:
"""
must preserve a string as the first element when appending an array
"""
parser = PkgbuildParser(BytesIO(b"source=base.patch\nsource+=(extra.patch)"))
assert list(parser) == [
PkgbuildPatch("source", "base.patch"),
PkgbuildPatch("source", ["base.patch", "extra.patch"]),
]
def test_parse_array() -> None:
"""
@@ -243,4 +282,12 @@ def test_parse(resource_path_root: Path) -> None:
_ver="$(cat CMakeLists.txt | grep -e SO_MAJOR_VERSION -e SO_MINOR_VERSION -e SO_BUILD_VERSION | cut -d '"' -f2 | head -n3)"
echo "$(echo ${_ver} | tr ' ' .).r$(git rev-list --count HEAD).$(git rev-parse --short HEAD)"
}"""),
PkgbuildPatch("var", "say \"hello\""),
PkgbuildPatch("var", "a\\b"),
PkgbuildPatch("var", "$name"),
PkgbuildPatch("var", "`date`"),
PkgbuildPatch("var", "firstsecond"),
PkgbuildPatch("var", "a\\qb"),
PkgbuildPatch("var", "\\$name"),
PkgbuildPatch("var", "first\nsecond"),
]
@@ -578,6 +578,7 @@ def test_walk(resource_path_root: Path) -> None:
resource_path_root / "models" / "package_pacman-static_pkgbuild",
resource_path_root / "models" / "package_python-pytest-loop_pkgbuild",
resource_path_root / "models" / "package_tpacpi-bat-git_pkgbuild",
resource_path_root / "models" / "package_ttf-google-fonts-git_pkgbuild",
resource_path_root / "models" / "package_vim-youcompleteme-git_pkgbuild",
resource_path_root / "models" / "package_yay_pkgbuild",
resource_path_root / "models" / "pkgbuild",
+303 -147
View File
@@ -222,7 +222,7 @@ def test_parse_ahriman(resource_path_root: Path) -> None:
must parse real PKGBUILDs correctly (ahriman)
"""
pkgbuild = Pkgbuild.from_file(resource_path_root / "models" / "package_ahriman_pkgbuild")
values = {key: value.value for key, value in pkgbuild.fields.items() if not value.is_function}
values = {key: None if value.is_function else value.value for key, value in pkgbuild.fields.items()}
assert values == {
"pkgbase": "ahriman",
"pkgname": "ahriman",
@@ -279,6 +279,8 @@ def test_parse_ahriman(resource_path_root: Path) -> None:
"53d37efec812afebf86281716259f9ea78a307b83897166c72777251c3eebcb587ecee375d907514781fb2a5c808cbb24ef9f3f244f12740155d0603bf213131",
"62b2eccc352d33853ef243c9cddd63663014aa97b87242f1b5bc5099a7dbd69ff3821f24ffc58e1b7f2387bd4e9e9712cc4c67f661b1724ad99cdf09b3717794",
],
"build()": None,
"package()": None,
}
@@ -287,7 +289,7 @@ def test_parse_gcc10(resource_path_root: Path) -> None:
must parse real PKGBUILDs correctly (gcc10)
"""
pkgbuild = Pkgbuild.from_file(resource_path_root / "models" / "package_gcc10_pkgbuild")
values = {key: value.value for key, value in pkgbuild.fields.items() if not value.is_function}
values = {key: None if value.is_function else value.value for key, value in pkgbuild.fields.items()}
assert values == {
"pkgbase": "gcc10",
"pkgname": [
@@ -354,6 +356,12 @@ def test_parse_gcc10(resource_path_root: Path) -> None:
"_CHOST": "${CHOST:=}",
"_MAKEFLAGS": "${MAKEFLAGS:=}",
"_libdir": "usr/lib/gcc/${CHOST}/${pkgver%%+*}",
"prepare()": None,
"build()": None,
"check()": None,
"package_gcc10-libs()": None,
"package_gcc10()": None,
"package_gcc10-fortran()": None,
}
@@ -362,7 +370,7 @@ def test_parse_jellyfin_ffmpeg6_bin(resource_path_root: Path) -> None:
must parse real PKGBUILDs correctly (jellyfin-ffmpeg6-bin)
"""
pkgbuild = Pkgbuild.from_file(resource_path_root / "models" / "package_jellyfin-ffmpeg6-bin_pkgbuild")
values = {key: value.value for key, value in pkgbuild.fields.items() if not value.is_function}
values = {key: None if value.is_function else value.value for key, value in pkgbuild.fields.items()}
assert values == {
"pkgbase": "jellyfin-ffmpeg6-bin",
"pkgname": "jellyfin-ffmpeg6-bin",
@@ -396,6 +404,189 @@ def test_parse_jellyfin_ffmpeg6_bin(resource_path_root: Path) -> None:
"source_aarch64": ["https://repo.jellyfin.org/releases/ffmpeg/${pkgver}-${pkgrel}/jellyfin-ffmpeg_${pkgver}-${pkgrel}_portable_linuxarm64-gpl.tar.xz"],
"sha256sums_x86_64": ["32cbe40942d26072faa1182835ccc89029883766de11778c731b529aa632ff37"],
"sha256sums_aarch64": ["22b8f2a3c92c6b1c9e6830a6631f08f3f0a7ae80739ace71ad30704a28045184"],
"package()": None,
}
def test_parse_pacman_static(resource_path_root: Path) -> None:
"""
must parse real PKGBUILDs correctly (pacman-static)
"""
pkgbuild = Pkgbuild.from_file(resource_path_root / "models" / "package_pacman-static_pkgbuild")
values = {key: None if value.is_function else value.value for key, value in pkgbuild.fields.items()}
assert values == {
"pkgbase": "pacman-static",
"pkgname": "pacman-static",
"pkgver": "7.0.0.r6.gc685ae6",
"_cares_ver": "1.34.4",
"_nghttp2_ver": "1.64.0",
"_curlver": "8.12.1",
"_sslver": "3.4.1",
"_zlibver": "1.3.1",
"_xzver": "5.6.4",
"_bzipver": "1.0.8",
"_zstdver": "1.5.6",
"_libarchive_ver": "3.7.7",
"_gpgerrorver": "1.51",
"_libassuanver": "3.0.0",
"_gpgmever": "1.24.2",
"pkgrel": "15",
"_git_tag": "7.0.0",
"_git_patch_level_commit": "c685ae6412af04cae1eaa5d6bda8c277c7ffb8c8",
"pkgdesc": "Statically-compiled pacman (to fix or install systems without libc)",
"arch": [
"i486",
"i686",
"pentium4",
"x86_64",
"arm",
"armv6h",
"armv7h",
"aarch64"
],
"url": "https://www.archlinux.org/pacman/",
"license": ["GPL-2.0-or-later"],
"depends": ["pacman"],
"makedepends": [
"meson",
"musl",
"kernel-headers-musl",
"git",
],
"options": [
"!emptydirs",
"!lto",
],
"source": [
"git+https://gitlab.archlinux.org/pacman/pacman.git#tag=v${_git_tag}?signed",
"pacman-revertme-makepkg-remove-libdepends-and-libprovides.patch::https://gitlab.archlinux.org/pacman/pacman/-/commit/354a300cd26bb1c7e6551473596be5ecced921de.patch",
"https://github.com/nghttp2/nghttp2/releases/download/v$_nghttp2_ver/nghttp2-$_nghttp2_ver.tar.xz",
"https://github.com/c-ares/c-ares/releases/download/v${_cares_ver}/c-ares-${_cares_ver}.tar.gz",
"https://github.com/c-ares/c-ares/releases/download/v${_cares_ver}/c-ares-${_cares_ver}.tar.gz.asc",
"https://curl.haxx.se/download/curl-${_curlver}.tar.gz",
"https://curl.haxx.se/download/curl-${_curlver}.tar.gz.asc",
"https://github.com/openssl/openssl/releases/download/openssl-${_sslver}/openssl-${_sslver}.tar.gz",
"https://github.com/openssl/openssl/releases/download/openssl-${_sslver}/openssl-${_sslver}.tar.gz.asc",
"ca-dir.patch",
"openssl-3.0.7-no-atomic.patch",
"https://zlib.net/zlib-${_zlibver}.tar.gz",
"https://zlib.net/zlib-${_zlibver}.tar.gz.asc",
"git+https://github.com/tukaani-project/xz#tag=v${_xzver}",
"https://sourceware.org/pub/bzip2/bzip2-${_bzipver}.tar.gz",
"https://sourceware.org/pub/bzip2/bzip2-${_bzipver}.tar.gz.sig",
"https://github.com/facebook/zstd/releases/download/v${_zstdver}/zstd-${_zstdver}.tar.zst",
"https://github.com/facebook/zstd/releases/download/v${_zstdver}/zstd-${_zstdver}.tar.zst.sig",
"https://gnupg.org/ftp/gcrypt/libgpg-error/libgpg-error-${_gpgerrorver}.tar.bz2",
"https://gnupg.org/ftp/gcrypt/libgpg-error/libgpg-error-${_gpgerrorver}.tar.bz2.sig",
"https://gnupg.org/ftp/gcrypt/libassuan/libassuan-${_libassuanver}.tar.bz2",
"https://gnupg.org/ftp/gcrypt/libassuan/libassuan-${_libassuanver}.tar.bz2.sig",
"https://www.gnupg.org/ftp/gcrypt/gpgme/gpgme-${_gpgmever}.tar.bz2",
"https://www.gnupg.org/ftp/gcrypt/gpgme/gpgme-${_gpgmever}.tar.bz2.sig",
"https://github.com/libarchive/libarchive/releases/download/v${_libarchive_ver}/libarchive-${_libarchive_ver}.tar.xz",
"https://github.com/libarchive/libarchive/releases/download/v${_libarchive_ver}/libarchive-${_libarchive_ver}.tar.xz.asc",
],
"validpgpkeys": [
"6645B0A8C7005E78DB1D7864F99FFE0FEAE999BD",
"B8151B117037781095514CA7BBDFFC92306B1121",
"27EDEAF22F3ABCEB50DB9A125CC908FDB71E12C2",
"DA7D64E4C82C6294CB73A20E22E3D13B5411B7CA",
"27EDEAF22F3ABCEB50DB9A125CC908FDB71E12C2",
"8657ABB260F056B1E5190839D9C4D26D0E604491",
"7953AC1FBC3DC8B3B292393ED5E9E43F7DF9EE8C",
"A21FAB74B0088AA361152586B8EF1A6BA9DA2D5C",
"EFC0A467D613CB83C7ED6D30D894E2CE8B3D79F5",
"BA5473A2B0587B07FB27CF2D216094DFD0CB81EF",
"8657ABB260F056B1E5190839D9C4D26D0E604491",
"7953AC1FBC3DC8B3B292393ED5E9E43F7DF9EE8C",
"A21FAB74B0088AA361152586B8EF1A6BA9DA2D5C",
"EFC0A467D613CB83C7ED6D30D894E2CE8B3D79F5",
"5ED46A6721D365587791E2AA783FCD8E58BCAFBA",
"3690C240CE51B4670D30AD1C38EE757D69184620",
"EC3CFE88F6CA0788774F5C1D1AA44BE649DE760A",
"4EF4AC63455FC9F4545D9B7DEF8FE99528B52FFD",
"D8692123C4065DEA5E0F3AB5249B39D24F25E3B6",
"031EC2536E580D8EA286A9F22071B08A33BD3F06",
"6DAA6E64A76D2840571B4902528897B826403ADA",
"AC8E115BF73E2D8D47FA9908E98E9B2D19C6C8BD",
"A5A45B12AD92D964B89EEE2DEC560C81CEC2276E",
"DB2C7CF1B4C265FAEF56E3FC5848A18B8F14184B",
],
"sha512sums": [
"44e00c2bc259fe6a85de71f7fd8a43fcfd1b8fb7d920d2267bd5b347e02f1dab736b3d96e31faf7b535480398e2348f7c0b9914e51ca7e12bab2d5b8003926b4",
"1a108c4384b6104e627652488659de0b1ac3330640fc3250f0a283af7c5884daab187c1efc024b2545262da1911d2b0b7b0d5e4e5b68bb98db25a760c9f1fb1a",
"b544196c3b7a55faacd11700d11e2fe4f16a7418282c9abb24a668544a15293580fd1a2cc5f93367c8a17c7ee45335c6d2f5c68a72dd176d516fd033f203eeec",
"3285e14d94bc736d6caddfe7ad7e3c6a6e69d49b079c989bb3e8aba4da62c022e38229d1e691aaa030b7d3bcd89e458d203f260806149a71ad9adb31606eae02",
"SKIP",
"9fcdcceab8bce43e888db79a38c775ff15790a806d3cc5cc96f396a829c6da2383b258481b5642153da14087943f6ef607af0aa3b75df6f41b95c6cd61d835eb",
"SKIP",
"1de6307c587686711f05d1e96731c43526fa3af51e4cd94c06c880954b67f6eb4c7db3177f0ea5937d41bc1f8cadcf5bce75025b5c1a46a469376960f1001c5f",
"SKIP",
"b1873dbb7a49460b007255689102062756972de5cc2d38b12cc9f389b6be412da6797579b1acd3717a8cd2ee118fd9801b94e55f063d4328f050f0876a5eb53c",
"b5887ea77417fae49b6cb1e9fa782d3021f268d5219701d87a092235964f73fa72a31428b630445517f56f2bb69dcbbb24119ef9dbf8b4e40a753369a9f9a16f",
"580677aad97093829090d4b605ac81c50327e74a6c2de0b85dd2e8525553f3ddde17556ea46f8f007f89e435493c9a20bc997d1ef1c1c2c23274528e3c46b94f",
"SKIP",
"e3216eca5fae2c9ce419e698bfbe186903088dad0a579749cb49bcde8f9d4073b98bf1570fe69190a9a41feb2a7c9814498ec9b867527de1c74ff75a1cbdfc17",
"083f5e675d73f3233c7930ebe20425a533feedeaaa9d8cc86831312a6581cefbe6ed0d08d2fa89be81082f2a5abdabca8b3c080bf97218a1bd59dc118a30b9f3",
"SKIP",
"21f9da445afd76acaf3acb22d216c2b584d95e8c68e00f5cb3f6673f2d556dd14a7593344adf8ffd194bba3314387ee0e486d6248f6c935abca2edd8a4cf95ed",
"SKIP",
"4489f615c6a0389577a7d1fd7d3917517bb2fe032abd9a6d87dfdbd165dabcf53f8780645934020bf27517b67a064297475888d5b368176cf06bc22f1e735e2b",
"SKIP",
"7c5c95c1b85bef2d4890c068a5a8ea8a1fe0d8def6ab09e5f34fc2746d8808bbb0fc168e3bd66d52ee5ed799dcf9f258f4125cda98c8384f6411bcad8d8b3139",
"SKIP",
"ad69101d1fceef6cd1dd6d5348f6f2be06912da6b6a7d0fece3ce08cf35054e6953b80ca9c4748554882892faa44e7c54e705cf25bbf2b796cd4ad12b09da185",
"SKIP",
"2524f71f4c2ebc254a1927279be3394e820d0a0c6dec7ef835a862aa08c35756edaa4208bcdc710dd092872b59c200b555b78670372e2830822e278ff1ec4e4a",
"SKIP",
],
"LDFLAGS": "$LDFLAGS -static",
"CC": "musl-gcc -fno-stack-protector",
"CXX": "musl-gcc -fno-stack-protector",
"CFLAGS": "${CFLAGS/-fstack-protector-strong/} -D_LARGEFILE64_SOURCE",
"CXXFLAGS": "${CXXFLAGS/-fstack-protector-strong/} -D_LARGEFILE64_SOURCE",
"PKGEXT": ".pkg.tar.xz",
"prepare()": None,
"build()": None,
"package()": None,
}
def test_parse_python_pytest_loop(resource_path_root: Path) -> None:
"""
must parse real PKGBUILDs correctly (python-pytest-loop)
"""
pkgbuild = Pkgbuild.from_file(resource_path_root / "models" / "package_python-pytest-loop_pkgbuild")
values = {key: None if value.is_function else value.value for key, value in pkgbuild.fields.items()}
assert values == {
"pkgbase": "python-pytest-loop",
"_pname": "${pkgbase#python-}",
"_pyname": "${_pname//-/_}",
"pkgname": ["python-${_pname}"],
"pkgver": "1.0.13",
"pkgrel": "1",
"pkgdesc": "Pytest plugin for looping test execution.",
"arch": ["any"],
"url": "https://github.com/anogowski/pytest-loop",
"license": ["MPL-2.0"],
"makedepends": [
"python-hatchling",
"python-versioningit",
"python-wheel",
"python-build",
"python-installer",
],
"checkdepends": [
"python-pytest",
],
"source": [
"https://files.pythonhosted.org/packages/source/${_pyname:0:1}/${_pyname}/${_pyname}-${pkgver}.tar.gz",
],
"md5sums": [
"98365f49606d5068f92350f1d2569a5f",
],
"build()": None,
"check()": None,
"package_python-pytest-loop()": None,
}
@@ -404,7 +595,7 @@ def test_parse_tpacpi_bat_git(resource_path_root: Path) -> None:
must parse real PKGBUILDs correctly (tpacpi-bat-git)
"""
pkgbuild = Pkgbuild.from_file(resource_path_root / "models" / "package_tpacpi-bat-git_pkgbuild")
values = {key: value.value for key, value in pkgbuild.fields.items() if not value.is_function}
values = {key: None if value.is_function else value.value for key, value in pkgbuild.fields.items()}
assert values == {
"pkgbase": "tpacpi-bat-git",
"pkgname": "tpacpi-bat-git",
@@ -421,45 +612,95 @@ def test_parse_tpacpi_bat_git(resource_path_root: Path) -> None:
"backup": ["etc/conf.d/tpacpi"],
"source": ["git+https://github.com/teleshoes/tpacpi-bat.git"],
"b2sums": ["SKIP"],
"pkgver()": None,
"package()": None,
}
def test_parse_yay(resource_path_root: Path) -> None:
def test_parse_ttf_google_fonts_git(resource_path_root: Path) -> None:
"""
must parse real PKGBUILDs correctly (yay)
must parse real PKGBUILDs correctly (ttf-google-fonts-git)
"""
pkgbuild = Pkgbuild.from_file(resource_path_root / "models" / "package_yay_pkgbuild")
values = {key: value.value for key, value in pkgbuild.fields.items() if not value.is_function}
pkgbuild = Pkgbuild.from_file(resource_path_root / "models" / "package_ttf-google-fonts-git_pkgbuild")
values = {key: None if value.is_function else value.value for key, value in pkgbuild.fields.items()}
assert "ttf-google-fonts-git" in pkgbuild.packages()
assert values == {
"pkgbase": "yay",
"pkgname": "yay",
"pkgver": "12.3.5",
"pkgname": "ttf-google-fonts-git",
"pkgver": "r11002.cdabad3d0",
"pkgrel": "1",
"pkgdesc": "Yet another yogurt. Pacman wrapper and AUR helper written in go.",
"arch": [
"i686",
"pentium4",
"x86_64",
"arm",
"armv7h",
"armv6h",
"aarch64",
"riscv64",
],
"url": "https://github.com/Jguer/yay",
"options": ["!lto"],
"license": ["GPL-3.0-or-later"],
"epoch": "1",
"pkgdesc": "TrueType fonts from the Google Fonts project (git version)",
"arch": ["any"],
"url": "https://github.com/google/fonts",
"license": ["custom:SIL Open Font License", "custom:Ubuntu Font License v1.0"],
"depends": [
"pacman>6.1",
"git",
"adobe-source-code-pro-fonts",
"adobe-source-sans-fonts",
"adobe-source-serif-fonts",
"cantarell-fonts",
"noto-fonts",
"noto-fonts-extra",
"ttf-anonymous-pro",
"ttf-caladea",
"ttf-croscore",
"ttf-fira-sans",
"ttf-fira-mono",
"ttf-inconsolata",
"ttf-lato",
"ttf-merriweather",
"ttf-merriweather-sans",
"ttf-opensans",
"ttf-oswald",
"ttf-quintessential",
"ttf-roboto",
"ttf-roboto-mono",
"ttf-signika",
"ttf-ubuntu-font-family",
],
"optdepends": [
"sudo: privilege elevation",
"doas: privilege elevation",
"makedepends": ["git", "fontconfig"],
"conflicts": [
"jsmath-fonts",
"lohit-fonts",
"ttf-andika",
"ttf-arabeyes-fonts",
"ttf-cardo",
"ttf-comfortaa",
"ttf-google-fonts-typewolf",
"ttf-lora-cyrillic",
"ttf-lekton",
"ttf-medievalsharp",
"ttf-nova",
"ttf-oxygen",
"ttf-oxygen-git",
"ttf-pt-fonts",
"ttf-source-code-pro-ibx",
"ttf-source-sans-pro-ibx",
"ttf-vollkorn-ibx",
],
"makedepends": ["go>=1.21"],
"source": ["${pkgname}-${pkgver}.tar.gz::https://github.com/Jguer/yay/archive/v${pkgver}.tar.gz"],
"sha256sums": ["2fb6121a6eb4c5e6afaf22212b2ed15022500a4bc34bb3dc0f9782c1d43c3962"],
"provides": [
"jsmath-fonts",
"lohit-fonts",
"ttf-andika",
"ttf-cardo",
"ttf-carlito",
"ttf-comfortaa",
"ttf-lora-cyrillic",
"ttf-lekton",
"ttf-medievalsharp",
"ttf-nova",
"ttf-oxygen",
"ttf-oxygen-git",
"ttf-pt-fonts",
"ttf-source-code-pro-ibx",
"ttf-source-sans-pro-ibx",
"ttf-vollkorn-ibx",
],
"source": ["git+${url}.git"],
"sha512sums": ["SKIP"],
"pkgbase": "ttf-google-fonts-git",
"pkgver()": None,
"prepare()": None,
"package()": None,
}
@@ -468,7 +709,7 @@ def test_parse_vim_youcompleteme_git(resource_path_root: Path) -> None:
must parse real PKGBUILDs correctly (vim-youcompleteme-git)
"""
pkgbuild = Pkgbuild.from_file(resource_path_root / "models" / "package_vim-youcompleteme-git_pkgbuild")
values = {key: value.value for key, value in pkgbuild.fields.items() if not value.is_function}
values = {key: None if value.is_function else value.value for key, value in pkgbuild.fields.items()}
assert values == {
"pkgbase": "vim-youcompleteme-git",
"_gocode": "y",
@@ -523,134 +764,49 @@ def test_parse_vim_youcompleteme_git(resource_path_root: Path) -> None:
"10a64c468d1dd2a384e0e5fd4eb2582fd9f1dfa706b6d2d2bb88fb0fbfc2718d",
"9a5bee818a4995bc52e91588059bef42728d046808206bfb93977f4e3109e50c",
],
"pkgver()": None,
"prepare()": None,
"build()": None,
"package()": None,
}
def test_parse_python_pytest_loop(resource_path_root: Path) -> None:
def test_parse_yay(resource_path_root: Path) -> None:
"""
must parse real PKGBUILDs correctly (python-pytest-loop)
must parse real PKGBUILDs correctly (yay)
"""
pkgbuild = Pkgbuild.from_file(resource_path_root / "models" / "package_python-pytest-loop_pkgbuild")
values = {key: value.value for key, value in pkgbuild.fields.items() if not value.is_function}
pkgbuild = Pkgbuild.from_file(resource_path_root / "models" / "package_yay_pkgbuild")
values = {key: None if value.is_function else value.value for key, value in pkgbuild.fields.items()}
assert values == {
"pkgbase": "python-pytest-loop",
"_pname": "${pkgbase#python-}",
"_pyname": "${_pname//-/_}",
"pkgname": ["python-${_pname}"],
"pkgver": "1.0.13",
"pkgbase": "yay",
"pkgname": "yay",
"pkgver": "12.3.5",
"pkgrel": "1",
"pkgdesc": "Pytest plugin for looping test execution.",
"arch": ["any"],
"url": "https://github.com/anogowski/pytest-loop",
"license": ["MPL-2.0"],
"makedepends": [
"python-hatchling",
"python-versioningit",
"python-wheel",
"python-build",
"python-installer",
],
"checkdepends": [
"python-pytest",
],
"source": [
"https://files.pythonhosted.org/packages/source/${_pyname:0:1}/${_pyname}/${_pyname}-${pkgver}.tar.gz",
],
"md5sums": [
"98365f49606d5068f92350f1d2569a5f",
],
}
def test_parse_pacman_static(resource_path_root: Path) -> None:
"""
must parse real PKGBUILDs correctly (pacman-static)
"""
pkgbuild = Pkgbuild.from_file(resource_path_root / "models" / "package_pacman-static_pkgbuild")
values = {key: value.value for key, value in pkgbuild.fields.items() if not value.is_function}
assert values == {
"pkgbase": "pacman-static",
"pkgname": "pacman-static",
"pkgver": "7.0.0.r6.gc685ae6",
"_cares_ver": "1.34.4",
"_nghttp2_ver": "1.64.0",
"_curlver": "8.12.1",
"_sslver": "3.4.1",
"_zlibver": "1.3.1",
"_xzver": "5.6.4",
"_bzipver": "1.0.8",
"_zstdver": "1.5.6",
"_libarchive_ver": "3.7.7",
"_gpgerrorver": "1.51",
"_libassuanver": "3.0.0",
"_gpgmever": "1.24.2",
"pkgrel": "15",
"_git_tag": "7.0.0",
"_git_patch_level_commit": "c685ae6412af04cae1eaa5d6bda8c277c7ffb8c8",
"pkgdesc": "Statically-compiled pacman (to fix or install systems without libc)",
"pkgdesc": "Yet another yogurt. Pacman wrapper and AUR helper written in go.",
"arch": [
"i486",
"i686",
"pentium4",
"x86_64",
"arm",
"armv6h",
"armv7h",
"aarch64"
"armv6h",
"aarch64",
"riscv64",
],
"url": "https://www.archlinux.org/pacman/",
"license": ["GPL-2.0-or-later"],
"depends": ["pacman"],
"makedepends": [
"meson",
"musl",
"kernel-headers-musl",
"url": "https://github.com/Jguer/yay",
"options": ["!lto"],
"license": ["GPL-3.0-or-later"],
"depends": [
"pacman>6.1",
"git",
],
"options": [
"!emptydirs",
"!lto",
"optdepends": [
"sudo: privilege elevation",
"doas: privilege elevation",
],
"source": [
"git+https://gitlab.archlinux.org/pacman/pacman.git#tag=v${_git_tag}?signed",
"pacman-revertme-makepkg-remove-libdepends-and-libprovides.patch::https://gitlab.archlinux.org/pacman/pacman/-/commit/354a300cd26bb1c7e6551473596be5ecced921de.patch",
],
"validpgpkeys": [
"6645B0A8C7005E78DB1D7864F99FFE0FEAE999BD",
"B8151B117037781095514CA7BBDFFC92306B1121",
],
"sha512sums": [
"44e00c2bc259fe6a85de71f7fd8a43fcfd1b8fb7d920d2267bd5b347e02f1dab736b3d96e31faf7b535480398e2348f7c0b9914e51ca7e12bab2d5b8003926b4",
"1a108c4384b6104e627652488659de0b1ac3330640fc3250f0a283af7c5884daab187c1efc024b2545262da1911d2b0b7b0d5e4e5b68bb98db25a760c9f1fb1a",
"b544196c3b7a55faacd11700d11e2fe4f16a7418282c9abb24a668544a15293580fd1a2cc5f93367c8a17c7ee45335c6d2f5c68a72dd176d516fd033f203eeec",
"3285e14d94bc736d6caddfe7ad7e3c6a6e69d49b079c989bb3e8aba4da62c022e38229d1e691aaa030b7d3bcd89e458d203f260806149a71ad9adb31606eae02",
"SKIP",
"9fcdcceab8bce43e888db79a38c775ff15790a806d3cc5cc96f396a829c6da2383b258481b5642153da14087943f6ef607af0aa3b75df6f41b95c6cd61d835eb",
"SKIP",
"1de6307c587686711f05d1e96731c43526fa3af51e4cd94c06c880954b67f6eb4c7db3177f0ea5937d41bc1f8cadcf5bce75025b5c1a46a469376960f1001c5f",
"SKIP",
"b1873dbb7a49460b007255689102062756972de5cc2d38b12cc9f389b6be412da6797579b1acd3717a8cd2ee118fd9801b94e55f063d4328f050f0876a5eb53c",
"b5887ea77417fae49b6cb1e9fa782d3021f268d5219701d87a092235964f73fa72a31428b630445517f56f2bb69dcbbb24119ef9dbf8b4e40a753369a9f9a16f",
"580677aad97093829090d4b605ac81c50327e74a6c2de0b85dd2e8525553f3ddde17556ea46f8f007f89e435493c9a20bc997d1ef1c1c2c23274528e3c46b94f",
"SKIP",
"e3216eca5fae2c9ce419e698bfbe186903088dad0a579749cb49bcde8f9d4073b98bf1570fe69190a9a41feb2a7c9814498ec9b867527de1c74ff75a1cbdfc17",
"083f5e675d73f3233c7930ebe20425a533feedeaaa9d8cc86831312a6581cefbe6ed0d08d2fa89be81082f2a5abdabca8b3c080bf97218a1bd59dc118a30b9f3",
"SKIP",
"21f9da445afd76acaf3acb22d216c2b584d95e8c68e00f5cb3f6673f2d556dd14a7593344adf8ffd194bba3314387ee0e486d6248f6c935abca2edd8a4cf95ed",
"SKIP",
"4489f615c6a0389577a7d1fd7d3917517bb2fe032abd9a6d87dfdbd165dabcf53f8780645934020bf27517b67a064297475888d5b368176cf06bc22f1e735e2b",
"SKIP",
"7c5c95c1b85bef2d4890c068a5a8ea8a1fe0d8def6ab09e5f34fc2746d8808bbb0fc168e3bd66d52ee5ed799dcf9f258f4125cda98c8384f6411bcad8d8b3139",
"SKIP",
"ad69101d1fceef6cd1dd6d5348f6f2be06912da6b6a7d0fece3ce08cf35054e6953b80ca9c4748554882892faa44e7c54e705cf25bbf2b796cd4ad12b09da185",
"SKIP",
"2524f71f4c2ebc254a1927279be3394e820d0a0c6dec7ef835a862aa08c35756edaa4208bcdc710dd092872b59c200b555b78670372e2830822e278ff1ec4e4a",
"SKIP",
],
"LDFLAGS": "$LDFLAGS -static",
"CC": "musl-gcc -fno-stack-protector",
"CXX": "musl-gcc -fno-stack-protector",
"CFLAGS": "${CFLAGS/-fstack-protector-strong/}",
"CXXFLAGS": "${CXXFLAGS/-fstack-protector-strong/}",
"PKGEXT": ".pkg.tar.xz",
"makedepends": ["go>=1.21"],
"source": ["${pkgname}-${pkgver}.tar.gz::https://github.com/Jguer/yay/archive/v${pkgver}.tar.gz"],
"sha256sums": ["2fb6121a6eb4c5e6afaf22212b2ed15022500a4bc34bb3dc0f9782c1d43c3962"],
"build()": None,
"package()": None,
}
+1 -1
View File
@@ -2,7 +2,7 @@
pkgbase='ahriman'
pkgname=('ahriman' 'ahriman-core' 'ahriman-triggers' 'ahriman-web')
pkgver=2.23.2
pkgver=2.23.6
pkgrel=1
pkgdesc="ArcH linux ReposItory MANager"
arch=('any')
+4 -2
View File
@@ -65,7 +65,7 @@ digraph G {
ahriman_core_alpm_pacman [fillcolor="#9f2b04",fontcolor="#ffffff",label="ahriman\.\ncore\.\nalpm\.\npacman"];
ahriman_core_alpm_pacman_database [fillcolor="#a15035",fontcolor="#ffffff",label="ahriman\.\ncore\.\nalpm\.\npacman_database"];
ahriman_core_alpm_pacman_handle [fillcolor="#cc5933",fontcolor="#ffffff",label="ahriman\.\ncore\.\nalpm\.\npacman_handle"];
ahriman_core_alpm_pkgbuild_parser [fillcolor="#a15035",fontcolor="#ffffff",label="ahriman\.\ncore\.\nalpm\.\npkgbuild_parser"];
ahriman_core_alpm_pkgbuild_parser [fillcolor="#914830",fontcolor="#ffffff",label="ahriman\.\ncore\.\nalpm\.\npkgbuild_parser"];
ahriman_core_alpm_remote [fillcolor="blue",fontcolor="white",label="ahriman\.\ncore\.\nalpm\.\nremote",shape="box"];
ahriman_core_alpm_remote_aur [fillcolor="blue",fontcolor="white",label="ahriman\.\ncore\.\nalpm\.\nremote\.\naur",shape="box"];
ahriman_core_alpm_remote_official [fillcolor="blue",fontcolor="white",label="ahriman\.\ncore\.\nalpm\.\nremote\.\nofficial",shape="box"];
@@ -567,7 +567,7 @@ digraph G {
ahriman_core_alpm_pacman_database -> ahriman_core_alpm_pacman [fillcolor="#a15035",weight="3"];
ahriman_core_alpm_pacman_handle -> ahriman_core_alpm_pacman [fillcolor="#cc5933",weight="3"];
ahriman_core_alpm_pacman_handle -> ahriman_models_package [fillcolor="#cc5933",minlen="3"];
ahriman_core_alpm_pkgbuild_parser -> ahriman_models_pkgbuild [fillcolor="#a15035",minlen="3"];
ahriman_core_alpm_pkgbuild_parser -> ahriman_models_pkgbuild [fillcolor="#914830",minlen="3"];
ahriman_core_alpm_remote -> ahriman_application_handlers_search [fillcolor="blue",minlen="3"];
ahriman_core_alpm_remote -> ahriman_core_build_tools_package_archive [fillcolor="blue",minlen="2",weight="2"];
ahriman_core_alpm_remote -> ahriman_core_repository_repository [fillcolor="blue",minlen="2",weight="2"];
@@ -667,6 +667,7 @@ digraph G {
ahriman_core_configuration -> ahriman_application_lock [fillcolor="blue",minlen="2"];
ahriman_core_configuration -> ahriman_core_alpm_pacman [fillcolor="blue",minlen="2",weight="2"];
ahriman_core_configuration -> ahriman_core_alpm_pacman_database [fillcolor="blue",minlen="2",weight="2"];
ahriman_core_configuration -> ahriman_core_alpm_pkgbuild_parser [fillcolor="blue",minlen="2",weight="2"];
ahriman_core_configuration -> ahriman_core_archive_archive_trigger [fillcolor="blue",minlen="2",weight="2"];
ahriman_core_configuration -> ahriman_core_auth_auth [fillcolor="blue",minlen="2",weight="2"];
ahriman_core_configuration -> ahriman_core_auth_mapping [fillcolor="blue",minlen="2",weight="2"];
@@ -734,6 +735,7 @@ digraph G {
ahriman_core_configuration_configuration_multi_dict -> ahriman_core_configuration_configuration [fillcolor="#b85c3d",weight="3"];
ahriman_core_configuration_schema -> ahriman_application_handlers_validate [fillcolor="#ce603b",minlen="3"];
ahriman_core_configuration_schema -> ahriman_core_triggers_trigger [fillcolor="#ce603b",minlen="2",weight="2"];
ahriman_core_configuration_shell_interpolator -> ahriman_core_alpm_pkgbuild_parser [fillcolor="blue",minlen="2",weight="2"];
ahriman_core_configuration_shell_interpolator -> ahriman_core_configuration_configuration [fillcolor="blue",weight="3"];
ahriman_core_configuration_shell_template -> ahriman_core_configuration_shell_interpolator [fillcolor="#ce603b",weight="3"];
ahriman_core_configuration_shell_template -> ahriman_models_pkgbuild_patch [fillcolor="#ce603b",minlen="3"];
+1 -1
View File
@@ -42,5 +42,5 @@
"preview": "vite preview"
},
"type": "module",
"version": "2.23.2"
"version": "2.23.6"
}
@@ -0,0 +1,151 @@
# Maintainer: Andrew Crerar <crerar@archlinux.org>
# Contributor: Mohammadreza Abdollahzadeh <morealaz at gmail dot com>
# Contributor: FadeMind <fademind@gmail.com>
# Contributor: Vlad M. <vlad@archlinux.net>
# Contributor: Sebastian Stammler <stammler.s@gmail.com>
# Contributor: Sarkasper <echo a2FzcGVyLm1lbnRlbkBnbXguY29tCg== | base64 -d>
# Contributor: Daniel Micay <danielmicay@gmail.com>
# Contributor: Michalis Georgiou <mechmg93@gmail.comr>
# Contributor: Alexander De Sousa <archaur.xandy21@spamgourmet.com>
pkgname=ttf-google-fonts-git
pkgver=r11002.cdabad3d0
pkgrel=1
epoch=1
pkgdesc="TrueType fonts from the Google Fonts project (git version)"
arch=('any')
url="https://github.com/google/fonts"
license=('custom:SIL Open Font License' 'custom:Ubuntu Font License v1.0')
depends=('adobe-source-code-pro-fonts'
'adobe-source-sans-fonts'
'adobe-source-serif-fonts'
'cantarell-fonts'
'noto-fonts'
'noto-fonts-extra'
'ttf-anonymous-pro'
'ttf-caladea'
'ttf-croscore'
'ttf-fira-sans'
'ttf-fira-mono'
'ttf-inconsolata'
'ttf-lato'
'ttf-merriweather'
'ttf-merriweather-sans'
'ttf-opensans'
'ttf-oswald'
'ttf-quintessential'
'ttf-roboto'
'ttf-roboto-mono'
'ttf-signika'
'ttf-ubuntu-font-family')
makedepends=('git' 'fontconfig')
conflicts=('jsmath-fonts'
'lohit-fonts'
'ttf-andika'
'ttf-arabeyes-fonts'
'ttf-cardo'
'ttf-comfortaa'
'ttf-google-fonts-typewolf'
'ttf-lora-cyrillic'
'ttf-lekton'
'ttf-medievalsharp'
'ttf-nova'
'ttf-oxygen'
'ttf-oxygen-git'
'ttf-pt-fonts'
'ttf-source-code-pro-ibx'
'ttf-source-sans-pro-ibx'
'ttf-vollkorn-ibx')
provides=('jsmath-fonts'
'lohit-fonts'
'ttf-andika'
'ttf-cardo'
'ttf-carlito'
'ttf-comfortaa'
'ttf-lora-cyrillic'
'ttf-lekton'
'ttf-medievalsharp'
'ttf-nova'
'ttf-oxygen'
'ttf-oxygen-git'
'ttf-pt-fonts'
'ttf-source-code-pro-ibx'
'ttf-source-sans-pro-ibx'
'ttf-vollkorn-ibx')
source=(git+"${url}".git)
sha512sums=('SKIP')
pkgver() {
cd fonts
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
prepare() {
cd fonts
# NOTE: Adobe Blank is not meant to be installed.
# See: https://github.com/google/fonts/issues/2106#issuecomment-520067314
rm --recursive "${srcdir}/fonts/ofl/adobeblank"
}
package() {
# NOTE: These are the font families that already exist in the [extra] repo
# or should not be installed by this package, due to user reports
# of system instability.
declare -A omitted_font_families=(
[anonymous-pro]=1
[arimo]=1
[caladea]=1
[cantarell]=1
[carlito]=1
[cousine]=1
[dai-banna-sil]=1
[fira-sans]=1
[fira-mono]=1
[inconsolata]=1
[merriweather]=1
[merriweather-sans]=1
[noto-color-emoji]=1
[noto-sans]=1
[noto-sans-tamil]=1
[noto-serif]=1
[open-sans]=1
[oswald]=1
[quintessential]=1
[roboto]=1
[roboto-condensed]=1
[roboto-mono]=1
[source-sans-3]=1
[source-sans-pro]=1
[source-serif-4]=1
[source-serif-pro]=1
[tinos]=1
[ubuntu]=1
[ubuntu-mono]=1
)
while IFS= read -rd '' file; do
font_family=$(fc-query -f '%{family[0]|downcase|translate( ,-)}\n' "$file" | sed -n '1p')
# NOTE: Skip the rest of the loop if we're not supposed to be touching this family
((omitted_font_families["$font_family"])) && continue
pkg_font_path="$pkgdir"/usr/share/fonts/"$font_family"
install -Dm644 "$file" -t "$pkg_font_path" # TODO: Check and make sure $font_family is being created
# NOTE: If the font's license already exists, we don't need to copy the license again.
src_license_path="${file%/*}"/OFL.txt
pkg_font_license="$pkgdir"/usr/share/licenses/"$pkgname"/LICENSE."$font_family"
if [[ -f "$src_license_path" && ! -f "$pkg_font_license" ]]; then
install -Dm644 "$src_license_path" "$pkg_font_license"
fi
done < <(find "$srcdir" -type f -iname \*.ttf -print0)
# NOTE: Since the zcool xiaowei chinese font has special characters. We need to change
# the folder name to prevent errors during package compression.
mv "$pkgdir"/usr/share/fonts/站酷小薇体 "$pkgdir"/usr/share/fonts/zcool-xiaowei-regular
mv "$pkgdir"/usr/share/licenses/"$pkgname"/LICENSE.站酷小薇体 "$pkgdir"/usr/share/licenses/"$pkgname"/LICENSE.zcool-xiaowei-regular
}
+12
View File
@@ -113,3 +113,15 @@ pkgver() {
_ver="$(cat CMakeLists.txt | grep -e SO_MAJOR_VERSION -e SO_MINOR_VERSION -e SO_BUILD_VERSION | cut -d '"' -f2 | head -n3)"
echo "$(echo ${_ver} | tr ' ' .).r$(git rev-list --count HEAD).$(git rev-parse --short HEAD)"
}
# escapes and newlines inside double-quoted assignments
var="say \"hello\""
var="a\\b"
var="\$name"
var="\`date\`"
var="first\
second"
var="a\qb"
var="\\\\$name"
var="first
second"