From bfa9a42d9de4b29173cbe34bdbb874313d07f3ab Mon Sep 17 00:00:00 2001 From: SulfurNitride Date: Fri, 1 May 2026 01:12:56 -0500 Subject: Port upstream PR #2384: --name/--modname/--version/--source on download CLI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds metadata flags to the `download` subcommand and a corresponding DownloadManager::startDownloadURLWithMeta() entry point that populates ModRepositoryFileInfo before queueing. Skipped the upstream settings.cpp hunk that re-registers the Windows nxmhandler.exe binary for both nxm:// and modl:// — our nxmhandler_linux already registers both MIME schemes in registerHandler(). Cherry-picked from upstream/dev/modl-handler against merge-base dc420a25. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/src/commandline.cpp | 31 ++++++++++++++++++++++++++++++- src/src/commandline.h | 1 + src/src/downloadmanager.cpp | 16 ++++++++++++++++ src/src/downloadmanager.h | 3 +++ 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/src/commandline.cpp b/src/src/commandline.cpp index 46f9be0..2de6bc6 100644 --- a/src/src/commandline.cpp +++ b/src/src/commandline.cpp @@ -806,6 +806,18 @@ Command::Meta DownloadFileCommand::meta() const return {"download", "downloads a file", "URL", ""}; } +po::options_description DownloadFileCommand::getVisibleOptions() const +{ + po::options_description d; + + d.add_options()("name,n", po::value(), "(optional) the download name")( + "modname,m", po::value(), "(optional) the mod name")( + "version,v", po::value(), "(optional) the download / mod version")( + "source,s", po::value(), "(optional) the download source"); + + return d; +} + po::options_description DownloadFileCommand::getInternalOptions() const { po::options_description d; @@ -832,16 +844,33 @@ bool DownloadFileCommand::canForwardToPrimary() const std::optional DownloadFileCommand::runPostOrganizer(OrganizerCore& core) { const QString url = QString::fromStdString(vm()["URL"].as()); + QString name, modName, version, source; if (!url.startsWith("https://")) { reportError(QObject::tr("Download URL must start with https://")); return 1; } + if (vm().count("name")) { + name = QString::fromStdString(vm()["name"].as()); + } + + if (vm().count("modname")) { + modName = QString::fromStdString(vm()["modname"].as()); + } + + if (vm().count("version")) { + version = QString::fromStdString(vm()["version"].as()); + } + + if (vm().count("source")) { + source = QString::fromStdString(vm()["source"].as()); + } + log::debug("starting direct download from command line: {}", url.toStdString()); MessageDialog::showMessage(QObject::tr("Download started"), qApp->activeWindow(), false); - core.downloadManager()->startDownloadURLs(QStringList() << url); + core.downloadManager()->startDownloadURLWithMeta(url, name, modName, version, source); return {}; } diff --git a/src/src/commandline.h b/src/src/commandline.h index 8dcc23a..6109d37 100644 --- a/src/src/commandline.h +++ b/src/src/commandline.h @@ -207,6 +207,7 @@ class DownloadFileCommand : public Command protected: Meta meta() const override; + po::options_description getVisibleOptions() const override; po::options_description getInternalOptions() const override; po::positional_options_description getPositional() const override; diff --git a/src/src/downloadmanager.cpp b/src/src/downloadmanager.cpp index ee87f67..d7e5ce5 100644 --- a/src/src/downloadmanager.cpp +++ b/src/src/downloadmanager.cpp @@ -2054,6 +2054,22 @@ int DownloadManager::startDownloadURLs(const QStringList& urls) return m_ActiveDownloads.size() - 1; } +int DownloadManager::startDownloadURLWithMeta(const QString& url, const QString& name, + const QString& modName, + const QString& version, + const QString& source) +{ + ModRepositoryFileInfo info; + info.name = name; + info.modName = modName; + info.version = version; + info.repository = source; + if (!addDownload(QStringList() << url, "", -1, -1, &info)) { + return 0; + } + return m_ActiveDownloads.size() - 1; +} + int DownloadManager::startDownloadNexusFile(const QString& gameName, int modID, int fileID) { diff --git a/src/src/downloadmanager.h b/src/src/downloadmanager.h index 581fe84..dce9069 100644 --- a/src/src/downloadmanager.h +++ b/src/src/downloadmanager.h @@ -409,6 +409,9 @@ public: public: // IDownloadManager interface: int startDownloadURLs(const QStringList& urls); + int startDownloadURLWithMeta(const QString& url, const QString& name, + const QString& modName, const QString& version, + const QString& source); int startDownloadNexusFile(const QString& gameName, int modID, int fileID); QString downloadPath(int id) const; -- cgit v1.3.1