commit: 794a949f0391b5c4fbfed8a4d603e47a6b3d1b3f Author: Lucio Sauer <watermanpaint <AT> posteo <DOT> net> AuthorDate: Sun Jul 6 07:47:06 2025 +0000 Commit: Sam James <sam <AT> gentoo <DOT> org> CommitDate: Tue Jul 8 19:47:35 2025 +0000 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=794a949f
app-misc/anki: add 25.07.1 * Upstream now generates the wheels using the hatchling backend and uv as frontend. Since the disutils-r1 eclass calls the backend directly using dev-python/gpep517, we can remove all references to the frontend and omit the dependency. * Follow up on 0d7c8f89 and drop the x86 keyword. * Disable pytest plugin autoload. * Extract Python-specific code into the appropriate sub-phases. * Invoke cargo-nextest with common options found across ::gentoo. * Use edo where it's sensible. Signed-off-by: Lucio Sauer <watermanpaint <AT> posteo.net> Part-of: https://github.com/gentoo/gentoo/pull/42917 Signed-off-by: Sam James <sam <AT> gentoo.org> app-misc/anki/Manifest | 5 + app-misc/anki/anki-25.07.1.ebuild | 314 +++++++++++++++++++++ .../anki/files/anki-25.07.1-remove-aqt-data.patch | 19 ++ 3 files changed, 338 insertions(+) diff --git a/app-misc/anki/Manifest b/app-misc/anki/Manifest index df330c0abc8c..ca9594f89e58 100644 --- a/app-misc/anki/Manifest +++ b/app-misc/anki/Manifest @@ -1,7 +1,12 @@ DIST anki-25.02.4-node_modules.tar.xz 304237316 BLAKE2B 270db46a9d7d64f87a57052f82071108e78371805e68c7d426dad268edd4f548b2ace4e7f2712597f4894e7c4d20fa7a9e72e3cd2278f023317f40361bcf3a37 SHA512 820495a61a3bf5bdaeaf40c4ae6d1b1cf3a9b2924494c40c66065b4b4214e52cfaf6477af2b7e801500e180f8c6956881c5206b049996ab0ae58f45966a368f4 DIST anki-25.02.5-crates.tar.xz 57606472 BLAKE2B 40f976c4e20c6ecd0877db05a733bd66b608e1e054177479ec3068a5d9d8b8dcd32495a4c81caee4e37e12090bb8b000f41f7c3162e3d7b80dbe522bca797f47 SHA512 f382f304ead6edee5c64472945ac56fb418adf046129c45771862ff5732a1a944f84e6d80ef590f11bde2ca2058c989ed70847ebb791f101af9a3ad34285d396 DIST anki-25.02.6.gh.tar.gz 2433980 BLAKE2B 6a572f21f72f79da3e8faf384b04978bb26e2f4b0414f67658d41d434b3244641cdcab51af9027fc86280f1bdafb3790eb1a7a3de3700f231b145d959c2f81fe SHA512 acb9f29842f8025752fa4dd3e5de58b6f066c85f6862d97dd44e20fe622dd49347057f8c97174c7477f5bb291210af477bd58b6e9e3f18ebde46f54c1e04380c +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.1.gh.tar.gz 2505851 BLAKE2B dace7ba31895875963f6c54f9ed0a6b97c7e4f2394b1135a4d9001a6cc0251d3b246e8de9072c556240321bd960c59cb6f38b371e582fd363c58218c50e06c15 SHA512 bc800d97df5ff48b9e7e7a714c836796597fbebbd66ac5ed8574c1927376ac696d67d72d5c245b71ce6534fadce13dc951212389aa22772637b9e986977ff357 DIST anki-core-i18n-0fe0162f4a18e8ef2fbac1d9a33af8e38cf7260e.gh.tar.gz 1521578 BLAKE2B 101505d871df70316222db08f2bc85fdd00be81320600c64c76bb51565a88c13fa6fdd9e059ed404931f2dc97611cf2a954650d10d6556cd181427dbffc4f1a6 SHA512 c72eaea9e0f350d092a44f7623a7cfdcb74ff99a97ca4b53c51b1b26af387c9c6cd64bfca3dc4577c14c3ee4040b8ce1a7a50f2e209b0fa47c5297f97c92a910 +DIST anki-core-i18n-a9216499ba1fb1538cfd740c698adaaa3410fd4b.gh.tar.gz 1663490 BLAKE2B d09d9df034b9e4be426ac63eb8fbc78ef8027b5e2a75e172ee44416227ee83c4d9095b61cde87d5d1dbcc2d91d04d0891bca3b3850b99a2111932473a30167eb SHA512 d59493e6cb0de6519c268ec52fc1021f34548e87553325c9b6874af8cc0bc5211e1819aad1015abe5c226517fbd179304928559cd8c404d4d53923e3917b943e DIST anki-desktop-ftl-17216b03db7249600542e388bd4ea124478400e5.gh.tar.gz 235720 BLAKE2B 0e1a454dbfa5f0f8750000c86b1468c7cfde99e53e6e7683820f5523963c4187e76ef40c4be4c2ef7037cc269f258fe3270ba99006912fb2844ba6cc18dc91d3 SHA512 6d91607c6b0805e6dfce8a93dbf46ac945e9b1631aa054cb98e513d7a6da64d905035b8da8ea5d10c0d700a0aa96b056748d956342fe4ddf7232f7f7540ee88a +DIST anki-desktop-ftl-a1134ab59d3d23468af2968741aa1f21d16ff308.gh.tar.gz 248333 BLAKE2B b4cc10764df8ad39df670adba6a4dee54bfd07022bfe61bf3e15bf708772323cad892a299f0641f67f49cbfe499cd01caed5479f8855bc852316549c9ecbe858 SHA512 23b745671edb3be1f5c42f6b657a6c36e3892e70276765652b3d80d5e5eab149a6420cbaac97b193f18241eb969cdd77e97df697c12590bbcc78e34c779dc027 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.07.1.ebuild b/app-misc/anki/anki-25.07.1.ebuild new file mode 100644 index 000000000000..cccf0dbf6c13 --- /dev/null +++ b/app-misc/anki/anki-25.07.1.ebuild @@ -0,0 +1,314 @@ +# 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..13} ) + +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.85.0" + +inherit cargo desktop distutils-r1 edo greadme multiprocessing ninja-utils \ + optfeature toolchain-funcs xdg + +DESCRIPTION="Smart spaced repetition flashcard program" +HOMEPAGE="https://apps.ankiweb.net/" + +declare -A COMMITS=( + [anki]="a83a6b5928c6563d12e7b66d4f7b7b2f51b6f22b" + [ftl-core]="a9216499ba1fb1538cfd740c698adaaa3410fd4b" + [ftl-desktop]="a1134ab59d3d23468af2968741aa1f21d16ff308" +) +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? ( 0BSD BlueOak-1.0.0 CC-BY-3.0 CC-BY-4.0 PSF-2 ) +" +# 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="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} ) +" + +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}] + dev-python/wheel[${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}"/${P}-remove-aqt-data.patch + "${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 + # We build wheels without invoking the uv frontend + sed -i '/uv_binary/d' build/configure/src/python.rs || 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 \ + 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_preinst() { + greadme_pkg_preinst + use gui && xdg_pkg_preinst +} + +pkg_postinst() { + greadme_pkg_postinst + if use gui; then + xdg_pkg_postinst + 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 +} diff --git a/app-misc/anki/files/anki-25.07.1-remove-aqt-data.patch b/app-misc/anki/files/anki-25.07.1-remove-aqt-data.patch new file mode 100644 index 000000000000..3bff077a2709 --- /dev/null +++ b/app-misc/anki/files/anki-25.07.1-remove-aqt-data.patch @@ -0,0 +1,19 @@ +Upstream intends to include qt/aqt/data in the wheel under _aqt/ but +ends up including it under aqt/ as well. This is a minimal version of +the patch I sent upstream: +https://github.com/ankitects/anki/pull/4180 +From: Lucio Sauer <[email protected]> +--- a/qt/pyproject.toml ++++ b/qt/pyproject.toml +@@ -77,7 +77,7 @@ ankiw = "aqt:run" + + [tool.hatch.build.targets.wheel] + packages = ["aqt"] +-exclude = ["**/*.scss", "**/*.ui"] ++exclude = ["aqt/data", "**/*.ui"] + + [tool.hatch.version] + source = "code" +-- +2.49.0 +
