mirror of
https://github.com/arcan1s/ahriman.git
synced 2026-10-31 13:33:06 +00:00
Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d3b569bfa2 | ||
|
|
64a7e9b288 | ||
|
|
5ad8a2a7d0 | ||
|
|
c56a319267 |
No files matched your search
@@ -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.
|
* 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.
|
* 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.
|
* `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
|
### Other checks
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
.TH AHRIMAN "1" "2026\-10\-25" "ahriman 2.23.5" "ArcH linux ReposItory MANager"
|
.TH AHRIMAN "1" "2026\-10\-30" "ahriman 2.23.6" "ArcH linux ReposItory MANager"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
ahriman \- ArcH linux ReposItory MANager
|
ahriman \- ArcH linux ReposItory MANager
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
|
|||||||
@@ -17,4 +17,4 @@
|
|||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
__version__ = "2.23.5"
|
__version__ = "2.23.6"
|
||||||
@@ -113,6 +113,13 @@ class PkgbuildParser(Iterable[PkgbuildPatch]):
|
|||||||
... print(patch.key, patch.value)
|
... print(patch.key, patch.value)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
_ESCAPED_CHARACTERS = {
|
||||||
|
"\\$": "$",
|
||||||
|
"\\`": "`",
|
||||||
|
"\\\"": "\"",
|
||||||
|
"\\\n": "",
|
||||||
|
}
|
||||||
|
|
||||||
def __init__(self, stream: IO[bytes]) -> None:
|
def __init__(self, stream: IO[bytes]) -> None:
|
||||||
"""
|
"""
|
||||||
Args:
|
Args:
|
||||||
@@ -121,7 +128,7 @@ class PkgbuildParser(Iterable[PkgbuildPatch]):
|
|||||||
self._content = stream.read()
|
self._content = stream.read()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _text(node: Node) -> str:
|
def text(node: Node) -> str:
|
||||||
"""
|
"""
|
||||||
read the original source text represented by a syntax tree node
|
read the original source text represented by a syntax tree node
|
||||||
|
|
||||||
@@ -134,7 +141,7 @@ class PkgbuildParser(Iterable[PkgbuildPatch]):
|
|||||||
return cast(bytes, node.text).decode("utf8", errors="backslashreplace")
|
return cast(bytes, node.text).decode("utf8", errors="backslashreplace")
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _unquote(value: str) -> str:
|
def unquote(value: str) -> str:
|
||||||
"""
|
"""
|
||||||
remove shell quotes and escapes from a single value
|
remove shell quotes and escapes from a single value
|
||||||
|
|
||||||
@@ -146,6 +153,37 @@ class PkgbuildParser(Iterable[PkgbuildPatch]):
|
|||||||
"""
|
"""
|
||||||
return "".join(shlex.split(value, comments=False, posix=True))
|
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:
|
def _assignment(self, node: Node) -> PkgbuildPatch:
|
||||||
"""
|
"""
|
||||||
convert an assignment node
|
convert an assignment node
|
||||||
@@ -156,10 +194,8 @@ class PkgbuildParser(Iterable[PkgbuildPatch]):
|
|||||||
Returns:
|
Returns:
|
||||||
PkgbuildPatch: parsed assignment
|
PkgbuildPatch: parsed assignment
|
||||||
"""
|
"""
|
||||||
name = cast(Node, node.child_by_field_name(PkgbuildNodeField.Name))
|
key = self.text(cast(Node, node.child_by_field_name(PkgbuildNodeField.Name)))
|
||||||
value = cast(Node, node.child_by_field_name(PkgbuildNodeField.Value))
|
value = node.child_by_field_name(PkgbuildNodeField.Value)
|
||||||
key = self._text(name)
|
|
||||||
|
|
||||||
# bash permits assignments without a value (for example ``IFS=``).
|
# bash permits assignments without a value (for example ``IFS=``).
|
||||||
# tree-sitter represents those assignments without a value node.
|
# tree-sitter represents those assignments without a value node.
|
||||||
if value is None:
|
if value is None:
|
||||||
@@ -167,13 +203,13 @@ class PkgbuildParser(Iterable[PkgbuildPatch]):
|
|||||||
|
|
||||||
match value.type:
|
match value.type:
|
||||||
case PkgbuildNodeType.Array:
|
case PkgbuildNodeType.Array:
|
||||||
array_values = []
|
values = []
|
||||||
for element in filter(lambda child: child.type != PkgbuildNodeType.Comment, value.named_children):
|
for element in filter(lambda child: child.type != PkgbuildNodeType.Comment, value.named_children):
|
||||||
array_values.extend(self._expand_array(element))
|
values.extend(self._expand_array(element))
|
||||||
return PkgbuildPatch(key, array_values)
|
return PkgbuildPatch(key, values)
|
||||||
|
|
||||||
case _:
|
case _:
|
||||||
return PkgbuildPatch(key, self._value(value))
|
return PkgbuildPatch(key, self.value(value))
|
||||||
|
|
||||||
def _expand_array(self, node: Node) -> list[str]:
|
def _expand_array(self, node: Node) -> list[str]:
|
||||||
"""
|
"""
|
||||||
@@ -186,7 +222,7 @@ class PkgbuildParser(Iterable[PkgbuildPatch]):
|
|||||||
list[str]: expanded element values
|
list[str]: expanded element values
|
||||||
"""
|
"""
|
||||||
if node.type != PkgbuildNodeType.Concatenation:
|
if node.type != PkgbuildNodeType.Concatenation:
|
||||||
return [self._value(node)]
|
return [self.value(node)]
|
||||||
|
|
||||||
values = [""]
|
values = [""]
|
||||||
children = node.named_children
|
children = node.named_children
|
||||||
@@ -196,17 +232,18 @@ class PkgbuildParser(Iterable[PkgbuildPatch]):
|
|||||||
Node(type=PkgbuildNodeType.Word, text=b"{"),
|
Node(type=PkgbuildNodeType.Word, text=b"{"),
|
||||||
Node(type=PkgbuildNodeType.Word) as content,
|
Node(type=PkgbuildNodeType.Word) as content,
|
||||||
Node(type=PkgbuildNodeType.Word, text=b"}"),
|
Node(type=PkgbuildNodeType.Word, text=b"}"),
|
||||||
] if "," in (escaped := self._text(content).replace("\\,", ShellInterpolator.DATA_LINK_ESCAPE)):
|
] if "," in (escaped := self.text(content).replace("\\,", ShellInterpolator.DATA_LINK_ESCAPE)):
|
||||||
parts = [
|
parts = [
|
||||||
self._unquote(part).replace(ShellInterpolator.DATA_LINK_ESCAPE, ",")
|
self.unquote(part).replace(ShellInterpolator.DATA_LINK_ESCAPE, ",")
|
||||||
for part in escaped.split(",")
|
for part in escaped.split(",")
|
||||||
]
|
]
|
||||||
children = children[3:]
|
children = children[3:]
|
||||||
|
|
||||||
case [head, *_]:
|
case _:
|
||||||
parts = [self._value(head)]
|
parts = [self.value(children.pop(0))]
|
||||||
children = children[1:]
|
|
||||||
values = [prefix + part for prefix in values for part in parts]
|
values = [prefix + part for prefix in values for part in parts]
|
||||||
|
|
||||||
return values
|
return values
|
||||||
|
|
||||||
def _read(self, node: Node, values: dict[str | None, PkgbuildPatch]) -> Iterator[PkgbuildPatch]:
|
def _read(self, node: Node, values: dict[str | None, PkgbuildPatch]) -> Iterator[PkgbuildPatch]:
|
||||||
@@ -241,7 +278,7 @@ class PkgbuildParser(Iterable[PkgbuildPatch]):
|
|||||||
case PkgbuildNodeType.FunctionDefinition:
|
case PkgbuildNodeType.FunctionDefinition:
|
||||||
name = cast(Node, node.child_by_field_name(PkgbuildNodeField.Name))
|
name = cast(Node, node.child_by_field_name(PkgbuildNodeField.Name))
|
||||||
body = cast(Node, node.child_by_field_name(PkgbuildNodeField.Body))
|
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 _:
|
case _:
|
||||||
# descend into statements, but skip command arguments and values
|
# descend into statements, but skip command arguments and values
|
||||||
@@ -255,30 +292,6 @@ class PkgbuildParser(Iterable[PkgbuildPatch]):
|
|||||||
):
|
):
|
||||||
yield from self._read(child, values)
|
yield from self._read(child, values)
|
||||||
|
|
||||||
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 self._unquote(value)
|
|
||||||
|
|
||||||
def parse(self) -> Iterator[PkgbuildPatch]:
|
def parse(self) -> Iterator[PkgbuildPatch]:
|
||||||
"""
|
"""
|
||||||
parse source and yield extracted entries
|
parse source and yield extracted entries
|
||||||
|
|||||||
@@ -282,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)"
|
_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)"
|
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"),
|
||||||
]
|
]
|
||||||
@@ -222,7 +222,7 @@ def test_parse_ahriman(resource_path_root: Path) -> None:
|
|||||||
must parse real PKGBUILDs correctly (ahriman)
|
must parse real PKGBUILDs correctly (ahriman)
|
||||||
"""
|
"""
|
||||||
pkgbuild = Pkgbuild.from_file(resource_path_root / "models" / "package_ahriman_pkgbuild")
|
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 == {
|
assert values == {
|
||||||
"pkgbase": "ahriman",
|
"pkgbase": "ahriman",
|
||||||
"pkgname": "ahriman",
|
"pkgname": "ahriman",
|
||||||
@@ -279,6 +279,8 @@ def test_parse_ahriman(resource_path_root: Path) -> None:
|
|||||||
"53d37efec812afebf86281716259f9ea78a307b83897166c72777251c3eebcb587ecee375d907514781fb2a5c808cbb24ef9f3f244f12740155d0603bf213131",
|
"53d37efec812afebf86281716259f9ea78a307b83897166c72777251c3eebcb587ecee375d907514781fb2a5c808cbb24ef9f3f244f12740155d0603bf213131",
|
||||||
"62b2eccc352d33853ef243c9cddd63663014aa97b87242f1b5bc5099a7dbd69ff3821f24ffc58e1b7f2387bd4e9e9712cc4c67f661b1724ad99cdf09b3717794",
|
"62b2eccc352d33853ef243c9cddd63663014aa97b87242f1b5bc5099a7dbd69ff3821f24ffc58e1b7f2387bd4e9e9712cc4c67f661b1724ad99cdf09b3717794",
|
||||||
],
|
],
|
||||||
|
"build()": None,
|
||||||
|
"package()": None,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -287,7 +289,7 @@ def test_parse_gcc10(resource_path_root: Path) -> None:
|
|||||||
must parse real PKGBUILDs correctly (gcc10)
|
must parse real PKGBUILDs correctly (gcc10)
|
||||||
"""
|
"""
|
||||||
pkgbuild = Pkgbuild.from_file(resource_path_root / "models" / "package_gcc10_pkgbuild")
|
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 == {
|
assert values == {
|
||||||
"pkgbase": "gcc10",
|
"pkgbase": "gcc10",
|
||||||
"pkgname": [
|
"pkgname": [
|
||||||
@@ -354,6 +356,12 @@ def test_parse_gcc10(resource_path_root: Path) -> None:
|
|||||||
"_CHOST": "${CHOST:=}",
|
"_CHOST": "${CHOST:=}",
|
||||||
"_MAKEFLAGS": "${MAKEFLAGS:=}",
|
"_MAKEFLAGS": "${MAKEFLAGS:=}",
|
||||||
"_libdir": "usr/lib/gcc/${CHOST}/${pkgver%%+*}",
|
"_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)
|
must parse real PKGBUILDs correctly (jellyfin-ffmpeg6-bin)
|
||||||
"""
|
"""
|
||||||
pkgbuild = Pkgbuild.from_file(resource_path_root / "models" / "package_jellyfin-ffmpeg6-bin_pkgbuild")
|
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 == {
|
assert values == {
|
||||||
"pkgbase": "jellyfin-ffmpeg6-bin",
|
"pkgbase": "jellyfin-ffmpeg6-bin",
|
||||||
"pkgname": "jellyfin-ffmpeg6-bin",
|
"pkgname": "jellyfin-ffmpeg6-bin",
|
||||||
@@ -396,6 +404,7 @@ 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"],
|
"source_aarch64": ["https://repo.jellyfin.org/releases/ffmpeg/${pkgver}-${pkgrel}/jellyfin-ffmpeg_${pkgver}-${pkgrel}_portable_linuxarm64-gpl.tar.xz"],
|
||||||
"sha256sums_x86_64": ["32cbe40942d26072faa1182835ccc89029883766de11778c731b529aa632ff37"],
|
"sha256sums_x86_64": ["32cbe40942d26072faa1182835ccc89029883766de11778c731b529aa632ff37"],
|
||||||
"sha256sums_aarch64": ["22b8f2a3c92c6b1c9e6830a6631f08f3f0a7ae80739ace71ad30704a28045184"],
|
"sha256sums_aarch64": ["22b8f2a3c92c6b1c9e6830a6631f08f3f0a7ae80739ace71ad30704a28045184"],
|
||||||
|
"package()": None,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -404,7 +413,7 @@ def test_parse_pacman_static(resource_path_root: Path) -> None:
|
|||||||
must parse real PKGBUILDs correctly (pacman-static)
|
must parse real PKGBUILDs correctly (pacman-static)
|
||||||
"""
|
"""
|
||||||
pkgbuild = Pkgbuild.from_file(resource_path_root / "models" / "package_pacman-static_pkgbuild")
|
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}
|
values = {key: None if value.is_function else value.value for key, value in pkgbuild.fields.items()}
|
||||||
assert values == {
|
assert values == {
|
||||||
"pkgbase": "pacman-static",
|
"pkgbase": "pacman-static",
|
||||||
"pkgname": "pacman-static",
|
"pkgname": "pacman-static",
|
||||||
@@ -536,6 +545,9 @@ def test_parse_pacman_static(resource_path_root: Path) -> None:
|
|||||||
"CFLAGS": "${CFLAGS/-fstack-protector-strong/} -D_LARGEFILE64_SOURCE",
|
"CFLAGS": "${CFLAGS/-fstack-protector-strong/} -D_LARGEFILE64_SOURCE",
|
||||||
"CXXFLAGS": "${CXXFLAGS/-fstack-protector-strong/} -D_LARGEFILE64_SOURCE",
|
"CXXFLAGS": "${CXXFLAGS/-fstack-protector-strong/} -D_LARGEFILE64_SOURCE",
|
||||||
"PKGEXT": ".pkg.tar.xz",
|
"PKGEXT": ".pkg.tar.xz",
|
||||||
|
"prepare()": None,
|
||||||
|
"build()": None,
|
||||||
|
"package()": None,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -544,7 +556,7 @@ def test_parse_python_pytest_loop(resource_path_root: Path) -> None:
|
|||||||
must parse real PKGBUILDs correctly (python-pytest-loop)
|
must parse real PKGBUILDs correctly (python-pytest-loop)
|
||||||
"""
|
"""
|
||||||
pkgbuild = Pkgbuild.from_file(resource_path_root / "models" / "package_python-pytest-loop_pkgbuild")
|
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}
|
values = {key: None if value.is_function else value.value for key, value in pkgbuild.fields.items()}
|
||||||
assert values == {
|
assert values == {
|
||||||
"pkgbase": "python-pytest-loop",
|
"pkgbase": "python-pytest-loop",
|
||||||
"_pname": "${pkgbase#python-}",
|
"_pname": "${pkgbase#python-}",
|
||||||
@@ -572,6 +584,9 @@ def test_parse_python_pytest_loop(resource_path_root: Path) -> None:
|
|||||||
"md5sums": [
|
"md5sums": [
|
||||||
"98365f49606d5068f92350f1d2569a5f",
|
"98365f49606d5068f92350f1d2569a5f",
|
||||||
],
|
],
|
||||||
|
"build()": None,
|
||||||
|
"check()": None,
|
||||||
|
"package_python-pytest-loop()": None,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -580,7 +595,7 @@ def test_parse_tpacpi_bat_git(resource_path_root: Path) -> None:
|
|||||||
must parse real PKGBUILDs correctly (tpacpi-bat-git)
|
must parse real PKGBUILDs correctly (tpacpi-bat-git)
|
||||||
"""
|
"""
|
||||||
pkgbuild = Pkgbuild.from_file(resource_path_root / "models" / "package_tpacpi-bat-git_pkgbuild")
|
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 == {
|
assert values == {
|
||||||
"pkgbase": "tpacpi-bat-git",
|
"pkgbase": "tpacpi-bat-git",
|
||||||
"pkgname": "tpacpi-bat-git",
|
"pkgname": "tpacpi-bat-git",
|
||||||
@@ -597,6 +612,8 @@ def test_parse_tpacpi_bat_git(resource_path_root: Path) -> None:
|
|||||||
"backup": ["etc/conf.d/tpacpi"],
|
"backup": ["etc/conf.d/tpacpi"],
|
||||||
"source": ["git+https://github.com/teleshoes/tpacpi-bat.git"],
|
"source": ["git+https://github.com/teleshoes/tpacpi-bat.git"],
|
||||||
"b2sums": ["SKIP"],
|
"b2sums": ["SKIP"],
|
||||||
|
"pkgver()": None,
|
||||||
|
"package()": None,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -605,7 +622,7 @@ def test_parse_ttf_google_fonts_git(resource_path_root: Path) -> None:
|
|||||||
must parse real PKGBUILDs correctly (ttf-google-fonts-git)
|
must parse real PKGBUILDs correctly (ttf-google-fonts-git)
|
||||||
"""
|
"""
|
||||||
pkgbuild = Pkgbuild.from_file(resource_path_root / "models" / "package_ttf-google-fonts-git_pkgbuild")
|
pkgbuild = Pkgbuild.from_file(resource_path_root / "models" / "package_ttf-google-fonts-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 "ttf-google-fonts-git" in pkgbuild.packages()
|
assert "ttf-google-fonts-git" in pkgbuild.packages()
|
||||||
assert values == {
|
assert values == {
|
||||||
"pkgname": "ttf-google-fonts-git",
|
"pkgname": "ttf-google-fonts-git",
|
||||||
@@ -681,6 +698,9 @@ def test_parse_ttf_google_fonts_git(resource_path_root: Path) -> None:
|
|||||||
"source": ["git+${url}.git"],
|
"source": ["git+${url}.git"],
|
||||||
"sha512sums": ["SKIP"],
|
"sha512sums": ["SKIP"],
|
||||||
"pkgbase": "ttf-google-fonts-git",
|
"pkgbase": "ttf-google-fonts-git",
|
||||||
|
"pkgver()": None,
|
||||||
|
"prepare()": None,
|
||||||
|
"package()": None,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -689,7 +709,7 @@ def test_parse_vim_youcompleteme_git(resource_path_root: Path) -> None:
|
|||||||
must parse real PKGBUILDs correctly (vim-youcompleteme-git)
|
must parse real PKGBUILDs correctly (vim-youcompleteme-git)
|
||||||
"""
|
"""
|
||||||
pkgbuild = Pkgbuild.from_file(resource_path_root / "models" / "package_vim-youcompleteme-git_pkgbuild")
|
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 == {
|
assert values == {
|
||||||
"pkgbase": "vim-youcompleteme-git",
|
"pkgbase": "vim-youcompleteme-git",
|
||||||
"_gocode": "y",
|
"_gocode": "y",
|
||||||
@@ -744,6 +764,10 @@ def test_parse_vim_youcompleteme_git(resource_path_root: Path) -> None:
|
|||||||
"10a64c468d1dd2a384e0e5fd4eb2582fd9f1dfa706b6d2d2bb88fb0fbfc2718d",
|
"10a64c468d1dd2a384e0e5fd4eb2582fd9f1dfa706b6d2d2bb88fb0fbfc2718d",
|
||||||
"9a5bee818a4995bc52e91588059bef42728d046808206bfb93977f4e3109e50c",
|
"9a5bee818a4995bc52e91588059bef42728d046808206bfb93977f4e3109e50c",
|
||||||
],
|
],
|
||||||
|
"pkgver()": None,
|
||||||
|
"prepare()": None,
|
||||||
|
"build()": None,
|
||||||
|
"package()": None,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -752,7 +776,7 @@ def test_parse_yay(resource_path_root: Path) -> None:
|
|||||||
must parse real PKGBUILDs correctly (yay)
|
must parse real PKGBUILDs correctly (yay)
|
||||||
"""
|
"""
|
||||||
pkgbuild = Pkgbuild.from_file(resource_path_root / "models" / "package_yay_pkgbuild")
|
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}
|
values = {key: None if value.is_function else value.value for key, value in pkgbuild.fields.items()}
|
||||||
assert values == {
|
assert values == {
|
||||||
"pkgbase": "yay",
|
"pkgbase": "yay",
|
||||||
"pkgname": "yay",
|
"pkgname": "yay",
|
||||||
@@ -783,4 +807,6 @@ def test_parse_yay(resource_path_root: Path) -> None:
|
|||||||
"makedepends": ["go>=1.21"],
|
"makedepends": ["go>=1.21"],
|
||||||
"source": ["${pkgname}-${pkgver}.tar.gz::https://github.com/Jguer/yay/archive/v${pkgver}.tar.gz"],
|
"source": ["${pkgname}-${pkgver}.tar.gz::https://github.com/Jguer/yay/archive/v${pkgver}.tar.gz"],
|
||||||
"sha256sums": ["2fb6121a6eb4c5e6afaf22212b2ed15022500a4bc34bb3dc0f9782c1d43c3962"],
|
"sha256sums": ["2fb6121a6eb4c5e6afaf22212b2ed15022500a4bc34bb3dc0f9782c1d43c3962"],
|
||||||
|
"build()": None,
|
||||||
|
"package()": None,
|
||||||
}
|
}
|
||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
pkgbase='ahriman'
|
pkgbase='ahriman'
|
||||||
pkgname=('ahriman' 'ahriman-core' 'ahriman-triggers' 'ahriman-web')
|
pkgname=('ahriman' 'ahriman-core' 'ahriman-triggers' 'ahriman-web')
|
||||||
pkgver=2.23.5
|
pkgver=2.23.6
|
||||||
pkgrel=1
|
pkgrel=1
|
||||||
pkgdesc="ArcH linux ReposItory MANager"
|
pkgdesc="ArcH linux ReposItory MANager"
|
||||||
arch=('any')
|
arch=('any')
|
||||||
|
|||||||
Vendored
+4
-2
@@ -65,7 +65,7 @@ digraph G {
|
|||||||
ahriman_core_alpm_pacman [fillcolor="#9f2b04",fontcolor="#ffffff",label="ahriman\.\ncore\.\nalpm\.\npacman"];
|
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_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_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 [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_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"];
|
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_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_core_alpm_pacman [fillcolor="#cc5933",weight="3"];
|
||||||
ahriman_core_alpm_pacman_handle -> ahriman_models_package [fillcolor="#cc5933",minlen="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_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_build_tools_package_archive [fillcolor="blue",minlen="2",weight="2"];
|
||||||
ahriman_core_alpm_remote -> ahriman_core_repository_repository [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_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 [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_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_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_auth [fillcolor="blue",minlen="2",weight="2"];
|
||||||
ahriman_core_configuration -> ahriman_core_auth_mapping [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_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_application_handlers_validate [fillcolor="#ce603b",minlen="3"];
|
||||||
ahriman_core_configuration_schema -> ahriman_core_triggers_trigger [fillcolor="#ce603b",minlen="2",weight="2"];
|
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_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_core_configuration_shell_interpolator [fillcolor="#ce603b",weight="3"];
|
||||||
ahriman_core_configuration_shell_template -> ahriman_models_pkgbuild_patch [fillcolor="#ce603b",minlen="3"];
|
ahriman_core_configuration_shell_template -> ahriman_models_pkgbuild_patch [fillcolor="#ce603b",minlen="3"];
|
||||||
|
|||||||
@@ -42,5 +42,5 @@
|
|||||||
"preview": "vite preview"
|
"preview": "vite preview"
|
||||||
},
|
},
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "2.23.5"
|
"version": "2.23.6"
|
||||||
}
|
}
|
||||||
@@ -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)"
|
_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)"
|
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"
|
||||||
Reference in new issue
Block a user