diff --git a/aqt/installer.py b/aqt/installer.py index 2d54cfa..e54df87 100644 --- a/aqt/installer.py +++ b/aqt/installer.py @@ -368,6 +368,69 @@ class Cli: else: qt_version = args.qt_version Cli._validate_version_str(qt_version) + + if hasattr(args, "use_official_installer") and args.use_official_installer is not None: + + if len(args.use_official_installer) not in [0, 2]: + raise CliInputError( + "When providing arguments to --use-official-installer, exactly 2 arguments are required: " + "--use-official-installer email password" + ) + + self.logger.info("Using official Qt installer") + + commercial_args = InstallArgParser() + + # Core parameters required by install-qt-official + commercial_args.target = args.target + commercial_args.arch = self._set_arch( + args.arch, args.host, args.target, getattr(args, "qt_version", getattr(args, "qt_version_spec", "")) + ) + + commercial_args.version = qt_version + + email = None + password = None + if len(args.use_official_installer) == 2: + email, password = args.use_official_installer + self.logger.info(f"Using credentials provided with --use-official-installer") + + # Optional parameters + commercial_args.email = email or getattr(args, "email", None) + commercial_args.pw = password or getattr(args, "pw", None) + commercial_args.outputdir = args.outputdir + commercial_args.modules = args.modules + commercial_args.base = getattr(args, "base", None) + + # TODO Add those, and remove from ignored + commercial_args.override = None + commercial_args.dry_run = None + + # Log ignored options + ignored_options = [] + if getattr(args, "noarchives", False): + ignored_options.append("--noarchives") + if getattr(args, "autodesktop", False): + ignored_options.append("--autodesktop") + if getattr(args, "archives", None): + ignored_options.append("--archives") + if getattr(args, "timeout", False): + ignored_options.append("--timeout") + if getattr(args, "keep", False): + ignored_options.append("--keep") + if getattr(args, "archive_dest", False): + ignored_options.append("--archive_dest") + if getattr(args, "dry_run", False): + ignored_options.append("--dry_run") + if getattr(args, "override", False): + ignored_options.append("--override") + + if ignored_options: + self.logger.warning("Options ignored because you requested the official installer:") + self.logger.warning(", ".join(ignored_options)) + + return self.run_install_qt_commercial(commercial_args, print_version=False) + archives = args.archives if args.noarchives: if modules is None: @@ -683,9 +746,10 @@ class Cli: ) show_list(meta) - def run_install_qt_commercial(self, args: InstallArgParser) -> None: + def run_install_qt_commercial(self, args: InstallArgParser, print_version: Optional[bool] = True) -> None: """Execute commercial Qt installation""" - self.show_aqt_version() + if print_version: + self.show_aqt_version() try: if args.override: @@ -721,7 +785,7 @@ class Cli: commercial_installer.install() Settings.qt_installer_cleanup() except Exception as e: - self.logger.error(f"Error installing official installer {str(e)}") + self.logger.error(f"Error installing official installer: {str(e)}") finally: self.logger.info("Done") @@ -793,6 +857,16 @@ class Cli: "required. When enabled, this option installs the required desktop version automatically. " "It has no effect when the desktop installation is not required.", ) + install_qt_parser.add_argument( + "--use-official-installer", + nargs="*", + default=None, + metavar=("EMAIL", "PASSWORD"), + help="Use the official Qt installer for installation instead of the aqt downloader. " + "Can be used without arguments or with email and password: --use-official-installer email password. " + "This redirects to install-qt-official. " + "Arguments not compatible with the official installer will be ignored.", + ) def _set_install_tool_parser(self, install_tool_parser): install_tool_parser.set_defaults(func=self.run_install_tool) @@ -951,7 +1025,7 @@ class Cli: def _make_all_parsers(self, subparsers: argparse._SubParsersAction) -> None: """Creates all command parsers and adds them to the subparsers""" - def make_parser_it(cmd: str, desc: str, set_parser_cmd, formatter_class): + def make_parser_it(cmd: str, desc: str, set_parser_cmd, formatter_class) -> None: kwargs = {"formatter_class": formatter_class} if formatter_class else {} p = subparsers.add_parser(cmd, description=desc, **kwargs) set_parser_cmd(p) diff --git a/docs/authors.rst b/docs/authors.rst index 9cd33a3..e8c116b 100644 --- a/docs/authors.rst +++ b/docs/authors.rst @@ -16,6 +16,7 @@ All contributors, listed alphabetically, are: * Adrian Eddy (fix the case of Android 6.7.0) * Alberto Mardegan(ignore_hash option) +* Alexandre @Kidev Poumaroux (official installer option, WASM fixes for Qt6.7.x) * Andrew Wason (support arm64) * Andrei Yankovich (tools ifw installation) * Aurélien Gâteau (patching to qmake) @@ -51,4 +52,4 @@ All contributors, listed alphabetically, are: * @ypnos (Documents) and many other participants and contributors. -If you find a missing name to record, please feel free to tell me. \ No newline at end of file +If you find a missing name to record, please feel free to tell me. diff --git a/docs/official.rst b/docs/official.rst index db17740..1d637d6 100644 --- a/docs/official.rst +++ b/docs/official.rst @@ -44,50 +44,6 @@ Options * If none are inputed, the package ``qtX.Y.Z-essentials`` is downloaded (default Qt install, includes ``qtcreator``...) * If ``all`` is inputed, the package ``qtX.Y.Z-full`` is downloaded (includes everything) -.. dropdown:: Click to see all the special packages (for Linux Qt 6.8.1) - - .. code-block:: text - - Name: qt6.8.1-essentials - Display name: Qt 6.8.1 Linux x86_64 Essential Components - Description: Qt 6.8.1 Linux x86_64 Essential Libraries, Headers, and Tools - Version: 6.8.1 - Components: qt.qt6.681.linux_gcc_64 - - Name: qt6.8.1-essentials-dev - Display name: Qt 6.8.1 Linux x86_64 Essential Components (dev) - Description: Qt 6.8.1 Linux x86_64 Essential Libraries, Headers, and Tools (dev) - Version: 6.8.1 - Required aliases: qt6.8.1-essentials - - Name: qt6.8.1-full - Display name: Qt 6.8.1 Linux x86_64 All Components with Sources - Description: Qt 6.8.1 Linux x86_64 All Libraries, Headers, Tools, and Sources - Version: 6.8.1 - Components: qt.qt6.681.src,extensions.qtwebengine.681.src - Required aliases: qt6.8.1-essentials,qt6.8.1-addons,qt6.8.1-extensions - Optional components: extensions.qtinsighttracker.681.src - - Name: qt6.8.1-full-dbg - Display name: Qt 6.8.1 Linux x86_64 All Components with Sources and Debug Information Files - Description: Qt 6.8.1 Linux x86_64 All Libraries, Headers, Tools, Sources, and Debug Information Files (dev) - Version: 6.8.1 - Components: qt.qt6.681.debug_info.linux_gcc_64,qt.qt6.681.debug_info,extensions.qtwebengine.681.debug_information - Required aliases: qt6.8.1-full-dev - - Name: qt6.8.1-full-dev - Display name: Qt 6.8.1 Linux x86_64 All Components with Sources (dev) - Description: Qt 6.8.1 Linux x86_64 All Libraries, Headers, Tools, and Sources (dev) - Version: 6.8.1 - Required aliases: qt6.8.1-full - - Name: qt6.8.1-sdk - Display name: Qt 6.8.1 Linux x86_64 SDK - Description: Qt 6.8.1 Linux x86_64 SDK Tools (Qt Creator, Ninja, and CMake) - Version: 6.8.1 - Components: qt.tools.qtcreator_gui,qt.tools.cmake,qt.tools.ninja - Required aliases: qt6.8.1-full-dev,qt6.8.1-full-dbg - - ``--outputdir `` - Installation directory (default: current directory) - ``--override `` - Pass all remaining arguments directly to the Qt installer CLI @@ -106,7 +62,7 @@ Options - ``search_terms`` - Terms to search for in package names (grabs all that is not other options) Override Mode ------------- +---------------------- ``install-qt-official`` supports an override mode that passes all arguments after ``--override`` directly to the Qt installer CLI, and will ignore all the other params except ``--email`` and ``--pw`` if given prior to it .. code-block:: bash @@ -122,7 +78,7 @@ When using override mode: * `More info here `_ Examples --------- +-------------- .. code-block:: bash # Standard installation @@ -138,7 +94,7 @@ Examples aqt install-qt-official --override install qt.qt6.680.gcc_64 --email user@example.com --pw pass Advanced configs --------------- +-------------------------- The file located in ``./aqt/settings.ini`` can be edited in the ``[qtofficial]`` part to fine tune the official installer (`more details here `_): .. code-block:: ini diff --git a/tests/test_commercial.py b/tests/test_commercial.py index 2948589..1acc00f 100644 --- a/tests/test_commercial.py +++ b/tests/test_commercial.py @@ -275,6 +275,17 @@ def test_get_install_command(monkeypatch, modules: Optional[List[str]], expected "stopProcessesForUpdates=Cancel,installationErrorWithCancel=Cancel,installationErrorWithIgnore=Ignore," "AssociateCommonFiletypes=Yes,telemetry-question=No install qt.{}.{}.{}", ), + ( + "install-qt linux desktop 6.8.1 {} --outputdir ./install-qt-flag --use-official-installer {} {}", + {"windows": "win64_msvc2022_64", "linux": "linux_gcc_64", "mac": "clang_64"}, + ["./install-qt-official", "qt6", "681"], + "qt-unified-{}-x64-online.run --email ******** --pw ******** --root {} " + "--accept-licenses --accept-obligations " + "--confirm-command " + "--auto-answer OperationDoesNotExistError=Ignore,OverwriteTargetDirectory=Yes," + "stopProcessesForUpdates=Cancel,installationErrorWithCancel=Cancel,installationErrorWithIgnore=Ignore," + "AssociateCommonFiletypes=Yes,telemetry-question=No install qt.{}.{}.{}", + ), ], ) def test_install_qt_commercial(