From 25922912c7e37f3bc3000e71b647e77677d8f2c5 Mon Sep 17 00:00:00 2001 From: coast Date: Mon, 12 Oct 2026 14:41:07 +0330 Subject: sync --- AGENTS.md | 14 ++ CLAUDE.md | 1 + CONTRIBUTING.md | 25 ++ LICENSE | 117 ++++++++++ README.md | 33 +++ licences/Batch | 13 ++ licences/RSA | 75 ++++++ licences/truecrypt-3.0 | 92 ++++++++ metadata/about.conf | 4 + metadata/categories.conf | 20 ++ metadata/layout.conf | 1 + nvchecker.toml | 256 +++++++++++++++++++++ .../ananicy-cpp/ananicy-cpp-1.2.0.exheres-0 | 47 ++++ .../ananicy-rules-cachyos-1.1.49.exheres-0 | 27 +++ .../sudo-rs/files/sudo-rs-0.2.15-pam-service.patch | 11 + packages/app-admin/sudo-rs/files/sudoers-rs | 11 + .../app-admin/sudo-rs/sudo-rs-0.2.15.exheres-0 | 60 +++++ .../veracrypt-1.26.29-argon2-avx2-avx512f.patch | 98 ++++++++ .../files/veracrypt-1.26.29-fix-nosse2.patch | 31 +++ .../files/veracrypt-1.26.29-fix-release-date.patch | 19 ++ .../veracrypt/veracrypt-1.26.29.exheres-0 | 101 ++++++++ .../cachyos-settings-1.4.1.exheres-0 | 87 +++++++ .../dmemcg-booster/dmemcg-booster-0.1.3.exheres-0 | 40 ++++ .../app-misc/ente-auth/ente-auth-4.4.25.exheres-0 | 76 ++++++ .../app-misc/ente-auth/files/enteauth-launcher | 3 + .../app-misc/nvchecker/nvchecker-2.22.exheres-0 | 19 ++ .../app-misc/protonplus/protonplus-0.6.8.exheres-0 | 55 +++++ packages/app-misc/shuck/shuck-0.2.4.exheres-0 | 10 + packages/app-misc/ydotool/ydotool-1.0.4.exheres-0 | 29 +++ .../bubblejail/bubblejail-0.10.4.exheres-0 | 73 ++++++ .../distrobox/distrobox-1.8.2.5.exheres-0 | 54 +++++ packages/dev-cpp/ada/ada-4.0.0.exheres-0 | 19 ++ packages/dev-libs/libbpf/libbpf-1.8.0.exheres-0 | 33 +++ .../tlottie-0_pre20260911-tdesktop-compat.patch | 160 +++++++++++++ .../tlottie/tlottie-0_pre20260911.exheres-0 | 30 +++ .../structlog/structlog-26.1.0.exheres-0 | 19 ++ .../hydra-launcher/hydra-launcher-4.1.6.exheres-0 | 87 +++++++ .../prismlauncher/prismlauncher-11.1.1.exheres-0 | 63 +++++ .../gui-libs/adwaita-qt/adwaita-qt-1.4.2.exheres-0 | 21 ++ .../qt-color-widgets-3.0.0.exheres-0 | 43 ++++ .../media-libs/libmysofa/libmysofa-1.3.5.exheres-0 | 36 +++ packages/media-libs/nanosvg/files/nanosvg.patch | 248 ++++++++++++++++++++ .../media-libs/nanosvg/nanosvg-0.1.0.1.exheres-0 | 35 +++ .../tg_owt/files/tg_owt-0_pre20260803-abseil.patch | 159 +++++++++++++ .../tg_owt/tg_owt-0_pre20260803.exheres-0 | 90 ++++++++ .../files/zita-convolver-4.0.3-makefile.patch | 23 ++ .../zita-convolver/zita-convolver-4.0.3.exheres-0 | 33 +++ .../easyeffects/easyeffects-8.3.0.exheres-0 | 61 +++++ .../pear-desktop/pear-desktop-3.12.0.exheres-0 | 84 +++++++ .../net-firewall/ufw/files/systemd/ufw.service | 18 ++ .../ufw/files/ufw-0.36-bash-completion.patch | 16 ++ .../ufw/files/ufw-0.36.1-distutils.patch | 14 ++ .../ufw/files/ufw-0.36.1-dont-check-iptables.patch | 50 ++++ .../ufw/files/ufw-0.36.1-move-path.patch | 124 ++++++++++ .../ufw/files/ufw-0.36.1-shebang.patch | 15 ++ packages/net-firewall/ufw/ufw-0.36.2.exheres-0 | 57 +++++ .../ayugram-desktop-7.2.9.exheres-0 | 72 ++++++ packages/net-im/discord/discord-1.0.161.exheres-0 | 120 ++++++++++ packages/net-im/discord/files/discord-launcher | 4 + packages/net-im/discord/files/discord.desktop | 9 + packages/net-im/discord/files/manifest.json | 11 + packages/net-im/viber/viber-27.3.0.2.exheres-0 | 122 ++++++++++ packages/net-im/zoom/files/zoom.desktop | 8 + packages/net-im/zoom/files/zoom.svg | 22 ++ packages/net-im/zoom/zoom-7.2.1.5760.exheres-0 | 86 +++++++ packages/net-libs/tde2e/tde2e-1.8.49.exheres-0 | 33 +++ .../net-misc/rustdesk/rustdesk-1.5.0.exheres-0 | 86 +++++++ .../mullvad-vpn/mullvad-vpn-2026.5.exheres-0 | 62 +++++ .../kernel-cachyos-7.2.9-r1.exheres-0 | 110 +++++++++ .../scx-loader/scx-loader-1.1.3.exheres-0 | 53 +++++ packages/sys-kernel/scx/scx-1.1.3.exheres-0 | 84 +++++++ packages/wayland-apps/fnott/fnott-1.8.0.exheres-0 | 45 ++++ .../wayland-apps/fuzzel/fuzzel-1.15.0.exheres-0 | 62 +++++ .../wayland-apps/wlsunset/wlsunset-0.4.0.exheres-0 | 24 ++ .../x11-apps/flameshot/flameshot-14.0.0.exheres-0 | 65 ++++++ .../x11-apps/qt6ct/files/qt6ct-0.9-qt-6.10.patch | 22 ++ packages/x11-apps/qt6ct/qt6ct-0.9.exheres-0 | 40 ++++ .../xdotool/xdotool-4.20260303.1.exheres-0 | 45 ++++ .../x11-misc/nwg-look/nwg-look-1.1.2.exheres-0 | 66 ++++++ .../x11-misc/xcur2png/xcur2png-0.7.1.exheres-0 | 34 +++ profiles/repo_name | 1 + scripts/check-versions.py | 191 +++++++++++++++ scripts/update-kernel-cachyos.py | 223 ++++++++++++++++++ tests/test_check_versions.py | 140 +++++++++++ tests/test_update_kernel_cachyos.py | 177 ++++++++++++++ 85 files changed, 5057 insertions(+) create mode 100644 AGENTS.md create mode 120000 CLAUDE.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 licences/Batch create mode 100644 licences/RSA create mode 100644 licences/truecrypt-3.0 create mode 100644 metadata/about.conf create mode 100644 metadata/categories.conf create mode 100644 metadata/layout.conf create mode 100644 nvchecker.toml create mode 100644 packages/app-admin/ananicy-cpp/ananicy-cpp-1.2.0.exheres-0 create mode 100644 packages/app-admin/ananicy-rules-cachyos/ananicy-rules-cachyos-1.1.49.exheres-0 create mode 100644 packages/app-admin/sudo-rs/files/sudo-rs-0.2.15-pam-service.patch create mode 100644 packages/app-admin/sudo-rs/files/sudoers-rs create mode 100644 packages/app-admin/sudo-rs/sudo-rs-0.2.15.exheres-0 create mode 100644 packages/app-crypt/veracrypt/files/veracrypt-1.26.29-argon2-avx2-avx512f.patch create mode 100644 packages/app-crypt/veracrypt/files/veracrypt-1.26.29-fix-nosse2.patch create mode 100644 packages/app-crypt/veracrypt/files/veracrypt-1.26.29-fix-release-date.patch create mode 100644 packages/app-crypt/veracrypt/veracrypt-1.26.29.exheres-0 create mode 100644 packages/app-misc/cachyos-settings/cachyos-settings-1.4.1.exheres-0 create mode 100644 packages/app-misc/dmemcg-booster/dmemcg-booster-0.1.3.exheres-0 create mode 100644 packages/app-misc/ente-auth/ente-auth-4.4.25.exheres-0 create mode 100644 packages/app-misc/ente-auth/files/enteauth-launcher create mode 100644 packages/app-misc/nvchecker/nvchecker-2.22.exheres-0 create mode 100644 packages/app-misc/protonplus/protonplus-0.6.8.exheres-0 create mode 100644 packages/app-misc/shuck/shuck-0.2.4.exheres-0 create mode 100644 packages/app-misc/ydotool/ydotool-1.0.4.exheres-0 create mode 100644 packages/app-virtualization/bubblejail/bubblejail-0.10.4.exheres-0 create mode 100644 packages/app-virtualization/distrobox/distrobox-1.8.2.5.exheres-0 create mode 100644 packages/dev-cpp/ada/ada-4.0.0.exheres-0 create mode 100644 packages/dev-libs/libbpf/libbpf-1.8.0.exheres-0 create mode 100644 packages/dev-libs/tlottie/files/tlottie-0_pre20260911-tdesktop-compat.patch create mode 100644 packages/dev-libs/tlottie/tlottie-0_pre20260911.exheres-0 create mode 100644 packages/dev-python/structlog/structlog-26.1.0.exheres-0 create mode 100644 packages/games-misc/hydra-launcher/hydra-launcher-4.1.6.exheres-0 create mode 100644 packages/games-misc/prismlauncher/prismlauncher-11.1.1.exheres-0 create mode 100644 packages/gui-libs/adwaita-qt/adwaita-qt-1.4.2.exheres-0 create mode 100644 packages/gui-libs/qt-color-widgets/qt-color-widgets-3.0.0.exheres-0 create mode 100644 packages/media-libs/libmysofa/libmysofa-1.3.5.exheres-0 create mode 100644 packages/media-libs/nanosvg/files/nanosvg.patch create mode 100644 packages/media-libs/nanosvg/nanosvg-0.1.0.1.exheres-0 create mode 100644 packages/media-libs/tg_owt/files/tg_owt-0_pre20260803-abseil.patch create mode 100644 packages/media-libs/tg_owt/tg_owt-0_pre20260803.exheres-0 create mode 100644 packages/media-libs/zita-convolver/files/zita-convolver-4.0.3-makefile.patch create mode 100644 packages/media-libs/zita-convolver/zita-convolver-4.0.3.exheres-0 create mode 100644 packages/media-sound/easyeffects/easyeffects-8.3.0.exheres-0 create mode 100644 packages/media-sound/pear-desktop/pear-desktop-3.12.0.exheres-0 create mode 100644 packages/net-firewall/ufw/files/systemd/ufw.service create mode 100644 packages/net-firewall/ufw/files/ufw-0.36-bash-completion.patch create mode 100644 packages/net-firewall/ufw/files/ufw-0.36.1-distutils.patch create mode 100644 packages/net-firewall/ufw/files/ufw-0.36.1-dont-check-iptables.patch create mode 100644 packages/net-firewall/ufw/files/ufw-0.36.1-move-path.patch create mode 100644 packages/net-firewall/ufw/files/ufw-0.36.1-shebang.patch create mode 100644 packages/net-firewall/ufw/ufw-0.36.2.exheres-0 create mode 100644 packages/net-im/ayugram-desktop/ayugram-desktop-7.2.9.exheres-0 create mode 100644 packages/net-im/discord/discord-1.0.161.exheres-0 create mode 100644 packages/net-im/discord/files/discord-launcher create mode 100644 packages/net-im/discord/files/discord.desktop create mode 100644 packages/net-im/discord/files/manifest.json create mode 100644 packages/net-im/viber/viber-27.3.0.2.exheres-0 create mode 100644 packages/net-im/zoom/files/zoom.desktop create mode 100644 packages/net-im/zoom/files/zoom.svg create mode 100644 packages/net-im/zoom/zoom-7.2.1.5760.exheres-0 create mode 100644 packages/net-libs/tde2e/tde2e-1.8.49.exheres-0 create mode 100644 packages/net-misc/rustdesk/rustdesk-1.5.0.exheres-0 create mode 100644 packages/net-vpn/mullvad-vpn/mullvad-vpn-2026.5.exheres-0 create mode 100644 packages/sys-kernel/kernel-cachyos/kernel-cachyos-7.2.9-r1.exheres-0 create mode 100644 packages/sys-kernel/scx-loader/scx-loader-1.1.3.exheres-0 create mode 100644 packages/sys-kernel/scx/scx-1.1.3.exheres-0 create mode 100644 packages/wayland-apps/fnott/fnott-1.8.0.exheres-0 create mode 100644 packages/wayland-apps/fuzzel/fuzzel-1.15.0.exheres-0 create mode 100644 packages/wayland-apps/wlsunset/wlsunset-0.4.0.exheres-0 create mode 100644 packages/x11-apps/flameshot/flameshot-14.0.0.exheres-0 create mode 100644 packages/x11-apps/qt6ct/files/qt6ct-0.9-qt-6.10.patch create mode 100644 packages/x11-apps/qt6ct/qt6ct-0.9.exheres-0 create mode 100644 packages/x11-apps/xdotool/xdotool-4.20260303.1.exheres-0 create mode 100644 packages/x11-misc/nwg-look/nwg-look-1.1.2.exheres-0 create mode 100644 packages/x11-misc/xcur2png/xcur2png-0.7.1.exheres-0 create mode 100644 profiles/repo_name create mode 100644 scripts/check-versions.py create mode 100644 scripts/update-kernel-cachyos.py create mode 100644 tests/test_check_versions.py create mode 100644 tests/test_update_kernel_cachyos.py diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..de0e89f --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,14 @@ +# Agent guidelines + +This repository contains Exherbo exheres maintained by Gurov. Follow nearby recipes and Exherbo packaging conventions. Keep changes small and focused. + +## AI use + +New contributors must prepare their contributions without AI assistance. Maintainers may use AI to help with repository work, but they must understand, review, and test the changes before committing or submitting them. + +AI agents must not: + +- Commit or push unless the repository owner explicitly requests it. +- Open pull requests or submit patches without explicit authorization. +- Invent package metadata, dependencies, licences, or build instructions. Verify them against upstream. +- Treat a request to edit files as permission to commit or submit unreviewed changes. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 120000 index 0000000..55bf822 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +./AGENTS.md \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..5a975db --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,25 @@ +# Contributing + +This is a personal Exherbo repository for packages I use. Issues and pull requests are welcome on [Codeberg](https://codeberg.org/Gurov/gurov). Open an issue before proposing a new package. New contributors must prepare contributions without AI assistance; see [AGENTS.md](AGENTS.md) for the full policy. + +Keep changes focused. Verify versions, source URLs, licences, and dependencies against upstream. When equivalent Linux binaries are available as `.deb` and `.rpm`, prefer the `.deb` after checking their contents. Put patches in the package's `files/` directory and explain why they're needed. + +## Exheres style + +- Follow nearby recipes. Keep the copyright header and group metadata, dependencies, and phases in the same order. Omit fields supplied by an exlib and phases the package does not need. +- Indent with four spaces. Group dependencies by purpose (`build`, `build+run`, `run`, then `test` or `suggestion` if needed). Leave out empty groups and unused options. +- Preserve package-specific pins, archive names, slots, and restrictions. Formatting changes must not change how a package builds. + +Before opening a pull request: + +1. Check metadata and preview dependency resolution for the package you changed: + + ```sh + cave show category/package::gurov + cave resolve category/package::gurov + ``` + +2. Build and test what changed when possible. Report failed or skipped checks. +3. Review the diff and run `git diff --check`. + +Replace `category/package` with the package you changed. Do not add `-x` to the preview command. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..17cb286 --- /dev/null +++ b/LICENSE @@ -0,0 +1,117 @@ +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification follow. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. + + c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. + + one line to give the program's name and an idea of what it does. Copyright (C) yyyy name of author + + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. + +signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice diff --git a/README.md b/README.md new file mode 100644 index 0000000..77a37c2 --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +# gurov + +Supplemental, third-party [Exherbo](https://www.exherbo.org/) repository for packages I use. It extends `arbor`; it is not an official Exherbo repository. + +## Add the repository + +Create `/etc/paludis/repositories/gurov.conf`: + +```ini +format = e +location = ${root}/var/db/paludis/repositories/gurov +sync = git+https://codeberg.org/Gurov/gurov.git +sync_options = --branch=main +``` + +Then sync and install a package: + +```sh +cave sync gurov +cave resolve category/package::gurov -x +``` + +### Mirror + +A backup mirror is available at [git.coasteen.xyz](https://git.coasteen.xyz/exherbo-overlay.git). Use it if Codeberg is unavailable. + +To use the mirror, change the `sync` line in the repository configuration to: + +```ini +sync = git+https://git.coasteen.xyz/exherbo-overlay.git +``` + +The mirror may not always be fully up to date with the primary repository. diff --git a/licences/Batch b/licences/Batch new file mode 100644 index 0000000..b30fdab --- /dev/null +++ b/licences/Batch @@ -0,0 +1,13 @@ +You are free to use Batch (the "icon set") or any part thereof (the "icons") +in any personal, open-source or commercial work without obligation of payment +(monetary or otherwise) or attribution. Do not sell the icon set, host +the icon set or rent the icon set (either in existing or modified form). + +While attribution is optional, it is always appreciated. + +Intellectual property rights are not transferred with the download of the icons. + +EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL ADAM WHITCROFT +BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, +PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THE USE OF THE ICONS, +EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. diff --git a/licences/RSA b/licences/RSA new file mode 100644 index 0000000..54c77de --- /dev/null +++ b/licences/RSA @@ -0,0 +1,75 @@ +Copyright (C) , RSA Data Security, Inc. Created . All +rights reserved. + +License to copy and use this software is granted provided that it +is identified as the "RSA Data Security, Inc. MD Message-Digest +Algorithm" in all material mentioning or referencing this software +or this function. + +License is also granted to make and use derivative works provided +that such works are identified as "derived from the RSA Data +Security, Inc. MD Message-Digest Algorithm" in all material +mentioning or referencing the derived work. + +RSA Data Security, Inc. makes no representations concerning either +the merchantability of this software or the suitability of this +software for any particular purpose. It is provided "as is" +without express or implied warranty of any kind. + +These notices must be retained in any copies of any part of this +documentation and/or software. + +---------------------------------------------------------------------- +http://www.ietf.org/ietf-ftp/IPR/RSA-MD-all + +The following was recevied Fenbruary 23,2000 +From: "Linn, John" + +February 19, 2000 + + The purpose of this memo is to clarify the status of intellectual +property rights asserted by RSA Security Inc. ("RSA") in the MD2, MD4 and +MD5 message-digest algorithms, which are documented in RFC-1319, RFC-1320, +and RFC-1321 respectively. + + Implementations of these message-digest algorithms, including +implementations derived from the reference C code in RFC-1319, RFC-1320, and +RFC-1321, may be made, used, and sold without license from RSA for any +purpose. + + No rights other than the ones explicitly set forth above are +granted. Further, although RSA grants rights to implement certain +algorithms as defined by identified RFCs, including implementations derived +from the reference C code in those RFCs, no right to use, copy, sell, or +distribute any other implementations of the MD2, MD4, or MD5 message-digest +algorithms created, implemented, or distributed by RSA is hereby granted by +implication, estoppel, or otherwise. Parties interested in licensing +security components and toolkits written by RSA should contact the company +to discuss receiving a license. All other questions should be directed to +Margaret K. Seif, General Counsel, RSA Security Inc., 36 Crosby Drive, +Bedford, Massachusetts 01730. + + Implementations of the MD2, MD4, or MD5 algorithms may be subject to +United States laws and regulations controlling the export of technical data, +computer software, laboratory prototypes and other commodities (including +the Arms Export Control Act, as amended, and the Export Administration Act +of 1970). The transfer of certain technical data and commodities may +require a license from the cognizant agency of the United States Government. +RSA neither represents that a license shall not be required for a particular +implementation nor that, if required, one shall be issued. + + + DISCLAIMER: RSA MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES +OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, VALIDITY OF +INTELLECTUAL PROPERTY RIGHTS, ISSUED OR PENDING, OR THE ABSENCE OF LATENT OR +OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE, IN CONNECTION WITH THE MD2, MD4, +OR MD5 ALGORITHMS. NOTHING IN THIS GRANT OF RIGHTS SHALL BE CONSTRUED AS A +REPRESENTATION OR WARRANTY GIVEN BY RSA THAT THE IMPLEMENTATION OF THE +ALGORITHM WILL NOT INFRINGE THE INTELLECTUAL PROPERTY RIGHTS OF ANY THIRD +PARTY. IN NO EVENT SHALL RSA, ITS TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, +PARENTS AND AFFILIATES BE LIABLE FOR INCIDENTAL OR CONSEQUENTIAL DAMAGES OF +ANY KIND RESULTING FROM IMPLEMENTATION OF THIS ALGORITHM, INCLUDING ECONOMIC +DAMAGE OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER RSA +SHALL BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF +THE POSSIBILITY OF SUCH INJURY OR DAMAGE. diff --git a/licences/truecrypt-3.0 b/licences/truecrypt-3.0 new file mode 100644 index 0000000..cae7767 --- /dev/null +++ b/licences/truecrypt-3.0 @@ -0,0 +1,92 @@ +TrueCrypt License Version 3.0 + + +Software distributed under this license is distributed on an "AS IS" BASIS WITHOUT WARRANTIES OF ANY KIND. THE AUTHORS AND DISTRIBUTORS OF THE SOFTWARE DISCLAIM ANY LIABILITY. ANYONE WHO USES, COPIES, MODIFIES, OR (RE)DISTRIBUTES ANY PART OF THE SOFTWARE IS, BY SUCH ACTION(S), ACCEPTING AND AGREEING TO BE BOUND BY ALL TERMS AND CONDITIONS OF THIS LICENSE. IF YOU DO NOT ACCEPT THEM, DO NOT USE, COPY, MODIFY, NOR (RE)DISTRIBUTE THE SOFTWARE, NOR ANY PART(S) THEREOF. + + +I. Definitions + +1. "This Product" means the work (including, but not limited to, source code, graphics, texts, and accompanying files) made available under and governed by this version of this license ("License"), as may be indicated by, but is not limited to, copyright notice(s) attached to or included in the work. + +2. "You" means (and "Your" refers to) an individual or a legal entity (e.g., a non-profit organization, commercial organization, government agency, etc.) exercising permissions granted by this License. + +3. "Modification" means (and "modify" refers to) any alteration of This Product, including, but not limited to, addition to or deletion from the substance or structure of This Product, translation into another language, repackaging, alteration or removal of any file included with This Product, and addition of any new files to This Product. + +4. "Your Product" means This Product modified by You, or any work You derive from (or base on) any part of This Product. In addition, "Your Product" means any work in which You include any (modified or unmodified) portion of This Product. However, if the work in which you include it is an aggregate software distribution (such as an operating system distribution or a cover CD-ROM of a magazine) containing multiple separate products, then the term "Your Product" includes only those products (in the aggregate software distribution) that use, include, or depend on a modified or unmodified version of This Product (and the term "Your Product" does not include the whole aggregate software distribution). For the purposes of this License, a product suite consisting of two or more products is considered a single product (operating system distributions and cover media of magazines are not considered product suites). + +5. "Distribution" means (and "distribute" refers to), regardless of means or methods, conveyance, transfer, providing, or making available of This/Your Product or portions thereof to third parties (including, but not limited to, making This/Your Product, or portions thereof, available for download to third parties, whether or not any third party has downloaded the product, or any portion thereof, made available for download). + + + +II. Use, Copying, and Distribution of This Product + +1. Provided that You comply with all applicable terms and conditions of this License, You may make copies of This Product (unmodified) and distribute copies of This Product (unmodified) that are not included in another product forming Your Product (except as permitted under Chapter III). Note: For terms and conditions for copying and distribution of modified versions of This Product, see Chapter III. + +2. Provided that You comply with all applicable terms and conditions of this License, You may use This Product freely (see also Chapter III) on any number of computers/systems for non-commercial and/or commercial purposes. + + + +III. Modification, Derivation, and Inclusion in Other Products + +1. If all conditions specified in the following paragraphs in this Chapter (III) are met (for exceptions, see Section III.2) and if You comply with all other applicable terms and conditions of this License, You may modify This Product (thus forming Your Product), derive new works from This Product or portions thereof (thus forming Your Product), include This Product or portions thereof in another product (thus forming Your Product, unless defined otherwise in Chapter I), and You may use (for non-commercial and/or commercial purposes), copy, and/or distribute Your Product. + + The name of Your Product (or of Your modified version of This Product) must not contain the name TrueCrypt (for example, the following names are not allowed: TrueCrypt, TrueCrypt+, TrueCrypt Professional, iTrueCrypt, etc.) nor any other names confusingly similar to the name TrueCrypt (e.g., True-Crypt, True Crypt, TruKrypt, etc.) + + All occurrences of the name TrueCrypt that could reasonably be considered to identify Your Product must be removed from Your Product and from any associated materials. Logo(s) included in (or attached to) Your Product (and in/to associated materials) must not incorporate and must not be confusingly similar to any of the TrueCrypt logos (including, but not limited to, the non-textual logo consisting primarily of a key in stylized form) or portion(s) thereof. All graphics contained in This Product (logos, icons, etc.) must be removed from Your Product (or from Your modified version of This Product) and from any associated materials. + + The following phrases must be removed from Your Product and from any associated materials, except the text of this License: "A TrueCrypt Foundation Release", "Released by TrueCrypt Foundation", "This is a TrueCrypt Foundation release." + + Phrase "Based on TrueCrypt, freely available at www.truecrypt.org" must be displayed by Your Product (if technically feasible) and contained in its documentation. Alternatively, if This Product or its portion You included in Your Product constitutes only a minor portion of Your Product, phrase "Portions of this product are based in part on TrueCrypt, freely available at www.truecrypt.org" may be displayed instead. In each of the cases mentioned above in this paragraph, "www.truecrypt.org" must be a hyperlink (if technically feasible) pointing to www.truecrypt.org and You may freely choose the location within the user interface (if there is any) of Your Product (e.g., an "About" window, etc.) and the way in which Your Product will display the respective phrase. + + Your Product (and any associated materials, e.g., the documentation, the content of the official web site of Your Product, etc.) must not present any Internet address containing the domain name truecrypt.org (or any domain name that forwards to the domain name truecrypt.org) in a manner that might suggest that it is where information about Your Product may be obtained or where bugs found in Your Product may be reported or where support for Your Product may be available or otherwise attempt to indicate that the domain name truecrypt.org is associated with Your Product. + + The complete source code of Your Product must be freely and publicly available (for exceptions, see Section III.2) at least until You cease to distribute Your Product. This condition can be met in one or both of the following ways: (i) You include the complete source code of Your Product with every copy of Your Product that You make and distribute and You make all such copies of Your Product available to the general public free of charge, and/or (ii) You include information (valid and correct at least until You cease to distribute Your Product) about where the complete source code of Your Product can be obtained free of charge (e.g., an Internet address) or for a reasonable reproduction fee with every copy of Your Product that You make and distribute and, if there is a web site officially associated with Your Product, You include the aforementioned information about the source code on a freely and publicly accessible web page to which such web site links via an easily viewable hyperlink (at least until You cease to distribute Your Product). + + The source code of Your Product must not be deliberately obfuscated and it must not be in an intermediate form (e.g., the output of a preprocessor). Source code means the preferred form in which a programmer would usually modify the program. + + Portions of the source code of Your Product not contained in This Product (e.g., portions added by You in creating Your Product, whether created by You or by third parties) must be available under license(s) that (however, see also Subsection III.1.e) allow(s) anyone to modify and derive new works from the portions of the source code that are not contained in This Product and to use, copy, and redistribute such modifications and/or derivative works. The license(s) must be perpetual, non-exclusive, royalty-free, no-charge, and worldwide, and must not invalidate, weaken, restrict, interpret, amend, modify, interfere with or otherwise affect any part, term, provision, or clause of this License. The text(s) of the license(s) must be included with every copy of Your Product that You make and distribute. + + You must not change the license terms of This Product in any way (adding any new terms is considered changing the license terms even if the original terms are retained), which means, e.g., that no part of This Product may be put under another license. You must keep intact all the legal notices contained in the source code files. You must include the following items with every copy of Your Product that You make and distribute: a clear and conspicuous notice stating that Your Product or portion(s) thereof is/are governed by this version of the TrueCrypt License, a verbatim copy of this version of the TrueCrypt License (as contained herein), a clear and conspicuous notice containing information about where the included copy of the License can be found, and an appropriate copyright notice. + + +2. You are not obligated to comply with Subsection III.1.d if Your Product is not distributed (i.e., Your Product is available only to You). + + + +IV. Disclaimer of Liability, Disclaimer of Warranty, Indemnification + +You expressly acknowledge and agree to the following: + +1. IN NO EVENT WILL ANY (CO)AUTHOR OF THIS PRODUCT, OR ANY APPLICABLE INTELLECTUAL-PROPERTY OWNER, OR ANY OTHER PARTY WHO MAY COPY AND/OR (RE)DISTRIBUTE THIS PRODUCT OR PORTIONS THEREOF, AS MAY BE PERMITTED HEREIN, BE LIABLE TO YOU OR TO ANY OTHER PARTY FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO, ANY DIRECT, INDIRECT, GENERAL, SPECIAL, INCIDENTAL, PUNITIVE, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, CORRUPTION OR LOSS OF DATA, ANY LOSSES SUSTAINED BY YOU OR THIRD PARTIES, A FAILURE OF THIS PRODUCT TO OPERATE WITH ANY OTHER PRODUCT, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR BUSINESS INTERRUPTION), WHETHER IN CONTRACT, STRICT LIABILITY, TORT (INCLUDING, BUT NOT LIMITED TO, NEGLIGENCE) OR OTHERWISE, ARISING OUT OF THE USE, COPYING, MODIFICATION, OR (RE)DISTRIBUTION OF THIS PRODUCT (OR A PORTION THEREOF) OR OF YOUR PRODUCT (OR A PORTION THEREOF), OR INABILITY TO USE THIS PRODUCT (OR A PORTION THEREOF), EVEN IF SUCH DAMAGES (OR THE POSSIBILITY OF SUCH DAMAGES) ARE/WERE PREDICTABLE OR KNOWN TO ANY (CO)AUTHOR, INTELLECTUAL-PROPERTY OWNER, OR ANY OTHER PARTY. + +2. THIS PRODUCT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THIS PRODUCT IS WITH YOU. SHOULD THIS PRODUCT PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR, OR CORRECTION. + +3. THIS PRODUCT MAY INCORPORATE IMPLEMENTATIONS OF CRYPTOGRAPHIC ALGORITHMS THAT ARE REGULATED (E.G., SUBJECT TO EXPORT/IMPORT CONTROL REGULATIONS) OR ILLEGAL IN SOME COUNTRIES. IT IS SOLELY YOUR RESPONSIBILITY TO VERIFY THAT IT IS LEGAL TO IMPORT AND/OR (RE)EXPORT AND/OR USE THIS PRODUCT (OR PORTIONS THEREOF) IN COUNTRIES WHERE YOU INTEND TO USE IT AND/OR TO WHICH YOU INTEND TO IMPORT IT AND/OR FROM WHICH YOU INTEND TO EXPORT IT, AND IT IS SOLELY YOUR RESPONSIBILITY TO COMPLY WITH ANY APPLICABLE REGULATIONS, RESTRICTIONS, AND LAWS. + +4. YOU SHALL INDEMNIFY, DEFEND AND HOLD ALL (CO)AUTHORS OF THIS PRODUCT, AND APPLICABLE INTELLECTUAL-PROPERTY OWNERS, HARMLESS FROM AND AGAINST ANY AND ALL LIABILITY, DAMAGES, LOSSES, SETTLEMENTS, PENALTIES, FINES, COSTS, EXPENSES (INCLUDING REASONABLE ATTORNEYS' FEES), DEMANDS, CAUSES OF ACTION, CLAIMS, ACTIONS, PROCEEDINGS, AND SUITS, DIRECTLY RELATED TO OR ARISING OUT OF YOUR USE, INABILITY TO USE, COPYING, (RE)DISTRIBUTION, IMPORT AND/OR (RE)EXPORT OF THIS PRODUCT (OR PORTIONS THEREOF) AND/OR YOUR BREACH OF ANY TERM OF THIS LICENSE. + + + +V. Trademarks + +This License does not grant permission to use trademarks associated with (or applying to) This Product, except for fair use as defined by applicable law and except for use expressly permitted or required by this License. Any attempt otherwise to use trademarks associated with (or applying to) This Product automatically and immediately terminates Your rights under This License and may constitute trademark infringement (which may be prosecuted). + + + +VI. General Terms and Conditions, Miscellaneous Provisions + +1. ANYONE WHO USES AND/OR COPIES AND/OR MODIFIES AND/OR CREATES DERIVATIVE WORKS OF AND/OR (RE)DISTRIBUTES THIS PRODUCT, OR ANY PORTION(S) THEREOF, IS, BY SUCH ACTION(S), AGREEING TO BE BOUND BY AND ACCEPTING ALL TERMS AND CONDITIONS OF THIS LICENSE (AND THE RESPONSIBILITIES AND OBLIGATIONS CONTAINED IN THIS LICENSE). IF YOU DO NOT ACCEPT (AND AGREE TO BE BOUND BY) ALL TERMS AND CONDITIONS OF THIS LICENSE, DO NOT USE, COPY, MODIFY, CREATE DERIVATIVE WORKS OF, NOR (RE)DISTRIBUTE THIS PRODUCT, NOR ANY PORTION(S) THEREOF. + +2. YOU MAY NOT USE, MODIFY, COPY, CREATE DERIVATIVE WORKS OF, (RE)DISTRIBUTE, OR SUBLICENSE THIS PRODUCT, OR PORTION(S) THEREOF, EXCEPT AS EXPRESSLY PROVIDED IN THIS LICENSE (EVEN IF APPLICABLE LAW GIVES YOU MORE RIGHTS). ANY ATTEMPT (EVEN IF PERMITTED BY APPLICABLE LAW) OTHERWISE TO USE, MODIFY, COPY, CREATE DERIVATIVE WORKS OF, (RE)DISTRIBUTE, OR SUBLICENSE THIS PRODUCT, OR PORTION(S) THEREOF, AUTOMATICALLY AND IMMEDIATELY TERMINATES YOUR RIGHTS UNDER THIS LICENSE AND CAN CONSTITUTE COPYRIGHT INFRINGEMENT (WHICH MAY BE PROSECUTED). ANY CONDITIONS AND RESTRICTIONS CONTAINED IN THIS LICENSE ARE ALSO LIMITATIONS ON THE SCOPE OF THIS LICENSE AND ALSO DEFINE THE SCOPE OF YOUR RIGHTS UNDER THIS LICENSE. YOUR FAILURE TO COMPLY WITH THE TERMS AND CONDITIONS OF THIS LICENSE OR FAILURE TO PERFORM ANY APPLICABLE OBLIGATION IMPOSED BY THIS LICENSE AUTOMATICALLY AND IMMEDIATELY TERMINATES YOUR RIGHTS UNDER THIS LICENSE AND CAN CAUSE OR BE CONSIDERED COPYRIGHT INFRINGEMENT (WHICH MAY BE PROSECUTED). NOTHING IN THIS LICENSE SHALL IMPLY OR BE CONSTRUED AS A PROMISE, OBLIGATION, OR COVENANT NOT TO SUE FOR COPYRIGHT OR TRADEMARK INFRINGEMENT IF YOU DO NOT COMPLY WITH THE TERMS AND CONDITIONS OF THIS LICENSE. + +3. This License does not constitute or imply a waiver of any intellectual property rights except as may be otherwise expressly provided in this License. This License does not transfer, assign, or convey any intellectual property rights (e.g., it does not transfer ownership of copyrights or trademarks). + +4. Subject to the terms and conditions of this License, You may allow a third party to use Your copy of This Product (or a copy that You make and distribute, or Your Product) provided that the third party explicitly accepts and agrees to be bound by all terms and conditions of this License and the third party is not prohibited from using This Product (or portions thereof) by this License (see, e.g., Section VI.7) or by applicable law. However, You are not obligated to ensure that the third party accepts (and agrees to be bound by all terms of) this License if You distribute only the self-extracting package (containing This Product) that does not allow the user to install (nor extract) the files contained in the package until he or she accepts and agrees to be bound by all terms and conditions of this License. + +5. Without specific prior written permission from the authors of This Product (or from their common representative), You must not use the name of This Product, the names of the authors of This Product, or the names of the legal entities (or informal groups) of which the authors were/are members/employees, to endorse or promote Your Product or any work in which You include a modified or unmodified version of This Product, or to endorse or promote You or Your affiliates, or in a way that might suggest that Your Product (or any work in which You include a modified or unmodified version of This Product), You, or Your affiliates is/are endorsed by one or more authors of This Product, or in a way that might suggest that one or more authors of This Product is/are affiliated with You (or Your affiliates) or directly participated in the creation of Your Product or of any work in which You include a modified or unmodified version of This Product. + +6. IF YOU ARE NOT SURE WHETHER YOU UNDERSTAND ALL PARTS OF THIS LICENSE OR IF YOU ARE NOT SURE WHETHER YOU CAN COMPLY WITH ALL TERMS AND CONDITIONS OF THIS LICENSE, YOU MUST NOT USE, COPY, MODIFY, CREATE DERIVATIVE WORKS OF, NOR (RE)DISTRIBUTE THIS PRODUCT, NOR ANY PORTION(S) OF IT. YOU SHOULD CONSULT WITH A LAWYER. + +7. IF (IN RELEVANT CONTEXT) ANY PROVISION OF CHAPTER IV OF THIS LICENSE IS UNENFORCEABLE, INVALID, OR PROHIBITED UNDER APPLICABLE LAW IN YOUR JURISDICTION, YOU HAVE NO RIGHTS UNDER THIS LICENSE AND YOU MUST NOT USE, COPY, MODIFY, CREATE DERIVATIVE WORKS OF, NOR (RE)DISTRIBUTE THIS PRODUCT, NOR ANY PORTION(S) THEREOF. + +8. Except as otherwise provided in this License, if any provision of this License, or a portion thereof, is found to be invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of this License, and such invalid or unenforceable provision shall be construed to reflect the original intent of the provision and shall be enforced to the maximum extent permitted by applicable law so as to effect the original intent of the provision as closely as possible. diff --git a/metadata/about.conf b/metadata/about.conf new file mode 100644 index 0000000..6badcac --- /dev/null +++ b/metadata/about.conf @@ -0,0 +1,4 @@ +summary = Gurov's supplemental Exherbo repository +homepage = https://codeberg.org/Gurov/gurov +owner = Gurov +status = third-party diff --git a/metadata/categories.conf b/metadata/categories.conf new file mode 100644 index 0000000..dcc75b7 --- /dev/null +++ b/metadata/categories.conf @@ -0,0 +1,20 @@ +app-admin +app-crypt +app-misc +sys-kernel +wayland-apps +media-libs +x11-apps +gui-libs +games-misc +app-virtualization +net-vpn +net-firewall +x11-misc +media-sound +net-im +net-misc +dev-cpp +dev-libs +net-libs +dev-python diff --git a/metadata/layout.conf b/metadata/layout.conf new file mode 100644 index 0000000..c989464 --- /dev/null +++ b/metadata/layout.conf @@ -0,0 +1 @@ +masters = arbor diff --git a/nvchecker.toml b/nvchecker.toml new file mode 100644 index 0000000..695eec9 --- /dev/null +++ b/nvchecker.toml @@ -0,0 +1,256 @@ +[__config__] +max_concurrency = 8 + +["app-admin/ananicy-cpp"] +source = "gitlab" +gitlab = "ananicy-cpp/ananicy-cpp" +use_max_tag = true +include_regex = "v[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" +prefix = "v" + +["app-admin/ananicy-rules-cachyos"] +source = "github" +github = "CachyOS/ananicy-rules" +use_max_tag = true +include_regex = "[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" + +["app-admin/sudo-rs"] +source = "github" +github = "trifectatechfoundation/sudo-rs" +use_max_tag = true +include_regex = "v[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" +prefix = "v" + +["app-crypt/veracrypt"] +source = "github" +github = "veracrypt/VeraCrypt" +use_max_tag = true +include_regex = "VeraCrypt_[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" +prefix = "VeraCrypt_" + +["app-misc/cachyos-settings"] +source = "github" +github = "CachyOS/CachyOS-Settings" +use_max_tag = true +include_regex = "[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" + +["app-misc/dmemcg-booster"] +source = "gitlab" +host = "gitlab.steamos.cloud" +gitlab = "holo/dmemcg-booster" +use_max_tag = true +include_regex = "[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" + +["app-misc/ente-auth"] +source = "aur" +aur = "ente-auth" +strip_release = true + +["app-misc/nvchecker"] +source = "pypi" +pypi = "nvchecker" + +["games-misc/prismlauncher"] +source = "github" +github = "PrismLauncher/PrismLauncher" +use_max_tag = true +include_regex = "[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" + +["app-misc/protonplus"] +source = "github" +github = "Vysp3r/ProtonPlus" +use_max_tag = true +include_regex = "v[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" +prefix = "v" + +["app-misc/shuck"] +source = "github" +github = "ewhauser/shuck" +use_max_tag = true +include_regex = "v[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" +prefix = "v" + +["app-misc/ydotool"] +source = "github" +github = "ReimuNotMoe/ydotool" +use_max_tag = true +include_regex = "v[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" +prefix = "v" + +["app-virtualization/bubblejail"] +source = "github" +github = "igo95862/bubblejail" +use_max_tag = true +include_regex = "[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" + +["app-virtualization/distrobox"] +source = "github" +github = "89luca89/distrobox" +use_max_tag = true +include_regex = "[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" + +["dev-cpp/ada"] +source = "github" +github = "ada-url/ada" +use_max_tag = true +include_regex = "v[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" +prefix = "v" + +["dev-libs/libbpf"] +source = "github" +github = "libbpf/libbpf" +use_max_tag = true +include_regex = "v[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" +prefix = "v" + +["dev-python/structlog"] +source = "pypi" +pypi = "structlog" + +["games-misc/hydra-launcher"] +source = "github" +github = "hydralauncher/hydra" +use_max_release = true +include_regex = "v[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" +prefix = "v" + +["gui-libs/adwaita-qt"] +source = "github" +github = "FedoraQt/adwaita-qt" +use_max_tag = true +include_regex = "[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" + +["gui-libs/qt-color-widgets"] +source = "gitlab" +gitlab = "mattbas/Qt-Color-Widgets" +use_max_tag = true +include_regex = "[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" + +["media-libs/libmysofa"] +source = "github" +github = "hoene/libmysofa" +use_max_tag = true +include_regex = "v[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" +prefix = "v" + +["media-libs/zita-convolver"] +source = "regex" +url = "https://kokkinizita.linuxaudio.org/linuxaudio/downloads/" +regex = 'href="zita-convolver-([0-9]+(?:\.[0-9]+)*)\.tar\.bz2"' + +["media-sound/easyeffects"] +source = "github" +github = "wwmm/easyeffects" +use_max_tag = true +include_regex = "v[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" +prefix = "v" + +["media-sound/pear-desktop"] +source = "github" +github = "pear-devs/pear-desktop" +use_max_release = true +include_regex = "v[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" +prefix = "v" + +["net-im/ayugram-desktop"] +source = "github" +github = "AyuGram/AyuGramDesktop" +use_max_release = true +include_regex = "v[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" +prefix = "v" + +["net-firewall/ufw"] +source = "regex" +url = "https://launchpad.net/ufw/+download" +regex = 'href="https://launchpad.net/ufw/[0-9.]+/[0-9.]+/\+download/ufw-([0-9]+(?:\.[0-9]+)*)\.tar\.gz"' + +["net-im/discord"] +source = "archpkg" +archpkg = "discord" +strip_release = true + +["net-im/viber"] +source = "aur" +aur = "viber" +strip_release = true + +["net-im/zoom"] +source = "regex" +url = "https://zoom.us/rest/download?os=linux" +regex = '"zoom":\{"version":"([0-9]+(?:\.[0-9]+)*)"' + +["net-misc/rustdesk"] +source = "github" +github = "rustdesk/rustdesk" +use_max_release = true +include_regex = "^[0-9]+\\.[0-9]+(?:\\.[0-9]+)*$" + +["net-vpn/mullvad-vpn"] +source = "aur" +aur = "mullvad-vpn-bin" +strip_release = true + +["sys-kernel/kernel-cachyos"] +source = "aur" +aur = "linux-cachyos" + +["sys-kernel/scx"] +source = "github" +github = "sched-ext/scx" +use_max_tag = true +include_regex = "v[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" +prefix = "v" + +["sys-kernel/scx-loader"] +source = "github" +github = "sched-ext/scx-loader" +use_max_tag = true +include_regex = "v[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" +prefix = "v" + +["wayland-apps/fnott"] +source = "gitea" +host = "codeberg.org" +gitea = "dnkl/fnott" +use_max_tag = true +include_regex = "[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" + +["wayland-apps/fuzzel"] +source = "gitea" +host = "codeberg.org" +gitea = "dnkl/fuzzel" +use_max_tag = true +include_regex = "[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" + +["wayland-apps/wlsunset"] +source = "git" +git = "https://git.sr.ht/~kennylevinsen/wlsunset" +use_max_tag = true +include_regex = "[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" + +["x11-apps/xdotool"] +source = "github" +github = "jordansissel/xdotool" +use_max_release = true +include_regex = "^v[0-9]+\\.[0-9]{8}\\.[0-9]+$" +prefix = "v" + +["x11-apps/flameshot"] +source = "github" +github = "flameshot-org/flameshot" +use_max_tag = true +include_regex = "v[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" +prefix = "v" + +["x11-misc/nwg-look"] +source = "github" +github = "nwg-piotr/nwg-look" +use_max_tag = true +include_regex = "v[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" +prefix = "v" + +["x11-misc/xcur2png"] +source = "github" +github = "eworm-de/xcur2png" +use_max_tag = true +include_regex = "[0-9]+\\.[0-9]+(?:\\.[0-9]+)*" diff --git a/packages/app-admin/ananicy-cpp/ananicy-cpp-1.2.0.exheres-0 b/packages/app-admin/ananicy-cpp/ananicy-cpp-1.2.0.exheres-0 new file mode 100644 index 0000000..7734048 --- /dev/null +++ b/packages/app-admin/ananicy-cpp/ananicy-cpp-1.2.0.exheres-0 @@ -0,0 +1,47 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require cmake + +SUMMARY="Ananicy rewritten in C++ for lower resource usage" +HOMEPAGE="https://gitlab.com/ananicy-cpp/ananicy-cpp" +DOWNLOADS="${HOMEPAGE}/-/archive/v${PV}/${PN}-v${PV}.tar.bz2 -> ${PNV}.tar.bz2" + +LICENCES="GPL-3" +SLOT="0" +PLATFORMS="~amd64" + +DEPENDENCIES=" + build: + dev-libs/json[>=3.9] + + build+run: + dev-libs/fmt[>=8] + dev-libs/spdlog[>=1.9] + sys-apps/systemd + + suggestion: + app-admin/ananicy-rules-cachyos [[ description = [ CachyOS rules and configuration ] ]] +" + +CMAKE_SOURCE="${WORKBASE}/${PN}-v${PV}" + +CMAKE_SRC_CONFIGURE_PARAMS=( + -DENABLE_SYSTEMD=ON + -DUSE_BPF_PROC_IMPL=OFF + -DUSE_EXTERNAL_FMTLIB=ON + -DUSE_EXTERNAL_JSON=ON + -DUSE_EXTERNAL_SPDLOG=ON + -DVERSION="${PV}" + -DCCACHE=OFF +) + +src_prepare() { + cmake_src_prepare + edo sed -i '/#include /a #include ' src/platform/linux/debug.cpp + edo sed -i '/#include /a #include ' src/platform/linux/process.cpp + edo sed -i '/#include /a #include ' src/platform/systemd/service.cpp + edo sed -i '/#include /a #include ' src/platform/linux/backtrace.cpp + edo sed -i '/#include /a #include ' src/utility/argument_parsing/argument.cpp + edo sed -i '/#include /a #include ' src/platform/linux/singleton_process.cpp +} diff --git a/packages/app-admin/ananicy-rules-cachyos/ananicy-rules-cachyos-1.1.49.exheres-0 b/packages/app-admin/ananicy-rules-cachyos/ananicy-rules-cachyos-1.1.49.exheres-0 new file mode 100644 index 0000000..d6552e7 --- /dev/null +++ b/packages/app-admin/ananicy-rules-cachyos/ananicy-rules-cachyos-1.1.49.exheres-0 @@ -0,0 +1,27 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +SUMMARY="CachyOS rules for ananicy-cpp" +HOMEPAGE="https://github.com/CachyOS/ananicy-rules" +DOWNLOADS="${HOMEPAGE}/archive/refs/tags/${PV}.tar.gz -> ${PNV}.tar.gz" + +LICENCES="GPL-3" +SLOT="0" +PLATFORMS="~amd64" + +DEPENDENCIES=" + run: + app-admin/ananicy-cpp +" + +WORK="${WORKBASE}/ananicy-rules-${PV}" + +src_compile() { + : +} + +src_install() { + insinto /etc/ananicy.d + doins -r 00-default + doins 00-cgroups.cgroups 00-types.types ananicy.conf +} diff --git a/packages/app-admin/sudo-rs/files/sudo-rs-0.2.15-pam-service.patch b/packages/app-admin/sudo-rs/files/sudo-rs-0.2.15-pam-service.patch new file mode 100644 index 0000000..3fde656 --- /dev/null +++ b/packages/app-admin/sudo-rs/files/sudo-rs-0.2.15-pam-service.patch @@ -0,0 +1,11 @@ +--- a/src/sudo/pam.rs ++++ b/src/sudo/pam.rs +@@ -40,7 +40,7 @@ + ) -> PamResult { + let service_name = match launch { + LaunchType::Login if cfg!(feature = "pam-login") => "sudo-i", +- LaunchType::Login | LaunchType::Shell | LaunchType::Direct => "sudo", ++ LaunchType::Login | LaunchType::Shell | LaunchType::Direct => "sudo-rs", + }; + let mut pam = PamContext::new_cli( + "sudo", diff --git a/packages/app-admin/sudo-rs/files/sudoers-rs b/packages/app-admin/sudo-rs/files/sudoers-rs new file mode 100644 index 0000000..17f3550 --- /dev/null +++ b/packages/app-admin/sudo-rs/files/sudoers-rs @@ -0,0 +1,11 @@ +Defaults secure_path="/usr/local/bin:/usr/local/sbin:/usr/host/bin" + +root ALL=(ALL:ALL) ALL + +# Uncomment to allow members of wheel to use sudo-rs. +# %wheel ALL=(ALL:ALL) ALL + +# Uncomment to allow members of sudo to use sudo-rs. +# %sudo ALL=(ALL:ALL) ALL + +@includedir /etc/sudoers.d diff --git a/packages/app-admin/sudo-rs/sudo-rs-0.2.15.exheres-0 b/packages/app-admin/sudo-rs/sudo-rs-0.2.15.exheres-0 new file mode 100644 index 0000000..113814b --- /dev/null +++ b/packages/app-admin/sudo-rs/sudo-rs-0.2.15.exheres-0 @@ -0,0 +1,60 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require cargo [ rust_minimum_version=1.85 ] github [ user=trifectatechfoundation tag=v${PV} ] pam + +SUMMARY="Memory-safe implementation of sudo" + +LICENCES="|| ( Apache-2.0 MIT )" +SLOT="0" +PLATFORMS="~amd64 ~armv8" +MYOPTIONS="native-names" + +DEPENDENCIES+=" + build+run: + sys-libs/pam + + run: + native-names? ( !app-admin/sudo ) +" + +CARGO_SRC_COMPILE_PARAMS=( --bin sudo --bin visudo ) +CARGO_SRC_INSTALL_PARAMS=( --bin sudo --bin visudo ) + +src_prepare() { + default + if ! option native-names; then + expatch "${FILES}/${PNV}-pam-service.patch" + fi +} + +src_install() { + local suffix= name= bin="${IMAGE}/usr/$(exhost --target)/bin" + + cargo_src_install + if ! option native-names; then + suffix=-rs + edo mv "${bin}/sudo" "${bin}/sudo-rs" + edo mv "${bin}/visudo" "${bin}/visudo-rs" + fi + edo chmod 4755 "${bin}/sudo${suffix}" + dosym sudo${suffix} /usr/$(exhost --target)/bin/sudoedit${suffix} + + edo sed -i 's@/etc/sudoers\\f@/etc/sudoers-rs\\f@g' docs/man/sudo.8.man docs/man/visudo.8.man + edo sed -i '8s@/etc/sudoers@/etc/sudoers-rs@' docs/man/sudoers.5.man + + newman docs/man/sudo.8.man sudo${suffix}.8 + newman docs/man/visudo.8.man visudo${suffix}.8 + newman docs/man/sudoers.5.man sudoers${suffix}.5 + dosym sudo${suffix}.8 /usr/share/man/man8/sudoedit${suffix}.8 + + dodoc SECURITY.md + + keepdir /etc/sudoers.d + name=sudo${suffix} + pamd_mimic_system "${name}" auth auth account password session + + insinto /etc + insopts -m 0440 + doins "${FILES}/sudoers-rs" +} diff --git a/packages/app-crypt/veracrypt/files/veracrypt-1.26.29-argon2-avx2-avx512f.patch b/packages/app-crypt/veracrypt/files/veracrypt-1.26.29-argon2-avx2-avx512f.patch new file mode 100644 index 0000000..7d9b76d --- /dev/null +++ b/packages/app-crypt/veracrypt/files/veracrypt-1.26.29-argon2-avx2-avx512f.patch @@ -0,0 +1,98 @@ +Fix build when CFLAGS contains or implies -mavx2 and/or -mavx512f + +https://bugs.gentoo.org/983361 +https://github.com/veracrypt/VeraCrypt/issues/1867 + +--- a/Build/Include/Makefile.inc ++++ b/Build/Include/Makefile.inc +@@ -14,7 +14,7 @@ $(NAME): $(NAME).a + + clean: + @echo Cleaning $(NAME) +- rm -f $(APPNAME) $(NAME).a $(OBJS) $(OBJSEX) $(OBJSNOOPT) $(OBJSHANI) $(OBJAESNI) $(OBJSSSE41) $(OBJSSSSE3) $(OBJSAVX2) $(OBJARMV8CRYPTO) $(OBJS:.o=.d) $(OBJSEX:.oo=.d) $(OBJSNOOPT:.o0=.d) $(OBJSHANI:.oshani=.d) $(OBJAESNI:.oaesni=.d) $(OBJSSSE41:.osse41=.d) $(OBJSSSSE3:.ossse3=.d) $(OBJSAVX2:.oavx2=.d) $(OBJARMV8CRYPTO:.oarmv8crypto=.d) *.gch ++ rm -f $(APPNAME) $(NAME).a $(OBJS) $(OBJSEX) $(OBJSNOOPT) $(OBJSHANI) $(OBJAESNI) $(OBJSSSE2) $(OBJSSSE41) $(OBJSSSSE3) $(OBJSAVX2) $(OBJARMV8CRYPTO) $(OBJS:.o=.d) $(OBJSEX:.oo=.d) $(OBJSNOOPT:.o0=.d) $(OBJSHANI:.oshani=.d) $(OBJAESNI:.oaesni=.d) $(OBJSSSE2:.osse2=.d) $(OBJSSSE41:.osse41=.d) $(OBJSSSSE3:.ossse3=.d) $(OBJSAVX2:.oavx2=.d) $(OBJARMV8CRYPTO:.oarmv8crypto=.d) *.gch + + %.o: %.c + @echo Compiling $(/dev/null 2>&1 && echo D; rm -f $$t $$t.a) + RANLIB_DETERMINISTIC := $(shell t=$$(mktemp); rm -f $$t.a; $(AR) rc $$t.a $$t >/dev/null 2>&1; $(RANLIB) -D $$t.a >/dev/null 2>&1 && echo -D; rm -f $$t $$t.a) + +-$(NAME).a: $(OBJS) $(OBJSEX) $(OBJSNOOPT) $(OBJSHANI) $(OBJAESNI) $(OBJSSSE41) $(OBJSSSSE3) $(OBJSAVX2) $(OBJARMV8CRYPTO) ++$(NAME).a: $(OBJS) $(OBJSEX) $(OBJSNOOPT) $(OBJSHANI) $(OBJAESNI) $(OBJSSSE2) $(OBJSSSE41) $(OBJSSSSE3) $(OBJSAVX2) $(OBJARMV8CRYPTO) + @echo Updating library $@ + rm -f $@ +- $(AR) $(AFLAGS) $(AR_DETERMINISTIC)rc $@ $(OBJS) $(OBJSEX) $(OBJSNOOPT) $(OBJSHANI) $(OBJAESNI) $(OBJSSSE41) $(OBJSSSSE3) $(OBJSAVX2) $(OBJARMV8CRYPTO) ++ $(AR) $(AFLAGS) $(AR_DETERMINISTIC)rc $@ $(OBJS) $(OBJSEX) $(OBJSNOOPT) $(OBJSHANI) $(OBJAESNI) $(OBJSSSE2) $(OBJSSSE41) $(OBJSSSSE3) $(OBJSAVX2) $(OBJARMV8CRYPTO) + $(RANLIB) $(RANLIB_DETERMINISTIC) $@ +--- a/Volume/Volume.make ++++ b/Volume/Volume.make +@@ -13,6 +13,7 @@ + OBJS := + OBJSEX := + OBJSNOOPT := ++OBJSSSE2 := + OBJSSSE41 := + OBJSSSSE3 := + OBJSHANI := +@@ -96,11 +97,15 @@ else + endif + + ifeq "$(GCC_GTEQ_430)" "1" ++ OBJSSSE2 += ../Crypto/blake2s_SSE2.osse2 + OBJSSSE41 += ../Crypto/blake2s_SSE41.osse41 + OBJSSSSE3 += ../Crypto/blake2s_SSSE3.ossse3 ++ OBJSSSE2 += ../Crypto/Argon2/src/opt_sse2.osse2 + else ++ OBJS += ../Crypto/blake2s_SSE2.o + OBJS += ../Crypto/blake2s_SSE41.o + OBJS += ../Crypto/blake2s_SSSE3.o ++ OBJS += ../Crypto/Argon2/src/opt_sse2.o + endif + ifeq "$(GCC_GTEQ_500)" "1" + OBJSHANI += ../Crypto/Sha2Intel.oshani +@@ -127,7 +134,6 @@ ifeq "$(ENABLE_WOLFCRYPT)" "0" + OBJS += ../Crypto/Aeskey.o + OBJS += ../Crypto/Aestab.o + OBJS += ../Crypto/blake2s.o +-OBJS += ../Crypto/blake2s_SSE2.o + OBJS += ../Crypto/SerpentFast.o + OBJS += ../Crypto/SerpentFast_simd.o + OBJS += ../Crypto/Sha2.o +@@ -141,7 +147,6 @@ OBJS += ../Crypto/Argon2/src/blake2/blake2b.o + OBJS += ../Crypto/Argon2/src/argon2.o + OBJS += ../Crypto/Argon2/src/core.o + OBJS += ../Crypto/Argon2/src/argon2.o +-OBJS += ../Crypto/Argon2/src/opt_sse2.o + OBJS += ../Crypto/Argon2/src/ref.o + OBJS += ../Crypto/Argon2/src/selftest.o + OBJS += ../Common/Pkcs5.o diff --git a/packages/app-crypt/veracrypt/files/veracrypt-1.26.29-fix-nosse2.patch b/packages/app-crypt/veracrypt/files/veracrypt-1.26.29-fix-nosse2.patch new file mode 100644 index 0000000..f28b1ec --- /dev/null +++ b/packages/app-crypt/veracrypt/files/veracrypt-1.26.29-fix-nosse2.patch @@ -0,0 +1,31 @@ +Fix building with NOSSE2. +The change in Tcdefs.h is not required for x86, but for some reason it is +necessary for x86_64. + +https://github.com/veracrypt/VeraCrypt/pull/1891 + +--- a/Common/Tcdefs.h ++++ b/Common/Tcdefs.h +@@ -52,9 +52,7 @@ extern unsigned short _rotl16(unsigned short value, unsigned char shift); + + #endif // defined(_UEFI) + +-#ifdef TC_WINDOWS_BOOT + #include +-#endif + + #define TC_APP_NAME "VeraCrypt" + +--- a/Makefile ++++ b/Makefile +@@ -289,8 +289,8 @@ ifeq "$(shell uname -s)" "Linux" + endif + + ifeq "$(origin NOSSE2)" "command line" +- CFLAGS += -mno-sse2 +- CXXFLAGS += -mno-sse2 ++ CFLAGS += -mno-sse2 -DCRYPTOPP_DISABLE_AESNI -DCRYPTOPP_DISABLE_SHANI ++ CXXFLAGS += -mno-sse2 -DCRYPTOPP_DISABLE_AESNI -DCRYPTOPP_DISABLE_SHANI + WXCONFIG_CFLAGS += -mno-sse2 + WXCONFIG_CXXFLAGS += -mno-sse2 + endif diff --git a/packages/app-crypt/veracrypt/files/veracrypt-1.26.29-fix-release-date.patch b/packages/app-crypt/veracrypt/files/veracrypt-1.26.29-fix-release-date.patch new file mode 100644 index 0000000..ed512b9 --- /dev/null +++ b/packages/app-crypt/veracrypt/files/veracrypt-1.26.29-fix-release-date.patch @@ -0,0 +1,19 @@ +From 80a126d04ec4943f96cb98d9cc152af1a4c1d0a0 Mon Sep 17 00:00:00 2001 +From: Mounir IDRASSI +Date: Sat, 13 Jun 2026 11:32:59 +0900 +Subject: [PATCH] Fix release date string to match actual TC_RELEASE_DATE_DAY + value + +--- + +--- a/Common/Tcdefs.h ++++ b/Common/Tcdefs.h +@@ -73,7 +73,7 @@ extern unsigned short _rotl16(unsigned short value, unsigned char shift); + #define VERSION_NUM 0x0126 + + // Release date +-#define TC_STR_RELEASE_DATE L"June 8, 2026" ++#define TC_STR_RELEASE_DATE L"June 9, 2026" + #define TC_RELEASE_DATE_YEAR 2026 + #define TC_RELEASE_DATE_MONTH 6 + #define TC_RELEASE_DATE_DAY 9 diff --git a/packages/app-crypt/veracrypt/veracrypt-1.26.29.exheres-0 b/packages/app-crypt/veracrypt/veracrypt-1.26.29.exheres-0 new file mode 100644 index 0000000..eef0d3a --- /dev/null +++ b/packages/app-crypt/veracrypt/veracrypt-1.26.29.exheres-0 @@ -0,0 +1,101 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require wxwidgets freedesktop-desktop freedesktop-mime gtk-icon-cache + +SUMMARY="Disk encryption based on TrueCrypt" +HOMEPAGE="https://veracrypt.io/en/Home.html" +DOWNLOADS="https://github.com/veracrypt/VeraCrypt/archive/refs/tags/VeraCrypt_${PV}.tar.gz -> ${PNV}.tar.gz" + +LICENCES="Apache-2.0 BSD-3 RSA truecrypt-3.0" +SLOT="0" +PLATFORMS="~amd64" +RESTRICT="mirror" +MYOPTIONS="doc gui" + +DEPENDENCIES=" + build: + dev-lang/yasm + virtual/pkg-config + + build+run: + sys-apps/pcsc-lite + sys-fs/fuse:3 + sys-fs/lvm2 + + run: + || ( + app-admin/sudo-rs[native-names] + app-admin/sudo + ) +" + +WORK="${WORKBASE}/VeraCrypt-VeraCrypt_${PV}/src" + +DEFAULT_SRC_PREPARE_PATCHES=( + "${FILES}/${PNV}-fix-release-date.patch" + "${FILES}/${PNV}-argon2-avx2-avx512f.patch" + "${FILES}/${PNV}-fix-nosse2.patch" +) + +src_configure() { + MAKE_ARGS=( + NOSTRIP=1 NOTEST=1 VERBOSE=1 WITHFUSE3=1 + AR="${AR}" CC="${CC}" CXX="${CXX}" RANLIB="${RANLIB}" + TC_EXTRA_CFLAGS="${CFLAGS}" TC_EXTRA_CXXFLAGS="${CXXFLAGS}" + TC_EXTRA_LFLAGS="${LDFLAGS}" WX_CONFIG="${WX_CONFIG}" + ) + if ! option gui; then + MAKE_ARGS+=( NOGUI=1 ) + fi +} + +src_compile() { + local gui=0 + if option gui; then + gui=1 + fi + + emake "${MAKE_ARGS[@]}" + emake "${MAKE_ARGS[@]}" DESTDIR="${WORK}/staging" \ + INSTALL_UNINSTALLER=0 INSTALL_LICENSE=0 INSTALL_DOCS=0 \ + INSTALL_LANGUAGES=0 INSTALL_APPIMAGE_FILES=0 \ + INSTALL_MOUNT_HELPER_DIR="$(exhost --target)/bin" \ + INSTALL_DESKTOP=${gui} INSTALL_MIME=${gui} INSTALL_ICONS=${gui} install +} + +src_install() { + edo cp -R "${WORK}/staging/usr" "${IMAGE}/" + + dodir /usr/$(exhost --target)/bin + edo mv "${IMAGE}/usr/bin/veracrypt" "${IMAGE}/usr/$(exhost --target)/bin/veracrypt" + edo rmdir "${IMAGE}/usr/bin" + + if option gui; then + edo sed -i 's|Exec=/usr/bin/veracrypt|Exec=veracrypt|' \ + "${IMAGE}/usr/share/applications/veracrypt.desktop" + fi + + dodoc "${WORK}/../License.txt" "${WORK}/Readme.txt" + if option doc; then + edo mkdir -p "${IMAGE}/usr/share/doc/${PNV}" + edo cp -r "${WORK}/../doc/html" "${WORK}/../doc/EFI-DCS" "${IMAGE}/usr/share/doc/${PNV}/" + fi +} + +pkg_postinst() { + if option gui; then + freedesktop-mime_pkg_postinst + freedesktop-desktop_pkg_postinst + gtk-icon-cache_pkg_postinst + fi + ewarn "VeraCrypt's TrueCrypt-derived license restricts redistribution of modified versions." +} + +pkg_postrm() { + if option gui; then + freedesktop-mime_pkg_postrm + freedesktop-desktop_pkg_postrm + gtk-icon-cache_pkg_postrm + fi +} diff --git a/packages/app-misc/cachyos-settings/cachyos-settings-1.4.1.exheres-0 b/packages/app-misc/cachyos-settings/cachyos-settings-1.4.1.exheres-0 new file mode 100644 index 0000000..38bfe29 --- /dev/null +++ b/packages/app-misc/cachyos-settings/cachyos-settings-1.4.1.exheres-0 @@ -0,0 +1,87 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require systemd-service [ systemd_files=[ usr/lib/systemd/system/pci-latency.service ] ] \ + udev-rules [ udev_files=[ usr/lib/udev/rules.d/{20-audio-pm,40-hpet-permissions,50-sata,60-ioschedulers,69-hdparm,71-nvidia,99-cpu-dma-latency}.rules ] ] + +SUMMARY="Configuration files and tweaks from CachyOS" +HOMEPAGE="https://github.com/CachyOS/CachyOS-Settings" +DOWNLOADS="${HOMEPAGE}/archive/refs/tags/${PV}.tar.gz -> ${PNV}.tar.gz" + +LICENCES="GPL-3" +SLOT="0" +PLATFORMS="~amd64" +MYOPTIONS="zram" + +DEPENDENCIES=" + run: + app-shells/bash + sys-apps/hdparm + sys-apps/pciutils + sys-apps/systemd + sys-process/procps + zram? ( + app-arch/zstd + sys-apps/zram-generator + ) +" + +WORK="${WORKBASE}/CachyOS-Settings-${PV}" + +src_prepare() { + edo sed -i "s@ExecStart=/usr/bin/pci-latency@ExecStart=/usr/$(exhost --target)/bin/pci-latency@" \ + usr/lib/systemd/system/pci-latency.service +} + +src_compile() { + : +} + +src_install() { + insinto /etc/security/limits.d + doins etc/security/limits.d/20-audio.conf + + exeinto /usr/$(exhost --target)/bin + doexe usr/bin/{dlss-swapper,dlss-swapper-dll,pci-latency,zink-run,game-performance,kerver} + + insinto /usr/$(exhost --target)/lib/modprobe.d + doins usr/lib/modprobe.d/{amdgpu,blacklist,nvidia}.conf + + insinto /usr/$(exhost --target)/lib/modules-load.d + doins usr/lib/modules-load.d/ntsync.conf + + insinto /usr/$(exhost --target)/lib/sysctl.d + doins usr/lib/sysctl.d/70-cachyos-settings.conf + + local systemd_dir="/usr/$(exhost --target)/lib/systemd" + insinto "${systemd_dir}/journald.conf.d" + doins usr/lib/systemd/journald.conf.d/00-journal-size.conf + + insinto "${systemd_dir}/system.conf.d" + doins usr/lib/systemd/system.conf.d/{00-timeout,10-limits}.conf + + install_systemd_files + + insinto "${SYSTEMDSYSTEMUNITDIR}" + doins -r usr/lib/systemd/system/{rtkit-daemon,user@}.service.d + doins -r usr/lib/systemd/system/{session.slice,system.slice,user-.slice}.d + + insinto "${systemd_dir}/user.conf.d" + doins usr/lib/systemd/user.conf.d/{00-timeout,10-limits}.conf + + if option zram; then + insinto "${systemd_dir}" + doins usr/lib/systemd/zram-generator.conf + + insinto "${UDEVRULESDIR}" + doins usr/lib/udev/rules.d/30-zram.rules + fi + + insinto "${SYSTEMDTMPFILESDIR}" + doins usr/lib/tmpfiles.d/{coredump,thp-shrinker,thp}.conf + + install_udev_files + + insinto /usr/share/X11/xorg.conf.d + doins usr/share/X11/xorg.conf.d/20-touchpad.conf +} diff --git a/packages/app-misc/dmemcg-booster/dmemcg-booster-0.1.3.exheres-0 b/packages/app-misc/dmemcg-booster/dmemcg-booster-0.1.3.exheres-0 new file mode 100644 index 0000000..66548df --- /dev/null +++ b/packages/app-misc/dmemcg-booster/dmemcg-booster-0.1.3.exheres-0 @@ -0,0 +1,40 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require cargo [ rust_minimum_version=1.85 ] \ + gitlab [ prefix=https://gitlab.steamos.cloud user=holo tag=${PV} new_download_scheme=true ] \ + systemd-service [ systemd_files=[ dmemcg-booster-system.service ] systemd_user_files=[ dmemcg-booster-user.service ] ] + +SUMMARY="Boost foreground games with dmem cgroup limits" + +LICENCES="MIT" +SLOT="0" +PLATFORMS="~amd64" + +DEPENDENCIES+=" + build: + dev-util/pkgconf + + build+run: + sys-apps/dbus + + run: + sys-apps/systemd +" + +src_unpack() { + gitlab_src_unpack + edo cd "${WORK}" + ecargo_fetch +} + +src_prepare() { + default + edo sed -i "s@ExecStart=/usr/bin/dmemcg-booster@ExecStart=/usr/$(exhost --target)/bin/dmemcg-booster@" \ + dmemcg-booster-{system,user}.service +} + +src_install() { + cargo_src_install + install_systemd_files +} diff --git a/packages/app-misc/ente-auth/ente-auth-4.4.25.exheres-0 b/packages/app-misc/ente-auth/ente-auth-4.4.25.exheres-0 new file mode 100644 index 0000000..e839cbd --- /dev/null +++ b/packages/app-misc/ente-auth/ente-auth-4.4.25.exheres-0 @@ -0,0 +1,76 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require freedesktop-desktop freedesktop-mime gtk-icon-cache + +SUMMARY="End-to-end encrypted two-factor authenticator" +HOMEPAGE="https://ente.io/auth/ https://github.com/ente-io/ente" +DOWNLOADS="https://github.com/ente-io/ente/releases/download/auth-v${PV}/ente-auth-v${PV}-x86_64.AppImage -> ${PNV}.AppImage" + +LICENCES="AGPL-3+" +SLOT="0" +PLATFORMS="~amd64" +RESTRICT="mirror strip test" + +DEPENDENCIES=" + build: + sys-fs/squashfs-tools + + run: + dev-libs/libayatana-appindicator + dev-libs/libepoxy + dev-libs/libsecret:1 + dev-libs/openssl:3 + net-misc/curl + sys-libs/zlib + x11-libs/gtk+:3 +" + +WORK="${WORKBASE}/squashfs-root" + +pkg_setup() { + exdirectory --allow /opt +} + +src_unpack() { + local checksum + checksum=$(sha256sum "${FETCHEDDIR}/${PNV}.AppImage") || die "Cannot checksum Ente Auth AppImage" + [[ ${checksum%% *} == c85f4a9a75e8b97a54f99a7f6db4307275b42f6465d76515354fe42231e12b85 ]] || + die "Ente Auth AppImage changed; check version before updating checksum" + + edo unsquashfs -offset 944632 -dest "${WORK}" "${FETCHEDDIR}/${PNV}.AppImage" +} + +src_install() { + edo mkdir -p "${IMAGE}/opt/enteauth" + edo cp -a "${WORK}/data" "${WORK}/lib" "${WORK}/enteauth" "${IMAGE}/opt/enteauth/" + edo rm "${IMAGE}/opt/enteauth/lib/libdartjni.so" + + exeinto /usr/$(exhost --target)/bin + newexe "${FILES}/enteauth-launcher" enteauth + + insinto /usr/share/applications + edo sed 's@^Exec=.*@Exec=enteauth %u@' "${WORK}/enteauth.desktop" > "${WORKBASE}/enteauth.desktop" || die + doins "${WORKBASE}/enteauth.desktop" + + insinto /usr/share/icons + doins -r "${WORK}/usr/share/icons/hicolor" + + insinto /usr/share/pixmaps + doins "${WORK}/enteauth.png" + + insinto /usr/share/metainfo + doins "${WORK}/usr/share/metainfo/ente_auth.appdata.xml" +} + +pkg_postinst() { + freedesktop-mime_pkg_postinst + freedesktop-desktop_pkg_postinst + gtk-icon-cache_pkg_postinst +} + +pkg_postrm() { + freedesktop-mime_pkg_postrm + freedesktop-desktop_pkg_postrm + gtk-icon-cache_pkg_postrm +} diff --git a/packages/app-misc/ente-auth/files/enteauth-launcher b/packages/app-misc/ente-auth/files/enteauth-launcher new file mode 100644 index 0000000..2478e84 --- /dev/null +++ b/packages/app-misc/ente-auth/files/enteauth-launcher @@ -0,0 +1,3 @@ +#!/bin/sh +cd /opt/enteauth || exit 1 +exec ./enteauth "$@" diff --git a/packages/app-misc/nvchecker/nvchecker-2.22.exheres-0 b/packages/app-misc/nvchecker/nvchecker-2.22.exheres-0 new file mode 100644 index 0000000..d840b0c --- /dev/null +++ b/packages/app-misc/nvchecker/nvchecker-2.22.exheres-0 @@ -0,0 +1,19 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require pypi py-pep517 [ backend=setuptools blacklist="3.9" multibuild=false ] + +SUMMARY="New version checker for software" + +LICENCES="MIT" +SLOT="0" +PLATFORMS="~amd64" + +DEPENDENCIES=" + run: + dev-python/structlog[python_abis:*(-)?] + dev-python/platformdirs[python_abis:*(-)?] + dev-python/tornado[>=6][python_abis:*(-)?] + dev-python/pycurl[python_abis:*(-)?] + python_abis:3.10? ( dev-python/tomli[python_abis:3.10] ) +" diff --git a/packages/app-misc/protonplus/protonplus-0.6.8.exheres-0 b/packages/app-misc/protonplus/protonplus-0.6.8.exheres-0 new file mode 100644 index 0000000..62f36e1 --- /dev/null +++ b/packages/app-misc/protonplus/protonplus-0.6.8.exheres-0 @@ -0,0 +1,55 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require meson vala [ vala_dep=true vala_slots=[ 0.56 ] ] gsettings gtk-icon-cache + +SUMMARY="A modern compatibility tools manager" +HOMEPAGE="https://github.com/Vysp3r/ProtonPlus" +DOWNLOADS="${HOMEPAGE}/archive/refs/tags/v${PV}.tar.gz -> ${PNV}.tar.gz" + +LICENCES="GPL-3+" +SLOT="0" +PLATFORMS="~amd64" + +DEPENDENCIES+=" + build: + dev-util/desktop-file-utils + sys-devel/gettext + virtual/pkg-config + + build+run: + app-arch/libarchive + base/libgee:0.8 + core/json-glib + dev-libs/appstream:5.3 + dev-libs/glib:2 + dev-libs/libadwaita:1[>=1.6][vapi] + gnome-desktop/libsoup:3.0[vapi] + media-libs/SDL:3[>=3.2.0] + x11-libs/cairo + x11-libs/gtk:4.0 + x11-libs/libnotify +" + +MESON_SOURCE="${WORKBASE}/ProtonPlus-${PV}" + +pkg_setup() { + meson_pkg_setup + vala_pkg_setup +} + +src_install() { + export GSETTINGS_DISABLE_SCHEMAS_COMPILE=1 + meson_src_install + unset GSETTINGS_DISABLE_SCHEMAS_COMPILE +} + +pkg_postinst() { + gsettings_pkg_postinst + gtk-icon-cache_pkg_postinst +} + +pkg_postrm() { + gsettings_pkg_postrm + gtk-icon-cache_pkg_postrm +} diff --git a/packages/app-misc/shuck/shuck-0.2.4.exheres-0 b/packages/app-misc/shuck/shuck-0.2.4.exheres-0 new file mode 100644 index 0000000..e63bc20 --- /dev/null +++ b/packages/app-misc/shuck/shuck-0.2.4.exheres-0 @@ -0,0 +1,10 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require cargo [ rust_minimum_version=1.94.1 crate_path=crates/shuck-cli ] github [ user=ewhauser tag=v${PV} ] + +SUMMARY="Shell script linter" + +LICENCES="MIT" +SLOT="0" +PLATFORMS="~amd64" diff --git a/packages/app-misc/ydotool/ydotool-1.0.4.exheres-0 b/packages/app-misc/ydotool/ydotool-1.0.4.exheres-0 new file mode 100644 index 0000000..f5cb832 --- /dev/null +++ b/packages/app-misc/ydotool/ydotool-1.0.4.exheres-0 @@ -0,0 +1,29 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require cmake systemd-service + +SUMMARY="Generic command-line automation tool without X" +HOMEPAGE="https://github.com/ReimuNotMoe/ydotool" +DOWNLOADS="${HOMEPAGE}/archive/v${PV}.tar.gz -> ${PNV}.tar.gz" + +LICENCES="AGPL-3+" +SLOT="0" +PLATFORMS="~amd64" + +DEPENDENCIES=" + build: + app-doc/scdoc + dev-util/pkgconf + sys-kernel/linux-headers + + run: + sys-apps/systemd +" + +CMAKE_SRC_CONFIGURE_PARAMS=( -DCMAKE_POLICY_VERSION_MINIMUM=3.5 ) + +src_prepare() { + default + edo sed -i "/^add_subdirectory(Daemon)/i set(SD_UNITDIR \"${SYSTEMDUSERUNITDIR}\")" "${CMAKE_SOURCE}/CMakeLists.txt" +} diff --git a/packages/app-virtualization/bubblejail/bubblejail-0.10.4.exheres-0 b/packages/app-virtualization/bubblejail/bubblejail-0.10.4.exheres-0 new file mode 100644 index 0000000..5e96581 --- /dev/null +++ b/packages/app-virtualization/bubblejail/bubblejail-0.10.4.exheres-0 @@ -0,0 +1,73 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require python [ blacklist="2 3.9 3.10" multibuild=false ] meson [ meson_minimum_version=1.3.0 ] gtk-icon-cache + +SUMMARY="Bubblewrap-based sandboxing utility" +HOMEPAGE="https://github.com/igo95862/bubblejail" +DOWNLOADS="${HOMEPAGE}/releases/download/${PV}/${PNV}.tar.xz" + +LICENCES="GPL-3+ MIT MPL-2.0" +SLOT="0" +PLATFORMS="~amd64" +MYOPTIONS="doc gui bash-completion fish-completion" + +DEPENDENCIES=" + build: + dev-python/Jinja2[python_abis:*(-)?] + doc? ( app-doc/scdoc ) + + run: + dev-python/cattrs[python_abis:*(-)?] + dev-python/pyxdg[python_abis:*(-)?] + dev-python/tomli-w[python_abis:*(-)?] + sys-apps/bubblewrap[>=0.5.0] + sys-apps/xdg-dbus-proxy + sys-libs/libseccomp + gui? ( + dev-python/PyQt6[python_abis:*(-)?] + x11-themes/hicolor-icon-theme + ) +" + +MESON_SRC_CONFIGURE_PARAMS=( -Duse-vendored-python-lxns=enabled ) +MESON_SRC_CONFIGURE_OPTION_SWITCHES=( 'doc man' ) + +src_prepare() { + meson_src_prepare + edo sed -i "1s@/usr/bin/python3@/usr/$(exhost --target)/bin/python$(python_get_abi)@" \ + templates/bubblejail_launch_base.py.jinja +} + +src_install() { + meson_src_install + + if ! option gui; then + edo rm -f "${IMAGE}/usr/$(exhost --target)/bin/bubblejail-config" \ + "${IMAGE}/usr/share/applications/bubblejail-config.desktop" \ + "${IMAGE}/usr/share/icons/hicolor/128x128/apps/bubblejail-config.png" \ + "${IMAGE}/usr/share/icons/hicolor/scalable/apps/bubblejail-config.svg" + fi + if ! option bash-completion; then + edo rm -f "${IMAGE}/usr/share/bash-completion/completions/bubblejail" + fi + if ! option fish-completion; then + edo rm -f "${IMAGE}/usr/share/fish/vendor_completions.d/bubblejail.fish" + fi + + edo find "${IMAGE}/usr/share" -depth -type d -empty -delete + keepdir /etc/bubblejail/profiles + python_bytecompile +} + +pkg_postinst() { + if option gui; then + gtk-icon-cache_pkg_postinst + fi +} + +pkg_postrm() { + if option gui; then + gtk-icon-cache_pkg_postrm + fi +} diff --git a/packages/app-virtualization/distrobox/distrobox-1.8.2.5.exheres-0 b/packages/app-virtualization/distrobox/distrobox-1.8.2.5.exheres-0 new file mode 100644 index 0000000..96b90fe --- /dev/null +++ b/packages/app-virtualization/distrobox/distrobox-1.8.2.5.exheres-0 @@ -0,0 +1,54 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +SUMMARY="Use any Linux distribution inside your terminal" +HOMEPAGE=" + https://distrobox.it/ + https://github.com/89luca89/distrobox +" + +DOWNLOADS=" + https://github.com/89luca89/distrobox/archive/refs/tags/${PV}.tar.gz + -> ${PNV}.tar.gz +" + +LICENCES="GPL-3" +SLOT="0" +PLATFORMS="~amd64" + +MYOPTIONS=" + gui [[ + description = [ Install Distrobox's desktop icons ] + ]] +" + +DEPENDENCIES=" + run: + || ( + app-virtualization/podman + app-virtualization/docker-cli + ) +" + +src_install() { + dobin distrobox* + + doman man/man1/* + + insinto /usr/share/bash-completion/completions + doins completions/bash/* + + insinto /usr/share/zsh/site-functions + doins completions/zsh/* + + if option gui; then + insinto /usr/share/icons/hicolor/scalable/apps + doins icons/terminal-distrobox-icon.svg + + local size + for size in 16 22 24 32 36 48 64 72 96 128 256; do + insinto "/usr/share/icons/hicolor/${size}x${size}/apps" + doins "icons/hicolor/${size}x${size}/apps/terminal-distrobox-icon.png" + done + fi +} diff --git a/packages/dev-cpp/ada/ada-4.0.0.exheres-0 b/packages/dev-cpp/ada/ada-4.0.0.exheres-0 new file mode 100644 index 0000000..9cdd5f5 --- /dev/null +++ b/packages/dev-cpp/ada/ada-4.0.0.exheres-0 @@ -0,0 +1,19 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require cmake + +SUMMARY="WHATWG-compliant URL parser written in C++" +HOMEPAGE="https://github.com/ada-url/ada" +DOWNLOADS="https://github.com/ada-url/ada/archive/refs/tags/v${PV}.tar.gz -> ${PNV}.tar.gz" + +LICENCES="Apache-2.0 MIT" +SLOT="0" +PLATFORMS="~amd64" + +CMAKE_SRC_CONFIGURE_PARAMS=( + -DBUILD_SHARED_LIBS=ON + -DADA_TESTING=OFF + -DADA_TOOLS=OFF + -DADA_INCLUDE_URL_PATTERN=OFF +) diff --git a/packages/dev-libs/libbpf/libbpf-1.8.0.exheres-0 b/packages/dev-libs/libbpf/libbpf-1.8.0.exheres-0 new file mode 100644 index 0000000..9d6e2fd --- /dev/null +++ b/packages/dev-libs/libbpf/libbpf-1.8.0.exheres-0 @@ -0,0 +1,33 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require github [ user=libbpf tag=v${PV} ] + +SUMMARY="Library for loading and managing eBPF programs" + +LICENCES="|| ( LGPL-2.1 BSD-2 )" +SLOT="0" +PLATFORMS="~amd64" + +DEPENDENCIES=" + build: + dev-util/pkgconf + sys-kernel/linux-headers + + build+run: + dev-util/elfutils + sys-libs/zlib +" + +src_compile() { + emake -C src +} + +src_install() { + emake -C src install \ + DESTDIR="${IMAGE}" \ + PREFIX="/usr/$(exhost --target)" \ + LIBDIR="/usr/$(exhost --target)/lib" + edo rm "${IMAGE}/usr/$(exhost --target)/lib/libbpf.a" + emagicdocs +} diff --git a/packages/dev-libs/tlottie/files/tlottie-0_pre20260911-tdesktop-compat.patch b/packages/dev-libs/tlottie/files/tlottie-0_pre20260911-tdesktop-compat.patch new file mode 100644 index 0000000..595e044 --- /dev/null +++ b/packages/dev-libs/tlottie/files/tlottie-0_pre20260911-tdesktop-compat.patch @@ -0,0 +1,160 @@ +diff --git a/src/composition/limits.rs b/src/composition/limits.rs +index f8de04c..d4715ab 100644 +--- a/src/composition/limits.rs ++++ b/src/composition/limits.rs +@@ -87,7 +87,9 @@ pub struct Limits { + pub max_render_points: usize, + /// Maximum cumulative dash output allocation estimate per frame, in bytes. + pub max_render_dash_bytes: usize, +- /// Maximum geometry/raster work units charged per frame. ++ /// Maximum geometry/raster work units charged per frame. Telegram's gift ++ /// models peak near 5M (~1.25ms/frame, half of what rlottie spends on ++ /// them uncapped), so the cap keeps headroom above real content. + pub max_render_work: usize, + /// Maximum weighted pixel visits per frame at 64x64 or smaller. + /// Larger outputs scale this allowance proportionally to canvas area. +@@ -140,7 +142,7 @@ impl Default for Limits { + max_dimension: 8192, + max_render_points: 1_048_576, + max_render_dash_bytes: 6_330_240, +- max_render_work: 4_194_304, ++ max_render_work: 8_388_608, + max_render_pixels: 64 * 1024 * 1024, + max_render_bytes: 36 * 1024 * 1024, + } +diff --git a/src/composition/parse.rs b/src/composition/parse.rs +index 47fdaa6..4a0aac8 100644 +--- a/src/composition/parse.rs ++++ b/src/composition/parse.rs +@@ -222,7 +222,9 @@ fn parse_vec2(c: &mut Cursor<'_>) -> Result { + match got { + [Some(x), Some(y)] => Ok(Vec2::new(x, y)), + [Some(x), None] => Ok(Vec2::new(x, x)), +- _ => Err(invalid(c, "expected [x, y]")), ++ // rlottie zero-fills a missing component, and optimized .tgs files write ++ // `[]` for every straight-line tangent; rejecting those loses the file. ++ _ => Ok(Vec2::ZERO), + } + } + +@@ -1060,6 +1062,14 @@ fn parse_shape_item(c: &mut Cursor<'_>, limits: &Limits) -> Result { + + let mut seen = SeenFields::default(); + let inline_group = for_each_field_until(c, |c, key| { ++ // rlottie dispatches a shape item on `ty` and Skip()s every key ahead of ++ // it, so fields authored before `ty` never reach the reference parser. ++ // Telegram's gift patterns write {"d":3,"ty":"el"} and rely on that: the ++ // ellipses keep the exporter's winding and punch holes in the body path. ++ if ty.is_none() && !matches!(key, b"ty") { ++ c.skip_value()?; ++ return Ok(false); ++ } + match_once!(seen, key, { + b"t" => { + grad_type = parse_f32(c)?; +@@ -1208,9 +1218,8 @@ fn parse_shape_item(c: &mut Cursor<'_>, limits: &Limits) -> Result { + None => Ok(Property::Static(default)), + } + }; +- // Path direction on primitives: `d` == 3 reverses the winding. rlottie +- // supports this too, but accidentally ignores `d` if it appears before +- // `ty`; honor the authored field order-independently. ++ // Path direction on primitives: `d` == 3 reverses the winding, for a `d` ++ // that the field loop above accepted (it is dropped before `ty`). + let direction_reversed = |c: &Cursor<'_>, pos: Option| -> bool { pos.is_some_and(|p| parse_f32(&mut c.fork_at(p)).unwrap_or(1.0) == 3.0) }; + + match &ty { +diff --git a/src/composition/tests/parse.rs b/src/composition/tests/parse.rs +index abbdbba..00aceab 100644 +--- a/src/composition/tests/parse.rs ++++ b/src/composition/tests/parse.rs +@@ -113,21 +113,29 @@ fn parses_shape_layer() { + } + + #[test] +-fn primitive_direction_is_order_independent() { +- let comp = parse( +- r#"{"fr":30,"ip":0,"op":30,"w":100,"h":100,"layers":[ +- {"ty":4,"ind":1,"ip":0,"op":30,"st":0,"ks":{}, ++fn primitive_direction_before_ty_is_dropped() { ++ // rlottie dispatches on `ty` and Skip()s every key ahead of it, so a `d` ++ // written first never reaches the reference parser. Telegram's gift ++ // patterns are authored against that: {"d":3,"ty":"el"} keeps the ++ // exporter's winding so the ellipses punch holes in the body path. ++ let ellipse = |shape: &str| { ++ let json = alloc::format!( ++ r#"{{"fr":30,"ip":0,"op":30,"w":100,"h":100,"layers":[ ++ {{"ty":4,"ind":1,"ip":0,"op":30,"st":0,"ks":{{}}, + "shapes":[ +- {"d":3,"ty":"el","p":{"a":0,"k":[50,50]},"s":{"a":0,"k":[10,10]}}, +- {"ty":"fl","c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1} +- ]} +- ]}"#, +- ) +- .unwrap(); +- let Some(Shape::Ellipse(ellipse)) = comp.layers[0].shapes.first() else { +- panic!("expected ellipse"); ++ {shape}, ++ {{"ty":"fl","c":{{"a":0,"k":[1,0,0,1]}},"o":{{"a":0,"k":100}},"r":1}} ++ ]}} ++ ]}}"# ++ ); ++ let comp = parse(&json).unwrap(); ++ let Some(Shape::Ellipse(ellipse)) = comp.layers[0].shapes.first() else { ++ panic!("expected ellipse"); ++ }; ++ ellipse.reversed + }; +- assert!(ellipse.reversed); ++ assert!(!ellipse(r#"{"d":3,"ty":"el","p":{"a":0,"k":[50,50]},"s":{"a":0,"k":[10,10]}}"#)); ++ assert!(ellipse(r#"{"ty":"el","p":{"a":0,"k":[50,50]},"s":{"a":0,"k":[10,10]},"d":3}"#)); + } + + #[test] +@@ -394,6 +402,19 @@ fn inherited_keyframe_heap_budget_is_cumulative_and_preserves_end_values() { + } + } + ++#[test] ++fn empty_tangent_points_parse_as_zero_corners() { ++ // Optimized .tgs files write `[]` for every straight-line tangent, and ++ // rlottie zero-fills a point it cannot read; rejecting them loses the ++ // whole animation (Telegram's "21_heart_white" typing sticker). ++ let json = br#"{"i":[[],[]],"o":[[],[]],"v":[[2,0],[4,0]],"c":true}"#; ++ let limits = Limits::default(); ++ let path = parse_path_value(&mut Cursor::new(json.as_slice(), 128), &limits).unwrap(); ++ assert_eq!(path.vertices, alloc::vec![Vec2::new(2.0, 0.0), Vec2::new(4.0, 0.0)]); ++ assert!(path.in_tangents.iter().all(|t| *t == Vec2::ZERO)); ++ assert!(path.out_tangents.iter().all(|t| *t == Vec2::ZERO)); ++} ++ + #[test] + fn inherited_path_budget_charges_padded_tangents_before_cloning() { + let json = br#"[{"t":0,"s":[{"v":[[1,2],[3,4]],"i":[],"o":[]}]},{"t":1}]"#; +@@ -412,10 +433,9 @@ fn inherited_path_budget_charges_padded_tangents_before_cloning() { + + #[test] + fn group_walk_preserves_siblings_transforms_and_shared_limits() { +- // Exercise both field orders and resume the parent after the child list. ++ // Resume the parent after the child list. + for group in [ + r#"{"ty":"gr","it":[{"ty":"tr","p":{"k":[3,4]}},{"ty":"gr","it":[{"ty":"rc","p":{"k":[5,6]},"s":{"k":[7,8]}}]},{"ty":"el","p":{"k":[9,10]},"s":{"k":[11,12]}}]}"#, +- r#"{"it":[{"ty":"tr","p":{"k":[3,4]}},{"it":[{"ty":"rc","p":{"k":[5,6]},"s":{"k":[7,8]}}],"ty":"gr"},{"ty":"el","p":{"k":[9,10]},"s":{"k":[11,12]}}],"ty":"gr"}"#, + ] { + let json = alloc::format!(r#"[{group},{{"ty":"fl","c":{{"k":[1,0,0,1]}}}}]"#); + let mut counts = ShapeCounts::default(); +@@ -440,3 +460,14 @@ fn group_walk_preserves_siblings_transforms_and_shared_limits() { + assert!(parse_shape_list(&mut Cursor::new(json, 128), &Limits::default(), 0, &mut ShapeCounts::default()).is_err()); + } + } ++ ++#[test] ++fn group_items_before_ty_are_dropped() { ++ // Same rlottie rule as primitive_direction_before_ty_is_dropped: an `it` ++ // written ahead of `ty` is skipped, so the reference walks an empty group. ++ let json = br#"[{"it":[{"ty":"el","p":{"k":[9,10]},"s":{"k":[11,12]}}],"ty":"gr"},{"ty":"fl","c":{"k":[1,0,0,1]}}]"#; ++ let mut counts = ShapeCounts::default(); ++ let (shapes, _) = parse_shape_list(&mut Cursor::new(json.as_slice(), 128), &Limits::default(), 0, &mut counts).unwrap(); ++ assert!(matches!(&shapes[..], [Shape::Fill(_)])); ++ assert_eq!(counts.paints, 1); ++} diff --git a/packages/dev-libs/tlottie/tlottie-0_pre20260911.exheres-0 b/packages/dev-libs/tlottie/tlottie-0_pre20260911.exheres-0 new file mode 100644 index 0000000..faf85da --- /dev/null +++ b/packages/dev-libs/tlottie/tlottie-0_pre20260911.exheres-0 @@ -0,0 +1,30 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require cargo [ rust_minimum_version=1.96.1 ] + +TLOTTIE_COMMIT="31f1b542f88e7b4be9a01e749920d857535fc715" + +SUMMARY="Rust library for rendering Lottie animations" +HOMEPAGE="https://github.com/dkaraush/tlottie" +DOWNLOADS="${HOMEPAGE}/archive/${TLOTTIE_COMMIT}.tar.gz -> ${PNV}.tar.gz" +WORK="${WORKBASE}/tlottie-${TLOTTIE_COMMIT}" + +LICENCES="MIT" +SLOT="0" +PLATFORMS="~amd64" + +DEFAULT_SRC_PREPARE_PATCHES=( "${FILES}/${PNV}-tdesktop-compat.patch" ) + +src_compile() { + ecargo rustc --frozen --release --features c-api --lib --crate-type staticlib \ + -- --print native-static-libs +} + +src_install() { + insinto /usr/$(exhost --target)/lib + doins "target/$(rust_target_arch_name)/release/libtlottie.a" + insinto /usr/$(exhost --target)/include/tlottie + doins include/tlottie.h + emagicdocs +} diff --git a/packages/dev-python/structlog/structlog-26.1.0.exheres-0 b/packages/dev-python/structlog/structlog-26.1.0.exheres-0 new file mode 100644 index 0000000..aa97ffa --- /dev/null +++ b/packages/dev-python/structlog/structlog-26.1.0.exheres-0 @@ -0,0 +1,19 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require pypi py-pep517 [ backend=hatchling blacklist="3.9" ] + +SUMMARY="Structured logging for Python" + +LICENCES="|| ( Apache-2.0 MIT )" +SLOT="0" +PLATFORMS="~amd64" + +DEPENDENCIES=" + build: + dev-python/hatch_vcs[python_abis:*(-)?] + dev-python/hatch-fancy-pypi-readme[>=22.8.0][python_abis:*(-)?] + + run: + python_abis:3.10? ( dev-python/typing-extensions[python_abis:3.10] ) +" diff --git a/packages/games-misc/hydra-launcher/hydra-launcher-4.1.6.exheres-0 b/packages/games-misc/hydra-launcher/hydra-launcher-4.1.6.exheres-0 new file mode 100644 index 0000000..f12714b --- /dev/null +++ b/packages/games-misc/hydra-launcher/hydra-launcher-4.1.6.exheres-0 @@ -0,0 +1,87 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require freedesktop-desktop freedesktop-mime gtk-icon-cache + +SUMMARY="Open-source gaming platform and launcher" +HOMEPAGE="https://github.com/hydralauncher/hydra" +DOWNLOADS="${HOMEPAGE}/releases/download/v${PV}/hydralauncher_${PV}_amd64.deb -> ${PNV}.deb" + +LICENCES="MIT" +SLOT="0" +PLATFORMS="~amd64" +RESTRICT="mirror strip test" + +DEPENDENCIES=" + build: + app-arch/libarchive + + run: + dev-libs/at-spi2-core + dev-libs/expat + dev-libs/glib:2 + dev-libs/libsecret + dev-libs/nspr + dev-libs/nss + media-libs/fontconfig + net-misc/aria2 + net-print/cups + sys-apps/dbus + sys-apps/util-linux + sys-libs/zlib + sys-sound/alsa-lib + x11-apps/xdg-utils + x11-dri/libdrm + x11-dri/mesa + x11-libs/cairo + x11-libs/gdk-pixbuf:2.0 + x11-libs/gtk+:3 + x11-libs/libX11 + x11-libs/libXcomposite + x11-libs/libXdamage + x11-libs/libXext + x11-libs/libXfixes + x11-libs/libXrandr + x11-libs/libXScrnSaver + x11-libs/libXtst + x11-libs/libxcb + x11-libs/libnotify + x11-libs/pango +" + +WORK="${WORKBASE}/${PNV}" + +pkg_setup() { + exdirectory --allow /opt +} + +src_unpack() { + edo mkdir -p "${WORK}" + edo bsdtar -xOf "${FETCHEDDIR}/${PNV}.deb" data.tar.xz > "${WORKBASE}/data.tar.xz" + edo tar -xf "${WORKBASE}/data.tar.xz" -C "${WORK}" +} + +src_install() { + edo mkdir -p "${IMAGE}/opt/Hydra" + edo cp -a "${WORK}/opt/Hydra/." "${IMAGE}/opt/Hydra/" + + insinto /usr/share/applications + doins "${WORK}/usr/share/applications/hydralauncher.desktop" + insinto /usr/share/icons/hicolor/512x512/apps + doins "${WORK}/usr/share/icons/hicolor/512x512/apps/hydralauncher.png" + + dodir /usr/$(exhost --target)/bin + dosym /opt/Hydra/hydralauncher /usr/$(exhost --target)/bin/hydralauncher +} + +pkg_postinst() { + freedesktop-mime_pkg_postinst + freedesktop-desktop_pkg_postinst + gtk-icon-cache_pkg_postinst +} + +pkg_postrm() { + freedesktop-mime_pkg_postrm + freedesktop-desktop_pkg_postrm + gtk-icon-cache_pkg_postrm +} diff --git a/packages/games-misc/prismlauncher/prismlauncher-11.1.1.exheres-0 b/packages/games-misc/prismlauncher/prismlauncher-11.1.1.exheres-0 new file mode 100644 index 0000000..7e2a005 --- /dev/null +++ b/packages/games-misc/prismlauncher/prismlauncher-11.1.1.exheres-0 @@ -0,0 +1,63 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require cmake freedesktop-desktop freedesktop-mime gtk-icon-cache + +SUMMARY="Minecraft launcher with ability to manage multiple instances" +HOMEPAGE="https://prismlauncher.org https://github.com/PrismLauncher/PrismLauncher" +DOWNLOADS="https://github.com/PrismLauncher/PrismLauncher/releases/download/${PV}/PrismLauncher-${PV}.tar.gz -> ${PNV}.tar.gz" + +LICENCES="Apache-2.0 Batch GPL-3 LGPL-2+ LGPL-3+ MIT OFL-1.1" +SLOT="0" +PLATFORMS="~amd64" + +DEPENDENCIES=" + build: + app-doc/scdoc + kde-frameworks/extra-cmake-modules + sys-libs/vulkan-headers + virtual/jdk:17 + virtual/pkg-config + + build+run: + app-arch/libarchive + app-text/cmark + dev-cpp/tomlplusplus + media-libs/qrencode + sys-apps/gamemode + sys-apps/pciutils + sys-libs/zlib + x11-dri/mesa + x11-libs/qtbase:6[gui][vulkan] + x11-libs/qtnetworkauth:6 + x11-libs/qtsvg:6 + + run: + x11-libs/qtimageformats:6 + + suggestion: + virtual/jre:* [[ description = [ System Java for running Minecraft, otherwise use the built-in Java downloader ] ]] +" + +CMAKE_SOURCE="${WORKBASE}/PrismLauncher-${PV}" + +CMAKE_SRC_CONFIGURE_PARAMS=( + -DLauncher_BUILD_PLATFORM=Exherbo + -DLauncher_ENABLE_JAVA_DOWNLOADER=ON +) + +CMAKE_SRC_CONFIGURE_TESTS=( + '-DBUILD_TESTING=ON -DBUILD_TESTING=OFF' +) + +pkg_postinst() { + freedesktop-mime_pkg_postinst + freedesktop-desktop_pkg_postinst + gtk-icon-cache_pkg_postinst +} + +pkg_postrm() { + freedesktop-mime_pkg_postrm + freedesktop-desktop_pkg_postrm + gtk-icon-cache_pkg_postrm +} diff --git a/packages/gui-libs/adwaita-qt/adwaita-qt-1.4.2.exheres-0 b/packages/gui-libs/adwaita-qt/adwaita-qt-1.4.2.exheres-0 new file mode 100644 index 0000000..73596d1 --- /dev/null +++ b/packages/gui-libs/adwaita-qt/adwaita-qt-1.4.2.exheres-0 @@ -0,0 +1,21 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require cmake + +SUMMARY="Adwaita style for Qt6 applications" +HOMEPAGE="https://github.com/FedoraQt/adwaita-qt" +DOWNLOADS="https://github.com/FedoraQt/adwaita-qt/archive/${PV}/${PNV}.tar.gz" + +LICENCES="GPL-2 LGPL-2" +SLOT="0" +PLATFORMS="~amd64" + +DEPENDENCIES=" + build+run: + x11-libs/qtbase:6[>=6.2.0][gui] +" + +CMAKE_SRC_CONFIGURE_PARAMS=( + -DUSE_QT6=ON +) diff --git a/packages/gui-libs/qt-color-widgets/qt-color-widgets-3.0.0.exheres-0 b/packages/gui-libs/qt-color-widgets/qt-color-widgets-3.0.0.exheres-0 new file mode 100644 index 0000000..e6af19c --- /dev/null +++ b/packages/gui-libs/qt-color-widgets/qt-color-widgets-3.0.0.exheres-0 @@ -0,0 +1,43 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require cmake + +SUMMARY="Qt (C++) widgets to manage color inputs" +HOMEPAGE="https://gitlab.com/mattbas/Qt-Color-Widgets" + +DOWNLOADS=" + https://gitlab.com/mattbas/Qt-Color-Widgets/-/archive/${PV}/Qt-Color-Widgets-${PV}.tar.bz2 + -> ${PNV}.tar.bz2 +" + +LICENCES="LGPL-3+" +SLOT="0" +PLATFORMS="~amd64" + +MYOPTIONS=" + designer [[ + description = [ Build the Qt Designer plugin ] + ]] +" + +DEPENDENCIES=" + build+run: + x11-libs/qtbase:6[gui] + + designer? ( + x11-libs/qttools:6[designer] + ) +" + +CMAKE_SOURCE="${WORKBASE}/Qt-Color-Widgets-${PV}" + +src_configure() { + CMAKE_SRC_CONFIGURE_PARAMS=( + -DQT_VERSION_MAJOR=6 + -DBUILD_SHARED_LIBS=ON + -DQTCOLORWIDGETS_DESIGNER_PLUGIN="$(option designer ON OFF)" + ) + + cmake_src_configure +} diff --git a/packages/media-libs/libmysofa/libmysofa-1.3.5.exheres-0 b/packages/media-libs/libmysofa/libmysofa-1.3.5.exheres-0 new file mode 100644 index 0000000..dc31d82 --- /dev/null +++ b/packages/media-libs/libmysofa/libmysofa-1.3.5.exheres-0 @@ -0,0 +1,36 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require cmake + +SUMMARY="Library for reading AES SOFA files" +HOMEPAGE="https://github.com/hoene/libmysofa" +DOWNLOADS="https://github.com/hoene/libmysofa/archive/refs/tags/v${PV}.tar.gz -> ${PNV}.tar.gz" + +LICENCES="BSD-3" +SLOT="0" +PLATFORMS="~amd64" + +DEPENDENCIES=" + build+run: + sys-libs/zlib + + test: + app-arch/bzip2 + dev-lang/node + dev-util/cunit +" + +CMAKE_SRC_CONFIGURE_PARAMS=( + -DBUILD_SHARED_LIBS=ON + -DBUILD_STATIC_LIBS=OFF +) + +CMAKE_SRC_CONFIGURE_TESTS=( + '-DBUILD_TESTS=ON -DBUILD_TESTS=OFF' +) + +src_install() { + cmake_src_install + edo rm -r "${IMAGE}/usr/share/libmysofa" +} diff --git a/packages/media-libs/nanosvg/files/nanosvg.patch b/packages/media-libs/nanosvg/files/nanosvg.patch new file mode 100644 index 0000000..dc11e93 --- /dev/null +++ b/packages/media-libs/nanosvg/files/nanosvg.patch @@ -0,0 +1,248 @@ +From abcd277ea45e9098bed752cf9c6875b533c0892f Mon Sep 17 00:00:00 2001 +From: AlbrechtS +Date: Sun, 4 Feb 2018 23:47:38 +0100 +Subject: [PATCH] Modify rasterizer to support non-square X,Y axes scaling. + +Add new function nsvgRasterizeXY() similar to nsvgRasterize() but with +separate scaling factors for x-axis and y-axis. +--- + src/nanosvgrast.h | 78 +++++++++++++++++++++++++++++++---------------- + 1 file changed, 51 insertions(+), 27 deletions(-) + +diff --git a/src/nanosvgrast.h b/src/nanosvgrast.h +index 17ba3b0..a83db27 100644 +--- a/src/nanosvgrast.h ++++ b/src/nanosvgrast.h +@@ -22,6 +22,12 @@ + * + */ + ++/* Modified by FLTK to support non-square X,Y axes scaling. ++ * ++ * Added: nsvgRasterizeXY() ++*/ ++ ++ + #ifndef NANOSVGRAST_H + #define NANOSVGRAST_H + +@@ -46,6 +52,9 @@ typedef struct NSVGrasterizer NSVGrasterizer; + unsigned char* img = malloc(w*h*4); + // Rasterize + nsvgRasterize(rast, image, 0,0,1, img, w, h, w*4); ++ ++ // For non-square X,Y scaling, use ++ nsvgRasterizeXY(rast, image, 0,0,1,1, img, w, h, w*4); + */ + + // Allocated rasterizer context. +@@ -55,7 +64,7 @@ NSVGrasterizer* nsvgCreateRasterizer(void); + // r - pointer to rasterizer context + // image - pointer to image to rasterize + // tx,ty - image offset (applied after scaling) +-// scale - image scale ++// scale - image scale (assumes square aspect ratio) + // dst - pointer to destination image data, 4 bytes per pixel (RGBA) + // w - width of the image to render + // h - height of the image to render +@@ -64,6 +73,12 @@ void nsvgRasterize(NSVGrasterizer* r, + NSVGimage* image, float tx, float ty, float scale, + unsigned char* dst, int w, int h, int stride); + ++// As above, but allow X and Y axes to scale independently for non-square aspects ++void nsvgRasterizeXY(NSVGrasterizer* r, ++ NSVGimage* image, float tx, float ty, ++ float sx, float sy, ++ unsigned char* dst, int w, int h, int stride); ++ + // Deletes rasterizer context. + void nsvgDeleteRasterizer(NSVGrasterizer*); + +@@ -370,7 +385,7 @@ static void nsvg__flattenCubicBez(NSVGrasterizer* r, + nsvg__flattenCubicBez(r, x1234,y1234, x234,y234, x34,y34, x4,y4, level+1, type); + } + +-static void nsvg__flattenShape(NSVGrasterizer* r, NSVGshape* shape, float scale) ++static void nsvg__flattenShape(NSVGrasterizer* r, NSVGshape* shape, float sx, float sy) + { + int i, j; + NSVGpath* path; +@@ -378,13 +393,13 @@ static void nsvg__flattenShape(NSVGrasterizer* r, NSVGshape* shape, float scale) + for (path = shape->paths; path != NULL; path = path->next) { + r->npoints = 0; + // Flatten path +- nsvg__addPathPoint(r, path->pts[0]*scale, path->pts[1]*scale, 0); ++ nsvg__addPathPoint(r, path->pts[0]*sx, path->pts[1]*sy, 0); + for (i = 0; i < path->npts-1; i += 3) { + float* p = &path->pts[i*2]; +- nsvg__flattenCubicBez(r, p[0]*scale,p[1]*scale, p[2]*scale,p[3]*scale, p[4]*scale,p[5]*scale, p[6]*scale,p[7]*scale, 0, 0); ++ nsvg__flattenCubicBez(r, p[0]*sx,p[1]*sy, p[2]*sx,p[3]*sy, p[4]*sx,p[5]*sy, p[6]*sx,p[7]*sy, 0, 0); + } + // Close path +- nsvg__addPathPoint(r, path->pts[0]*scale, path->pts[1]*scale, 0); ++ nsvg__addPathPoint(r, path->pts[0]*sx, path->pts[1]*sy, 0); + // Build edges + for (i = 0, j = r->npoints-1; i < r->npoints; j = i++) + nsvg__addEdge(r, r->points[j].x, r->points[j].y, r->points[i].x, r->points[i].y); +@@ -734,7 +749,7 @@ static void nsvg__prepareStroke(NSVGrasterizer* r, float miterLimit, int lineJoi + } + } + +-static void nsvg__flattenShapeStroke(NSVGrasterizer* r, NSVGshape* shape, float scale) ++static void nsvg__flattenShapeStroke(NSVGrasterizer* r, NSVGshape* shape, float sx, float sy) + { + int i, j, closed; + NSVGpath* path; +@@ -742,15 +757,16 @@ static void nsvg__flattenShapeStroke(NSVGrasterizer* r, NSVGshape* shape, float + float miterLimit = shape->miterLimit; + int lineJoin = shape->strokeLineJoin; + int lineCap = shape->strokeLineCap; +- float lineWidth = shape->strokeWidth * scale; ++ const float sw = (sx + sy) / 2; // average scaling factor ++ const float lineWidth = shape->strokeWidth * sw; // FIXME (?) + + for (path = shape->paths; path != NULL; path = path->next) { + // Flatten path + r->npoints = 0; +- nsvg__addPathPoint(r, path->pts[0]*scale, path->pts[1]*scale, NSVG_PT_CORNER); ++ nsvg__addPathPoint(r, path->pts[0]*sx, path->pts[1]*sy, NSVG_PT_CORNER); + for (i = 0; i < path->npts-1; i += 3) { + float* p = &path->pts[i*2]; +- nsvg__flattenCubicBez(r, p[0]*scale,p[1]*scale, p[2]*scale,p[3]*scale, p[4]*scale,p[5]*scale, p[6]*scale,p[7]*scale, 0, NSVG_PT_CORNER); ++ nsvg__flattenCubicBez(r, p[0]*sx,p[1]*sy, p[2]*sx,p[3]*sy, p[4]*sx,p[5]*sy, p[6]*sx,p[7]*sy, 0, NSVG_PT_CORNER); + } + if (r->npoints < 2) + continue; +@@ -796,7 +812,7 @@ static void nsvg__flattenShapeStroke(NSVGrasterizer* r, NSVGshape* shape, float + dashOffset -= shape->strokeDashArray[idash]; + idash = (idash + 1) % shape->strokeDashCount; + } +- dashLen = (shape->strokeDashArray[idash] - dashOffset) * scale; ++ dashLen = (shape->strokeDashArray[idash] - dashOffset) * sw; + + for (j = 1; j < r->npoints2; ) { + float dx = r->points2[j].x - cur.x; +@@ -818,7 +834,7 @@ static void nsvg__flattenShapeStroke(NSVGrasterizer* r, NSVGshape* shape, float + // Advance dash pattern + dashState = !dashState; + idash = (idash+1) % shape->strokeDashCount; +- dashLen = shape->strokeDashArray[idash] * scale; ++ dashLen = shape->strokeDashArray[idash] * sw; + // Restart + cur.x = x; + cur.y = y; +@@ -987,7 +1003,7 @@ static inline int nsvg__div255(int x) + } + + static void nsvg__scanlineSolid(unsigned char* dst, int count, unsigned char* cover, int x, int y, +- float tx, float ty, float scale, NSVGcachedPaint* cache) ++ float tx, float ty, float sx, float sy, NSVGcachedPaint* cache) + { + + if (cache->type == NSVG_PAINT_COLOR) { +@@ -1028,9 +1044,9 @@ static void nsvg__scanlineSolid(unsigned char* dst, int count, unsigned char* co + int i, cr, cg, cb, ca; + unsigned int c; + +- fx = ((float)x - tx) / scale; +- fy = ((float)y - ty) / scale; +- dx = 1.0f / scale; ++ fx = ((float)x - tx) / sx; ++ fy = ((float)y - ty) / sy; ++ dx = 1.0f / sx; + + for (i = 0; i < count; i++) { + int r,g,b,a,ia; +@@ -1073,9 +1089,9 @@ static void nsvg__scanlineSolid(unsigned char* dst, int count, unsigned char* co + int i, cr, cg, cb, ca; + unsigned int c; + +- fx = ((float)x - tx) / scale; +- fy = ((float)y - ty) / scale; +- dx = 1.0f / scale; ++ fx = ((float)x - tx) / sx; ++ fy = ((float)y - ty) / sy; ++ dx = 1.0f / sx; + + for (i = 0; i < count; i++) { + int r,g,b,a,ia; +@@ -1114,7 +1130,7 @@ static void nsvg__scanlineSolid(unsigned char* dst, int count, unsigned char* co + } + } + +-static void nsvg__rasterizeSortedEdges(NSVGrasterizer *r, float tx, float ty, float scale, NSVGcachedPaint* cache, char fillRule) ++static void nsvg__rasterizeSortedEdges(NSVGrasterizer *r, float tx, float ty, float sx, float sy, NSVGcachedPaint* cache, char fillRule) + { + NSVGactiveEdge *active = NULL; + int y, s; +@@ -1196,7 +1212,7 @@ static void nsvg__rasterizeSortedEdges(NSVGrasterizer *r, float tx, float ty, fl + if (xmin < 0) xmin = 0; + if (xmax > r->width-1) xmax = r->width-1; + if (xmin <= xmax) { +- nsvg__scanlineSolid(&r->bitmap[y * r->stride] + xmin*4, xmax-xmin+1, &r->scanline[xmin], xmin, y, tx,ty, scale, cache); ++ nsvg__scanlineSolid(&r->bitmap[y * r->stride] + xmin*4, xmax-xmin+1, &r->scanline[xmin], xmin, y, tx,ty, sx, sy, cache); + } + } + +@@ -1364,8 +1380,9 @@ static void dumpEdges(NSVGrasterizer* r, const char* name) + } + */ + +-void nsvgRasterize(NSVGrasterizer* r, +- NSVGimage* image, float tx, float ty, float scale, ++void nsvgRasterizeXY(NSVGrasterizer* r, ++ NSVGimage* image, float tx, float ty, ++ float sx, float sy, + unsigned char* dst, int w, int h, int stride) + { + NSVGshape *shape = NULL; +@@ -1396,7 +1413,7 @@ void nsvgRasterize(NSVGrasterizer* r, + r->freelist = NULL; + r->nedges = 0; + +- nsvg__flattenShape(r, shape, scale); ++ nsvg__flattenShape(r, shape, sx, sy); + + // Scale and translate edges + for (i = 0; i < r->nedges; i++) { +@@ -1414,14 +1431,14 @@ void nsvgRasterize(NSVGrasterizer* r, + // now, traverse the scanlines and find the intersections on each scanline, use non-zero rule + nsvg__initPaint(&cache, &shape->fill, shape->opacity); + +- nsvg__rasterizeSortedEdges(r, tx,ty,scale, &cache, shape->fillRule); ++ nsvg__rasterizeSortedEdges(r, tx,ty, sx, sy, &cache, shape->fillRule); + } +- if (shape->stroke.type != NSVG_PAINT_NONE && (shape->strokeWidth * scale) > 0.01f) { ++ if (shape->stroke.type != NSVG_PAINT_NONE && (shape->strokeWidth * sx) > 0.01f) { + nsvg__resetPool(r); + r->freelist = NULL; + r->nedges = 0; + +- nsvg__flattenShapeStroke(r, shape, scale); ++ nsvg__flattenShapeStroke(r, shape, sx, sy); + + // dumpEdges(r, "edge.svg"); + +@@ -1441,7 +1458,7 @@ void nsvgRasterize(NSVGrasterizer* r, + // now, traverse the scanlines and find the intersections on each scanline, use non-zero rule + nsvg__initPaint(&cache, &shape->stroke, shape->opacity); + +- nsvg__rasterizeSortedEdges(r, tx,ty,scale, &cache, NSVG_FILLRULE_NONZERO); ++ nsvg__rasterizeSortedEdges(r, tx,ty,sx, sy, &cache, NSVG_FILLRULE_NONZERO); + } + } + +@@ -1453,6 +1470,13 @@ void nsvgRasterize(NSVGrasterizer* r, + r->stride = 0; + } + ++void nsvgRasterize(NSVGrasterizer* r, ++ NSVGimage* image, float tx, float ty, float scale, ++ unsigned char* dst, int w, int h, int stride) ++{ ++ nsvgRasterizeXY(r,image, tx, ty, scale, scale, dst, w, h, stride); ++} ++ + #endif // NANOSVGRAST_IMPLEMENTATION + + #endif // NANOSVGRAST_H diff --git a/packages/media-libs/nanosvg/nanosvg-0.1.0.1.exheres-0 b/packages/media-libs/nanosvg/nanosvg-0.1.0.1.exheres-0 new file mode 100644 index 0000000..5b9838f --- /dev/null +++ b/packages/media-libs/nanosvg/nanosvg-0.1.0.1.exheres-0 @@ -0,0 +1,35 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require cmake + +NANOSVG_COMMIT="9da543e8329fdd81b64eb48742d8ccb09377aed1" + +SUMMARY="Simple stupid SVG parser" +HOMEPAGE="https://github.com/memononen/nanosvg" + +DOWNLOADS=" + https://github.com/memononen/nanosvg/archive/${NANOSVG_COMMIT}.tar.gz + -> ${PNV}.tar.gz +" + +LICENCES="ZLIB" +SLOT="0" +PLATFORMS="~amd64" + +CMAKE_SOURCE="${WORKBASE}/nanosvg-${NANOSVG_COMMIT}" + +DEFAULT_SRC_PREPARE_PATCHES=( + "${FILES}/nanosvg.patch" +) + +CMAKE_SRC_CONFIGURE_PARAMS=( + -DBUILD_SHARED_LIBS=ON +) + +src_install() { + cmake_src_install + + insinto /usr/share/licenses/${PN} + newins "${CMAKE_SOURCE}/LICENSE.txt" LICENSE +} diff --git a/packages/media-libs/tg_owt/files/tg_owt-0_pre20260803-abseil.patch b/packages/media-libs/tg_owt/files/tg_owt-0_pre20260803-abseil.patch new file mode 100644 index 0000000..6305158 --- /dev/null +++ b/packages/media-libs/tg_owt/files/tg_owt-0_pre20260803-abseil.patch @@ -0,0 +1,159 @@ +--- a/cmake/libabsl.cmake ++++ b/cmake/libabsl.cmake +@@ -1,128 +1,37 @@ +-add_library(libabsl OBJECT EXCLUDE_FROM_ALL) +-init_target(libabsl) +-add_library(tg_owt::libabsl ALIAS libabsl) +- ++set(_tg_owt_build_shared_libs ${BUILD_SHARED_LIBS}) ++set(BUILD_SHARED_LIBS OFF) ++set(ABSL_ENABLE_INSTALL OFF) + set(libabsl_loc ${third_party_loc}/abseil-cpp) ++add_subdirectory(${libabsl_loc} ${CMAKE_CURRENT_BINARY_DIR}/abseil-cpp EXCLUDE_FROM_ALL) ++set(BUILD_SHARED_LIBS ${_tg_owt_build_shared_libs}) ++ ++add_library(libabsl INTERFACE) ++add_library(tg_owt::libabsl ALIAS libabsl) ++target_compile_features(libabsl INTERFACE cxx_std_20) + +-nice_target_sources(libabsl ${libabsl_loc} ++target_link_libraries(tg_owt + PRIVATE +- # absl/base/dynamic_annotations.cc +- # absl/base/internal/cycleclock.cc +- # absl/base/internal/exception_safety_testing.cc +- # absl/base/internal/exponential_biased.cc +- # absl/base/internal/low_level_alloc.cc +- # absl/base/internal/periodic_sampler.cc +- absl/base/internal/raw_logging.cc +- # absl/base/internal/scoped_set_env.cc +- # absl/base/internal/spinlock.cc +- # absl/base/internal/spinlock_wait.cc +- # absl/base/internal/strerror.cc +- # absl/base/internal/sysinfo.cc +- # absl/base/internal/thread_identity.cc +- absl/base/internal/throw_delegate.cc +- # absl/base/internal/unscaledcycleclock.cc +- # absl/base/log_severity.cc +- # absl/container/internal/hash_generator_testing.cc +- # absl/container/internal/hashtablez_sampler.cc +- # absl/container/internal/hashtablez_sampler_force_weak_definition.cc +- # absl/container/internal/raw_hash_set.cc +- # absl/container/internal/test_instance_tracker.cc +- # absl/debugging/failure_signal_handler.cc +- # absl/debugging/internal/address_is_readable.cc +- # absl/debugging/internal/demangle.cc +- # absl/debugging/internal/elf_mem_image.cc +- # absl/debugging/internal/examine_stack.cc +- # absl/debugging/internal/stack_consumption.cc +- # absl/debugging/internal/vdso_support.cc +- # absl/debugging/leak_check.cc +- # absl/debugging/leak_check_disable.cc +- # absl/debugging/stacktrace.cc +- # absl/debugging/symbolize.cc +- # absl/flags/flag.cc +- # absl/flags/flag_test_defs.cc +- # absl/flags/internal/commandlineflag.cc +- # absl/flags/internal/flag.cc +- # absl/flags/internal/program_name.cc +- # absl/flags/internal/registry.cc +- # absl/flags/internal/type_erased.cc +- # absl/flags/internal/usage.cc +- # absl/flags/marshalling.cc +- # absl/flags/parse.cc +- # absl/flags/usage.cc +- # absl/flags/usage_config.cc +- # absl/hash/internal/city.cc +- # absl/hash/internal/hash.cc +- absl/numeric/int128.cc +- # absl/random/discrete_distribution.cc +- # absl/random/gaussian_distribution.cc +- # absl/random/internal/chi_square.cc +- # absl/random/internal/distribution_test_util.cc +- # absl/random/internal/nanobenchmark.cc +- # absl/random/internal/pool_urbg.cc +- # absl/random/internal/randen.cc +- # absl/random/internal/randen_detect.cc +- # absl/random/internal/randen_hwaes.cc +- # absl/random/internal/randen_slow.cc +- # absl/random/internal/seed_material.cc +- # absl/random/seed_gen_exception.cc +- # absl/random/seed_sequences.cc +- # absl/status/status.cc +- # absl/status/status_payload_printer.cc +- absl/strings/ascii.cc +- absl/strings/charconv.cc +- absl/strings/cord.cc +- absl/strings/escaping.cc +- absl/strings/internal/charconv_bigint.cc +- absl/strings/internal/charconv_parse.cc +- absl/strings/internal/escaping.cc +- absl/strings/internal/memutil.cc +- absl/strings/internal/ostringstream.cc +- absl/strings/internal/pow10_helper.cc +- absl/strings/internal/str_format/arg.cc +- absl/strings/internal/str_format/bind.cc +- absl/strings/internal/str_format/extension.cc +- absl/strings/internal/str_format/float_conversion.cc +- absl/strings/internal/str_format/output.cc +- absl/strings/internal/str_format/parser.cc +- absl/strings/internal/utf8.cc +- absl/strings/match.cc +- absl/strings/numbers.cc +- absl/strings/str_cat.cc +- absl/strings/str_replace.cc +- absl/strings/str_split.cc +- absl/strings/string_view.cc +- absl/strings/substitute.cc +- # absl/synchronization/barrier.cc +- # absl/synchronization/blocking_counter.cc +- # absl/synchronization/internal/create_thread_identity.cc +- # absl/synchronization/internal/graphcycles.cc +- # absl/synchronization/internal/per_thread_sem.cc +- # absl/synchronization/internal/waiter.cc +- # absl/synchronization/mutex.cc +- # absl/synchronization/notification.cc +- # absl/time/civil_time.cc +- # absl/time/clock.cc +- # absl/time/duration.cc +- # absl/time/format.cc +- # absl/time/internal/cctz/src/civil_time_detail.cc +- # absl/time/internal/cctz/src/time_zone_fixed.cc +- # absl/time/internal/cctz/src/time_zone_format.cc +- # absl/time/internal/cctz/src/time_zone_if.cc +- # absl/time/internal/cctz/src/time_zone_impl.cc +- # absl/time/internal/cctz/src/time_zone_info.cc +- # absl/time/internal/cctz/src/time_zone_libc.cc +- # absl/time/internal/cctz/src/time_zone_lookup.cc +- # absl/time/internal/cctz/src/time_zone_posix.cc +- # absl/time/internal/cctz/src/zone_info_source.cc +- # absl/time/internal/test_util.cc +- # absl/time/time.cc +- # absl/types/bad_any_cast.cc +- absl/types/bad_optional_access.cc +- absl/types/bad_variant_access.cc ++ absl::algorithm_container ++ absl::bind_front ++ absl::config ++ absl::cord ++ absl::core_headers ++ absl::flat_hash_map ++ absl::inlined_vector ++ absl::flags ++ absl::flags_parse ++ absl::flags_usage ++ absl::memory ++ absl::optional ++ absl::str_format ++ absl::strings ++ absl::synchronization ++ absl::type_traits ++ absl::variant + ) + + target_include_directories(libabsl +-PUBLIC ++INTERFACE + $ + $ + ) diff --git a/packages/media-libs/tg_owt/tg_owt-0_pre20260803.exheres-0 b/packages/media-libs/tg_owt/tg_owt-0_pre20260803.exheres-0 new file mode 100644 index 0000000..8d7f3eb --- /dev/null +++ b/packages/media-libs/tg_owt/tg_owt-0_pre20260803.exheres-0 @@ -0,0 +1,90 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require cmake flag-o-matic + +TG_OWT_COMMIT="26068e29bfa8d74a9dc9c8f7f94172fafbc262b8" +LIBYUV_COMMIT="04821d1e7d60845525e8db55c7bcd41ef5be9406" +CRC32C_COMMIT="21fc8ef30415a635e7351ffa0e5d5367943d4a94" +ABSEIL_COMMIT="d7aaad83b488fd62bd51c81ecf16cd938532cc0a" + +SUMMARY="WebRTC build for Telegram" +HOMEPAGE="https://github.com/desktop-app/tg_owt" +DOWNLOADS=" + https://github.com/desktop-app/tg_owt/archive/${TG_OWT_COMMIT}.tar.gz -> ${PNV}.tar.gz + https://gitlab.com/chromiumsrc/libyuv/-/archive/${LIBYUV_COMMIT}/libyuv-${LIBYUV_COMMIT}.tar.bz2 + https://github.com/google/crc32c/archive/${CRC32C_COMMIT}.tar.gz -> crc32c-${CRC32C_COMMIT}.tar.gz + https://github.com/abseil/abseil-cpp/archive/${ABSEIL_COMMIT}.tar.gz -> abseil-cpp-${ABSEIL_COMMIT}.tar.gz +" + +LICENCES="Apache-2.0 BSD-3" +SLOT="0" +PLATFORMS="~amd64" + +DEPENDENCIES=" + build: + virtual/pkg-config + x11-proto/xorgproto + + build+run: + dev-libs/glib:2 + dev-libs/libglvnd + dev-libs/openssl + media-libs/libjpeg-turbo + media-libs/libvpx[>=1.10] + media-libs/openh264 + media-libs/opus + media/ffmpeg + media/pipewire + media-sound/pulseaudio + net-libs/libsrtp + sys-sound/alsa-lib + x11-dri/libdrm + x11-dri/mesa + x11-libs/libX11 + x11-libs/libXcomposite + x11-libs/libXdamage + x11-libs/libXext + x11-libs/libXfixes + x11-libs/libXrandr + x11-libs/libXrender + x11-libs/libXtst +" + +CMAKE_SOURCE="${WORKBASE}/tg_owt-${TG_OWT_COMMIT}" + +DEFAULT_SRC_PREPARE_PATCHES=( + "${FILES}/${PNV}-abseil.patch" +) + +CMAKE_SRC_CONFIGURE_PARAMS=( + -DCMAKE_DISABLE_FIND_PACKAGE_absl=ON + -DCMAKE_CXX_STANDARD=20 + -DCMAKE_SHARED_LINKER_FLAGS=-Wl,-z,defs + -DBUILD_SHARED_LIBS=ON + -DTG_OWT_USE_X11=ON + -DTG_OWT_USE_PIPEWIRE=ON + -DTG_OWT_DLOPEN_PIPEWIRE=ON + -DTG_OWT_BUILD_AUDIO_BACKENDS=ON +) + +src_prepare() { + edo rmdir "${CMAKE_SOURCE}/src/third_party/libyuv" + edo mv "${WORKBASE}/libyuv-${LIBYUV_COMMIT}" "${CMAKE_SOURCE}/src/third_party/libyuv" + edo rmdir "${CMAKE_SOURCE}/src/third_party/crc32c/src" + edo mv "${WORKBASE}/crc32c-${CRC32C_COMMIT}" "${CMAKE_SOURCE}/src/third_party/crc32c/src" + edo rmdir "${CMAKE_SOURCE}/src/third_party/abseil-cpp" + edo mv "${WORKBASE}/abseil-cpp-${ABSEIL_COMMIT}" "${CMAKE_SOURCE}/src/third_party/abseil-cpp" + edo cd "${CMAKE_SOURCE}" + default +} + +src_configure() { + append-cxxflags -DNDEBUG + cmake_src_configure +} + +src_install() { + cmake_src_install + edo find "${IMAGE}/usr/$(exhost --target)/include/tg_owt" -depth -type d -empty -delete +} diff --git a/packages/media-libs/zita-convolver/files/zita-convolver-4.0.3-makefile.patch b/packages/media-libs/zita-convolver/files/zita-convolver-4.0.3-makefile.patch new file mode 100644 index 0000000..625fa55 --- /dev/null +++ b/packages/media-libs/zita-convolver/files/zita-convolver-4.0.3-makefile.patch @@ -0,0 +1,23 @@ +diff -urN zita-convolver-4.0.3.orig/source/Makefile zita-convolver-4.0.3/source/Makefile +--- zita-convolver-4.0.3.orig/source/Makefile 2018-08-26 16:35:37.000000000 +0300 ++++ zita-convolver-4.0.3/source/Makefile 2019-04-13 22:32:29.558347119 +0300 +@@ -33,8 +33,7 @@ + + CPPFLAGS += -I. -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS + CPPFLAGS += -DENABLE_VECTOR_MODE +-CXXFLAGS += -fPIC -Wall -ffast-math -funroll-loops -O2 +-CXXFLAGS += -march=native ++CXXFLAGS += -fPIC -Wall -ffast-math -funroll-loops + LDLFAGS += + LDLIBS += + +@@ -56,8 +55,8 @@ + install -d $(DESTDIR)$(LIBDIR) + install -m 644 $(ZITA-CONVOLVER_H) $(DESTDIR)$(INCDIR) + install -m 755 $(ZITA-CONVOLVER_MIN) $(DESTDIR)$(LIBDIR) +- ldconfig + ln -sf $(ZITA-CONVOLVER_MIN) $(DESTDIR)$(LIBDIR)/$(ZITA-CONVOLVER_SO) ++ ln -sf $(ZITA-CONVOLVER_MIN) $(DESTDIR)$(LIBDIR)/$(ZITA-CONVOLVER_MAJ) + + uninstall: + rm -rf $(DESTDIR)$(INCDIR)/$(ZITA-CONVOLVER_H) diff --git a/packages/media-libs/zita-convolver/zita-convolver-4.0.3.exheres-0 b/packages/media-libs/zita-convolver/zita-convolver-4.0.3.exheres-0 new file mode 100644 index 0000000..91bb41e --- /dev/null +++ b/packages/media-libs/zita-convolver/zita-convolver-4.0.3.exheres-0 @@ -0,0 +1,33 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +SUMMARY="Real-time convolution matrix library" +HOMEPAGE="https://kokkinizita.linuxaudio.org/linuxaudio/" +DOWNLOADS="https://kokkinizita.linuxaudio.org/linuxaudio/downloads/${PNV}.tar.bz2" + +LICENCES="GPL-3+" +SLOT="4" +PLATFORMS="~amd64" + +DEPENDENCIES=" + build+run: + sci-libs/fftw +" + +DEFAULT_SRC_PREPARE_PATCHES=( + "${FILES}/${PNV}-makefile.patch" +) + +src_compile() { + emake -C source CXX="${CXX}" +} + +src_install() { + emake -C source install \ + CXX="${CXX}" \ + DESTDIR="${IMAGE}" \ + PREFIX="/usr/$(exhost --target)" \ + LIBDIR="/usr/$(exhost --target)/lib" + + emagicdocs +} diff --git a/packages/media-sound/easyeffects/easyeffects-8.3.0.exheres-0 b/packages/media-sound/easyeffects/easyeffects-8.3.0.exheres-0 new file mode 100644 index 0000000..80bbcb6 --- /dev/null +++ b/packages/media-sound/easyeffects/easyeffects-8.3.0.exheres-0 @@ -0,0 +1,61 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require cmake + +SUMMARY="Audio effects for PipeWire applications" +HOMEPAGE="https://wwmm.github.io/easyeffects/ https://github.com/wwmm/easyeffects" +DOWNLOADS="https://github.com/wwmm/easyeffects/archive/refs/tags/v${PV}.tar.gz -> ${PNV}.tar.gz" + +LICENCES="GPL-3" +SLOT="0" +PLATFORMS="~amd64" + +DEPENDENCIES=" + build: + kde-frameworks/extra-cmake-modules[>=6.10.0] + media-libs/ladspa-sdk + sys-devel/gettext + virtual/pkg-config + + build+run: + dev-libs/glib:2 + dev-libs/json + dev-libs/onetbb + kde/kirigami-addons:6 + kde-frameworks/kcolorscheme:6[>=6.10.0] + kde-frameworks/kconfig:6[>=6.10.0] + kde-frameworks/kconfigwidgets:6[>=6.10.0] + kde-frameworks/kcoreaddons:6[>=6.10.0] + kde-frameworks/ki18n:6[>=6.10.0] + kde-frameworks/kiconthemes:6[>=6.10.0] + kde-frameworks/kirigami:6[>=6.10.0] + kde-frameworks/qqc2-desktop-style:6[>=6.10.0] + media-libs/libbs2b + media-libs/libebur128[>=1.2.6] + media-libs/libmysofa + media-libs/libsndfile + media-libs/lilv[>=0.24] + media-libs/rnnoise + media-libs/soundtouch + media-libs/speexdsp + media-libs/webrtc-audio-processing:2 + media-libs/zita-convolver:4[>=4.0.3] + media/pipewire[>=1.0.6] + sci-libs/fftw + sci-libs/gsl + sys-libs/libportal[providers:qt6] + x11-libs/qtbase:6[gui] + x11-libs/qtdeclarative:6 + x11-libs/qtgraphs:6 + + suggestion: + media-sound/lsp-plugins [[ description = [ Additional equalizer, compressor and delay effects ] ]] +" + +CMAKE_SOURCE="${WORKBASE}/${PNV}" + +CMAKE_SRC_CONFIGURE_PARAMS=( + -DENABLE_LIBPORTAL=ON + -DENABLE_RNNOISE=ON +) diff --git a/packages/media-sound/pear-desktop/pear-desktop-3.12.0.exheres-0 b/packages/media-sound/pear-desktop/pear-desktop-3.12.0.exheres-0 new file mode 100644 index 0000000..c961f4d --- /dev/null +++ b/packages/media-sound/pear-desktop/pear-desktop-3.12.0.exheres-0 @@ -0,0 +1,84 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require freedesktop-desktop gtk-icon-cache + +SUMMARY="Desktop music player with extensions" +HOMEPAGE="https://github.com/pear-devs/pear-desktop" +DOWNLOADS="${HOMEPAGE}/releases/download/v${PV}/youtube-music_${PV}_amd64.deb" + +LICENCES="MIT" +SLOT="0" +PLATFORMS="~amd64" +RESTRICT="mirror strip test" + +DEPENDENCIES=" + run: + dev-libs/at-spi2-core + dev-libs/expat + dev-libs/glib:2 + dev-libs/libsecret + dev-libs/nspr + dev-libs/nss + media-libs/fontconfig + media-libs/freetype + net-print/cups + sys-apps/dbus + sys-apps/util-linux + sys-sound/alsa-lib + x11-apps/xdg-utils + x11-dri/libdrm + x11-dri/mesa + x11-libs/cairo + x11-libs/gdk-pixbuf:2.0 + x11-libs/gtk+:3 + x11-libs/libnotify + x11-libs/libX11 + x11-libs/libXcomposite + x11-libs/libXdamage + x11-libs/libXext + x11-libs/libXfixes + x11-libs/libXrandr + x11-libs/libXtst + x11-libs/libxcb + x11-libs/libxkbcommon + x11-libs/pango +" + +WORK="${WORKBASE}" + +pkg_setup() { + exdirectory --allow /opt +} + +src_unpack() { + default + unpack ./data.tar.xz +} + +src_install() { + edo mkdir -p "${IMAGE}/opt/YouTube Music" + edo cp -r "opt/YouTube Music/." "${IMAGE}/opt/YouTube Music/" + + dodir /usr/$(exhost --target)/bin + dosym "../../../opt/YouTube Music/youtube-music" /usr/$(exhost --target)/bin/${PN} + + insinto /usr/share/applications + doins usr/share/applications/com.github.th-ch.youtube-music.desktop + + local size + for size in 16 24 32 48 64 128 256 512 1024; do + insinto /usr/share/icons/hicolor/${size}x${size}/apps + doins "usr/share/icons/hicolor/${size}x${size}/apps/youtube-music.png" + done +} + +pkg_postinst() { + freedesktop-desktop_pkg_postinst + gtk-icon-cache_pkg_postinst +} + +pkg_postrm() { + freedesktop-desktop_pkg_postrm + gtk-icon-cache_pkg_postrm +} diff --git a/packages/net-firewall/ufw/files/systemd/ufw.service b/packages/net-firewall/ufw/files/systemd/ufw.service new file mode 100644 index 0000000..39c9843 --- /dev/null +++ b/packages/net-firewall/ufw/files/systemd/ufw.service @@ -0,0 +1,18 @@ +[Unit] +Description=Uncomplicated firewall +Documentation=man:ufw(8) +DefaultDependencies=no +Before=network-pre.target sysinit.target +Wants=network-pre.target +After=systemd-sysctl.service +Conflicts=iptables.service ip6tables.service nftables.service firewalld.service +ConditionPathExists=/etc/ufw/ufw.conf + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=/usr/share/ufw/ufw-init start +ExecStop=/usr/share/ufw/ufw-init stop + +[Install] +WantedBy=multi-user.target diff --git a/packages/net-firewall/ufw/files/ufw-0.36-bash-completion.patch b/packages/net-firewall/ufw/files/ufw-0.36-bash-completion.patch new file mode 100644 index 0000000..927af24 --- /dev/null +++ b/packages/net-firewall/ufw/files/ufw-0.36-bash-completion.patch @@ -0,0 +1,16 @@ +--- a/shell-completion/bash 2018-12-14 21:25:55.000000000 +0300 ++++ b/shell-completion/bash 2019-03-21 01:26:46.152181981 +0300 +@@ -57,7 +57,6 @@ + echo "numbered verbose" + } + +-_have ufw && + _ufw() + { + cur=${COMP_WORDS[COMP_CWORD]} +@@ -91,4 +90,4 @@ + fi + } + +-_have ufw && complete -F _ufw ufw ++complete -F _ufw ufw diff --git a/packages/net-firewall/ufw/files/ufw-0.36.1-distutils.patch b/packages/net-firewall/ufw/files/ufw-0.36.1-distutils.patch new file mode 100644 index 0000000..fe7ab38 --- /dev/null +++ b/packages/net-firewall/ufw/files/ufw-0.36.1-distutils.patch @@ -0,0 +1,14 @@ +https://src.fedoraproject.org/rpms/ufw/raw/rawhide/f/ufw-0.35-distutils-setuptools.patch +--- a/setup.py ++++ b/setup.py +@@ -26,8 +26,8 @@ + # + + from __future__ import print_function +-from distutils.command.install import install as _install +-from distutils.core import setup ++from setuptools.command.install import install as _install ++from setuptools import setup + import errno + import os + import re diff --git a/packages/net-firewall/ufw/files/ufw-0.36.1-dont-check-iptables.patch b/packages/net-firewall/ufw/files/ufw-0.36.1-dont-check-iptables.patch new file mode 100644 index 0000000..ae0c955 --- /dev/null +++ b/packages/net-firewall/ufw/files/ufw-0.36.1-dont-check-iptables.patch @@ -0,0 +1,50 @@ +--- a/setup.py 2022-06-27 17:33:18.043794598 +0300 ++++ b/setup.py 2022-06-27 18:15:18.384463926 +0300 +@@ -256,46 +256,7 @@ + os.unlink(os.path.join('staging', 'ufw-init')) + os.unlink(os.path.join('staging', 'ufw-init-functions')) + +-iptables_exe = '' +-iptables_dir = '' +- +-for e in ['iptables']: +- # Historically iptables was in /sbin, then later also symlinked from +- # /usr/sbin/iptables to /sbin/iptables. Debian bullseye moves iptables +- # to /usr/sbin with no symlink in /sbin except on upgrades. To accomodate +- # buildds that may still have the old iptables, search /usr/sbin first +- for dir in ['/usr/sbin', '/sbin', '/usr/bin', '/bin', '/usr/local/sbin', \ +- '/usr/local/bin']: +- if e == "iptables": +- if os.path.exists(os.path.join(dir, e)): +- iptables_dir = dir +- iptables_exe = os.path.join(iptables_dir, "iptables") +- print("Found '%s'" % iptables_exe) +- else: +- continue +- +- if iptables_exe != "": +- break +- +- +-if iptables_exe == '': +- print("ERROR: could not find required binary 'iptables'", file=sys.stderr) +- sys.exit(1) +- +-for e in ['ip6tables', 'iptables-restore', 'ip6tables-restore']: +- if not os.path.exists(os.path.join(iptables_dir, e)): +- print("ERROR: could not find required binary '%s'" % (e), file=sys.stderr) +- sys.exit(1) +- +-(rc, out) = cmd([iptables_exe, '-V']) +-if rc != 0: +- raise OSError(errno.ENOENT, "Could not find version for '%s'" % \ +- (iptables_exe)) +-version = re.sub('^v', '', re.split('\s', str(out))[1]) +-print("Found '%s' version '%s'" % (iptables_exe, version)) +-if version < "1.4": +- print("WARN: version '%s' has limited IPv6 support. See README for details." % (version), file=sys.stderr) +- ++iptables_dir = '/sbin' + setup (name='ufw', + version=ufw_version, + description='front-end for Linux firewalling', diff --git a/packages/net-firewall/ufw/files/ufw-0.36.1-move-path.patch b/packages/net-firewall/ufw/files/ufw-0.36.1-move-path.patch new file mode 100644 index 0000000..8ace1ed --- /dev/null +++ b/packages/net-firewall/ufw/files/ufw-0.36.1-move-path.patch @@ -0,0 +1,124 @@ +--- a/doc/ufw-framework.8 2021-09-19 04:19:03.000000000 +0300 ++++ b/doc/ufw-framework.8 2022-06-27 17:14:11.292890569 +0300 +@@ -18,7 +18,7 @@ + parameters and configuration of IPv6. The framework consists of the following + files: + .TP +-#STATE_PREFIX#/ufw\-init ++#SHARE_DIR#/ufw\-init + initialization script + .TP + #CONFIG_PREFIX#/ufw/before.init +@@ -47,7 +47,7 @@ + + .SH "BOOT INITIALIZATION" + .PP +-\fBufw\fR is started on boot with #STATE_PREFIX#/ufw\-init. This script is a ++\fBufw\fR is started on boot with #SHARE_DIR#/ufw\-init. This script is a + standard SysV style initscript used by the \fBufw\fR command and should not be + modified. The #CONFIG_PREFIX#/before.init and #CONFIG_PREFIX#/after.init + scripts may be used to perform any additional firewall configuration that is +--- a/setup.py 2021-09-19 04:19:01.000000000 +0300 ++++ b/setup.py 2022-06-27 17:33:18.043794598 +0300 +@@ -54,7 +54,7 @@ + return + + real_confdir = os.path.join('/etc') +- real_statedir = os.path.join('/lib', 'ufw') ++ real_statedir = os.path.join('/etc', 'ufw', 'user') + real_prefix = self.prefix + if self.home != None: + real_confdir = self.home + real_confdir +@@ -131,14 +131,20 @@ + self.copy_file('doc/ufw.8', manpage) + self.copy_file('doc/ufw-framework.8', manpage_f) + +- # Install state files and helper scripts ++ # Install state files + statedir = real_statedir + if self.root != None: + statedir = self.root + real_statedir + self.mkpath(statedir) + +- init_helper = os.path.join(statedir, 'ufw-init') +- init_helper_functions = os.path.join(statedir, 'ufw-init-functions') ++ # Install helper scripts ++ sharedir = real_sharedir ++ if self.root != None: ++ sharedir = self.root + real_sharedir ++ self.mkpath(sharedir) ++ ++ init_helper = os.path.join(sharedir, 'ufw-init') ++ init_helper_functions = os.path.join(sharedir, 'ufw-init-functions') + self.copy_file('src/ufw-init', init_helper) + self.copy_file('src/ufw-init-functions', init_helper_functions) + +@@ -219,14 +225,19 @@ + f]) + + subprocess.call(["sed", ++ "-i", ++ "s%#SHARE_DIR#%" + real_sharedir + "%g", ++ f]) ++ ++ subprocess.call(["sed", + "-i", + "s%#VERSION#%" + ufw_version + "%g", + f]) + + # Install pristine copies of rules files +- sharedir = real_sharedir +- if self.root != None: +- sharedir = self.root + real_sharedir ++ #sharedir = real_sharedir ++ #if self.root != None: ++ # sharedir = self.root + real_sharedir + rulesdir = os.path.join(sharedir, 'iptables') + self.mkpath(rulesdir) + for f in [ before_rules, after_rules, \ +--- a/src/backend_iptables.py 2021-09-19 04:19:01.000000000 +0300 ++++ b/src/backend_iptables.py 2022-06-27 17:44:24.880445896 +0300 +@@ -37,6 +37,8 @@ + + files = {} + config_dir = _findpath(ufw.common.config_dir, datadir) ++ state_dir = _findpath(ufw.common.state_dir, datadir) ++ share_dir = _findpath(ufw.common.share_dir, datadir) + + files['rules'] = os.path.join(config_dir, 'ufw/user.rules') + files['before_rules'] = os.path.join(config_dir, 'ufw/before.rules') +@@ -48,8 +50,7 @@ + # the lock files (ufw.common.state_dir, aka /lib/ufw), but when set, + # ufw-init is in rootdir/lib/ufw (ro) and the lockfiles in + # datadir/lib/ufw (rw) +- files['init'] = os.path.join(_findpath(ufw.common.state_dir, rootdir), +- 'ufw-init') ++ files['init'] = os.path.join(share_dir, 'ufw-init') + + ufw.backend.UFWBackend.__init__(self, "iptables", dryrun, files, + rootdir=rootdir, datadir=datadir) +--- a/src/ufw-init 2021-09-19 03:50:19.000000000 +0300 ++++ b/src/ufw-init 2022-06-27 17:48:34.352545026 +0300 +@@ -31,10 +31,10 @@ + fi + export DATA_DIR="$datadir" + +-if [ -s "${rootdir}#STATE_PREFIX#/ufw-init-functions" ]; then +- . "${rootdir}#STATE_PREFIX#/ufw-init-functions" ++if [ -s "${rootdir}#SHARE_DIR#/ufw-init-functions" ]; then ++ . "${rootdir}#SHARE_DIR#/ufw-init-functions" + else +- echo "Could not find ${rootdir}#STATE_PREFIX#/ufw-init-functions (aborting)" ++ echo "Could not find ${rootdir}#SHARE_DIR#/ufw-init-functions (aborting)" + exit 1 + fi + +@@ -83,7 +83,7 @@ + fi + ;; + *) +- echo "Usage: #STATE_PREFIX#/ufw-init {start|stop|restart|force-reload|force-stop|flush-all|status}" ++ echo "Usage: #SHARE_DIR#/ufw-init {start|stop|restart|force-reload|force-stop|flush-all|status}" + exit 1 + ;; + esac diff --git a/packages/net-firewall/ufw/files/ufw-0.36.1-shebang.patch b/packages/net-firewall/ufw/files/ufw-0.36.1-shebang.patch new file mode 100644 index 0000000..aaafaac --- /dev/null +++ b/packages/net-firewall/ufw/files/ufw-0.36.1-shebang.patch @@ -0,0 +1,15 @@ +--- a/setup.py 2019-03-21 01:51:55.751971770 +0300 ++++ b/setup.py 2019-03-21 01:54:40.142513567 +0300 +@@ -121,12 +121,6 @@ + for f in [ script, manpage, manpage_f ]: + self.mkpath(os.path.dirname(f)) + +- # update the interpreter to that of the one the user specified for setup +- print("Updating staging/ufw to use %s" % (sys.executable)) +- subprocess.call(["sed", +- "-i", +- "1s%^#.*python.*%#! /usr/bin/env " + sys.executable + "%g", +- 'staging/ufw']) + self.copy_file('staging/ufw', script) + self.copy_file('doc/ufw.8', manpage) + self.copy_file('doc/ufw-framework.8', manpage_f) diff --git a/packages/net-firewall/ufw/ufw-0.36.2.exheres-0 b/packages/net-firewall/ufw/ufw-0.36.2.exheres-0 new file mode 100644 index 0000000..c55c871 --- /dev/null +++ b/packages/net-firewall/ufw/ufw-0.36.2.exheres-0 @@ -0,0 +1,57 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require python [ blacklist="2 3.9 3.10" multibuild=false ] systemd-service + +SUMMARY="Uncomplicated firewall frontend for iptables" +HOMEPAGE="https://launchpad.net/ufw" +DOWNLOADS="${HOMEPAGE}/${PV%.*}/${PV}/+download/${PNV}.tar.gz" + +LICENCES="GPL-3" +SLOT="0" +PLATFORMS="~amd64" +RESTRICT="test" + +DEPENDENCIES=" + build: + dev-python/setuptools[python_abis:*(-)?] + sys-devel/gettext + + run: + net-firewall/iptables +" + +DEFAULT_SRC_PREPARE_PATCHES=( + "${FILES}/${PN}-0.36.1-move-path.patch" + "${FILES}/${PN}-0.36.1-dont-check-iptables.patch" + "${FILES}/${PN}-0.36.1-shebang.patch" + "${FILES}/${PN}-0.36-bash-completion.patch" + "${FILES}/${PN}-0.36.1-distutils.patch" +) + +src_compile() { + edo "${PYTHON}" -B setup.py install --prefix=/usr \ + --root="${WORK}/staging-root" --install-lib="$(python_get_sitedir)" \ + --no-compile +} + +src_install() { + edo cp -R "${WORK}/staging-root/." "${IMAGE}/" + + dodir /usr/$(exhost --target)/bin + edo mv "${IMAGE}/usr/sbin/ufw" "${IMAGE}/usr/$(exhost --target)/bin/ufw" + edo rmdir "${IMAGE}/usr/sbin" + edo sed -i "1c#! /usr/$(exhost --target)/bin/python$(python_get_abi)" \ + "${IMAGE}/usr/$(exhost --target)/bin/ufw" + + insinto /usr/share/bash-completion/completions + newins shell-completion/bash ufw + install_systemd_files + keepdir /etc/ufw/user + dodoc README + python_bytecompile +} + +pkg_postinst() { + ewarn "Allow remote SSH before enabling UFW; enabling it can interrupt your connection." +} diff --git a/packages/net-im/ayugram-desktop/ayugram-desktop-7.2.9.exheres-0 b/packages/net-im/ayugram-desktop/ayugram-desktop-7.2.9.exheres-0 new file mode 100644 index 0000000..11d8283 --- /dev/null +++ b/packages/net-im/ayugram-desktop/ayugram-desktop-7.2.9.exheres-0 @@ -0,0 +1,72 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require cmake +require flag-o-matic + +SUMMARY="Telegram desktop client with customization and Ghost mode" +HOMEPAGE="https://github.com/AyuGram/AyuGramDesktop" +DOWNLOADS="https://github.com/AyuGram/AyuGramDesktop/releases/download/v${PV}/AyuGramDesktop-${PV}-full.tar.gz -> ${PNV}-full.tar.gz" + +LICENCES="BSD-3 GPL-3+ LGPL-2+" +SLOT="0" +PLATFORMS="~amd64" + +DEPENDENCIES=" + build: + dev-lang/python:*[>=3] + dev-libs/fmt + dev-libs/tlottie + gnome-desktop/gobject-introspection + virtual/pkg-config + x11-libs/qtshadertools:6 + + build+run: + dev-cpp/ada + dev-libs/boost + dev-libs/glib:2 + dev-libs/libfido2 + dev-libs/openssl + dev-libs/protobuf[>=21.12] + gnome-bindings/glibmm:2.68[>=2.77] + media-libs/libjpeg-turbo + media-libs/libvpx + media-libs/openal + media-libs/openh264 + media-libs/opus + media-libs/rnnoise + media-libs/tg_owt + media/ffmpeg[>=6] + net-libs/tde2e + sys-apps/systemd + sys-libs/zlib + x11-libs/pango + x11-libs/qtbase:6[>=6.5][gui] + x11-libs/qtsvg:6[>=6.5] + + run: + x11-libs/qtimageformats:6[webp] +" + +CMAKE_SOURCE="${WORKBASE}/AyuGramDesktop-${PV}-full" + +CMAKE_SRC_CONFIGURE_PARAMS=( + -DQT_VERSION_MAJOR=6 + -DDESKTOP_APP_USE_PACKAGED=ON + -DDESKTOP_APP_DISABLE_AUTOUPDATE=ON + -DDESKTOP_APP_DISABLE_CRASH_REPORTS=ON + -DDESKTOP_APP_DISABLE_QT_PLUGINS=ON + -DQSB_EXECUTABLE=/usr/$(exhost --target)/lib/qt6/bin/qsb + -DTDESKTOP_API_ID=611335 + -DTDESKTOP_API_HASH=d524b414d21f4d37f08684c1df41ac9c +) + +src_configure() { + append-cxxflags -DNDEBUG + cmake_src_configure +} + +src_install() { + cmake_src_install + dodoc "${CMAKE_SOURCE}/LICENSE" "${CMAKE_SOURCE}/LEGAL" +} diff --git a/packages/net-im/discord/discord-1.0.161.exheres-0 b/packages/net-im/discord/discord-1.0.161.exheres-0 new file mode 100644 index 0000000..403a5ca --- /dev/null +++ b/packages/net-im/discord/discord-1.0.161.exheres-0 @@ -0,0 +1,120 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require freedesktop-desktop freedesktop-mime gtk-icon-cache + +SUMMARY="Voice, video, and text chat client" +HOMEPAGE="https://discord.com/" + +DISCORD_BASE="https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/${PV}" +UPDATE_DISABLER_COMMIT="2f26748a667045d26bc19841f1a731b4be7a7514" +DISCORD_MODULES=( + discord_desktop_core discord_erlpack discord_spellcheck discord_utils + discord_voice discord_zstd discord_rpc discord_game_utils discord_krisp +) + +DOWNLOADS=" + ${DISCORD_BASE}/full.distro -> ${PNV}.distro + https://github.com/flathub/com.discordapp.Discord/raw/${UPDATE_DISABLER_COMMIT}/disable-breaking-updates.py + -> ${PN}-disable-breaking-updates-${UPDATE_DISABLER_COMMIT}.py +" +for module in "${DISCORD_MODULES[@]}"; do + DOWNLOADS+=" ${DISCORD_BASE}/${module}/1/full.distro -> ${PNV}-${module}.distro " +done + +LICENCES="all-rights-reserved" +SLOT="0" +PLATFORMS="~amd64" +RESTRICT="mirror strip test" + +DEPENDENCIES=" + build: + app-arch/brotli + app-arch/zip + + run: + dev-lang/python:*[>=3] + dev-libs/at-spi2-core + dev-libs/expat + dev-libs/glib:2 + dev-libs/nspr + dev-libs/nss + media-libs/fontconfig + net-print/cups + sys-apps/dbus + sys-apps/util-linux + sys-libs/wayland + sys-sound/alsa-lib + x11-dri/libdrm + x11-dri/mesa + x11-libs/cairo + x11-libs/gdk-pixbuf:2.0 + x11-libs/gtk+:3 + x11-libs/libX11 + x11-libs/libXcomposite + x11-libs/libXdamage + x11-libs/libXext + x11-libs/libXfixes + x11-libs/libXrandr + x11-libs/libxcb + x11-libs/libxkbcommon + x11-libs/libxshmfence + x11-libs/pango +" + +WORK="${WORKBASE}/discord" + +pkg_setup() { + exdirectory --allow /opt +} + +src_unpack() { + edo mkdir -p "${WORK}" + edo brotli -d "${FETCHEDDIR}/${PNV}.distro" -o "${WORKBASE}/${PNV}.tar" + edo tar -xf "${WORKBASE}/${PNV}.tar" -C "${WORK}" + edo rm "${WORKBASE}/${PNV}.tar" + + local module + for module in "${DISCORD_MODULES[@]}"; do + edo mkdir -p "${WORKBASE}/${module}" + edo brotli -d "${FETCHEDDIR}/${PNV}-${module}.distro" -o "${WORKBASE}/${module}.tar" + edo tar -xf "${WORKBASE}/${module}.tar" -C "${WORKBASE}/${module}" + edo pushd "${WORKBASE}/${module}/files" + edo zip -qr "${WORK}/files/resources/bootstrap/${module}.zip" . + edo popd + edo rm -r "${WORKBASE}/${module}" "${WORKBASE}/${module}.tar" + done +} + +src_prepare() { + edo cp "${FILES}/manifest.json" "${WORK}/files/resources/bootstrap/manifest.json" +} + +src_install() { + edo mkdir -p "${IMAGE}/opt/discord" + edo cp -r "${WORK}/files/." "${IMAGE}/opt/discord/" + edo chmod 4755 "${IMAGE}/opt/discord/chrome-sandbox" + + insinto /opt/discord + newins "${FETCHEDDIR}/${PN}-disable-breaking-updates-${UPDATE_DISABLER_COMMIT}.py" disable-breaking-updates.py + edo chmod 755 "${IMAGE}/opt/discord/disable-breaking-updates.py" + + insinto /usr/share/icons/hicolor/256x256/apps + newins "${WORK}/files/discord.png" discord.png + insinto /usr/share/applications + doins "${FILES}/discord.desktop" + exeinto /usr/$(exhost --target)/bin + newexe "${FILES}/discord-launcher" discord +} + +pkg_postinst() { + freedesktop-mime_pkg_postinst + freedesktop-desktop_pkg_postinst + gtk-icon-cache_pkg_postinst +} + +pkg_postrm() { + freedesktop-mime_pkg_postrm + freedesktop-desktop_pkg_postrm + gtk-icon-cache_pkg_postrm +} diff --git a/packages/net-im/discord/files/discord-launcher b/packages/net-im/discord/files/discord-launcher new file mode 100644 index 0000000..4c7a969 --- /dev/null +++ b/packages/net-im/discord/files/discord-launcher @@ -0,0 +1,4 @@ +#!/bin/sh + +/usr/bin/env python3 /opt/discord/disable-breaking-updates.py +exec /opt/discord/Discord "$@" diff --git a/packages/net-im/discord/files/discord.desktop b/packages/net-im/discord/files/discord.desktop new file mode 100644 index 0000000..1418496 --- /dev/null +++ b/packages/net-im/discord/files/discord.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=Discord +Comment=Voice, video, and text chat +Exec=discord --url -- %u +Icon=discord +Type=Application +Categories=Network;InstantMessaging; +StartupWMClass=discord +MimeType=x-scheme-handler/discord; diff --git a/packages/net-im/discord/files/manifest.json b/packages/net-im/discord/files/manifest.json new file mode 100644 index 0000000..1359c6e --- /dev/null +++ b/packages/net-im/discord/files/manifest.json @@ -0,0 +1,11 @@ +{ + "discord_desktop_core": 1, + "discord_erlpack": 1, + "discord_spellcheck": 1, + "discord_utils": 1, + "discord_voice": 1, + "discord_zstd": 1, + "discord_rpc": 1, + "discord_game_utils": 1, + "discord_krisp": 1 +} diff --git a/packages/net-im/viber/viber-27.3.0.2.exheres-0 b/packages/net-im/viber/viber-27.3.0.2.exheres-0 new file mode 100644 index 0000000..535de62 --- /dev/null +++ b/packages/net-im/viber/viber-27.3.0.2.exheres-0 @@ -0,0 +1,122 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require freedesktop-desktop freedesktop-mime gtk-icon-cache + +SUMMARY="Desktop messenger for text, voice, and video calls" +HOMEPAGE="https://www.viber.com/en/" +DOWNLOADS="https://download.cdn.viber.com/cdn/desktop/Linux/viber.deb -> ${PNV}.deb" + +LICENCES="all-rights-reserved" +SLOT="0" +PLATFORMS="~amd64" +RESTRICT="mirror strip test" + +DEPENDENCIES=" + run: + app-arch/brotli + app-arch/bzip2 + app-arch/snappy + app-arch/zstd + app-crypt/krb5 + app-crypt/libb2 + dev-libs/double-conversion + dev-libs/expat + dev-libs/glib:2 + dev-libs/gnutls + dev-libs/libglvnd + dev-libs/libxml2:2.0 + dev-libs/libxslt + dev-libs/nspr + dev-libs/nss + dev-libs/openssl:3 + media-libs/fontconfig + media-libs/freetype + media-libs/OpenJPEG:2 + media-libs/libpng + media-libs/libvorbis + media-libs/opus + media-sound/pulseaudio + net-libs/libssh + sys-apps/dbus + sys-libs/libgomp + sys-libs/libinput + sys-libs/zlib + sys-libs/wayland + sys-sound/alsa-lib + x11-dri/libdrm + x11-dri/mesa + x11-libs/libICE + x11-libs/libSM + x11-libs/libX11 + x11-libs/libXext + x11-libs/libXfixes + x11-libs/libXi + x11-libs/libXrandr + x11-libs/libXrender + x11-libs/libXScrnSaver + x11-libs/libXtst + x11-libs/libxcb + x11-libs/libxkbcommon + x11-libs/libxkbfile + x11-libs/libva + x11-libs/libvdpau + x11-libs/libxshmfence + x11-libs/mtdev + x11-utils/xcb-util + x11-utils/xcb-util-cursor + x11-utils/xcb-util-image + x11-utils/xcb-util-keysyms + x11-utils/xcb-util-renderutil + x11-utils/xcb-util-wm +" + +WORK="${WORKBASE}" + +pkg_setup() { + exdirectory --allow /opt +} + +src_unpack() { + local checksum + checksum=$(sha256sum "${FETCHEDDIR}/${PNV}.deb") || die "Cannot checksum Viber archive" + [[ ${checksum%% *} == 961534dc0cb920006ec7ae8108b0e1ba09a476eef1e13b4b370a79cd52dd20f3 ]] || + die "Viber archive changed; check version before updating checksum" + + default + unpack ./data.tar.xz +} + +src_install() { + edo mkdir -p "${IMAGE}/opt/viber" + edo cp -a opt/viber/. "${IMAGE}/opt/viber/" + + insinto /usr/share/applications + doins usr/share/applications/viber.desktop + + insinto /usr/share/pixmaps + doins usr/share/pixmaps/viber.png + insinto /usr/share/icons/hicolor/scalable/apps + newins usr/share/icons/hicolor/scalable/apps/Viber.svg viber.svg + + local size + for size in 16 24 32 48 64 96 128 256; do + insinto /usr/share/icons/hicolor/${size}x${size}/apps + newins "usr/share/viber/${size}x${size}.png" viber.png + done + + dodir /usr/$(exhost --target)/bin + dosym /opt/viber/Viber /usr/$(exhost --target)/bin/viber +} + +pkg_postinst() { + freedesktop-mime_pkg_postinst + freedesktop-desktop_pkg_postinst + gtk-icon-cache_pkg_postinst +} + +pkg_postrm() { + freedesktop-mime_pkg_postrm + freedesktop-desktop_pkg_postrm + gtk-icon-cache_pkg_postrm +} diff --git a/packages/net-im/zoom/files/zoom.desktop b/packages/net-im/zoom/files/zoom.desktop new file mode 100644 index 0000000..c5be36c --- /dev/null +++ b/packages/net-im/zoom/files/zoom.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Name=Zoom +Comment=Video conferencing +Exec=zoom %U +Icon=zoom +Type=Application +Categories=Network;VideoConference; +MimeType=x-scheme-handler/zoommtg;x-scheme-handler/zoomus;application/x-zoom; diff --git a/packages/net-im/zoom/files/zoom.svg b/packages/net-im/zoom/files/zoom.svg new file mode 100644 index 0000000..30d5a2d --- /dev/null +++ b/packages/net-im/zoom/files/zoom.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/net-im/zoom/zoom-7.2.1.5760.exheres-0 b/packages/net-im/zoom/zoom-7.2.1.5760.exheres-0 new file mode 100644 index 0000000..9e1fd0c --- /dev/null +++ b/packages/net-im/zoom/zoom-7.2.1.5760.exheres-0 @@ -0,0 +1,86 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require freedesktop-desktop freedesktop-mime gtk-icon-cache + +SUMMARY="Video conferencing client" +HOMEPAGE="https://www.zoom.com/" +DOWNLOADS="https://zoom.us/client/${PV}/zoom_x86_64.tar.xz -> ${PNV}.tar.xz" + +LICENCES="all-rights-reserved" +SLOT="0" +PLATFORMS="~amd64" +RESTRICT="mirror strip test" + +DEPENDENCIES=" + run: + app-arch/zstd + app-crypt/krb5 + dev-libs/at-spi2-core + dev-libs/expat + dev-libs/glib:2 + dev-libs/libglvnd + dev-libs/nspr + dev-libs/nss + media-libs/fontconfig + media-libs/freetype + media-sound/pulseaudio + net-print/cups + sys-apps/dbus + sys-apps/util-linux + sys-libs/libatomic + sys-libs/wayland + sys-libs/zlib + sys-sound/alsa-lib + x11-dri/libdrm + x11-dri/mesa + x11-libs/cairo + x11-libs/libX11 + x11-libs/libXcomposite + x11-libs/libXdamage + x11-libs/libXext + x11-libs/libXfixes + x11-libs/libXrandr + x11-libs/libXtst + x11-libs/libxcb + x11-libs/libxkbcommon + x11-libs/pango + x11-utils/xcb-util + x11-utils/xcb-util-cursor + x11-utils/xcb-util-image + x11-utils/xcb-util-keysyms + x11-utils/xcb-util-renderutil + x11-utils/xcb-util-wm +" + +WORK="${WORKBASE}/zoom" + +pkg_setup() { + exdirectory --allow /opt +} + +src_install() { + edo mkdir -p "${IMAGE}/opt/zoom" + edo cp -a "${WORK}/." "${IMAGE}/opt/zoom/" + edo find "${IMAGE}/opt/zoom" -depth -type d -empty -delete + + insinto /usr/share/applications + doins "${FILES}/zoom.desktop" + insinto /usr/share/icons/hicolor/scalable/apps + newins "${FILES}/zoom.svg" zoom.svg + + dodir /usr/$(exhost --target)/bin + dosym /opt/zoom/ZoomLauncher /usr/$(exhost --target)/bin/zoom +} + +pkg_postinst() { + freedesktop-mime_pkg_postinst + freedesktop-desktop_pkg_postinst + gtk-icon-cache_pkg_postinst +} + +pkg_postrm() { + freedesktop-mime_pkg_postrm + freedesktop-desktop_pkg_postrm + gtk-icon-cache_pkg_postrm +} diff --git a/packages/net-libs/tde2e/tde2e-1.8.49.exheres-0 b/packages/net-libs/tde2e/tde2e-1.8.49.exheres-0 new file mode 100644 index 0000000..e8aeaee --- /dev/null +++ b/packages/net-libs/tde2e/tde2e-1.8.49.exheres-0 @@ -0,0 +1,33 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require cmake + +TDLIB_COMMIT="51743dfd01dff6179e2d8f7095729caa4e2222e9" + +SUMMARY="End-to-end encryption library from TDLib" +HOMEPAGE="https://github.com/tdlib/td" +DOWNLOADS="https://github.com/tdlib/td/archive/${TDLIB_COMMIT}.tar.gz -> ${PNV}.tar.gz" + +LICENCES="Boost-1.0" +SLOT="0" +PLATFORMS="~amd64" + +DEPENDENCIES=" + build: + dev-util/gperf + + build+run: + dev-libs/openssl + sys-libs/zlib +" + +CMAKE_SOURCE="${WORKBASE}/td-${TDLIB_COMMIT}" + +CMAKE_SRC_CONFIGURE_PARAMS=( + -DTD_E2E_ONLY=ON + -DTD_INSTALL_STATIC_LIBRARIES=ON + -DTD_INSTALL_SHARED_LIBRARIES=OFF + -DTD_ENABLE_LTO=OFF + -DBUILD_TESTING=OFF +) diff --git a/packages/net-misc/rustdesk/rustdesk-1.5.0.exheres-0 b/packages/net-misc/rustdesk/rustdesk-1.5.0.exheres-0 new file mode 100644 index 0000000..a5a11c4 --- /dev/null +++ b/packages/net-misc/rustdesk/rustdesk-1.5.0.exheres-0 @@ -0,0 +1,86 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require freedesktop-desktop freedesktop-mime gtk-icon-cache \ + systemd-service [ systemd_files=[ usr/share/rustdesk/files/systemd/rustdesk.service ] ] + +SUMMARY="Remote desktop client and server" +HOMEPAGE="https://rustdesk.com/" +DOWNLOADS="https://github.com/rustdesk/rustdesk/releases/download/${PV}/${PNV}-x86_64.deb" + +LICENCES="AGPL-3" +SLOT="0" +PLATFORMS="~amd64" +RESTRICT="mirror strip test" + +DEPENDENCIES=" + run: + dev-libs/glib:2 + media-libs/gstreamer:1.0 + media-plugins/gst-plugins-base:1.0 + media-sound/pulseaudio + media/pipewire[gstreamer] + net-misc/curl + sys-apps/dbus + sys-apps/systemd + sys-libs/wayland + sys-sound/alsa-lib + x11-apps/xdotool + x11-libs/cairo + x11-libs/gdk-pixbuf:2.0 + x11-libs/gtk+:3 + x11-libs/libX11 + x11-libs/libXfixes + x11-libs/libXtst + x11-libs/libva[X] + x11-libs/libxcb + x11-libs/libxkbcommon + x11-libs/pango +" + +WORK="${WORKBASE}" + +src_unpack() { + default + unpack ./data.tar.xz +} + +src_prepare() { + default + edo sed -i '/^ExecStop=pkill -f /d; /^# kill --tray and --server both/d; /^# below two lines do not work/d; /^#ExecStop=/d' \ + usr/share/rustdesk/files/systemd/rustdesk.service + edo sed -i "s@/usr/bin/rustdesk@/usr/$(exhost --target)/bin/rustdesk@" \ + usr/share/rustdesk/files/systemd/rustdesk.service +} + +src_compile() { + : +} + +src_install() { + edo mkdir -p "${IMAGE}/usr/share/rustdesk" + edo cp -a usr/share/rustdesk/. "${IMAGE}/usr/share/rustdesk/" + + insinto /usr/share/applications + doins usr/share/applications/{rustdesk,rustdesk-link}.desktop + insinto /usr/share/icons/hicolor/256x256/apps + doins usr/share/icons/hicolor/256x256/apps/rustdesk.png + insinto /usr/share/icons/hicolor/scalable/apps + doins usr/share/icons/hicolor/scalable/apps/rustdesk.svg + + dodir /usr/$(exhost --target)/bin + dosym /usr/share/rustdesk/rustdesk /usr/$(exhost --target)/bin/rustdesk + install_systemd_files +} + +pkg_postinst() { + freedesktop-mime_pkg_postinst + freedesktop-desktop_pkg_postinst + gtk-icon-cache_pkg_postinst +} + +pkg_postrm() { + freedesktop-mime_pkg_postrm + freedesktop-desktop_pkg_postrm + gtk-icon-cache_pkg_postrm +} diff --git a/packages/net-vpn/mullvad-vpn/mullvad-vpn-2026.5.exheres-0 b/packages/net-vpn/mullvad-vpn/mullvad-vpn-2026.5.exheres-0 new file mode 100644 index 0000000..4a3da5b --- /dev/null +++ b/packages/net-vpn/mullvad-vpn/mullvad-vpn-2026.5.exheres-0 @@ -0,0 +1,62 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +SUMMARY="Mullvad VPN desktop client and daemon" +HOMEPAGE="https://mullvad.net/" + +DOWNLOADS="https://cdn.mullvad.net/app/desktop/releases/${PV}/MullvadVPN-${PV}_amd64.deb -> ${PNV}.deb" + +LICENCES="GPL-3" +SLOT="0" +PLATFORMS="~amd64" + +DEPENDENCIES=" + build: + app-arch/xz + + run: + dev-libs/at-spi2-core + sys-sound/alsa-lib + x11-dri/mesa + x11-dri/libdrm + sys-apps/dbus +" + +WORK="${WORKBASE}" + +pkg_setup() { + exdirectory --allow /opt +} + +src_unpack() { + local checksum + checksum=$(sha256sum "${FETCHEDDIR}/${PNV}.deb") || die "Cannot checksum Mullvad archive" + [[ ${checksum%% *} == aa6bd00452588597f50e8ca2f02bb91e9c295c4f01b0ae907354552e7428e7ab ]] || + die "Mullvad archive changed; check version before updating checksum" + + default + unpack ./data.tar.xz +} + +src_install() { + edo mkdir -p "${IMAGE}/opt" "${IMAGE}/usr" + edo cp -rT "${WORK}/opt" "${IMAGE}/opt" + edo cp -rT "${WORK}/usr" "${IMAGE}/usr" + + edo mkdir -p "${IMAGE}/usr/${CHOST}" + edo mv "${IMAGE}/usr/bin" "${IMAGE}/usr/${CHOST}/" + + if [[ -d "${IMAGE}/usr/lib" ]]; then + edo mv "${IMAGE}/usr/lib" "${IMAGE}/usr/${CHOST}/" + fi + + local helper="${IMAGE}/usr/${CHOST}/bin/mullvad-exclude" + [[ -f ${helper} && ! -L ${helper} ]] || die "Mullvad exclusion helper is missing or not a regular file" + edo chown root:root "${helper}" + edo chmod 4755 "${helper}" + + edo mkdir -p "${IMAGE}/usr/share/zsh/site-functions" + edo mv "${IMAGE}/usr/local/share/zsh/site-functions/_mullvad" "${IMAGE}/usr/share/zsh/site-functions/" + edo rmdir "${IMAGE}/usr/local/share/zsh/site-functions" "${IMAGE}/usr/local/share/zsh" \ + "${IMAGE}/usr/local/share" "${IMAGE}/usr/local" +} diff --git a/packages/sys-kernel/kernel-cachyos/kernel-cachyos-7.2.9-r1.exheres-0 b/packages/sys-kernel/kernel-cachyos/kernel-cachyos-7.2.9-r1.exheres-0 new file mode 100644 index 0000000..0fb85d0 --- /dev/null +++ b/packages/sys-kernel/kernel-cachyos/kernel-cachyos-7.2.9-r1.exheres-0 @@ -0,0 +1,110 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +SUMMARY="Prebuilt CachyOS Linux kernel with matching module headers" +HOMEPAGE="https://github.com/CachyOS/linux-cachyos" + +MY_RELEASE="${PV}-2" +MY_KERNEL="linux-cachyos-${MY_RELEASE}-x86_64_v3.pkg.tar.zst" +MY_HEADERS="linux-cachyos-headers-${MY_RELEASE}-x86_64_v3.pkg.tar.zst" +KERNEL_RELEASE="${MY_RELEASE}-cachyos" +DOWNLOADS=" + https://mirror.cachyos.org/repo/x86_64_v3/cachyos-v3/${MY_KERNEL} + https://mirror.cachyos.org/repo/x86_64_v3/cachyos-v3/${MY_HEADERS} +" + +LICENCES="GPL-2" +SLOT="0" +PLATFORMS="~amd64" +RESTRICT="mirror strip test" + +DEPENDENCIES=" + build: + app-arch/zstd + + build+run: + sys-apps/kmod[zstd] + + run: + app-arch/zstd + dev-lang/clang + dev-lang/llvm + dev-libs/openssl + dev-libs/xxHash + dev-util/dwarves + dev-util/elfutils + sys-apps/systemd + sys-boot/dracut + sys-devel/binutils + sys-devel/lld + sys-libs/zlib +" + +WORK="${WORKBASE}" + +pkg_pretend() { + if exhost --is-native -q && [[ ${ROOT} == / ]]; then + local flags flag + flags=$(grep -m1 '^flags[[:space:]]*:' /proc/cpuinfo) || die "Cannot check CPU features" + for flag in avx avx2 bmi1 bmi2 f16c fma movbe sse4_1 sse4_2 popcnt abm; do + [[ " ${flags} " == *" ${flag} "* ]] || die "CachyOS x86-64-v3 kernel requires CPU feature ${flag}" + done + fi +} + +src_unpack() { + local archive checksum expected + for archive in "${MY_KERNEL}" "${MY_HEADERS}"; do + case ${archive} in + "${MY_KERNEL}") expected=1cb3b27ee69d0ef743d8c30e5811e128376ecf23bc62536405f4e86ffedf1086 ;; + "${MY_HEADERS}") expected=ba982020097ef03b43ae5644e3ce6ec0942c468032f62d15b47d6be475b7d2af ;; + esac + checksum=$(sha256sum "${FETCHEDDIR}/${archive}") || die "Cannot checksum ${archive}" + [[ ${checksum%% *} == ${expected} ]] || die "CachyOS archive changed: ${archive}" + done + + edo mkdir -p "${WORK}/binary" "${WORK}/headers" + edo tar --zstd -xf "${FETCHEDDIR}/${MY_KERNEL}" -C "${WORK}/binary" + edo tar --zstd -xf "${FETCHEDDIR}/${MY_HEADERS}" -C "${WORK}/headers" +} + +src_compile() { + : +} + +src_install() { + local modules="/usr/$(exhost --target)/lib/modules/${KERNEL_RELEASE}" + local binary="${WORK}/binary/usr/lib/modules/${KERNEL_RELEASE}" + local headers="${WORK}/headers/usr/lib/modules/${KERNEL_RELEASE}" + + [[ -f ${binary}/vmlinuz && -d ${binary}/kernel && -f ${headers}/build/.config && + -f ${headers}/build/Module.symvers && -f ${headers}/build/System.map && + -d ${headers}/vdso ]] || die "CachyOS kernel or matching headers are missing" + + dodir "${modules}" + edo cp -a "${binary}/." "${IMAGE}${modules}/" + edo cp -a "${headers}/." "${IMAGE}${modules}/" + edo depmod -b "${IMAGE}" -m "/usr/$(exhost --target)/lib/modules" -a "${KERNEL_RELEASE}" +} + +pkg_postinst() { + local image="/usr/lib/modules/${KERNEL_RELEASE}/vmlinuz" + local retry="kernel-install add ${KERNEL_RELEASE} ${image}" + + if [[ ${ROOT} != / ]] || ! exhost --is-native -q; then + elog "Boot setup skipped for non-native or alternate-root installation." + elog "On the target system, run: ${retry}" + elif ! mountpoint -q /boot || ! command -v kernel-install >/dev/null || + ! command -v dracut >/dev/null; then + ewarn "Boot setup skipped: /boot must be mounted and kernel-install and dracut available." + ewarn "After fixing boot setup, run: ${retry}" + elif ! kernel-install add "${KERNEL_RELEASE}" "${image}"; then + ewarn "Boot entry or initramfs creation failed; check output above." + ewarn "After fixing boot setup, run: ${retry}" + else + elog "CachyOS boot entry and initramfs installed via kernel-install." + fi + + ewarn "With Secure Boot enabled, kernel-install does not guarantee a trusted kernel signature." + ewarn "Verify signing and boot entry before booting CachyOS; keep your working kernel as fallback." +} diff --git a/packages/sys-kernel/scx-loader/scx-loader-1.1.3.exheres-0 b/packages/sys-kernel/scx-loader/scx-loader-1.1.3.exheres-0 new file mode 100644 index 0000000..ef2a6f3 --- /dev/null +++ b/packages/sys-kernel/scx-loader/scx-loader-1.1.3.exheres-0 @@ -0,0 +1,53 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require cargo [ rust_minimum_version=1.95 ] github [ user=sched-ext tag=v${PV} ] \ + systemd-service [ systemd_files=[ services/scx_loader.service ] ] + +SUMMARY="D-Bus loader and controls for sched_ext schedulers" + +LICENCES="GPL-2" +SLOT="0" +PLATFORMS="~amd64" + +DEPENDENCIES+=" + run: + sys-kernel/scx[~${PV}] + sys-apps/dbus + sys-apps/systemd + sys-auth/polkit:1 +" + +CARGO_SRC_COMPILE_PARAMS=( -p scx_loader -p scxctl -p scxtui ) +CARGO_SRC_TEST_PARAMS=( "${CARGO_SRC_COMPILE_PARAMS[@]}" ) + +src_prepare() { + default + edo sed -i "s@/usr/bin/scx_loader@/usr/$(exhost --target)/bin/scx_loader@" \ + services/scx_loader.service services/org.scx.Loader.service + edo sed -i "/^ExecStart=/i Environment=\"PATH=/usr/$(exhost --target)/bin:/usr/bin:/bin\"" \ + services/scx_loader.service +} + +src_install() { + exeinto /usr/$(exhost --target)/bin + local binary + for binary in scx_loader scxctl scxtui ; do + doexe "target/$(rust_target_arch_name)/release/${binary}" + done + + install_systemd_files + + insinto /usr/share/dbus-1/system-services + doins services/org.scx.Loader.service + insinto /usr/share/dbus-1/system.d + doins configs/org.scx.Loader.conf + insinto /usr/share/dbus-1/interfaces + doins configs/org.scx.Loader.xml + insinto /usr/share/polkit-1/actions + doins configs/org.scx.Loader.policy + insinto /usr/share/scx_loader + newins configs/scx_loader.toml config.toml + + emagicdocs +} diff --git a/packages/sys-kernel/scx/scx-1.1.3.exheres-0 b/packages/sys-kernel/scx/scx-1.1.3.exheres-0 new file mode 100644 index 0000000..8412c9e --- /dev/null +++ b/packages/sys-kernel/scx/scx-1.1.3.exheres-0 @@ -0,0 +1,84 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require cargo [ rust_minimum_version=1.94.1 ] github [ user=sched-ext tag=v${PV} ] \ + systemd-service [ systemd_files=[ services/scx.service ] ] + +SUMMARY="sched_ext BPF schedulers and tools" + +LICENCES="GPL-2" +SLOT="0" +PLATFORMS="~amd64" + +DEPENDENCIES+=" + build: + dev-lang/clang[>=16] + dev-util/pkgconf + + build+run: + dev-util/elfutils + dev-libs/libbpf[>=1.7.0] + sys-libs/libseccomp + sys-libs/zlib + app-arch/zstd + + run: + sys-apps/systemd +" + +SCX_BINARIES=( + scx_beerland scx_bpfland scx_cake scx_chaos scx_cosmos scx_flash + scx_forge scx_lavd scx_layered scx_mitosis scx_p2dq + scx_pandemonium scx_rustland scx_rusty scx_tickless + scxtop vmlinux_docify +) + +CARGO_SRC_COMPILE_PARAMS=() +for scheduler in "${SCX_BINARIES[@]}" ; do + CARGO_SRC_COMPILE_PARAMS+=( -p "${scheduler}" ) +done +CARGO_SRC_TEST_PARAMS=( "${CARGO_SRC_COMPILE_PARAMS[@]}" ) + +export BPF_CLANG="/usr/$(exhost --target)/bin/clang" +export LIBBPF_SYS_LIBRARY_PATH="/usr/$(exhost --target)/lib" + +src_prepare() { + default + + local manifest count=0 + for manifest in rust/scx_arena/scx_arena/Cargo.toml \ + rust/scx_bpf_compat/Cargo.toml rust/scx_cargo/Cargo.toml \ + rust/scx_rustland_core/Cargo.toml rust/scx_userspace_arena/Cargo.toml \ + rust/scx_utils/Cargo.toml scheds/rust/scx_*/Cargo.toml \ + tools/scxtop/Cargo.toml ; do + [[ -f ${manifest} ]] || die "Missing Cargo manifest: ${manifest}" + local before after + before=$(grep -Ec '^libbpf-(rs|cargo|sys) = ' "${manifest}") || : + [[ ${before} -gt 0 ]] || die "Unexpected libbpf declarations in ${manifest}" + edo sed -i -E \ + -e 's/^(libbpf-(rs|cargo|sys) = )"(=[^"]+)"$/\1{ version = "\3", default-features = false }/' \ + -e 's/^(libbpf-(rs|cargo|sys) = \{ version = "[^"]+") \}$/\1, default-features = false }/' \ + "${manifest}" + after=$(grep -Ec '^libbpf-(rs|cargo|sys) = \{ version = "[^"]+", default-features = false \}$' "${manifest}") || : + [[ ${before} -eq ${after} ]] || die "Could not disable libbpf defaults in ${manifest}" + (( count += before )) + done + [[ ${count} -eq 26 ]] || die "Expected 26 libbpf dependency declarations, found ${count}" + + edo sed -i "/^ExecStart=/i Environment=\"PATH=/usr/$(exhost --target)/bin:/usr/bin:/bin\"" \ + services/scx.service +} + +src_install() { + exeinto /usr/$(exhost --target)/bin + local binary + for binary in "${SCX_BINARIES[@]}" ; do + doexe "target/$(rust_target_arch_name)/release/${binary}" + done + + install_systemd_files + insinto /etc/default + doins services/scx + + emagicdocs +} diff --git a/packages/wayland-apps/fnott/fnott-1.8.0.exheres-0 b/packages/wayland-apps/fnott/fnott-1.8.0.exheres-0 new file mode 100644 index 0000000..c9b829c --- /dev/null +++ b/packages/wayland-apps/fnott/fnott-1.8.0.exheres-0 @@ -0,0 +1,45 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require meson [ meson_minimum_version=0.59.0 ] +require systemd-service + +SUMMARY="Keyboard driven and lightweight Wayland notification daemon" +HOMEPAGE="https://codeberg.org/dnkl/fnott" +DOWNLOADS="${HOMEPAGE}/releases/download/${PV}/${PNV}.tar.gz" + +LICENCES="MIT ZLIB" +SLOT="0" +PLATFORMS="~amd64" + +DEPENDENCIES=" + build: + app-doc/scdoc + dev-libs/tllist[>=1.0.1] + sys-libs/wayland-protocols[>=1.32] + + build+run: + media-libs/fcft[<4.0.0&>=3.0.0] + media-libs/fontconfig + media-libs/freetype + media-libs/libpng:= + media-libs/nanosvg + sys-apps/dbus + sys-libs/wayland + x11-libs/pixman:1 +" + +MESON_SOURCE="${WORKBASE}/${PNV}" +MESON_SRC_CONFIGURE_PARAMS=( + -Ddocs=enabled + -Dsystemd-units-dir="${SYSTEMDUSERUNITDIR}" + -Dsystem-nanosvg=enabled +) + +src_install() { + meson_src_install + edo mkdir -p "${IMAGE}${SYSTEMDUSERUNITDIR}" + edo mv "${IMAGE}/usr/lib/systemd/user/fnott.service" "${IMAGE}${SYSTEMDUSERUNITDIR}/" + edo rmdir "${IMAGE}/usr/lib/systemd/user" "${IMAGE}/usr/lib/systemd" "${IMAGE}/usr/lib" + edo rm -r "${IMAGE}/usr/share/doc/${PN}" +} diff --git a/packages/wayland-apps/fuzzel/fuzzel-1.15.0.exheres-0 b/packages/wayland-apps/fuzzel/fuzzel-1.15.0.exheres-0 new file mode 100644 index 0000000..a8dacf5 --- /dev/null +++ b/packages/wayland-apps/fuzzel/fuzzel-1.15.0.exheres-0 @@ -0,0 +1,62 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require meson + +SUMMARY="Application launcher for wlroots based Wayland compositors" +HOMEPAGE="https://codeberg.org/dnkl/fuzzel" +DOWNLOADS="${HOMEPAGE}/releases/download/${PV}/${PNV}.tar.gz" + +LICENCES="MIT" +SLOT="0" +PLATFORMS="~amd64" +MYOPTIONS=" + png [[ + description = [ Build with PNG icon support ] + ]] + + svg [[ + description = [ Build with SVG icon support ] + ]] +" + +DEPENDENCIES=" + build: + app-doc/scdoc + dev-libs/tllist[>=1.0.1] + sys-libs/wayland-protocols[>=1.41] + + build+run: + media-libs/fcft[<4.0.0&>=3.3.1] + media-libs/fontconfig + sys-libs/wayland + x11-libs/libxkbcommon + x11-libs/pixman:1[>=0.46.0] + + png? ( + media-libs/libpng + ) + + svg? ( + media-libs/nanosvg + ) +" + +src_configure() { + meson_src_configure \ + -Denable-cairo=disabled \ + -Dpng-backend="$(option png libpng none)" \ + -Dsvg-backend="$(option svg nanosvg none)" \ + -Dsystem-nanosvg="$(option svg enabled disabled)" +} + +src_install() { + meson_src_install + edo rm -rf "${IMAGE}/usr/share/doc/fuzzel" +} + +pkg_postinst() { + einfo "An example configuration file is installed at" + einfo "/etc/xdg/fuzzel/fuzzel.ini" + einfo "Copy it to ~/.config/fuzzel/ and edit it as needed." +} diff --git a/packages/wayland-apps/wlsunset/wlsunset-0.4.0.exheres-0 b/packages/wayland-apps/wlsunset/wlsunset-0.4.0.exheres-0 new file mode 100644 index 0000000..ddf4f04 --- /dev/null +++ b/packages/wayland-apps/wlsunset/wlsunset-0.4.0.exheres-0 @@ -0,0 +1,24 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require meson [ meson_minimum_version=0.56.0 ] + +SUMMARY="Day/night gamma adjustments for Wayland" +HOMEPAGE="https://sr.ht/~kennylevinsen/wlsunset/" +DOWNLOADS="https://git.sr.ht/~kennylevinsen/wlsunset/archive/${PV}.tar.gz -> ${PNV}.tar.gz" + +LICENCES="MIT" +SLOT="0" +PLATFORMS="~amd64" + +DEPENDENCIES=" + build: + app-doc/scdoc[>=1.9.7] + sys-libs/wayland-protocols + + build+run: + sys-libs/wayland +" + +MESON_SOURCE="${WORKBASE}/${PNV}" +MESON_SRC_CONFIGURE_PARAMS=( -Dwerror=false -Dman-pages=enabled ) diff --git a/packages/x11-apps/flameshot/flameshot-14.0.0.exheres-0 b/packages/x11-apps/flameshot/flameshot-14.0.0.exheres-0 new file mode 100644 index 0000000..480ffff --- /dev/null +++ b/packages/x11-apps/flameshot/flameshot-14.0.0.exheres-0 @@ -0,0 +1,65 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require cmake + +SUMMARY="Powerful yet simple to use screenshot software" +HOMEPAGE="https://flameshot.org https://github.com/flameshot-org/flameshot" + +DOWNLOADS=" + https://github.com/flameshot-org/flameshot/archive/refs/tags/v${PV}.tar.gz + -> ${PNV}.tar.gz +" + +LICENCES=" + Apache-2.0 + FAL-1.3 + GPL-3+ +" +SLOT="0" +PLATFORMS="~amd64" + +MYOPTIONS=" + imgur [[ + description = [ Enable Imgur uploader ] + ]] + + wayland [[ + description = [ Enable Wayland clipboard support ] + ]] +" + +DEPENDENCIES=" + build: + x11-libs/qttools:6[linguist] + + build+run: + dev-libs/kdsingleapplication + gui-libs/qt-color-widgets + sys-apps/dbus + x11-libs/qtbase:6[gui] + x11-libs/qtsvg:6 + + wayland? ( + kde-frameworks/kguiaddons:6[wayland] + ) +" + +src_configure() { + CMAKE_SRC_CONFIGURE_PARAMS=( + -DCMAKE_DISABLE_FIND_PACKAGE_Git=ON + -DDISABLE_UPDATE_CHECKER=ON + -DENABLE_CACHE=0 + -DENABLE_IMGUR="$(option imgur ON OFF)" + -DFETCHCONTENT_TRY_FIND_PACKAGE_MODE=ALWAYS + -DUSE_BUNDLED_KDSINGLEAPPLICATION=OFF + -DUSE_KDSINGLEAPPLICATION=ON + -DUSE_WAYLAND_CLIPBOARD="$(option wayland ON OFF)" + ) + + cmake_src_configure +} + +src_install() { + cmake_src_install +} diff --git a/packages/x11-apps/qt6ct/files/qt6ct-0.9-qt-6.10.patch b/packages/x11-apps/qt6ct/files/qt6ct-0.9-qt-6.10.patch new file mode 100644 index 0000000..69e52d0 --- /dev/null +++ b/packages/x11-apps/qt6ct/files/qt6ct-0.9-qt-6.10.patch @@ -0,0 +1,22 @@ +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -24,7 +24,7 @@ + + add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x060000 -DUSE_WIDGETS) + +-find_package(Qt6 REQUIRED COMPONENTS BuildInternals Core Widgets OPTIONAL_COMPONENTS LinguistTools) ++find_package(Qt6 REQUIRED COMPONENTS BuildInternals Core Widgets GuiPrivate WidgetsPrivate OPTIONAL_COMPONENTS LinguistTools) + + get_target_property(QT_QTPATHS_EXECUTABLE Qt6::qtpaths IMPORTED_LOCATION) + +--- a/src/qt6ct-qtplugin/qt6ctplatformtheme.h ++++ b/src/qt6ct-qtplugin/qt6ctplatformtheme.h +@@ -30,7 +30,7 @@ + #define QT6CTPLATFORMTHEME_H + + #include +-#include ++#include + #include + #include + #include diff --git a/packages/x11-apps/qt6ct/qt6ct-0.9.exheres-0 b/packages/x11-apps/qt6ct/qt6ct-0.9.exheres-0 new file mode 100644 index 0000000..2dbea7d --- /dev/null +++ b/packages/x11-apps/qt6ct/qt6ct-0.9.exheres-0 @@ -0,0 +1,40 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require cmake + +SUMMARY="Qt6 configuration tool for desktops without Qt integration" +HOMEPAGE="https://www.opencode.net/trialuser/qt6ct/" +DOWNLOADS="https://www.opencode.net/api/v4/projects/5459/packages/generic/qt6ct/${PV}/${PNV}.tar.xz" + +LICENCES="BSD-2" +SLOT="0" +PLATFORMS="~amd64" + +DEPENDENCIES=" + build: + x11-libs/qttools:6[linguist] + + build+run: + x11-libs/qtbase:6[gui] + + run: + x11-libs/qtsvg:6 +" + +DEFAULT_SRC_PREPARE_PATCHES=( + "${FILES}/${PNV}-qt-6.10.patch" +) + +src_install() { + cmake_src_install + + hereenvd 98${PN} < +# Distributed under the terms of the GNU General Public License v2 + +SUMMARY="Command-line X11 automation and libxdo library" +HOMEPAGE="https://github.com/jordansissel/xdotool" +DOWNLOADS="${HOMEPAGE}/archive/refs/tags/v${PV}.tar.gz -> ${PNV}.tar.gz" + +LICENCES="BSD-3" +SLOT="0" +PLATFORMS="~amd64" + +DEPENDENCIES=" + build: + dev-util/pkgconf + dev-lang/perl + + build+run: + x11-libs/libX11 + x11-libs/libXinerama + x11-libs/libXtst + x11-libs/libxkbcommon +" + +MAKE_PARAMS=( + PREFIX=/usr + INSTALLBIN=/usr/$(exhost --target)/bin + INSTALLLIB=/usr/$(exhost --target)/lib + INSTALLPC=/usr/$(exhost --target)/lib/pkgconfig + INSTALLINCLUDE=/usr/$(exhost --target)/include + INSTALLMAN=/usr/share/man +) + +src_prepare() { + default + edo sed -i "s@pkg-config --@/usr/$(exhost --target)/bin/$(exhost --tool-prefix)pkg-config --@g" Makefile +} + +src_compile() { + emake "${MAKE_PARAMS[@]}" +} + +src_install() { + emake "${MAKE_PARAMS[@]}" DESTDIR="${IMAGE}" LDCONFIG=: install + dodoc COPYRIGHT +} diff --git a/packages/x11-misc/nwg-look/nwg-look-1.1.2.exheres-0 b/packages/x11-misc/nwg-look/nwg-look-1.1.2.exheres-0 new file mode 100644 index 0000000..a3f74be --- /dev/null +++ b/packages/x11-misc/nwg-look/nwg-look-1.1.2.exheres-0 @@ -0,0 +1,66 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +SUMMARY="GTK3 settings editor adapted to work in wlroots-based compositors" +HOMEPAGE="https://github.com/nwg-piotr/nwg-look" + +DOWNLOADS=" + https://github.com/nwg-piotr/nwg-look/archive/refs/tags/v${PV}.tar.gz + -> ${PNV}.tar.gz +" + +LICENCES="MIT" +SLOT="0" +PLATFORMS="~amd64" + +DEPENDENCIES=" + build: + dev-lang/go[>=1.26] + + build+run: + dev-libs/glib + media-libs/fontconfig + media-libs/freetype + x11-libs/harfbuzz + x11-misc/xcur2png + x11-libs/cairo + x11-libs/gdk-pixbuf + x11-libs/gtk+:3 + x11-libs/pango +" + +src_prepare() { + default + + export GOMODCACHE="${WORKBASE}/gomodcache" + export GOCACHE="${WORKBASE}/gocache" + + esandbox disable_net + edo go mod download + esandbox enable_net +} + +src_compile() { + export GOMODCACHE="${WORKBASE}/gomodcache" + export GOCACHE="${WORKBASE}/gocache" + + emake build +} + +src_install() { + insinto /usr/share/nwg-look + doins stuff/main.glade + doins -r langs + + insinto /usr/share/pixmaps + doins stuff/nwg-look.svg + + insinto /usr/share/applications + doins stuff/nwg-look.desktop + + dobin bin/nwg-look + + docinto nwg-look + dodoc README.md + dodoc LICENSE +} diff --git a/packages/x11-misc/xcur2png/xcur2png-0.7.1.exheres-0 b/packages/x11-misc/xcur2png/xcur2png-0.7.1.exheres-0 new file mode 100644 index 0000000..f388b3b --- /dev/null +++ b/packages/x11-misc/xcur2png/xcur2png-0.7.1.exheres-0 @@ -0,0 +1,34 @@ +# Copyright 2026 Gurov +# Distributed under the terms of the GNU General Public License v2 + +require autotools [ supported_autoconf=[ 2.7 ] supported_automake=[ 1.18 ] ] flag-o-matic + +SUMMARY="Convert X cursors to PNG images" +HOMEPAGE="https://github.com/eworm-de/xcur2png" + +DOWNLOADS=" + https://github.com/eworm-de/xcur2png/releases/download/${PV}/${PNV}.tar.gz +" + +LICENCES="GPL-3" +SLOT="0" +PLATFORMS="~amd64" + +DEPENDENCIES=" + build: + dev-util/pkgconf + + build+run: + media-libs/libpng + x11-libs/libXcursor +" + +src_prepare() { + default + eautoreconf +} + +src_configure() { + append-cflags "-std=gnu89" + default +} diff --git a/profiles/repo_name b/profiles/repo_name new file mode 100644 index 0000000..952b1fe --- /dev/null +++ b/profiles/repo_name @@ -0,0 +1 @@ +gurov diff --git a/scripts/check-versions.py b/scripts/check-versions.py new file mode 100644 index 0000000..d7762fe --- /dev/null +++ b/scripts/check-versions.py @@ -0,0 +1,191 @@ +#!/usr/bin/env python3 +"""Compare repository recipe versions with nvchecker results, without writing state.""" + +import json +import re +import subprocess +import sys +import tomllib +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +CONFIG = ROOT / "nvchecker.toml" + +UNSUPPORTED = { + "dev-libs/tlottie": "recipe version is tied to AyuGram's pinned commit and patch", + "media-libs/nanosvg": "recipe version is tied to a pinned commit", + "media-libs/tg_owt": "recipe pins four commits, not a release", + "net-libs/tde2e": "recipe version is tied to a pinned TDLib commit", + "x11-apps/qt6ct": "Git tag does not verify the generic registry archive", +} +VERSION = re.compile(r"[0-9]+(?:\.[0-9]+)*\Z") +KERNEL_RELEASE = re.compile(r"[0-9]+(?:\.[0-9]+)*-[0-9]+\Z") +KERNEL_RECIPE = re.compile(r"([0-9]+(?:\.[0-9]+)*)(?:-r([1-9][0-9]*))?\Z") + +LABELS = { + "update": "to update", + "failed": "failed", + "ahead": "ahead of upstream", + "unsupported": "not tracked", + "current": "up to date", +} + + +def recipes(root): + found = {} + problems = [] + kernel_count = 0 + for path in sorted((root / "packages").glob("*/*/*.exheres-0")): + name = f"{path.parent.parent.name}/{path.parent.name}" + stem = path.name.removesuffix(".exheres-0") + prefix = path.parent.name + "-" + if not stem.startswith(prefix) or not stem[len(prefix):]: + problems.append(f"invalid recipe filename: {path.relative_to(root)}") + continue + version = stem[len(prefix):] + if name == "sys-kernel/kernel-cachyos": + kernel_count += 1 + if not KERNEL_RECIPE.fullmatch(version): + problems.append(f"invalid kernel version: {version}") + continue + found[name] = version + elif name in found: + problems.append(f"multiple versions for {name}") + else: + found[name] = version + if kernel_count > 1: + problems.append("keep only one kernel-cachyos recipe") + return found, problems + + +def compare(current, upstream): + if not VERSION.fullmatch(current) or not VERSION.fullmatch(upstream): + return "incomparable" + a = tuple(map(int, current.split("."))) + b = tuple(map(int, upstream.split("."))) + length = max(len(a), len(b)) + a += (0,) * (length - len(a)) + b += (0,) * (length - len(b)) + return "update" if b > a else "ahead" if b < a else "current" + + +def kernel_release(root, version): + path = root / "packages/sys-kernel/kernel-cachyos" / f"kernel-cachyos-{version}.exheres-0" + try: + recipe = path.read_text() + except OSError: + return None + match = re.search(r'^MY_RELEASE="\$\{PV\}-([0-9]+)"$', recipe, re.MULTILINE) + return f"{KERNEL_RECIPE.fullmatch(version).group(1)}-{match.group(1)}" if match else None + + +def results(output): + versions = {} + errors = {} + for line in output.splitlines(): + try: + event = json.loads(line) + except json.JSONDecodeError: + continue + name = event.get("name") + if not name: + continue + if event.get("event") == "updated": + versions[name] = event.get("version") + elif event.get("level") == "error": + errors[name] = event.get("event", "unknown error") + return versions, errors + + +def report(root, config, output, returncode): + current, problems = recipes(root) + entries = {name for name in config if name != "__config__"} + overlap = entries & UNSUPPORTED.keys() + missing = current.keys() - entries - UNSUPPORTED.keys() + if config.get("__config__", {}).get("oldver") or config.get("__config__", {}).get("newver"): + problems.append("nvchecker must not write version files") + extra = (entries | UNSUPPORTED.keys()) - current.keys() + problems.extend(f"both configured and unsupported: {name}" for name in sorted(overlap)) + problems.extend(f"unmapped recipe: {name}" for name in sorted(missing)) + problems.extend(f"mapping without recipe: {name}" for name in sorted(extra)) + versions, errors = results(output) + unknown = (versions.keys() | errors.keys()) - entries + problems.extend(f"unexpected nvchecker result: {name}" for name in sorted(unknown)) + if returncode not in (0, 3): + problems.append(f"nvchecker exited with status {returncode}") + + rows = {status: [] for status in LABELS} + for name in sorted(current): + installed = current[name] + if name in UNSUPPORTED: + status, detail = "unsupported", UNSUPPORTED[name] + elif name not in entries: + status, detail = "failed", "no source configured" + elif name in errors: + status, detail = "failed", errors[name] + elif name not in versions or not isinstance(versions[name], str): + status, detail = "failed", "no version returned" + else: + upstream = versions[name] + if name == "sys-kernel/kernel-cachyos": + release = kernel_release(root, installed) + if release and KERNEL_RELEASE.fullmatch(upstream): + status = compare(release.replace("-", "."), upstream.replace("-", ".")) + else: + status = "incomparable" + detail = f"{release} -> {upstream}" if release else "unrecognized recipe release" + else: + status = compare(installed, upstream) + detail = f"{installed} -> {upstream}" + if status == "incomparable": + status = "failed" + if name != "sys-kernel/kernel-cachyos" or release: + detail = f"unrecognized version {upstream!r}" + rows[status].append((name, detail)) + if returncode == 3 and not errors: + problems.append("nvchecker reported failures without error details") + + lines = [", ".join(f"{len(rows[status])} {label}" for status, label in LABELS.items() if rows[status])] + shown = [f"{status:6} {name:39} {detail}" for status in ("update", "failed") for name, detail in rows[status]] + if shown: + lines += ["", *shown] + if problems: + lines += ["", *(f"ERROR: {problem}" for problem in problems)] + return "\n".join(lines), bool(problems or rows["failed"]) + + +def main(): + try: + with CONFIG.open("rb") as file: + config = tomllib.load(file) + except (OSError, tomllib.TOMLDecodeError) as error: + print(f"Cannot load {CONFIG}: {error}", file=sys.stderr) + return 1 + if config.get("__config__", {}).get("oldver") or config.get("__config__", {}).get("newver"): + print("Refusing nvchecker config with version file writes", file=sys.stderr) + return 1 + current, problems = recipes(ROOT) + entries = set(config) - {"__config__"} + problems.extend(f"unmapped recipe: {name}" for name in sorted(current.keys() - entries - UNSUPPORTED.keys())) + problems.extend(f"mapping without recipe: {name}" for name in sorted((entries | UNSUPPORTED.keys()) - current.keys())) + problems.extend(f"both configured and unsupported: {name}" for name in sorted(entries & UNSUPPORTED.keys())) + if problems: + print("\n".join(f"ERROR: {problem}" for problem in problems), file=sys.stderr) + return 1 + try: + completed = subprocess.run( + ["nvchecker", "--logger", "json", "--failures", "-c", str(CONFIG)], + text=True, capture_output=True, check=False, + ) + except OSError as error: + print(f"Cannot run nvchecker: {error}", file=sys.stderr) + return 1 + text, failed = report(ROOT, config, completed.stdout, completed.returncode) + print(text) + if completed.stderr: + print(completed.stderr, file=sys.stderr, end="") + return int(failed) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/update-kernel-cachyos.py b/scripts/update-kernel-cachyos.py new file mode 100644 index 0000000..2c9bd19 --- /dev/null +++ b/scripts/update-kernel-cachyos.py @@ -0,0 +1,223 @@ +#!/usr/bin/env python3 +"""Prepare a CachyOS kernel recipe from the latest AUR package release.""" + +import hashlib +import json +import os +import posixpath +import re +import subprocess +import sys +import tarfile +import tempfile +import urllib.error +import urllib.request +from pathlib import Path, PurePosixPath + +ROOT = Path(__file__).resolve().parent.parent +AUR_URL = "https://aur.archlinux.org/rpc/v5/info/linux-cachyos" +MIRROR = "https://mirror.cachyos.org/repo/x86_64_v3/cachyos-v3" +RECIPE = re.compile(r"kernel-cachyos-([0-9]+(?:\.[0-9]+)*)(?:-r([1-9][0-9]*))?\.exheres-0\Z") +RELEASE = re.compile(r"([0-9]+(?:\.[0-9]+)*)-([1-9][0-9]*)\Z") +MAX_DOWNLOAD = 1_500_000_000 + + +class UpdateError(Exception): + pass + + +def release_key(value): + match = RELEASE.fullmatch(value) + if not match: + raise UpdateError(f"Invalid upstream release: {value!r}") + return tuple(map(int, match.group(1).split("."))), int(match.group(2)) + + +def recipe_key(path): + match = RECIPE.fullmatch(path.name) + if not match: + raise UpdateError(f"Unexpected kernel recipe: {path.name}") + return tuple(map(int, match.group(1).split("."))), int(match.group(2) or 0) + + +def recipe_release(path): + match = re.search(r'^MY_RELEASE="\$\{PV\}-([1-9][0-9]*)"$', path.read_text(), re.MULTILINE) + if not match: + raise UpdateError(f"Missing literal MY_RELEASE in {path.name}") + version = RECIPE.fullmatch(path.name).group(1) + return f"{version}-{match.group(1)}" + + +def latest_aur_release(): + try: + with urllib.request.urlopen(AUR_URL, timeout=20) as response: + data = json.load(response) + except (urllib.error.URLError, TimeoutError, ValueError) as error: + raise UpdateError(f"AUR request failed (rate limit or network issue): {error}") from error + if not isinstance(data, dict) or data.get("resultcount") != 1 or not isinstance(data.get("results"), list) or len(data["results"]) != 1: + raise UpdateError("AUR did not return exactly one linux-cachyos result") + result = data["results"][0] + if not isinstance(result, dict) or result.get("Name") != "linux-cachyos" or not isinstance(result.get("Version"), str): + raise UpdateError("AUR returned an unexpected package or version") + release_key(result["Version"]) + return result["Version"] + + +def download(url, destination): + digest = hashlib.sha256() + size = 0 + try: + request = urllib.request.Request(url, headers={"User-Agent": "kernel-cachyos-updater/1.0"}) + with urllib.request.urlopen(request, timeout=60) as response, destination.open("xb") as output: + while chunk := response.read(1024 * 1024): + size += len(chunk) + if size > MAX_DOWNLOAD: + raise UpdateError(f"Archive exceeds size limit: {url}") + digest.update(chunk) + output.write(chunk) + except (urllib.error.URLError, OSError, TimeoutError) as error: + raise UpdateError(f"Cannot download {url}: {error}") from error + if not size: + raise UpdateError(f"Empty archive: {url}") + return digest.hexdigest() + + +def inspect_archive(archive, name, release): + try: + with archive.open("rb") as source, subprocess.Popen( + ["zstd", "-dc"], stdin=source, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL + ) as decompressor: + try: + with tarfile.open(fileobj=decompressor.stdout, mode="r|") as tar: + paths = set() + regular = set() + metadata = None + for member in tar: + path = PurePosixPath(member.name.removeprefix("./")) + if path.is_absolute() or ".." in path.parts or str(path) == ".": + raise UpdateError(f"Unsafe archive member: {member.name!r}") + if member.issym() or member.islnk(): + target = member.linkname + resolved = posixpath.normpath(posixpath.join(posixpath.dirname(str(path)), target)) + if target.startswith("/") or resolved == ".." or resolved.startswith("../"): + raise UpdateError(f"Unsafe archive link: {member.name!r}") + paths.add(str(path)) + if member.isfile(): + regular.add(str(path)) + if str(path) == ".PKGINFO": + if not member.isfile() or member.size > 64_000: + raise UpdateError(f"Invalid .PKGINFO in {archive.name}") + metadata = tar.extractfile(member).read().decode("utf-8") + # tar can stop at the end-of-archive marker before zstd reaches EOF. + for _ in iter(lambda: decompressor.stdout.read(1024 * 1024), b""): + pass + if decompressor.wait() != 0: + raise UpdateError(f"Cannot decompress {archive.name}") + except BaseException: + decompressor.kill() + decompressor.wait() + raise + except (tarfile.TarError, UnicodeError, OSError) as error: + raise UpdateError(f"Cannot inspect {archive.name}: {error}") from error + if metadata is None: + raise UpdateError(f"{archive.name} has no .PKGINFO") + fields = {} + for line in metadata.splitlines(): + if " = " in line: + key, value = line.split(" = ", 1) + fields.setdefault(key, []).append(value) + expected = {"pkgname": name, "pkgver": release, "arch": "x86_64_v3"} + for key, value in expected.items(): + if fields.get(key) != [value]: + raise UpdateError(f"{archive.name}: expected {key} = {value!r}, got {fields.get(key)!r}") + module = f"usr/lib/modules/{release}-cachyos" + if name == "linux-cachyos": + required = (f"{module}/vmlinuz",) + prefixes = (f"{module}/kernel/",) + else: + required = (f"{module}/build/.config", f"{module}/build/Module.symvers", f"{module}/build/System.map") + prefixes = (f"{module}/vdso/",) + if any(path not in regular for path in required) or any( + not any(path.startswith(prefix) for path in regular) for prefix in prefixes + ): + raise UpdateError(f"{archive.name}: expected kernel/module/header paths are missing") + + +def replace_once(text, pattern, replacement): + result, count = re.subn(pattern, replacement, text, flags=re.MULTILINE) + if count != 1: + raise UpdateError(f"Recipe template did not match exactly once: {pattern}") + return result + + +def render_recipe(template, release, hashes): + pkgrel = release_key(release)[1] + text = replace_once(template, r'^MY_RELEASE="\$\{PV\}-[1-9][0-9]*"$', f'MY_RELEASE="${{PV}}-{pkgrel}"') + for variable, digest in (("MY_KERNEL", hashes["linux-cachyos"]), ("MY_HEADERS", hashes["linux-cachyos-headers"])): + pattern = rf'("\${{{variable}}}"\) expected=)[0-9a-f]{{64}}( ;;)' + text = replace_once(text, pattern, lambda match: f"{match.group(1)}{digest}{match.group(2)}") + return text + + +def update(root=ROOT): + package_dir = root / "packages/sys-kernel/kernel-cachyos" + recipes = list(package_dir.glob("*.exheres-0")) + if len(recipes) != 1: + raise UpdateError(f"Expected exactly one kernel recipe, found {len(recipes)}") + latest = recipes[0] + current = recipe_release(latest) + if recipe_key(latest)[1] != release_key(current)[1] - 1: + raise UpdateError(f"Recipe revision does not match upstream pkgrel: {latest.name}") + template = latest.read_text() + if not re.search(r'^SLOT="0"$', template, re.MULTILINE): + raise UpdateError(f"Kernel recipe must use SLOT=0: {latest.name}") + upstream = latest_aur_release() + if release_key(upstream) == release_key(current): + print(f"Already current: {upstream}") + return + if release_key(upstream) < release_key(current): + raise UpdateError(f"AUR release {upstream} is older than recipe release {current}") + version = upstream.rsplit("-", 1)[0] + if version == current.rsplit("-", 1)[0] and release_key(upstream)[1] != release_key(current)[1] + 1: + raise UpdateError("Upstream pkgrel skipped a release; review missing kernel revisions") + revision = recipe_key(latest)[1] + 1 if version == current.rsplit("-", 1)[0] else 0 + suffix = f"-r{revision}" if revision else "" + target = package_dir / f"kernel-cachyos-{version}{suffix}.exheres-0" + if target.exists(): + raise UpdateError(f"Refusing to overwrite {target}") + + hashes = {} + with tempfile.TemporaryDirectory(prefix="kernel-cachyos-") as temporary: + for name in ("linux-cachyos", "linux-cachyos-headers"): + directory = Path(temporary) / name + directory.mkdir() + archive = directory / f"{name}-{upstream}-x86_64_v3.pkg.tar.zst" + hashes[name] = download(f"{MIRROR}/{archive.name}", archive) + inspect_archive(archive, name, upstream) + + content = render_recipe(template, upstream, hashes) + with tempfile.TemporaryDirectory(prefix=".kernel-recipe-", dir=package_dir) as temporary: + staged = Path(temporary) / target.name + staged.write_text(content) + result = subprocess.run(["bash", "-n", str(staged)], capture_output=True, text=True, check=False) + if result.returncode: + raise UpdateError(f"Generated recipe failed bash -n: {result.stderr.strip()}") + # Publish a complete file without replacing one another process created. + os.link(staged, target) + try: + latest.unlink() + except OSError as error: + target.unlink() + raise UpdateError(f"Could not remove old recipe: {error}") from error + print(f"Created {target.relative_to(root)} for upstream {upstream}") + print(f"Removed {latest.relative_to(root)}") + for name, digest in hashes.items(): + print(f"{name}: SHA-256 {digest} (verify against independently published hashes)") + + +if __name__ == "__main__": + try: + update() + except (UpdateError, OSError, subprocess.SubprocessError) as error: + print(f"ERROR: {error}", file=sys.stderr) + sys.exit(1) diff --git a/tests/test_check_versions.py b/tests/test_check_versions.py new file mode 100644 index 0000000..e94aafa --- /dev/null +++ b/tests/test_check_versions.py @@ -0,0 +1,140 @@ +import importlib.util +import json +import re +import tempfile +import unittest +from pathlib import Path + +SCRIPT = Path(__file__).resolve().parents[1] / "scripts/check-versions.py" +spec = importlib.util.spec_from_file_location("check_versions", SCRIPT) +checker = importlib.util.module_from_spec(spec) +spec.loader.exec_module(checker) + + +class VersionChecks(unittest.TestCase): + def test_numeric_comparison(self): + self.assertEqual(checker.compare("1.2.9", "1.2.10"), "newer") + self.assertEqual(checker.compare("2.0", "2.0.0"), "current") + self.assertEqual(checker.compare("2.1", "2.0"), "behind") + self.assertEqual(checker.compare("1.0", "2.0rc1"), "incomparable") + self.assertEqual(checker.compare("0_pre20260803", "1.0"), "incomparable") + + def test_recipes_and_coverage(self): + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + package = root / "packages/app-misc/example" + package.mkdir(parents=True) + (package / "example-0_pre20260803.exheres-0").touch() + found, problems = checker.recipes(root) + self.assertEqual(found, {"app-misc/example": "0_pre20260803"}) + self.assertEqual(problems, []) + text, failed = checker.report(root, {}, "", 0) + self.assertTrue(failed) + self.assertIn("unmapped recipe: app-misc/example", text) + (package / "example-1.0.exheres-0").touch() + _, problems = checker.recipes(root) + self.assertIn("multiple versions for app-misc/example", problems) + + def test_result_events(self): + output = "\n".join([ + json.dumps({"event": "updated", "name": "a/b", "version": "1.2", "level": "info"}), + json.dumps({"event": "no-result", "name": "c/d", "level": "error"}), + ]) + self.assertEqual(checker.results(output), ({"a/b": "1.2"}, {"c/d": "no-result"})) + + def test_failed_and_proxy_results(self): + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + for name in ("net-im/viber", "dev-python/structlog"): + category, package = name.split("/") + path = root / "packages" / category / package + path.mkdir(parents=True) + (path / f"{package}-1.0.exheres-0").touch() + config = {name: {"source": "aur"} for name in ("net-im/viber", "dev-python/structlog")} + output = json.dumps({"event": "updated", "name": "net-im/viber", "version": "1.2", "level": "info"}) + text, failed = checker.report(root, config, output, 3) + self.assertTrue(failed) + self.assertIn("proxy-newer", text) + self.assertIn("no version returned", text) + self.assertIn("failed=1", text) + + def test_aur_proxies(self): + import tomllib + with (SCRIPT.parents[1] / "nvchecker.toml").open("rb") as file: + config = tomllib.load(file) + for name, aur in (("app-misc/ente-auth", "ente-auth"), ("sys-kernel/kernel-cachyos", "linux-cachyos")): + with self.subTest(name=name): + self.assertNotIn(name, checker.UNSUPPORTED) + self.assertIn(name, checker.PROXIES) + self.assertEqual(config[name]["source"], "aur") + self.assertEqual(config[name]["aur"], aur) + self.assertTrue(config["app-misc/ente-auth"]["strip_release"]) + self.assertNotIn("strip_release", config["sys-kernel/kernel-cachyos"]) + + def test_kernel_release_proxy(self): + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + package = root / "packages/sys-kernel/kernel-cachyos" + package.mkdir(parents=True) + recipe = package / "kernel-cachyos-7.2.8.exheres-0" + recipe.write_text('MY_RELEASE="${PV}-1"\n') + config = {"sys-kernel/kernel-cachyos": {"source": "aur"}} + for version, expected in (("7.2.8-1", "proxy-current"), ("7.2.8-2", "proxy-newer"), ("7.2.8", "failed")): + with self.subTest(version=version): + output = json.dumps({"event": "updated", "name": "sys-kernel/kernel-cachyos", "version": version}) + text, failed = checker.report(root, config, output, 0) + self.assertIn(f"{expected:14} sys-kernel/kernel-cachyos", text) + self.assertIn(f"failed={int(expected == 'failed')}", text) + recipe.write_text('MY_RELEASE="${PV}-${REL}"\n') + output = json.dumps({"event": "updated", "name": "sys-kernel/kernel-cachyos", "version": "7.2.8-1"}) + text, failed = checker.report(root, config, output, 0) + self.assertTrue(failed) + self.assertIn("unrecognized recipe release", text) + + def test_tarball_feeds(self): + import tomllib + with (SCRIPT.parents[1] / "nvchecker.toml").open("rb") as file: + config = tomllib.load(file) + examples = { + "media-libs/zita-convolver": ( + 'https://kokkinizita.linuxaudio.org/linuxaudio/downloads/', + '', + "4.0.3", + ), + "net-firewall/ufw": ( + 'https://launchpad.net/ufw/+download', + '', + "0.36.2", + ), + } + for name, (url, html, version) in examples.items(): + with self.subTest(name=name): + self.assertNotIn(name, checker.UNSUPPORTED) + self.assertEqual(config[name]["source"], "regex") + self.assertEqual(config[name]["url"], url) + self.assertEqual(re.findall(config[name]["regex"], html), [version]) + + def test_zoom_feed(self): + import tomllib + with (SCRIPT.parents[1] / "nvchecker.toml").open("rb") as file: + config = tomllib.load(file) + entry = config["net-im/zoom"] + self.assertEqual(entry["source"], "regex") + self.assertEqual(entry["url"], "https://zoom.us/rest/download?os=linux") + response = '{"downloadVO":{"zoom":{"version":"7.2.1.5760"},"zoomX86":{"version":"5.4.53391.1108"}}}' + self.assertEqual(re.findall(entry["regex"], response), ["7.2.1.5760"]) + self.assertEqual(checker.compare("7.2.1.5760", "7.2.1.5760"), "current") + + def test_repository_coverage(self): + import tomllib + root = SCRIPT.parents[1] + with (root / "nvchecker.toml").open("rb") as file: + config = tomllib.load(file) + found, problems = checker.recipes(root) + self.assertEqual(problems, []) + self.assertEqual(set(found), (set(config) - {"__config__"}) | set(checker.UNSUPPORTED)) + self.assertFalse((set(config) - {"__config__"}) & set(checker.UNSUPPORTED)) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_update_kernel_cachyos.py b/tests/test_update_kernel_cachyos.py new file mode 100644 index 0000000..052f8ae --- /dev/null +++ b/tests/test_update_kernel_cachyos.py @@ -0,0 +1,177 @@ +import importlib.util +import io +import json +import tarfile +import tempfile +import unittest +from pathlib import Path +from unittest.mock import patch + +SCRIPTS = Path(__file__).resolve().parents[1] / "scripts" + + +def load(name, filename): + spec = importlib.util.spec_from_file_location(name, SCRIPTS / filename) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +updater = load("update_kernel_cachyos", "update-kernel-cachyos.py") +checker = load("check_versions_revisions", "check-versions.py") +TEMPLATE = '''MY_RELEASE="${PV}-1" +SLOT="0" +src_unpack() { + case ${archive} in + "${MY_KERNEL}") expected=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ;; + "${MY_HEADERS}") expected=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb ;; + esac +} +''' + + +class KernelUpdates(unittest.TestCase): + def setUp(self): + self.temporary = tempfile.TemporaryDirectory() + self.addCleanup(self.temporary.cleanup) + self.root = Path(self.temporary.name) + self.package = self.root / "packages/sys-kernel/kernel-cachyos" + self.package.mkdir(parents=True) + self.recipe("7.2.9", TEMPLATE) + + def recipe(self, version, text): + path = self.package / f"kernel-cachyos-{version}.exheres-0" + path.write_text(text) + return path + + def run_update(self, version, error=None): + def download(url, destination): + if error == "download" and "headers" in url: + raise updater.UpdateError("no matching headers") + destination.write_bytes(b"archive") + return "a" * 64 if "headers" not in url else "b" * 64 + + def inspect(_archive, name, _release): + if error == "inspect" and name == "linux-cachyos-headers": + raise updater.UpdateError("mismatched headers") + + with patch.object(updater, "latest_aur_release", return_value=version), \ + patch.object(updater, "download", side_effect=download), \ + patch.object(updater, "inspect_archive", side_effect=inspect): + updater.update(self.root) + + def names(self): + return sorted(path.name for path in self.package.iterdir()) + + def test_same_pv_replaces_previous_recipe(self): + self.run_update("7.2.9-2") + self.assertEqual(self.names(), ["kernel-cachyos-7.2.9-r1.exheres-0"]) + revised = (self.package / "kernel-cachyos-7.2.9-r1.exheres-0").read_text() + self.assertIn('MY_RELEASE="${PV}-2"', revised) + self.assertIn('SLOT="0"', revised) + self.assertIn("a" * 64, revised) + self.assertIn("b" * 64, revised) + found, problems = checker.recipes(self.root) + self.assertEqual(problems, []) + self.assertEqual(found["sys-kernel/kernel-cachyos"], "7.2.9-r1") + self.assertEqual(checker.kernel_release(self.root, "7.2.9-r1"), "7.2.9-2") + + def test_next_pkgrel_and_new_version(self): + self.run_update("7.2.9-2") + self.run_update("7.2.9-3") + self.assertEqual(self.names(), ["kernel-cachyos-7.2.9-r2.exheres-0"]) + self.run_update("7.3.0-1") + self.assertEqual(self.names(), ["kernel-cachyos-7.3.0.exheres-0"]) + + def test_noop_and_failure_preserve_recipes(self): + before = self.names() + self.run_update("7.2.9-1") + self.assertEqual(self.names(), before) + for version, error in (("7.2.9-3", None), ("7.2.9-2", "download"), ("7.2.9-2", "inspect")): + with self.subTest(version=version, error=error), self.assertRaises(updater.UpdateError): + self.run_update(version, error) + self.assertEqual(self.names(), before) + + def test_duplicate_and_legacy_slot_are_rejected(self): + old = self.recipe("7.2.8", TEMPLATE) + found, problems = checker.recipes(self.root) + self.assertIn("keep only one kernel-cachyos recipe", problems) + self.assertIn("sys-kernel/kernel-cachyos", found) + with patch.object(updater, "latest_aur_release") as aur, self.assertRaises(updater.UpdateError): + updater.update(self.root) + aur.assert_not_called() + old.unlink() + current = self.package / "kernel-cachyos-7.2.9.exheres-0" + current.write_text(TEMPLATE.replace('SLOT="0"', 'SLOT="${PV}"')) + with patch.object(updater, "latest_aur_release") as aur, self.assertRaises(updater.UpdateError): + updater.update(self.root) + aur.assert_not_called() + self.assertEqual(self.names(), ["kernel-cachyos-7.2.9.exheres-0"]) + + def test_bad_aur_response_preserves_recipes(self): + before = self.names() + for status in (403, 429): + with self.subTest(status=status): + from urllib.error import HTTPError + with patch.object(updater.urllib.request, "urlopen", side_effect=HTTPError(updater.AUR_URL, status, "blocked", {}, None)): + with self.assertRaises(updater.UpdateError): + updater.update(self.root) + self.assertEqual(self.names(), before) + + def test_aur_payload(self): + payload = json.dumps({"resultcount": 1, "results": [{"Name": "linux-cachyos", "Version": "7.2.9-2"}]}).encode() + with patch.object(updater.urllib.request, "urlopen", return_value=io.BytesIO(payload)): + self.assertEqual(updater.latest_aur_release(), "7.2.9-2") + + def test_archive_metadata_and_paths(self): + def archive(name, unsafe=False): + path = self.root / f"{name}.tar.zst" + module = "usr/lib/modules/7.2.9-2-cachyos" + items = { + ".PKGINFO": f"pkgname = {name}\npkgver = 7.2.9-2\narch = x86_64_v3\n".encode(), + } + if name == "linux-cachyos": + items.update({f"{module}/vmlinuz": b"kernel", f"{module}/kernel/example.ko.zst": b"module"}) + else: + items.update({f"{module}/build/{part}": b"header" for part in (".config", "Module.symvers", "System.map")}) + items[f"{module}/vdso/vdso64.so"] = b"vdso" + if unsafe: + items["../outside"] = b"bad" + raw = io.BytesIO() + with tarfile.open(fileobj=raw, mode="w") as tar: + for item, data in items.items(): + info = tarfile.TarInfo(item) + info.size = len(data) + tar.addfile(info, io.BytesIO(data)) + import subprocess + path.write_bytes(subprocess.run(["zstd", "-cq"], input=raw.getvalue(), stdout=subprocess.PIPE, check=True).stdout) + return path + + updater.inspect_archive(archive("linux-cachyos"), "linux-cachyos", "7.2.9-2") + updater.inspect_archive(archive("linux-cachyos-headers"), "linux-cachyos-headers", "7.2.9-2") + with self.assertRaises(updater.UpdateError): + updater.inspect_archive(archive("linux-cachyos", unsafe=True), "linux-cachyos", "7.2.9-2") + with self.assertRaises(updater.UpdateError): + updater.inspect_archive(archive("linux-cachyos"), "linux-cachyos", "7.2.9-3") + + def test_directory_cannot_stand_in_for_required_file(self): + archive = self.root / "invalid.tar.zst" + module = "usr/lib/modules/7.2.9-2-cachyos" + raw = io.BytesIO() + with tarfile.open(fileobj=raw, mode="w") as tar: + metadata = b"pkgname = linux-cachyos\npkgver = 7.2.9-2\narch = x86_64_v3\n" + info = tarfile.TarInfo(".PKGINFO") + info.size = len(metadata) + tar.addfile(info, io.BytesIO(metadata)) + for name in (f"{module}/vmlinuz", f"{module}/kernel/example"): + info = tarfile.TarInfo(name) + info.type = tarfile.DIRTYPE + tar.addfile(info) + import subprocess + archive.write_bytes(subprocess.run(["zstd", "-cq"], input=raw.getvalue(), stdout=subprocess.PIPE, check=True).stdout) + with self.assertRaises(updater.UpdateError): + updater.inspect_archive(archive, "linux-cachyos", "7.2.9-2") + + +if __name__ == "__main__": + unittest.main() -- cgit v1.3