diff --git a/games-util/bottles/Manifest b/games-util/bottles/Manifest index 9cc6ab9acc..e8eaad1a2f 100644 --- a/games-util/bottles/Manifest +++ b/games-util/bottles/Manifest @@ -1,2 +1,3 @@ DIST bottles-64.1.tar.gz 2758708 BLAKE2B 77b8dd6c4164b832bf1a5c073f2262c96c1877b01b9e6e69212201fac58a0c427559c3b3929ae6b6c1e3bb2952245cd11f9ca89c75d80d85371b248b33dc4652 SHA512 a5a4e5d0f06eadd9461901b29a168be91627fae014dc8f6f99210d0882301e9e34cbeaf5193107e77f4b01cdf8f5d50afa692e5916889e829f080b37c9d7a2c1 DIST bottles-65.4.tar.gz 5463050 BLAKE2B dea90e876c9ed49ac47a56787b519d367124d4ea511915f59cff60764d6dbf097cb68ae98d21b2fcfd863c9c0d868762591f6c602943ca0ec355f78052efa00c SHA512 2929beca726021eaf3ad85213629bfd75cd627c00f3cc6b4eb248586e912df18de1068ee2e9fde990460c65885c82a4cec284e9ab35c504d1c5e39ab3d3d90c1 +DIST bottles-66.6.tar.gz 5563577 BLAKE2B 9925976c9bb4d9a06656443e37117aabd4e82c08cf8c13f8b4e7232e4de20ade19dba6068fe7e312a89dc7a13802b919ed092cdc504db58cc4018fad99b92200 SHA512 a56e21f31ff6af1216b80e2b28fcc3f85e2398b47ce57f0bc793e93aff5259331f05bbaf577fd8ba1cc229670cfeb037381a60cd85815b3497f6146ab29e15eb diff --git a/games-util/bottles/bottles-66.6.ebuild b/games-util/bottles/bottles-66.6.ebuild new file mode 100644 index 0000000000..aaf7e8da68 --- /dev/null +++ b/games-util/bottles/bottles-66.6.ebuild @@ -0,0 +1,172 @@ +# Copyright 1999-2026 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +DISTUTILS_USE_PEP517=no +DISTUTILS_SINGLE_IMPL=1 +PYTHON_COMPAT=( python3_{12..15} ) + +inherit distutils-r1 gnome2-utils meson optfeature xdg + +DESCRIPTION="Run Windows software and games on Linux" +HOMEPAGE=" + https://usebottles.com + https://github.com/bottlesdevs/Bottles +" +SRC_URI="https://github.com/bottlesdevs/Bottles/archive/refs/tags/${PV}.tar.gz -> ${P}.tar.gz" + +S="${WORKDIR}/Bottles-${PV}" + +LICENSE="GPL-3" +SLOT="0" +KEYWORDS="~amd64" + +RDEPEND=" + dev-libs/glib:2 + dev-libs/libportal[gtk] + gui-libs/gtk:4 + gui-libs/gtksourceview:5 + gui-libs/libadwaita:1 + + dev-vcs/fvs2 + + $(python_gen_cond_dep ' + app-arch/patool[${PYTHON_USEDEP}] + dev-python/certifi[${PYTHON_USEDEP}] + dev-python/chardet[${PYTHON_USEDEP}] + dev-python/charset-normalizer[${PYTHON_USEDEP}] + dev-python/icoextract[${PYTHON_USEDEP}] + dev-python/idna[${PYTHON_USEDEP}] + dev-python/markdown[${PYTHON_USEDEP}] + dev-python/orjson[${PYTHON_USEDEP}] + dev-python/pathvalidate[${PYTHON_USEDEP}] + dev-python/pefile[${PYTHON_USEDEP}] + dev-python/pycairo[${PYTHON_USEDEP}] + dev-python/pycurl[${PYTHON_USEDEP}] + dev-python/pygobject[${PYTHON_USEDEP}] + dev-python/pyxdg[${PYTHON_USEDEP}] + dev-python/pyyaml[${PYTHON_USEDEP}] + dev-python/requests[${PYTHON_USEDEP}] + dev-python/urllib3[${PYTHON_USEDEP}] + dev-python/wheel[${PYTHON_USEDEP}] + dev-python/yara-python[${PYTHON_USEDEP}] + media-gfx/vkbasalt-cli[${PYTHON_USEDEP}] + ') +" +DEPEND="${RDEPEND}" +BDEPEND=" + dev-libs/appstream-glib + dev-libs/glib:2 + dev-util/blueprint-compiler + dev-util/desktop-file-utils + dev-util/gtk-update-icon-cache + sys-devel/gettext + + test? ( + $(python_gen_cond_dep ' + dev-python/freezegun[${PYTHON_USEDEP}] + ') + ) +" + +PATCHES=( + "${FILESDIR}/${PN}-64.1-dont-stub-gi.repository.patch" + "${FILESDIR}/${PN}-64.1-relax-AppStream-file-validation.patch" + "${FILESDIR}/${PN}-66.6-remove-Flatpak-related-checks.patch" +) + +EPYTEST_DESELECT=( + bottles/tests/backend/integration/playtime/test_aggregation.py::test_different_programs_separate_rows + bottles/tests/backend/integration/playtime/test_aggregation.py::test_same_program_aggregates_into_one_row + bottles/tests/backend/integration/playtime/test_disabled_tracking.py::test_disabled_tracking_smoke + bottles/tests/backend/integration/playtime/test_failure_run.py::test_failure_run_marks_unknown_and_updates_totals + bottles/tests/backend/integration/playtime/test_failure_run.py::test_multiple_failures_different_bottles + bottles/tests/backend/integration/playtime/test_failure_run.py::test_multiple_failures_same_bottle_different_programs + bottles/tests/backend/integration/playtime/test_playtime_signals.py::test_signals_flow_success + bottles/tests/backend/integration/playtime/test_playtime_signals.py::test_signals_flow_unknown_failure + bottles/tests/backend/integration/playtime/test_recovery.py::test_cli_manager_init_does_not_recover_live_sessions + bottles/tests/backend/integration/playtime/test_recovery.py::test_recovery_different_bottles + bottles/tests/backend/integration/playtime/test_recovery.py::test_recovery_same_bottle_different_programs + bottles/tests/backend/integration/playtime/test_recovery.py::test_recovery_smoke + bottles/tests/backend/integration/playtime/test_schema_meta.py::test_schema_meta_smoke + bottles/tests/backend/integration/playtime/test_successful_run.py::test_success_multiple_apps_two_same_bottle_one_other + bottles/tests/backend/integration/playtime/test_successful_run.py::test_successful_run_finalizes_and_updates_totals + bottles/tests/backend/integration/playtime/test_uniqueness_retry.py::test_uniqueness_retry_smoke + bottles/tests/backend/integration/playtime/test_wine_executor_playtime.py::test_wine_executor_emits_and_updates_totals + bottles/tests/backend/manager/test_manager.py::test_manager_cli_skips_connection_check + bottles/tests/backend/manager/test_playtime.py::test_disable_tracking_method + bottles/tests/backend/manager/test_playtime.py::test_disabled_tracker_is_noop + bottles/tests/backend/manager/test_sandbox_creation.py::test_create_bottle_rejects_profile_link_outside_prefix + bottles/tests/backend/test_network_timeouts.py::test_default_repository_fallbacks_are_commit_pinned + bottles/tests/backend/wine/test_executor.py::test_run_program_substitutes_placeholders + bottles/tests/frontend/test_bottle_details.py::test_flatpak_system_runner_uses_builtin_label + bottles/tests/frontend/test_bottle_details.py::test_missing_runner_dialog_waits_for_versioning_upgrade + bottles/tests/frontend/test_cli_setup.py::test_list_components_prepares_directories + bottles/tests/frontend/test_cli_setup.py::test_new_bottle_reports_creation_failure + bottles/tests/frontend/test_cli_setup.py::test_new_bottle_waits_for_catalogs_before_installing + bottles/tests/frontend/test_common.py::test_runner_dropdown_uses_display_names_without_changing_ids + bottles/tests/frontend/test_dependency_entry.py::test_cache_lookup_is_skipped_without_installed_dependencies + bottles/tests/frontend/test_dependency_entry.py::test_cache_lookup_only_runs_offline + bottles/tests/frontend/test_dependency_entry.py::test_dependency_row_activates_batch_selection + bottles/tests/frontend/test_dependency_entry.py::test_installed_dependency_actions_use_recorded_uninstaller + bottles/tests/frontend/test_dependency_entry.py::test_installed_dependency_row_shows_its_name + bottles/tests/frontend/test_dependency_entry.py::test_installed_dependency_without_uninstaller_cannot_be_removed + bottles/tests/frontend/test_details_view.py::test_unload_view_empties_the_page_stack + bottles/tests/frontend/test_drive_dialog.py::test_device_drive_shows_eject_action + bottles/tests/frontend/test_external_runner_component.py::test_external_runner_cannot_be_removed_from_bottles + bottles/tests/frontend/test_gtk_utils.py::test_full_width_string_list_factory_uses_unellipsized_labels + bottles/tests/frontend/test_steam_library.py::test_library_entry_resolves_steam_game_without_wine_program + bottles/tests/frontend/test_steam_library.py::test_program_widget_extracts_its_own_icon + bottles/tests/frontend/test_steam_library.py::test_program_widget_switches_desktop_entry_action + bottles/tests/frontend/test_steam_library.py::test_program_widget_uses_library_icon + bottles/tests/frontend/test_steam_library.py::test_steam_library_widget_launches_through_steam + bottles/tests/frontend/test_steam_library.py::test_steam_program_widget_exposes_library_action + bottles/tests/frontend/test_steam_runtime.py::test_steam_runtime_row_explains_availability + bottles/tests/frontend/test_ui_language.py::test_ui_languages_match_shipped_catalogs +) + +EPYTEST_IGNORE=( + bottles/tests/frontend/test_open_uri.py + bottles/tests/frontend/test_umu_ui.py + bottles/tests/fvs/test_repo.py +) + +EPYTEST_PLUGINS=( pytest-mock ) +distutils_enable_tests pytest + +src_test() { + find bottles/tests -type f -exec \ + sed -i "s|/app/share/bottles/bottles.gresource|${BUILD_DIR}/bottles/frontend/ui/bottles.gresource|" {} \; + + meson_src_test + distutils-r1_src_test +} + +src_install() { + meson_src_install + + python_fix_shebang "${ED}/usr/bin" +} + +pkg_postinst() { + xdg_pkg_postinst + gnome2_schemas_update + + optfeature "extracting files from .cab files" app-arch/cabextract + optfeature "7-Zip archiver support" app-arch/p7zip + optfeature "Vulkan support" dev-util/vulkan-tools + optfeature "icon/image convertion" media-gfx/imagemagick + optfeature "display information support" x11-apps/xdpyinfo + + optfeature "preloading game files into memory" dev-util/vmtouch + optfeature "optimizing Linux system performance on demand" games-util/gamemode + optfeature "an efficient micro-compositor for running games" gui-wm/gamescope + optfeature "monitoring FPS, temperatures, CPU/GPU load and more" games-util/mangohud + optfeature "UMU game prefixes" games-util/umu-launcher +} + +pkg_postrm() { + xdg_pkg_postrm + gnome2_schemas_update +} diff --git a/games-util/bottles/files/bottles-66.6-remove-Flatpak-related-checks.patch b/games-util/bottles/files/bottles-66.6-remove-Flatpak-related-checks.patch new file mode 100644 index 0000000000..577efb6280 --- /dev/null +++ b/games-util/bottles/files/bottles-66.6-remove-Flatpak-related-checks.patch @@ -0,0 +1,120 @@ +From: Pavel Sobolev +Subject: [PATCH] Remove Flatpak-related checks + +Signed-off-by: Pavel Sobolev + +--- a/bottles/frontend/meson.build ++++ b/bottles/frontend/meson.build +@@ -23,12 +23,6 @@ params_file = configure_file( + configuration: conf + ) + +-fs = import('fs') +- +-if not fs.is_file('/' + '.flatpak-info') +- error('file does not exist') +-endif +- + bottles_sources = [ + '__init__.py', + 'main.py', +--- a/bottles/frontend/views/bottle_details.py ++++ b/bottles/frontend/views/bottle_details.py +@@ -727,22 +727,7 @@ class BottleView(Adw.PreferencesPage): + dialog.connect("response", execute) + dialog.show() + +- if Xdp.Portal.running_under_sandbox(): +- if self.window.settings.get_boolean("show-sandbox-warning"): +- dialog = Adw.MessageDialog.new( +- self.window, +- _("Be Aware of Sandbox"), +- _( +- "Bottles is running in a sandbox, a restricted permission environment needed to keep you safe. If the program won't run, consider moving inside the bottle (3 dots icon on the top), then launch from there." +- ), +- ) +- dialog.add_response("dismiss", _("_Dismiss")) +- dialog.connect("response", lambda *args: show_chooser()) +- dialog.present() +- else: +- show_chooser() +- else: +- show_chooser() ++ show_chooser() + + def analyze_with_eagle(self, path): + """Open the Eagle analysis view and scan the given executable.""" +--- a/bottles/frontend/views/bottle_preferences.py ++++ b/bottles/frontend/views/bottle_preferences.py +@@ -185,9 +185,6 @@ class PreferencesView(Adw.PreferencesPage): + ) + ) + +- if not is_cpak() and not Xdp.Portal.running_under_sandbox(): +- return +- + _not_available = _("This feature is unavailable on your system.") + _flatpak_not_available = _("{} To add this feature, please run").format( + _not_available +--- a/bottles/frontend/views/list.py ++++ b/bottles/frontend/views/list.py +@@ -130,9 +130,6 @@ class BottlesBottleRow(Adw.ActionRow): + + def run_executable(self, *_args): + """Display file dialog for executable""" +- if not is_cpak() and not Xdp.Portal.running_under_sandbox(): +- return +- + def set_path(_dialog, response): + if response != Gtk.ResponseType.ACCEPT: + return +--- a/bottles/frontend/views/new_bottle_dialog.py ++++ b/bottles/frontend/views/new_bottle_dialog.py +@@ -93,9 +93,7 @@ class BottlesNewBottleDialog(Adw.Dialog): + ) + # common variables and references + self.window = GtkUtils.get_parent_window() +- if not self.window or ( +- not is_cpak() and not Xdp.Portal.running_under_sandbox() +- ): ++ if not self.window: + return + + self.app = self.window.get_application() +--- a/bottles/frontend/windows/window.py ++++ b/bottles/frontend/windows/window.py +@@ -143,35 +143,6 @@ class BottlesWindow(Adw.ApplicationWindow): + manager = Adw.StyleManager.get_default() + manager.set_color_scheme(Adw.ColorScheme.FORCE_DARK) + +- # Be VERY explicit that non-sandboxed environments are unsupported +- if not os.environ.get("CPAK_CONTAINER_ID") and not Xdp.Portal.running_under_sandbox(): +- +- def response(dialog, response, *args): +- if response == "close": +- quit(1) +- +- body = _( +- "Bottles is only supported within a sandboxed environment. Official sources of Bottles are available at" +- ) +- download_url = "usebottles.com/download" +- +- error_dialog = Adw.AlertDialog.new( +- _("Unsupported Environment"), +- f"{body} {download_url}.", +- ) +- +- error_dialog.add_response("close", _("Close")) +- error_dialog.set_body_use_markup(True) +- error_dialog.connect("response", response) +- error_dialog.present(self) +- logging.error( +- _( +- "Bottles is only supported within a sandboxed format. Official sources of Bottles are available at:" +- ) +- ) +- logging.error("https://usebottles.com/download/") +- return +- + # Loading view + self.page_loading = LoadingView()