@@ -10,35 +10,46 @@ PacmanRunner::PacmanRunner(QObject *parent) :
1010 QObject(parent)
1111{}
1212
13- QStringList PacmanRunner::frontend () const
13+ std::tuple< QStringList, bool > PacmanRunner::frontend () const
1414{
1515 QSettings settings;
16- if (settings.contains (QStringLiteral (" frontend" )))
17- return settings.value (QStringLiteral (" frontend" )).toStringList ();
18- else {
19- QList<QStringList> defaultFn = {
20- {QStringLiteral (" trizen" )},
21- {QStringLiteral (" pacaur" ), QStringLiteral (" --rebuild" )},
22- {QStringLiteral (" yaourt" )}
16+ if (settings.contains (QStringLiteral (" frontend" ))) {
17+ return std::make_tuple (settings.value (QStringLiteral (" frontend" )).toStringList (),
18+ settings.value (QStringLiteral (" frontend/waved" ), false ).toBool ());
19+ } else {
20+ static const QList<std::tuple<QStringList, bool >> defaultFn = {
21+ std::make_tuple (QStringList{QStringLiteral (" trizen" )}, false ),
22+ std::make_tuple (QStringList{QStringLiteral (" pacaur" ), QStringLiteral (" --rebuild" )}, false ),
23+ std::make_tuple (QStringList{QStringLiteral (" yaourt" )}, true )
2324 };
2425 for (auto fn : defaultFn) {
25- if (!QStandardPaths::findExecutable (fn .first ()).isNull ())
26+ if (!QStandardPaths::findExecutable (std::get< 0 >(fn) .first ()).isNull ())
2627 return fn;
2728 }
28- return {QStringLiteral (" pacman" )};
29+ return std::make_tuple (QStringList {QStringLiteral (" pacman" )}, true ) ;
2930 }
3031}
3132
32- void PacmanRunner::setFrontend (const QStringList &cli)
33+ QString PacmanRunner::frontendDescription () const
34+ {
35+ auto fn = frontend ();
36+ return QStringLiteral (" %1 (%2)" )
37+ .arg (std::get<0 >(fn).join (QLatin1Char (' ' )))
38+ .arg (std::get<1 >(fn) ? QStringLiteral (" waved" ) : QStringLiteral (" grouped" ));
39+ }
40+
41+ void PacmanRunner::setFrontend (const QStringList &cli, bool waved)
3342{
3443 QSettings settings;
3544 settings.setValue (QStringLiteral (" frontend" ), cli);
36- qDebug () << " Updated pacman frontend to" << cli.first ();
45+ settings.setValue (QStringLiteral (" frontend/waved" ), waved);
46+ qDebug () << " Updated pacman frontend to" << cli.first ()
47+ << (waved ? " (waved)" : " (sorted)" );
3748}
3849
39- int PacmanRunner::run (const QStringList &pkgs )
50+ int PacmanRunner::run (const QList< QStringList> &waves )
4051{
41- if (pkgs .isEmpty ()) {
52+ if (waves .isEmpty ()) {
4253 qWarning () << " No packages need to be rebuilt" ;
4354 return EXIT_SUCCESS;
4455 }
@@ -50,7 +61,8 @@ int PacmanRunner::run(const QStringList &pkgs)
5061 throw QStringLiteral (" Unable to find pacman binary in PATH" );
5162 proc.setProgram (pacman);
5263 QStringList pacArgs {QStringLiteral (" -Qi" )};
53- pacArgs.append (pkgs);
64+ for (auto pkgs : waves)
65+ pacArgs.append (pkgs);
5466 proc.setArguments (pacArgs);
5567 proc.setProcessChannelMode (QProcess::ForwardedErrorChannel);
5668 proc.setStandardOutputFile (QProcess::nullDevice ());
@@ -62,11 +74,25 @@ int PacmanRunner::run(const QStringList &pkgs)
6274 throw QStringLiteral (" Please remove repkg files of uninstalled packages and mark the unchanged via `repkg clear <pkg>`" );
6375
6476 // run the frontend to reinstall packages
65- auto cliArgs = frontend ();
77+ QStringList cliArgs;
78+ bool waved;
79+ std::tie (cliArgs, waved) = frontend ();
6680 auto bin = QStandardPaths::findExecutable (cliArgs.takeFirst ());
6781 if (bin.isNull ())
6882 throw QStringLiteral (" Unable to find binary \" %1\" in PATH" ).arg (bin);
6983 cliArgs.append (QStringLiteral (" -S" ));
70- cliArgs.append (pkgs);
71- return QProcess::execute (bin, cliArgs);
84+ if (waved) {
85+ for (auto pkgs : waves) {
86+ auto args = cliArgs;
87+ args.append (pkgs);
88+ auto res = QProcess::execute (bin, args);
89+ if (res != EXIT_SUCCESS)
90+ return res;
91+ }
92+ return EXIT_SUCCESS;
93+ } else {
94+ for (auto pkgs : waves)
95+ cliArgs.append (pkgs);
96+ return QProcess::execute (bin, cliArgs);
97+ }
7298}
0 commit comments