Index: gtk/rgchangeswindow.h =================================================================== --- gtk/rgchangeswindow.h (revision 308) +++ gtk/rgchangeswindow.h (working copy) @@ -51,7 +51,8 @@ vector &kept, vector &toInstall, vector &toUpgrade, - vector &toRemove); + vector &toRemove, + vector &toDowngrade); }; #endif Index: gtk/rgmainwindow.cc =================================================================== --- gtk/rgmainwindow.cc (revision 312) +++ gtk/rgmainwindow.cc (working copy) @@ -1705,17 +1705,19 @@ vector toKeep; vector toInstall; vector toUpgrade; + vector toDowngrade; vector toRemove; // ask if the user really want this changes bool changed=true; if (ask && me->_lister->getStateChanges(state, toKeep, toInstall, - toUpgrade, toRemove, exclude)) { + toUpgrade, toRemove, toDowngrade, + exclude)) { RGChangesWindow *chng; // show a summary of what's gonna happen chng = new RGChangesWindow(me); if (!chng->showAndConfirm(me->_lister, toKeep, toInstall, - toUpgrade, toRemove)) { + toUpgrade, toRemove, toDowngrade)) { // canceled operation me->_lister->restoreState(state); changed=false; Index: gtk/rgchangeswindow.cc =================================================================== --- gtk/rgchangeswindow.cc (revision 308) +++ gtk/rgchangeswindow.cc (working copy) @@ -90,7 +90,8 @@ vector &kept, vector &toInstall, vector &toUpgrade, - vector &toRemove) + vector &toRemove, + vector &toDowngrade) { GtkTreeIter iter, iter_child; @@ -109,6 +110,22 @@ } } + if(toDowngrade.size() > 0) { + /* downgrade */ + gtk_tree_store_append (_treeStore, &iter, NULL); + gtk_tree_store_set (_treeStore, &iter, + PKG_COLUMN, _("To be downgraded"), -1); + for (vector::const_iterator p = toDowngrade.begin(); + p != toDowngrade.end(); + p++) + { + gtk_tree_store_append (_treeStore, &iter_child, &iter); + gtk_tree_store_set(_treeStore, &iter_child, + PKG_COLUMN,(*p)->name(), -1); + } + } + + if(toUpgrade.size() > 0) { gtk_tree_store_append (_treeStore, &iter, NULL); gtk_tree_store_set (_treeStore, &iter, Index: common/rpackagelister.h =================================================================== --- common/rpackagelister.h (revision 308) +++ common/rpackagelister.h (working copy) @@ -264,6 +264,7 @@ vector &toInstall, vector &toUpgrade, vector &toRemove, + vector &toDowngrade, vector &exclude, bool sorted=true); Index: common/rcacheactor.cc =================================================================== --- common/rcacheactor.cc (revision 308) +++ common/rcacheactor.cc (working copy) @@ -25,6 +25,7 @@ vector toInstall; vector toUpgrade; vector toRemove; + vector toDowngrade; vector exclude; // empty //cout << "_laststate: " << _laststate << endl; @@ -32,13 +33,16 @@ return; if (_lister->getStateChanges(*_laststate, toKeep, toInstall, - toUpgrade, toRemove, exclude, false)) { + toUpgrade, toRemove, toDowngrade, + exclude, false)) { if (toKeep.empty() == false) run(toKeep, ACTION_KEEP); if (toInstall.empty() == false) run(toInstall, ACTION_INSTALL); if (toUpgrade.empty() == false) run(toUpgrade, ACTION_INSTALL); + if (toDowngrade.empty() == false) + run(toDowngrade, ACTION_INSTALL); if (toRemove.empty() == false) run(toRemove, ACTION_REMOVE); } Index: common/rpackagelister.cc =================================================================== --- common/rpackagelister.cc (revision 308) +++ common/rpackagelister.cc (working copy) @@ -1256,6 +1256,7 @@ vector &toInstall, vector &toUpgrade, vector &toRemove, + vector &toDowngrade, vector &exclude, bool sorted) { @@ -1288,6 +1289,10 @@ break; case RPackage::MDowngrade: + toDowngrade.push_back(_packages[i]); + changed = true; + break; + case RPackage::MBroken: case RPackage::MPinned: case RPackage::MNew: @@ -1306,6 +1311,9 @@ sort(toUpgrade.begin(), toUpgrade.end(), bla()); if (toRemove.empty() == false) sort(toRemove.begin(), toRemove.end(), bla()); + if (toDowngrade.empty() == false) + sort(toDowngrade.begin(), toDowngrade.end(), bla()); + } return changed;