[Bug]: TagStudio breaks in nixos-unstable
Checklist
- [x] I am using an up-to-date version.
- [x] I have read the documentation.
- [x] I have searched existing issues.
TagStudio Version
97ee43c
Operating System & Version
NixOS 25.05 (Warbler), 25.05.20250417.b024ced (NixOS/nixpkgs/b024ced1aac25639f8ca8fdfc2f8c4fbd66c48ef)
Description
It looks like there is a regression for the GlobalMenu in the current packages from nixos-unstable.
(See PR #870 and it's linked issues.)
It doesn't work for Nixpkgs Commit b024ced. If I'm not mistaken, it worked at least until Nixpkgs Commit 2631b0b.
I discovered this because I was trying to update my system and there is a build error. There were also some other questionable messages about fontconfig and ffmpeg.
Apart from the JXL plugin, I'm using the installation suggested in the documentation.
TagStudio Installation in Flake
flake.nix:
tagstudio = {
url = "github:TagStudioDev/TagStudio";
inputs.nixpkgs.follows = "nixpkgs";
};
home.nix:
inputs.tagstudio.packages.${pkgs.stdenv.hostPlatform.system}.tagstudio-jxl
In order to update my system at all, I had to remove inputs.nixpkgs.follows = "nixpkgs";.
However, as mentioned above, the global menu is now missing too. If I saw it correctly, new QT packages were deployed. That one might have something to do with that.
Expected Behavior
- A working global menu.
- Working build with
inputs.nixpkgs.follows = "nixpkgs";,- like recommended in Documentation for NixOS.
Steps to Reproduce
Rebuild System Flake with TagStudio.
Logs
System Flake Rebuild Output
error: builder for '/nix/store/ky5xbswbwip8il43hald97408p6igdrb-TagStudio-9.5.2.drv' failed with exit code 1;
last 25 log lines:
> tests/qt/test_file_path_options.py: 3 warnings
> tests/qt/test_qt_driver.py: 4 warnings
> /nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2/lib/python3.12/site-packages/tagstudio/core/library/alchemy/library.py:910: SADeprecationWarning: DISTINCT ON is currently supported only by the PostgreSQL dialect. Use of DISTINCT ON for other backends is currently silently ignored, however this usage is deprecated, and will raise CompileError in a future release for all backends that do not support this syntax.
> query_full=str(statement.compile(compile_kwargs={"literal_binds": True})),
>
> tests/test_library.py: 25 warnings
> tests/macros/test_missing_files.py: 1 warning
> tests/macros/test_dupe_entries.py: 1 warning
> tests/test_search.py: 66 warnings
> tests/qt/test_file_path_options.py: 3 warnings
> tests/qt/test_qt_driver.py: 3 warnings
> /nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2/lib/python3.12/site-packages/tagstudio/core/library/alchemy/library.py:914: SADeprecationWarning: DISTINCT ON is currently supported only by the PostgreSQL dialect. Use of DISTINCT ON for other backends is currently silently ignored, however this usage is deprecated, and will raise CompileError in a future release for all backends that do not support this syntax.
> items = session.scalars(statement).fetchall()
>
> tests/test_search.py::test_single_constraint[-31]
> /nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2/lib/python3.12/site-packages/tagstudio/core/library/alchemy/visitors.py:61: SADeprecationWarning: Invoking or_() without arguments is deprecated, and will be disallowed in a future release. For an empty or_() construct, use 'or_(false(), *args)' or 'or_(False, *args)'.
> return or_(*[self.visit(element) for element in node.elements])
>
> -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
> =========================== short test summary info ============================
> FAILED tests/qt/test_tag_search_panel.py::test_update_tags - TypeError: Expected signal or callable, got "NoneType"
> ================= 1 failed, 193 passed, 442 warnings in 2.76s ==================
> 2025-04-19 14:37:26 [info ] [FFmpeg] Using FFprobe location: ffprobe (Not Found)
> 2025-04-19 14:37:26 [info ] [FFmpeg] Using FFmpeg location: ffmpeg (Not Found)
> 2025-04-19 14:37:27 [info ] [ResourceManager] Resources Registered: count=32
For full logs, run:
nix log /nix/store/ky5xbswbwip8il43hald97408p6igdrb-TagStudio-9.5.2.drv
error: 1 dependencies of derivation '/nix/store/v1283cwyfnrb0k7lqjgzbsqk5mypvq72-home-manager-path.drv' failed to build
error: 1 dependencies of derivation '/nix/store/igc3pdqq0vpw62kkcaljlz5rvrig63ma-home-manager-generation.drv' failed to build
error: 1 dependencies of derivation '/nix/store/0biz9hnd2dks8y09m6m192r33c7jhgzg-user-environment.drv' failed to build
error: 1 dependencies of derivation '/nix/store/bshg80qrla2app6d7ppjz5gjhfl4sc2h-etc.drv' failed to build
error: 1 dependencies of derivation '/nix/store/ba81vh6l2xpj8l9bfv6fmaszs062d50d-nixos-system-znix-25.05.20250417.b024ced.drv' failed to build
Full Build Log
$> `nix log /nix/store/ky5xbswbwip8il43hald97408p6igdrb-TagStudio-9.5.2.drv`
Sourcing python-remove-tests-dir-hook
Sourcing python-catch-conflicts-hook.sh
Sourcing python-remove-bin-bytecode-hook.sh
Sourcing pypa-build-hook
Using pypaBuildPhase
Sourcing python-runtime-deps-check-hook
Using pythonRuntimeDepsCheckHook
Sourcing pypa-install-hook
Using pypaInstallPhase
Sourcing python-imports-check-hook.sh
Using pythonImportsCheckPhase
Sourcing python-namespaces-hook
Sourcing python-catch-conflicts-hook.sh
Sourcing pytest-check-hook
/nix/store/lbw329diypjdljmc229l9h6zd51drp2v-pytest-check-hook/nix-support/setup-hook: line 41: warning: command substitution: 1 unterminated here-document
Using pytestCheckPhase
Running phase: qtPreHook
@nix { "action": "setPhase", "phase": "qtPreHook" }
Running phase: unpackPhase
@nix { "action": "setPhase", "phase": "unpackPhase" }
unpacking source archive /nix/store/lyyyp4wqkf4fyyvfs0giar16283i6rm5-ni78p1q4pliddyw4n2z4jbx36j19i96w-source
source root is ni78p1q4pliddyw4n2z4jbx36j19i96w-source
setting SOURCE_DATE_EPOCH to timestamp 315619200 of file "ni78p1q4pliddyw4n2z4jbx36j19i96w-source/tests/test_translations.py"
Running phase: patchPhase
@nix { "action": "setPhase", "phase": "patchPhase" }
Running phase: updateAutotoolsGnuConfigScriptsPhase
@nix { "action": "setPhase", "phase": "updateAutotoolsGnuConfigScriptsPhase" }
Running phase: configurePhase
@nix { "action": "setPhase", "phase": "configurePhase" }
no configure script, doing nothing
Running phase: buildPhase
@nix { "action": "setPhase", "phase": "buildPhase" }
Executing pypaBuildPhase
Creating a wheel...
pypa build flags: --no-isolation --outdir dist/ --wheel
[1m* Getting build dependencies for wheel...[0m
[1m* Building wheel...[0m
[1m[92mSuccessfully built [4mtagstudio-9.5.2-py2.py3-none-any.whl[0m[1m[92m[0m
Finished creating a wheel...
/build/ni78p1q4pliddyw4n2z4jbx36j19i96w-source/dist /build/ni78p1q4pliddyw4n2z4jbx36j19i96w-source
Unpacking to: unpacked/tagstudio-9.5.2...OK
Repacking wheel as ./tagstudio-9.5.2-py2.py3-none-any.whl...OK
/build/ni78p1q4pliddyw4n2z4jbx36j19i96w-source
Finished executing pypaBuildPhase
Running phase: pythonRuntimeDepsCheckHook
@nix { "action": "setPhase", "phase": "pythonRuntimeDepsCheckHook" }
Executing pythonRuntimeDepsCheck
Checking runtime dependencies for tagstudio-9.5.2-py2.py3-none-any.whl
Finished executing pythonRuntimeDepsCheck
Running phase: glibPreInstallPhase
@nix { "action": "setPhase", "phase": "glibPreInstallPhase" }
Running phase: glibPreInstallPhase
@nix { "action": "setPhase", "phase": "glibPreInstallPhase" }
Running phase: glibPreInstallPhase
@nix { "action": "setPhase", "phase": "glibPreInstallPhase" }
Running phase: installPhase
@nix { "action": "setPhase", "phase": "installPhase" }
Executing pypaInstallPhase
Successfully installed tagstudio-9.5.2-py2.py3-none-any.whl
Finished executing pypaInstallPhase
Running phase: pythonOutputDistPhase
@nix { "action": "setPhase", "phase": "pythonOutputDistPhase" }
Executing pythonOutputDistPhase
Finished executing pythonOutputDistPhase
Running phase: qtOwnPathsHook
@nix { "action": "setPhase", "phase": "qtOwnPathsHook" }
Running phase: gappsWrapperArgsHook
@nix { "action": "setPhase", "phase": "gappsWrapperArgsHook" }
Running phase: dropIconThemeCache
@nix { "action": "setPhase", "phase": "dropIconThemeCache" }
Running phase: dropIconThemeCache
@nix { "action": "setPhase", "phase": "dropIconThemeCache" }
Running phase: fixupPhase
@nix { "action": "setPhase", "phase": "fixupPhase" }
wrapping Qt applications in /nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2/bin /nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2/sbin /nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2/libexec /nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2/Applications
Wrapping program '/nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2/bin/tagstudio'
shrinking RPATHs of ELF executables and libraries in /nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2
shrinking /nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2/bin/tagstudio
checking for references to /build/ in /nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2...
patching script interpreter paths in /nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2
/nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2/lib/python3.12/site-packages/tagstudio/main.py: interpreter directive changed from "#!/usr/bin/env python" to "/nix/store/fqm9bqqlmaqqr02qbalm1bazp810qfiw-python3-3.12.9/bin/python"
stripping (with command strip and flags -S -p) in /nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2/lib /nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2/bin
shrinking RPATHs of ELF executables and libraries in /nix/store/1qjravg3dggw0al24mw5kdc9b4vzfhkj-TagStudio-9.5.2-dist
checking for references to /build/ in /nix/store/1qjravg3dggw0al24mw5kdc9b4vzfhkj-TagStudio-9.5.2-dist...
patching script interpreter paths in /nix/store/1qjravg3dggw0al24mw5kdc9b4vzfhkj-TagStudio-9.5.2-dist
Rewriting #!/nix/store/fqm9bqqlmaqqr02qbalm1bazp810qfiw-python3-3.12.9/bin/python3.12 to #!/nix/store/fqm9bqqlmaqqr02qbalm1bazp810qfiw-python3-3.12.9
wrapping `/nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2/bin/.tagstudio-wrapped'...
Executing pythonRemoveTestsDir
Finished executing pythonRemoveTestsDir
Running phase: installCheckPhase
@nix { "action": "setPhase", "phase": "installCheckPhase" }
no Makefile or custom installCheckPhase, doing nothing
Running phase: pythonCatchConflictsPhase
@nix { "action": "setPhase", "phase": "pythonCatchConflictsPhase" }
Running phase: pythonRemoveBinBytecodePhase
@nix { "action": "setPhase", "phase": "pythonRemoveBinBytecodePhase" }
Running phase: pythonImportsCheckPhase
@nix { "action": "setPhase", "phase": "pythonImportsCheckPhase" }
Executing pythonImportsCheckPhase
Check whether the following modules can be imported: tagstudio
Running phase: pytestCheckPhase
@nix { "action": "setPhase", "phase": "pytestCheckPhase" }
Executing pytestCheckPhase
pytest flags: -m pytest -k not\ \(test_build_tag_panel_add_alias_callback\)\ and\ not\ \(test_build_tag_panel_add_aliases\)\ and\ not\ \(test_build_tag_panel_add_sub_tag_callback\)\ and\ not\ \(test_build_tag_panel_build_tag\)\ and\ not\ \(test_build_tag_panel_remove_alias_callback\)\ and\ not\ \(test_build_tag_panel_remove_subtag_callback\)\ and\ not\ \(test_build_tag_panel_set_aliases\)\ and\ not\ \(test_build_tag_panel_set_parent_tags\)\ and\ not\ \(test_build_tag_panel_set_tag\)\ and\ not\ \(test_json_migration\)\ and\ not\ \(test_library_migrations\)\ and\ not\ \(test_add_same_tag_to_selection_single\)\ and\ not\ \(test_add_tag_to_selection_multiple\)\ and\ not\ \(test_add_tag_to_selection_single\)\ and\ not\ \(test_custom_tag_category\)\ and\ not\ \(test_file_path_display\)\ and\ not\ \(test_meta_tag_category\)\ and\ not\ \(test_update_selection_empty\)\ and\ not\ \(test_update_selection_empty\)\ and\ not\ \(test_update_selection_multiple\)\ and\ not\ \(test_update_selection_single\)\ and\ not\ \(test_filepath_setting\) --numprocesses=32
[1m============================= test session starts ==============================[0m
platform linux -- Python 3.12.9, pytest-8.3.5, pluggy-1.5.0
PySide6 6.9.0 -- Qt runtime 6.9.0 -- Qt compiled 6.9.0
rootdir: /build/ni78p1q4pliddyw4n2z4jbx36j19i96w-source
configfile: pyproject.toml
plugins: qt-4.4.0, xdist-3.6.1, syrupy-4.9.1
[1m
created: 32/32 workers[0m[1m
initialized: 1/32 workers[0m[1m
initialized: 2/32 workers[0m[1m
initialized: 3/32 workers[0m[1m
initialized: 4/32 workers[0m[1m
initialized: 5/32 workers[0m[1m
initialized: 6/32 workers[0m[1m
initialized: 7/32 workers[0m[1m
initialized: 8/32 workers[0m[1m
initialized: 9/32 workers[0m[1m
initialized: 10/32 workers[0m[1m
initialized: 11/32 workers[0m[1m
initialized: 12/32 workers[0m[1m
initialized: 13/32 workers[0m[1m
initialized: 14/32 workers[0m[1m
initialized: 15/32 workers[0m[1m
initialized: 16/32 workers[0m[1m
initialized: 17/32 workers[0m[1m
initialized: 18/32 workers[0m[1m
initialized: 19/32 workers[0m[1m
initialized: 20/32 workers[0m[1m
initialized: 21/32 workers[0m[1m
initialized: 22/32 workers[0m[1m
initialized: 23/32 workers[0m[1m
initialized: 24/32 workers[0m[1m
initialized: 25/32 workers[0m[1m
initialized: 26/32 workers[0m[1m
initialized: 27/32 workers[0m[1m
initialized: 28/32 workers[0m[1m
initialized: 29/32 workers[0m[1m
initialized: 30/32 workers[0m[1m
initialized: 31/32 workers[0m[1m
initialized: 32/32 workers[0m[1m
ready: 1/32 workers [0m[1m
ready: 2/32 workers[0m[1m
ready: 3/32 workers[0m[1m
ready: 4/32 workers[0m[1m
collecting: 1/32 workers[0m[1m
collecting: 1/32 workers[0m[1m
collecting: 2/32 workers[0m[1m
collecting: 3/32 workers[0m[1m
collecting: 3/32 workers[0m[1m
collecting: 4/32 workers[0m[1m
collecting: 4/32 workers[0m[1m
collecting: 4/32 workers[0m[1m
collecting: 5/32 workers[0m[1m
collecting: 6/32 workers[0m[1m
collecting: 7/32 workers[0m[1m
collecting: 7/32 workers[0m[1m
collecting: 8/32 workers[0m[1m
collecting: 8/32 workers[0m[1m
collecting: 8/32 workers[0m[1m
collecting: 8/32 workers[0m[1m
collecting: 9/32 workers[0m[1m
collecting: 9/32 workers[0m[1m
collecting: 10/32 workers[0m[1m
collecting: 11/32 workers[0m[1m
collecting: 12/32 workers[0m[1m
collecting: 12/32 workers[0m[1m
collecting: 13/32 workers[0m[1m
collecting: 14/32 workers[0m[1m
collecting: 14/32 workers[0m[1m
collecting: 14/32 workers[0m[1m
collecting: 14/32 workers[0m[1m
collecting: 14/32 workers[0m[1m
collecting: 15/32 workers[0m[1m
collecting: 16/32 workers[0m[1m
collecting: 17/32 workers[0m[1m
collecting: 18/32 workers[0m[1m
collecting: 18/32 workers[0m[1m
collecting: 18/32 workers[0m[1m
collecting: 18/32 workers[0m[1m
collecting: 19/32 workers[0m[1m
collecting: 19/32 workers[0m[1m
collecting: 19/32 workers[0m[1m
collecting: 20/32 workers[0m[1m
collecting: 20/32 workers[0m[1m
collecting: 21/32 workers[0m[1m
collecting: 21/32 workers[0m[1m
collecting: 22/32 workers[0m[1m
collecting: 23/32 workers[0m[1m
collecting: 24/32 workers[0m[1m
collecting: 25/32 workers[0m[1m
collecting: 25/32 workers[0m[1m
collecting: 25/32 workers[0m[1m
collecting: 25/32 workers[0m[1m
collecting: 26/32 workers[0m[1m
collecting: 26/32 workers[0m[1m
collecting: 27/32 workers[0m[1m
collecting: 27/32 workers[0m[1m
collecting: 27/32 workers[0m[1m
collecting: 28/32 workers[0m[1m
collecting: 29/32 workers[0m[1m
collecting: 30/32 workers[0m[1m
collecting: 30/32 workers[0m[1m
collecting: 31/32 workers[0m[1m
32 workers [194 items] [0m
[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[31mF[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[31m [ 37%]
[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[31m [ 74%]
[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[31m [100%][0mFontconfig error: Cannot load default config file: No such file: (null)
Fontconfig error: No writable cache directories
/var/cache/fontconfig
/homeless-shelter/.cache/fontconfig
Fontconfig error: No writable cache directories
/var/cache/fontconfig
/homeless-shelter/.cache/fontconfig
Fontconfig error: No writable cache directories
/var/cache/fontconfig
/homeless-shelter/.cache/fontconfig
Fontconfig error: Cannot load default config file: No such file: (null)
Fontconfig error: No writable cache directories
/var/cache/fontconfig
/homeless-shelter/.cache/fontconfig
Fontconfig error: No writable cache directories
/var/cache/fontconfig
/homeless-shelter/.cache/fontconfig
Fontconfig error: No writable cache directories
/var/cache/fontconfig
/homeless-shelter/.cache/fontconfig
Fontconfig error: No writable cache directories
/var/cache/fontconfig
/homeless-shelter/.cache/fontconfig
Fontconfig error: No writable cache directories
/var/cache/fontconfig
/homeless-shelter/.cache/fontconfig
Fontconfig error: No writable cache directories
/var/cache/fontconfig
/homeless-shelter/.cache/fontconfig
Fontconfig error: No writable cache directories
/var/cache/fontconfig
/homeless-shelter/.cache/fontconfig
Fontconfig error: No writable cache directories
/var/cache/fontconfig
/homeless-shelter/.cache/fontconfig
Fontconfig error: No writable cache directories
/var/cache/fontconfig
/homeless-shelter/.cache/fontconfig
Fontconfig error: No writable cache directories
/var/cache/fontconfig
/homeless-shelter/.cache/fontconfig
Fontconfig error: No writable cache directories
/var/cache/fontconfig
/homeless-shelter/.cache/fontconfig
Fontconfig error: No writable cache directories
/var/cache/fontconfig
/homeless-shelter/.cache/fontconfig
Fontconfig error: No writable cache directories
/var/cache/fontconfig
/homeless-shelter/.cache/fontconfig
=================================== FAILURES ===================================
[31m[1m_______________________________ test_update_tags _______________________________[0m
[gw11] linux -- Python 3.12.9 /nix/store/fqm9bqqlmaqqr02qbalm1bazp810qfiw-python3-3.12.9/bin/python3.12
qtbot = <pytestqt.qtbot.QtBot object at 0x7ffed598a540>
library = <tagstudio.core.library.alchemy.library.Library object at 0x7ffed5989e50>
def test_update_tags(qtbot, library):
# Given
panel = TagSearchPanel(library)
qtbot.addWidget(panel)
# When
> panel.update_tags()
[1m[31mtests/qt/test_tag_search_panel.py[0m:11:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
[1m[31m/nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2/lib/python3.12/site-packages/tagstudio/qt/modals/tag_search.py[0m:244: in update_tags
self.set_tag_widget(tag=tag, index=i)
[1m[31m/nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2/lib/python3.12/site-packages/tagstudio/qt/modals/tag_search.py[0m:262: in set_tag_widget
new_tw = TagWidget(tag=None, has_edit=True, has_remove=True, library=self.lib)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <tagstudio.qt.widgets.tag.TagWidget(0x1dd5a90) at 0x7ffed5520f40>
tag = None, has_edit = True, has_remove = True
library = <tagstudio.core.library.alchemy.library.Library object at 0x7ffed5989e50>
on_remove_callback = None, on_click_callback = None, on_edit_callback = None
def __init__(
self,
tag: Tag | None,
has_edit: bool,
has_remove: bool,
library: "Library | None" = None,
on_remove_callback: FunctionType = None,
on_click_callback: FunctionType = None,
on_edit_callback: FunctionType = None,
) -> None:
super().__init__()
self.tag = tag
self.lib: Library | None = library
self.has_edit = has_edit
self.has_remove = has_remove
# if on_click_callback:
self.setCursor(Qt.CursorShape.PointingHandCursor)
self.base_layout = QVBoxLayout(self)
self.base_layout.setObjectName("baseLayout")
self.base_layout.setContentsMargins(0, 0, 0, 0)
self.bg_button = QPushButton(self)
self.bg_button.setFlat(True)
if has_edit:
edit_action = QAction(self)
edit_action.setText(Translations["generic.edit"])
> edit_action.triggered.connect(on_edit_callback)
[1m[31mE TypeError: Expected signal or callable, got "NoneType"[0m
[1m[31m/nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2/lib/python3.12/site-packages/tagstudio/qt/widgets/tag.py[0m:129: TypeError
---------------------------- Captured stdout setup -----------------------------
2025-04-19 14:37:29 [info ] [Library] Opening SQLite Library connection_string=sqlite:///:memory: library_dir=PosixPath('/dev/null')
2025-04-19 14:37:29 [info ] [Library] DB_VERSION: 0
2025-04-19 14:37:29 [info ] [Library] Creating DB tables...
----------------------------- Captured stdout call -----------------------------
2025-04-19 14:37:29 [info ] [TagSearchPanel] Updating Tags
2025-04-19 14:37:29 [info ] searching tags limit=25 results=2 search=None statement='SELECT tags.id, tags.name, tags.shorthand, tags.color_namespace, tags.color_slug, tags.is_category, tags.icon, tags.disambiguation_id, tag_colors_1.slug, tag_colors_1.namespace, tag_colors_1.name AS name_1, tag_colors_1."primary", tag_colors_1.secondary, tag_colors_1.color_border \nFROM tags LEFT OUTER JOIN tag_aliases ON tags.id = tag_aliases.tag_id LEFT OUTER JOIN tag_colors AS tag_colors_1 ON tag_colors_1.namespace = tags.color_namespace AND tag_colors_1.slug = tags.color_slug ORDER BY lower(tags.name)\n LIMIT :param_1'
----------------------------- Captured stderr call -----------------------------
Fontconfig error: Cannot load default config file: No such file: (null)
Fontconfig error: No writable cache directories
/var/cache/fontconfig
/homeless-shelter/.cache/fontconfig
Fontconfig error: No writable cache directories
/var/cache/fontconfig
/homeless-shelter/.cache/fontconfig
Fontconfig error: No writable cache directories
/var/cache/fontconfig
/homeless-shelter/.cache/fontconfig
Fontconfig error: No writable cache directories
/var/cache/fontconfig
/homeless-shelter/.cache/fontconfig
Fontconfig error: No writable cache directories
/var/cache/fontconfig
/homeless-shelter/.cache/fontconfig
Fontconfig error: No writable cache directories
/var/cache/fontconfig
/homeless-shelter/.cache/fontconfig
Fontconfig error: No writable cache directories
/var/cache/fontconfig
/homeless-shelter/.cache/fontconfig
Fontconfig error: No writable cache directories
/var/cache/fontconfig
/homeless-shelter/.cache/fontconfig
[33m=============================== warnings summary ===============================[0m
../../nix/store/6abd2b4xw6i713dk1vknkfyz7y08qhmn-python3.12-pydub-0.25.1/lib/python3.12/site-packages/pydub/utils.py:14: 33 warnings
/nix/store/6abd2b4xw6i713dk1vknkfyz7y08qhmn-python3.12-pydub-0.25.1/lib/python3.12/site-packages/pydub/utils.py:14: DeprecationWarning: 'audioop' is deprecated and slated for removal in Python 3.13
import audioop
../../nix/store/6abd2b4xw6i713dk1vknkfyz7y08qhmn-python3.12-pydub-0.25.1/lib/python3.12/site-packages/pydub/utils.py:170: 33 warnings
/nix/store/6abd2b4xw6i713dk1vknkfyz7y08qhmn-python3.12-pydub-0.25.1/lib/python3.12/site-packages/pydub/utils.py:170: RuntimeWarning: Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work
warn("Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work", RuntimeWarning)
../../nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2/lib/python3.12/site-packages/tagstudio/qt/widgets/thumb_renderer.py:78: 33 warnings
/nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2/lib/python3.12/site-packages/tagstudio/qt/widgets/thumb_renderer.py:78: DeprecationWarning: The AVIF support in this library is marked as deprecated and will be removed in the next version. If you still need AVIF support until it natively appears in Pillow, use the https://github.com/fdintino/pillow-avif-plugin project instead.
register_avif_opener()
tests/test_driver.py:14: 32 warnings
/build/ni78p1q4pliddyw4n2z4jbx36j19i96w-source/tests/test_driver.py:14: PytestCollectionWarning: cannot collect test class 'TestDriver' because it has a __init__ constructor (from: tests/test_driver.py)
class TestDriver(DriverMixin):
tests/test_library.py: 25 warnings
tests/macros/test_missing_files.py: 1 warning
tests/macros/test_dupe_entries.py: 1 warning
tests/test_search.py: 66 warnings
tests/qt/test_file_path_options.py: 3 warnings
tests/qt/test_qt_driver.py: 3 warnings
/nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2/lib/python3.12/site-packages/tagstudio/core/library/alchemy/library.py:891: SADeprecationWarning: DISTINCT ON is currently supported only by the PostgreSQL dialect. Use of DISTINCT ON for other backends is currently silently ignored, however this usage is deprecated, and will raise CompileError in a future release for all backends that do not support this syntax.
count_all: int = session.execute(query_count).scalar() or 0
tests/test_library.py: 35 warnings
tests/macros/test_missing_files.py: 1 warning
tests/macros/test_dupe_entries.py: 3 warnings
tests/test_search.py: 66 warnings
tests/qt/test_file_path_options.py: 3 warnings
tests/qt/test_qt_driver.py: 4 warnings
/nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2/lib/python3.12/site-packages/tagstudio/core/library/alchemy/library.py:910: SADeprecationWarning: DISTINCT ON is currently supported only by the PostgreSQL dialect. Use of DISTINCT ON for other backends is currently silently ignored, however this usage is deprecated, and will raise CompileError in a future release for all backends that do not support this syntax.
query_full=str(statement.compile(compile_kwargs={"literal_binds": True})),
tests/test_library.py: 25 warnings
tests/macros/test_missing_files.py: 1 warning
tests/macros/test_dupe_entries.py: 1 warning
tests/test_search.py: 66 warnings
tests/qt/test_file_path_options.py: 3 warnings
tests/qt/test_qt_driver.py: 3 warnings
/nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2/lib/python3.12/site-packages/tagstudio/core/library/alchemy/library.py:914: SADeprecationWarning: DISTINCT ON is currently supported only by the PostgreSQL dialect. Use of DISTINCT ON for other backends is currently silently ignored, however this usage is deprecated, and will raise CompileError in a future release for all backends that do not support this syntax.
items = session.scalars(statement).fetchall()
tests/test_search.py::test_single_constraint[-31]
/nix/store/j7wrnk4i2cjjv1r0psih6krfqnqhkh06-TagStudio-9.5.2/lib/python3.12/site-packages/tagstudio/core/library/alchemy/visitors.py:61: SADeprecationWarning: Invoking or_() without arguments is deprecated, and will be disallowed in a future release. For an empty or_() construct, use 'or_(false(), *args)' or 'or_(False, *args)'.
return or_(*[self.visit(element) for element in node.elements])
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
[36m[1m=========================== short test summary info ============================[0m
[31mFAILED[0m tests/qt/test_tag_search_panel.py::[1mtest_update_tags[0m - TypeError: Expected signal or callable, got "NoneType"
[31m================= [31m[1m1 failed[0m, [32m193 passed[0m, [33m442 warnings[0m[31m in 2.76s[0m[31m ==================[0m
2025-04-19 14:37:26 [info ] [FFmpeg] Using FFprobe location: ffprobe (Not Found)
2025-04-19 14:37:26 [info ] [FFmpeg] Using FFmpeg location: ffmpeg (Not Found)
2025-04-19 14:37:27 [info ] [ResourceManager] Resources Registered: count=32
QT-Version
$> qtdiag | head -5
versionFunctions: Not supported on OpenGL ES
versionFunctions: Not supported on OpenGL ES
Qt 6.9.0 (x86_64-little_endian-lp64 shared (dynamic) release build; by GCC 14.2.1 20250322) on "wayland"
OS: NixOS 25.05 (Warbler) [linux version 6.14.2]
Architecture: x86_64; features: SSE2 SSE3 SSSE3 SSE4.1 SSE4.2 AVX AVX2 AVX512F AVX512IFMA AVX512VBMI2 RDRAND RDSEED AES VAES SHA
Looks like Qt bumped from 6.8.x to 6.9.x in nixpkgs, that also explains the failing test talking about signals and callables. I suppose some sort of change in behavior that showed up in the test, might show up in other stuff too. Doesn't entirely explain the GlobalMenu, though.
Yep, removing inputs.nixpkgs.follows is at least a solution of sorts. The advantage of flakes, that they can still be created consistently with their pinned versions, unfortunately does not save this one specific case.
The build with the locked packages seems to be valid, but it no longer interfaces correctly with the desktop/menu in a more recent QT version. I just wanted to point this out early, as it might still work now for other people not using unstable, but it will ultimately break sooner or later.
I recently moved my system and removed some files from the Library folder. Without the global menu, there was no longer an option to rescan the data.
A good addition might be to temporarily display the menu directly in the window when pressing the 'Alt' key, like some other applications do it (no idea how). Alternatively, the global menu could be deactivated for a certain time using a special start parameter. So you're not locked out of relevant actions (if this could happen any future QT/Python update).
I have temporarily started my previous boot entry once, in which QT and TagStudio still fit together. This at least allowed me to trigger another rescan for the time being. Wondering if the global menu then might also break sometimes on other distributions with KDE Desktop …
But for now, happy Easter! 🐇🥚
Yes, something else I realized in reading this is that my proposal for a check in #892 would not have helped this, at least not without updating the nixpkgs input regularly. At the very least, I am able to reproduce this issue by updating that input.
What I have now noticed is that the breakage might be caused by PySide in specific being updated. I just need some time to figure out how best to address it. This will probably be a decision between updating the version of PySide used in the source, or adding an override to the package to use the previous version (which comes at the cost of requiring a local build). The latter may be a good idea temporarily at the very least, if it is shown that work must be done to bump.
Happy Easter to you too! 🧺
~~#916 has popped up coming from a user on EndeavourOS, which rules out this being limited to PySide, and makes this much higher priority than I had hoped.~~ False alarm, I seem to have gotten TagStudio to build with only PySide overrides, all works fine with Qt 6.9.x. Also, just noticed that #916 might be using an unsupported install method. PR spinning up once I have verified everything.
Finally made the mentioned PR, some things came up, and it took me some time to make sure everything was working properly. Will leave it up for feedback.
Issue seems to be back. Even with inputs.nixpkgs.follows removed from flake.
Logs:
$ tagstudio
2025-07-08 19:36:48 [info ] [FFmpeg] Using FFprobe location: ffprobe (Found)
2025-07-08 19:36:48 [info ] [FFmpeg] Using FFmpeg location: ffmpeg (Found)
2025-07-08 19:36:49 [error ] [ThumbRenderer] Could not import the "pillow_jxl" module
Traceback (most recent call last):
File "/nix/store/r3hf69imbw20w923x4ij5xdl9saz16ss-TagStudio-9.5.2/lib/python3.12/site-packages/tagstudio/qt/widgets/thumb_renderer.py", line 82, in <module>
import pillow_jxl # noqa: F401 # pyright: ignore[reportUnusedImport]
^^^^^^^^^^^^^^^^^
ModuleNotFoundError: No module named 'pillow_jxl'
2025-07-08 19:36:49 [info ] [ResourceManager] Resources Registered: count=31
2025-07-08 19:36:49 [info ] [Settings] Global Settings File Path not specified, using default
2025-07-08 19:36:49 [info ] [Settings] Reading Global Settings File path=PosixPath('/home/mads/.config/TagStudio/settings.toml')
2025-07-08 19:36:49 [info ] [Cache] Cache File not specified, using default one filename=/home/mads/.config/TagStudio/TagStudio.ini
2025-07-08 19:36:49 [info ] [Config] Thumbnail cache size limit: 500 MB
Cannot mix incompatible Qt library (6.9.1) with this library (6.9.0)
Aborted (core dumped)
@zzzealed i found a workaround by downloading the binary released here and executing it using steam-run ./tagstudio while this by far isn't the best one can at least still use it
Current breakage is due to a different reason and is being tracked in #988.