commit:     4fd61264a1b55e199dcb98c46f922592219b1fbf
Author:     Lucio Sauer <watermanpaint <AT> posteo <DOT> net>
AuthorDate: Wed Jul 23 13:17:44 2025 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Thu Sep 11 03:27:03 2025 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=4fd61264

app-misc/anki: add 25.09

* Enable py3_14
* Make xdg eclass deps conditional on USE=gui
* Require GUI when compiling docs

  Since the doc USE flag adds documentation for the Python modules used
  in the GUI, providing it for USE="doc,-gui" makes no sense.
  Previously, this just pulled in unused dependencies without generating
  any output.

Fixes: 3b9198bdf25bfcdf1dd878e39c202ecae74c6ed2
Fixes: e6b81091d520c123d552d521073088a19748ee78
Signed-off-by: Lucio Sauer <watermanpaint <AT> posteo.net>
Part-of: https://github.com/gentoo/gentoo/pull/43425
Signed-off-by: Sam James <sam <AT> gentoo.org>

 app-misc/anki/Manifest          |   5 +
 app-misc/anki/anki-25.09.ebuild | 320 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 325 insertions(+)

diff --git a/app-misc/anki/Manifest b/app-misc/anki/Manifest
index 63c0427dc88a..a17160c3c5da 100644
--- a/app-misc/anki/Manifest
+++ b/app-misc/anki/Manifest
@@ -1,7 +1,12 @@
 DIST anki-25.07.1-crates.tar.xz 62239872 BLAKE2B 
1179594a32fd93d47f5b385db08dc023685bb9a03b01078f32e5ccff72488e0f25a2b445601362221523afd2a8816409cd965e52d7a599801349de3baef626fe
 SHA512 
f82c51a5b63518a94807e8daa1a97e50f372632c8409a285e51daa7d7988d3a358ada16e364d9bb0ad2eff042c280877743a8ce35d32ad10b10dbf4f6cd22ce2
 DIST anki-25.07.1-node_modules.tar.xz 191719888 BLAKE2B 
87748620fc8d57cf92ae5cafba6ac8ffa035a7147a2611cb432e85cf0248b76fc6020d3a13860a3ac7031e4d39b72d2aad8ab02184781326a3642c84e2f9b422
 SHA512 
6b2246600e5fd2bfbd3a589ce09cea4edeab13265889bde9ca62041d1f2ed6254f4bc4edad14a0be33bee6443bfd2576908d7084cf32ab5c2a5878343e32c1ab
 DIST anki-25.07.3.gh.tar.gz 2511739 BLAKE2B 
a879fd84ff125e0ce5b0dbf11161d4889d4623f5d8e428ad81a26d982cabd58f98d349d2711cc37214311395b30afa6d041eb7e5ed80a983862360fca1fbd0c4
 SHA512 
a9f6243f0a92e30363e697a8f1f366c5411342a4a13b26b0b6f722d8f2c4dbe4364cd090fc0f1bef593deea9f12c0b7d98a401d97eaa35c4bc64623d37cc5ea2
+DIST anki-25.09-crates.tar.xz 61467196 BLAKE2B 
e6fc583b140ae8c83cdaf4faff734b0b21ccff3b19e7f79331ce31d1fa14764df88e9fa772897bfee37d645bb04b31ac56b6a4b636a7b6645ca6568a3ed3221b
 SHA512 
b72c7bb666c6a4a1c460f49d3f1d09e9ec6cf2e677751f145bc8679c229202433f3de59a0e5faf4b774ef15e4d68ad3cb67a93ef9241a08382f829e7e2d55fe7
+DIST anki-25.09-node_modules.tar.xz 189664744 BLAKE2B 
eb04828909dd52712679439cca5557a7dd7d015e27bb8423aa2286f0004fa07320976222374e5a732817d7af7227efbffccfe11f8c3a42ca50af13640bc97fdf
 SHA512 
9695fbce75bc6da741f012b961f7de2972cda49c088e8803d8276f5eb2b3963ac94667bd6ab4b5a40d96ca5d3c107305c5c47f8b62fc232f6bfc71be808d1fe6
+DIST anki-25.09.gh.tar.gz 2518339 BLAKE2B 
b3d3bd70382c889077f9c9ffe471372adc56e7fed8d9362c95571722196fd96d14db5719e2c5d562d7b0888f402e00007bac7b02be00b1ed3ff6a133becbd971
 SHA512 
ad56479c7aa6d57e3f96529aa5ba93560d5cb31b774152af19af8f6418d6e91b947a62127c7a04c49f8eb7e83955e85c57ee4f5f6a75f682df67abd847b53dc6
+DIST anki-core-i18n-6552c95a81d162422b2a50126547cc7f1b50c2fd.gh.tar.gz 1731528 
BLAKE2B 
2ec2f7ab687eb7d8848fff021704c9f689a5f81b2693edf6c40bdd3eaf793f71da3da0d1ec6ad23ee9e23dbae15bb68c84f53c1d8ced6ed0d055aacd6aab8dd4
 SHA512 
fc65966f77ea00c61c013fa646e7c9d9e276ddc1126f7a754ff468078ec0b10c0376e21f07a8add299846150985651bd1879ef7fe18b5dbdcf025a337bb53550
 DIST anki-core-i18n-b90ef6f03c251eb336029ac7c5f551200d41273f.gh.tar.gz 1690917 
BLAKE2B 
ffd1708f2c40346e2f8b9e800ce1b494cae289d970127e271862c79fcc7fbac1dcb046ff035a96ad3496e27f86638300c5aa47620cc0a34f1d5dc3194d23de0c
 SHA512 
6f9308b0001e4ae4cd9d4f368a5cc0e92df8b7705a2f7d94b2f92d404afd7484b3860e090335e2c7f91298d0690db40ee11929fa2060e0df2861313c6e52b80f
 DIST anki-desktop-ftl-9aa63c335c61b30421d39cf43fd8e3975179059c.gh.tar.gz 
250925 BLAKE2B 
ff14253eeae0355e16388af2d44b3ac086c447909b211a2741c54320044c84f53b8bb76a2aee3197db0bd010436b6d411a8f0ac79f2ba9353fe691bfa33ecc99
 SHA512 
647204336110b977987fb8f88d52613d544012150b4ff70ff6e704730c60576a5928ba02bfb2049ab38fc0b27cb238f98bdfbe7a8ec6b7a1f911d9ad1fb5d22b
+DIST anki-desktop-ftl-dad4e2736a2b53dcdb52d79b5703dd464c05d666.gh.tar.gz 
256169 BLAKE2B 
6307910c26ca9408c343423828844359ad249d08eddbdcfdd1832f7fe5c6417c594afbcd08096dc60869db278599394e101b2039710cc4cf0233cdc7ebd0a05d
 SHA512 
4ea7ce3f02c35ed7e04729d2ccdef102a2f87a2361716bb8e2df7a960884923119fe21b079d09e1a64565620623281616acd5f5bf72bbe98a6bd1d2f167c4b53
 DIST linkcheck-184b2ca50ed39ca43da13f0b830a463861adb9ca.gh.tar.gz 19408 
BLAKE2B 
c5e4f155f2d79d6d4340eaf3caaab8cbc0a558bc351d06b6c77ac4b61afa4172f5e3497106d5535b79911c7697a74ef8765f3fdcb7b602edb7524d6b5169a6fc
 SHA512 
2cff7ad872c9ce3b29a8c74f9ce1ca365f6c381e1d9bc5da46bb34d0687708164ad86fb78baecdb596de37f79f891d1326b994348e51f4e74ec2731da23034d4
 DIST rust-url-bb930b8d089f4d30d7d19c12e54e66191de47b88.gh.tar.gz 394844 
BLAKE2B 
e3c0cabca18a77cc71bb9982bbd7d49c540f5a597c993f66fb9cf52b0a4ecce2ef909cfe9b466767c0021c3adf8a0b9733d40e90d341bd2a97b5e9cbcc8e8037
 SHA512 
bad4ba7801168bed869ef3b9510566ed625fe345b3209f08d781ad07a03df61c28b52d1cb3992d614ffdf5af198c33bb725f612f5010b6965d8bbb519d818e2e

diff --git a/app-misc/anki/anki-25.09.ebuild b/app-misc/anki/anki-25.09.ebuild
new file mode 100644
index 000000000000..492da69e04ac
--- /dev/null
+++ b/app-misc/anki/anki-25.09.ebuild
@@ -0,0 +1,320 @@
+# Copyright 2022-2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_EXT=1
+DISTUTILS_OPTIONAL=1
+DISTUTILS_SINGLE_IMPL=1
+DISTUTILS_USE_PEP517=hatchling
+PYTHON_COMPAT=( python3_{11..14} )
+
+declare -A GIT_CRATES=(
+       
[linkcheck]='https://github.com/ankitects/linkcheck;184b2ca50ed39ca43da13f0b830a463861adb9ca;linkcheck-%commit%'
+       
[percent-encoding-iri]='https://github.com/ankitects/rust-url;bb930b8d089f4d30d7d19c12e54e66191de47b88;rust-url-%commit%/percent_encoding'
+)
+RUST_MIN_VER="1.88.0"
+
+inherit cargo desktop distutils-r1 edo greadme multiprocessing ninja-utils \
+       optfeature toolchain-funcs xdg-utils
+
+DESCRIPTION="Smart spaced repetition flashcard program"
+HOMEPAGE="https://apps.ankiweb.net/";
+
+declare -A COMMITS=(
+       [anki]="539054c34dccf8b89ca7ea9c9c40ecaf172de759"
+       [ftl-core]="6552c95a81d162422b2a50126547cc7f1b50c2fd"
+       [ftl-desktop]="dad4e2736a2b53dcdb52d79b5703dd464c05d666"
+)
+SRC_URI="${CARGO_CRATE_URIS}
+       https://github.com/ankitects/anki/archive/refs/tags/${PV}.tar.gz -> 
${P}.gh.tar.gz
+       
https://github.com/ankitects/anki-core-i18n/archive/${COMMITS[ftl-core]}.tar.gz
+       -> anki-core-i18n-${COMMITS[ftl-core]}.gh.tar.gz
+       
https://github.com/ankitects/anki-desktop-ftl/archive/${COMMITS[ftl-desktop]}.tar.gz
+       -> anki-desktop-ftl-${COMMITS[ftl-desktop]}.gh.tar.gz
+       
https://github.com/gentoo-crate-dist/anki/releases/download/${PV}/${P}-crates.tar.xz
+       gui? (
+               https://home.cit.tum.de/~salu/distfiles/${P}-node_modules.tar.xz
+       )
+"
+# How to get an up-to-date summary of runtime JS libs' licenses:
+# ./node_modules/.bin/license-checker-rseidelsohn --production 
--excludePackages anki --summary
+LICENSE="
+       AGPL-3+ BSD public-domain
+       gui? ( CC0-1.0 CC-BY-4.0 )
+"
+# Dependent crate licenses
+LICENSE+="
+       Apache-2.0 Apache-2.0-with-LLVM-exceptions BSD-2 CC0-1.0
+       CDLA-Permissive-2.0 ISC MIT MPL-2.0 Unicode-3.0 Unlicense ZLIB
+"
+# ring crate
+LICENSE+=" openssl"
+SLOT="0"
+KEYWORDS="~amd64"
+
+IUSE="+gui"
+REQUIRED_USE="
+       doc? ( gui )
+       gui? ( ${PYTHON_REQUIRED_USE} )
+"
+RESTRICT="!gui? ( test ) !test? ( test )"
+
+# Dependencies:
+# Python: python/requirements.{anki,aqt}.in
+# If ENABLE_QT5_COMPAT is set at runtime
+# additionally depend on PyQt6[dbus,printsupport].
+# Qt: qt/{aqt/{sound.py,qt/*.py},tools/build_ui.py}
+# app-misc/certificates: The rust backend library is built against
+# rustls-native-certs to use the native certificate store.
+# No ${PYTHON_DEPS} in DEPEND despite external module because it doesn't link
+# against libpython
+
+DEPEND="
+       >=app-arch/zstd-1.5.5:=
+       dev-db/sqlite:3
+"
+GUI_RDEPEND="
+       ${PYTHON_DEPS}
+       dev-qt/qtsvg:6
+       $(python_gen_cond_dep '
+               dev-python/beautifulsoup4[${PYTHON_USEDEP}]
+               dev-python/distro[${PYTHON_USEDEP}]
+               dev-python/decorator[${PYTHON_USEDEP}]
+               dev-python/flask[${PYTHON_USEDEP}]
+               dev-python/flask-cors[${PYTHON_USEDEP}]
+               dev-python/jsonschema[${PYTHON_USEDEP}]
+               dev-python/markdown[${PYTHON_USEDEP}]
+               dev-python/protobuf[${PYTHON_USEDEP}]
+               
>=dev-python/pyqt6-6.6.1[gui,network,opengl,quick,webchannel,widgets,${PYTHON_USEDEP}]
+               >=dev-python/pyqt6-sip-13.6.0[${PYTHON_USEDEP}]
+               >=dev-python/pyqt6-webengine-6.6.0[widgets,${PYTHON_USEDEP}]
+               dev-python/requests[${PYTHON_USEDEP}]
+               dev-python/send2trash[${PYTHON_USEDEP}]
+               dev-python/waitress[${PYTHON_USEDEP}]
+       ')
+"
+RDEPEND="
+       ${DEPEND}
+       app-misc/ca-certificates
+       gui? ( ${GUI_RDEPEND} )
+"
+IDEPEND="
+       gui? (
+               dev-util/desktop-file-utils
+               x11-misc/shared-mime-info
+       )
+"
+BDEPEND="
+       >=app-arch/zstd-1.5.5:=
+       dev-libs/protobuf[protoc(+)]
+       virtual/pkgconfig
+       gui? (
+               ${DISTUTILS_DEPS}
+               ${PYTHON_DEPS}
+               app-alternatives/ninja
+               >=net-libs/nodejs-20.12.1
+               sys-apps/yarn
+               $(python_gen_cond_dep 'dev-python/pyqt6[${PYTHON_USEDEP}]')
+       )
+       test? (
+               ${RDEPEND}
+               app-text/dvipng
+               app-text/texlive
+               dev-libs/openssl
+               dev-util/cargo-nextest
+               $(python_gen_cond_dep 'dev-python/mock[${PYTHON_USEDEP}]')
+       )
+"
+
+distutils_enable_sphinx python/sphinx \
+                       dev-python/sphinx-autoapi \
+                       dev-python/sphinx-rtd-theme
+
+EPYTEST_PLUGINS=()
+distutils_enable_tests pytest
+
+PATCHES=(
+       "${FILESDIR}"/24.06.3/remove-yarn.patch
+       "${FILESDIR}"/24.04.1/remove-mypy-protobuf.patch
+       "${FILESDIR}"/24.04.1/revert-cert-store-hack.patch
+       "${FILESDIR}"/23.12.1/ninja-rules-for-cargo.patch
+)
+
+QA_FLAGS_IGNORED="usr/bin/anki-sync-server
+       usr/lib/python.*/site-packages/anki/_rsbridge.so"
+
+pkg_setup() {
+       export PROTOC_BINARY="${BROOT}"/usr/bin/protoc
+       export LIBSQLITE3_SYS_USE_PKG_CONFIG=1
+       export ZSTD_SYS_USE_PKG_CONFIG=1
+       rust_pkg_setup
+       use gui && python-single-r1_pkg_setup
+}
+
+python_prepare_all() {
+       mv "${WORKDIR}"/node_modules out || die
+
+       # Expected files and directories
+       mkdir .git out/env || die
+       mkdir -p out/pyenv/bin || die
+
+       if use doc; then
+               sed "/^REPO_ROOT/s|=.*|= \"${S}\"|" -i python/sphinx/conf.py || 
die
+       fi
+
+       # Unpin Yarn
+       sed -e '/"type": "module"/s/,//' \
+               -e '/packageManager/d' -i package.json || die
+
+       # Not running the black formatter on generated files saves a dependency
+       sed '/subprocess/d' -i pylib/tools/hookslib.py || die
+
+       # Fix hardcoded runner location
+       export CARGO_TARGET_DIR="${S}"/out/rust
+       cbuild_dir="$(CHOST=${CBUILD:-${CHOST}} cargo_target_dir)"
+       sed "s,rust/release,${cbuild_dir##*out/}," \
+               -i build/ninja_gen/src/render.rs || die
+       # Separate src_configure from runner build
+       sed '/ConfigureBuild/d' -i build/ninja_gen/src/build.rs || die
+       distutils-r1_python_prepare_all
+}
+
+python_prepare() {
+       ln -s "${PYTHON}" out/pyenv/bin/python || die
+}
+
+src_prepare() {
+       default
+       rm -r ftl/{core,qt}-repo || die
+       ln -s "${WORKDIR}"/anki-core-i18n-${COMMITS[ftl-core]} ftl/core-repo || 
die
+       ln -s "${WORKDIR}"/anki-desktop-ftl-${COMMITS[ftl-desktop]} ftl/qt-repo 
|| die
+
+       mkdir out || die
+       echo -e "${COMMITS[anki]:0:8}" > out/buildhash || die
+
+       # None of our ninja implementations are n2
+       sed 's/which::which("n2").*/false,/' -i build/ninja_gen/src/build.rs || 
die
+
+       use gui && distutils-r1_src_prepare
+}
+
+_cbuild_cargo_build() {
+       CHOST=${CBUILD:-${CHOST}} cargo_src_compile "${@}"
+}
+
+python_configure_all() {
+       tc-env_build _cbuild_cargo_build -p configure
+
+       local -x NODE_BINARY="${BROOT}"/usr/bin/node \
+       YARN_BINARY="${BROOT}"/usr/bin/yarn \
+       UV_BINARY="${BROOT}"/bin/true \
+       OFFLINE_BUILD=1
+       if ! use debug; then
+               if tc-is-lto; then
+                       local -x RELEASE=2
+               else
+                       local -x RELEASE=1
+               fi
+       fi
+       cargo_env edo "${cbuild_dir}"/configure
+       unset cbuild_dir
+}
+
+src_configure() {
+       cargo_gen_config
+       cargo_src_configure
+       use gui && distutils-r1_src_configure
+}
+
+python_compile() {
+       tc-env_build _cbuild_cargo_build -p runner
+       cargo_env eninja -f out/build.ninja pylib qt
+       declare -A wheel_tags=(
+               [pylib]="cp39-abi3-manylinux_2_36_x86_64"
+               [qt]="py3-none-any"
+       )
+       local dir
+       for dir in ${!wheel_tags[@]}; do
+               pushd ${dir} > /dev/null || die
+               local -x ANKI_WHEEL_TAG=${wheel_tags[${dir}]}
+               distutils-r1_python_compile
+               popd || die
+       done
+}
+
+src_compile() {
+       if use gui; then
+               distutils-r1_src_compile
+       else
+               cargo_src_compile -p anki-sync-server
+       fi
+}
+
+python_test() {
+       epytest qt
+       epytest pylib
+}
+
+python_test_all() {
+       local -x NEXTEST_TEST_THREADS="$(makeopts_jobs)"
+       edo cargo nextest run $(usev !debug '--release') \
+                       --color always \
+                       --all-features \
+                       --tests \
+                       --no-fail-fast
+       eninja -f out/build.ninja check_vitest
+}
+
+src_test() {
+       local -x ANKI_TEST_MODE=1
+       distutils-r1_src_test
+}
+
+python_install_all() {
+       pushd qt/launcher/lin > /dev/null || die
+       doman anki.1
+       doicon anki.{png,xpm}
+       domenu anki.desktop
+       insinto /usr/share/mime/packages
+       doins anki.xml
+       popd || die
+       distutils-r1_python_install_all
+}
+
+src_install() {
+       greadme_stdin <<- EOF
+       Anki's user manual is located online at https://docs.ankiweb.net/
+       Anki's add-on developer manual is located online at 
https://addon-docs.ankiweb.net/
+       EOF
+
+       if use gui; then
+               distutils-r1_src_install
+       else
+               cargo_src_install --path rslib/sync
+       fi
+}
+
+pkg_postinst() {
+       greadme_pkg_postinst
+       if use gui; then
+               xdg_desktop_database_update
+               xdg_mimeinfo_database_update
+               optfeature "LaTeX in cards" "app-text/texlive[extra] 
app-text/dvipng"
+               optfeature "sound support" media-video/mpv media-video/mplayer
+               optfeature "recording support" "media-sound/lame[frontend] 
dev-python/pyqt6[multimedia]"
+               optfeature "faster database operations" dev-python/orjson
+               optfeature "Vulkan driver" "media-libs/vulkan-loader 
dev-qt/qtbase:6[vulkan]
+                       dev-qt/qtdeclarative:6[vulkan] 
dev-qt/qtwebengine:6[vulkan]"
+
+               einfo "You can customize the LaTeX header for your cards to fit 
your needs:"
+               einfo "Notes > Manage Note Types > [select a note type] > 
Options"
+       fi
+}
+
+pkg_postrm() {
+       if use gui; then
+               xdg_desktop_database_update
+               xdg_mimeinfo_database_update
+       fi
+}

Reply via email to