From c87815a6b841b1c797eb8cb43e0819d48986273c Mon Sep 17 00:00:00 2001 From: Bernd Wachter Date: Sun, 31 Mar 2013 20:51:57 +0300 Subject: [PATCH] Enable repo listing from CLI --- libssu/ssu.h | 2 +- libssu/ssudeviceinfo.cpp | 60 +++++++----- libssu/ssudeviceinfo.h | 15 ++- rndssucli/rndssucli.cpp | 158 +++++++++++++++++++++++++++--- rpm/ssu.changes | 3 + rpm/ssu.spec | 2 +- ssuurlresolver/ssuurlresolver.cpp | 2 +- 7 files changed, 199 insertions(+), 43 deletions(-) diff --git a/libssu/ssu.h b/libssu/ssu.h index edebdc5..980bbee 100644 --- a/libssu/ssu.h +++ b/libssu/ssu.h @@ -108,7 +108,7 @@ class Ssu: public QObject { DisableRepoManager = 0x1, ///< Disable automagic repository management RndMode = 0x2, ///< Enable RnD mode for device ReleaseMode = 0x4, ///< Enable Release mode - LenientMode = 0x8 ///< Disable strict mode (i.e., keep unmanaged repositories) + LenientMode = 0x8 ///< Disable strict mode (i.e., keep unmanaged repositories) }; /** diff --git a/libssu/ssudeviceinfo.cpp b/libssu/ssudeviceinfo.cpp index a480a6e..135c256 100644 --- a/libssu/ssudeviceinfo.cpp +++ b/libssu/ssudeviceinfo.cpp @@ -164,7 +164,10 @@ QStringList SsuDeviceInfo::disabledRepos(){ return result; } -QStringList SsuDeviceInfo::repos(bool rnd){ +// this half belongs into repo-manager, as it not only handles board-specific +// repositories. Right now this one looks like the better place due to the +// connection to board specific stuff, though +QStringList SsuDeviceInfo::repos(bool rnd, int filter){ int adaptationCount = adaptationRepos().size(); QStringList result; @@ -172,41 +175,48 @@ QStringList SsuDeviceInfo::repos(bool rnd){ for (int i=0; icontains(deviceVariant(true) + "/repos")) - result.append(boardMappings->value(deviceVariant(true) + "/repos").toStringList()); + // add device configured repos + if (boardMappings->contains(deviceVariant(true) + "/repos")) + result.append(boardMappings->value(deviceVariant(true) + "/repos").toStringList()); + + // read the disabled repositories for this device + // user can override repositories disabled here in the user configuration + foreach (const QString &key, disabledRepos()) + result.removeAll(key); + } // read user-defined repositories from ssu.ini // TODO: in strict mode, filter the repository list from there SsuCoreConfig *ssuSettings = SsuCoreConfig::instance(); - ssuSettings->beginGroup("repository-urls"); - result.append(ssuSettings->allKeys()); - ssuSettings->endGroup(); - // read user-enabled repositories from ssu.ini - if (ssuSettings->contains("enabled-repos")) - result.append(ssuSettings->value("enabled-repos").toStringList()); - - result.removeDuplicates(); + if (filter == NoFilter || filter == UserFilter){ + ssuSettings->beginGroup("repository-urls"); + result.append(ssuSettings->allKeys()); + ssuSettings->endGroup(); - // read the disabled repositories for this device - foreach (const QString &key, disabledRepos()) - result.removeAll(key); + // read user-enabled repositories from ssu.ini + if (ssuSettings->contains("enabled-repos")) + result.append(ssuSettings->value("enabled-repos").toStringList()); + } - // read the disabled repositories from user configuration - if (ssuSettings->contains("disabled-repos")){ - foreach (const QString &key, ssuSettings->value("disabled-repos").toStringList()) - result.removeAll(key); + if (filter == NoFilter || filter == UserFilter || filter == BoardFilterUserBlacklist){ + // read the disabled repositories from user configuration + if (ssuSettings->contains("disabled-repos")){ + foreach (const QString &key, ssuSettings->value("disabled-repos").toStringList()) + result.removeAll(key); + } } + result.removeDuplicates(); return result; } diff --git a/libssu/ssudeviceinfo.h b/libssu/ssudeviceinfo.h index 1ad8eff..1d96d34 100644 --- a/libssu/ssudeviceinfo.h +++ b/libssu/ssudeviceinfo.h @@ -17,6 +17,13 @@ class SsuDeviceInfo: public QObject { Q_OBJECT public: + enum RepoFilter { + NoFilter, + UserFilter, + BoardFilter, + BoardFilterUserBlacklist + }; + SsuDeviceInfo(); /** * Return the list of adaptations used for the set model @@ -43,12 +50,16 @@ class SsuDeviceInfo: public QObject { Q_INVOKABLE QString deviceUid(); /** * Return the list of repositories explicitely disabled for this device + * This does not include repositories only disabled in the user configuration. */ QStringList disabledRepos(); /** - * Return the complete list of repositories configured for a device + * Return the complete list of repositories configured for a device. + * Depending on the filter options, all repostories (user and board), + * only board-specific, or only user-specific are returned. + * Disabled repositories are excluded depending on filter settings. */ - QStringList repos(bool rnd=false); + QStringList repos(bool rnd=false, int filter=NoFilter); /** * Override device model autodetection */ diff --git a/rndssucli/rndssucli.cpp b/rndssucli/rndssucli.cpp index 5d1ad8c..1def9b9 100644 --- a/rndssucli/rndssucli.cpp +++ b/rndssucli/rndssucli.cpp @@ -11,6 +11,7 @@ #include #include +#include #include @@ -57,7 +58,25 @@ void RndSsuCli::optMode(QStringList opt){ // TODO: allow setting meaningful names instead of numbers if (opt.count() == 2){ - qout << "Device mode is: " << ssu.deviceMode() << endl; + QStringList modeList; + int deviceMode = ssu.deviceMode(); + + if ((deviceMode & Ssu::DisableRepoManager) == Ssu::DisableRepoManager) + modeList.append("DisableRepoManager"); + if ((deviceMode & Ssu::RndMode) == Ssu::RndMode) + modeList.append("RndMode"); + if ((deviceMode & Ssu::ReleaseMode) == Ssu::ReleaseMode) + modeList.append("ReleaseMode"); + if ((deviceMode & Ssu::LenientMode) == Ssu::LenientMode) + modeList.append("LenientMode"); + + qout << "Device mode is: " << ssu.deviceMode() + << " (" << modeList.join(" | ") << ")" << endl; + + if ((deviceMode & Ssu::RndMode) == Ssu::RndMode && + (deviceMode & Ssu::ReleaseMode) == Ssu::ReleaseMode) + qout << "Both Release and RnD mode set, device is in RnD mode" << endl; + state = Idle; } else if (opt.count() == 3){ qout << "Setting device mode from " << ssu.deviceMode() @@ -135,6 +154,7 @@ void RndSsuCli::optRelease(QStringList opt){ } else { qout << "Changing release from " << ssu.release() << " to " << opt.at(2) << endl; + qout << "Your device is now in release mode!" << endl; ssu.setRelease(opt.at(2)); state = Idle; } @@ -144,30 +164,141 @@ void RndSsuCli::optRelease(QStringList opt){ } else if (opt.count() == 4 && opt.at(2) == "-r"){ qout << "Changing release (RnD) from " << ssu.release(true) << " to " << opt.at(3) << endl; + qout << "Your device is now in RnD mode!" << endl; ssu.setRelease(opt.at(3), true); state = Idle; } } void RndSsuCli::optRepos(QStringList opt){ + QTextStream qout(stdout); SsuRepoManager repoManager; SsuDeviceInfo deviceInfo; - QHash repoParameters; + QHash repoParameters, repoOverride; + QString device=""; bool rndRepo = false; + int micMode=0, flagStart = 0; + + if ((ssu.deviceMode() & Ssu::RndMode) == Ssu::RndMode) + rndRepo = true; + + if (opt.count() >= 3 && opt.at(2) == "-m"){ + micMode = 1; + // TODO: read the default mic override variables from some config + /* + repoOverride.insert("release", "@RELEASE@"); + repoOverride.insert("rndRelease", "@RNDRELEASE@"); + repoOverride.insert("flavour", "@FLAVOUR@"); + repoOverride.insert("arch", "@ARCH@"); + */ + } - QHash repoOverride; - repoOverride.insert("release", "@RELEASE@"); - repoOverride.insert("rndRelease", "@RNDRELEASE@"); - repoOverride.insert("flavour", "@FLAVOUR@"); - repoOverride.insert("arch", "@ARCH@"); - //repoOverride.insert("", ""); + if (opt.count() >= 3 + micMode){ + // first argument is flag + if (opt.at(2 + micMode).contains("=")){ + flagStart = 2 + micMode; + } else if (!opt.at(2 + micMode).contains("=") && + opt.count() == 3 + micMode) { + // first (and only) argument is device) + device = opt.at(2 + micMode); + } else if(!opt.at(2 + micMode).contains("=") && + opt.count() > 3 + micMode && + opt.at(3 + micMode).contains("=")){ + // first argument is device, second flag + device = opt.at(2 + micMode); + flagStart = 3 + micMode; + } else { + state = UserError; + return; + } + } - QStringList repos = deviceInfo.repos(rndRepo); + if (flagStart != 0){ + for (int i=flagStart; i longestField) + longestField = repo.length(); + + qout.setFieldAlignment(QTextStream::AlignLeft); + + foreach (const QString &repo, repos){ + QString repoUrl = ssu.repoUrl(repo, rndRepo, repoParameters, repoOverride); + qout << " - " << qSetFieldWidth(longestField) << repo << qSetFieldWidth(0) << " ... " << repoUrl << endl; + } + + if (i==0){ + if (device != ""){ + repos.clear(); + continue; + } + repos = deviceInfo.repos(rndRepo, SsuDeviceInfo::UserFilter); + qout << endl << "Enabled repositories (user): " << endl; + } else if (i==1){ + repos = deviceInfo.disabledRepos(); + if (device.isEmpty()) + qout << endl << "Disabled repositories (global, might be overridden by user config): " << endl; + else + qout << endl << "Disabled repositories (global): " << endl; + } else if (i==2) { + repos.clear(); + if (device != "") + continue; + if (ssuSettings->contains("disabled-repos")) + repos.append(ssuSettings->value("disabled-repos").toStringList()); + qout << endl << "Disabled repositories (user): " << endl; + } } state = Idle; @@ -307,6 +438,7 @@ void RndSsuCli::usage(){ << "\t [-m] \tformat output suitable for kickstart" << endl << "\t [device] \tuse repos for 'device'" << endl << "\t [flags] \tadditional flags" << endl + << "\t rnd= \tset rnd or release mode (default: take from host)" << endl << "\taddrepo, ar \tadd this repository" << endl << "\t [url] \tspecify URL, if not configured" << endl << "\tremoverepo, rr \tremove this repository from configuration" << endl diff --git a/rpm/ssu.changes b/rpm/ssu.changes index 03d9faf..bd17994 100644 --- a/rpm/ssu.changes +++ b/rpm/ssu.changes @@ -1,3 +1,6 @@ +* Sun Mar 31 2013 Bernd Wachter - 0.28.1 +- Enable repo listing for ssu CLI + * Sat Mar 30 2013 Bernd Wachter - 0.28 - Add repository management - Add basic device mode handling diff --git a/rpm/ssu.spec b/rpm/ssu.spec index 6672be2..d8bb2e2 100644 --- a/rpm/ssu.spec +++ b/rpm/ssu.spec @@ -1,5 +1,5 @@ Name: ssu -Version: 0.28 +Version: 0.28.1 Release: 1 Summary: SSU enabler for RND Group: System/Base diff --git a/ssuurlresolver/ssuurlresolver.cpp b/ssuurlresolver/ssuurlresolver.cpp index ce28d5e..41be6a2 100644 --- a/ssuurlresolver/ssuurlresolver.cpp +++ b/ssuurlresolver/ssuurlresolver.cpp @@ -126,7 +126,7 @@ void SsuUrlResolver::run(){ } - if (!headerList.isEmpty()){ + if (!headerList.isEmpty() && !resolvedUrl.isEmpty()){ resolvedUrl = QString("%1?%2") .arg(resolvedUrl) .arg(headerList.join("&"));