added app list backup, helper shell scripts
[fapman] / packageview.cpp
index 73d0dd7..8b78bc0 100644 (file)
@@ -451,6 +451,12 @@ void PackageView::openWin()
                ui->actionRestore_all->setVisible(false);
        }
 
+       if( iSelectedStatFilter==Package::PkgStatInstalled ) {
+               ui->actionStore_list->setVisible(true);
+       } else {
+               ui->actionStore_list->setVisible(false);
+       }
+
        show();
 
        if( !ui->searchBar->isVisible() ) {
@@ -991,14 +997,19 @@ void PackageView::on_actionLoad_selections_triggered()
                        return;
        }
 
+       QString filename = QFileDialog::getOpenFileName(this, "Open selections list", KDefaultUserOpenSaveDir, "Selection lists (*.slist)");
+       if( filename.isNull() || filename.isEmpty() )
+               return;
+
        clearSelections();
 
        QStringList unknownList;
        QStringList wrongverList;
+       QStringList wrongstatusList;
        int success=0;
        int errors=0;
 
-       QFile f("/root/.fapman/selections.list");
+       QFile f( filename );
        if( f.open(QIODevice::ReadOnly | QIODevice::Text ) )
        {
                while(!f.atEnd()) {
@@ -1012,14 +1023,18 @@ void PackageView::on_actionLoad_selections_triggered()
                                                unknownList << parts.at(0);
                                        }
                                        else if( pkgIn ) {
-                                               wrongverList << parts.at(0);
+                                               wrongstatusList << parts.at(0);
                                        }
                                        else if( pkgAv ) {
-                                               if( pkgAv->version() == parts.at(1) && !pkgAv->isInstalled() ) {
+                                               if( !pkgAv->isInstalled() )
+                                               {
                                                        pkgAv->setMarkedForOperation(Package::PkgOpInstallUpgrade);
                                                        success++;
+                                                       if( pkgAv->version() != parts.at(1) ) {
+                                                               wrongverList << parts.at(0);
+                                                       }
                                                } else {
-                                                       wrongverList << parts.at(0);
+                                                       wrongstatusList << parts.at(0);
                                                }
                                        }
 
@@ -1028,14 +1043,18 @@ void PackageView::on_actionLoad_selections_triggered()
                                                unknownList << parts.at(0);
                                        }
                                        else if( (pkgAv && !pkgIn) || (pkgIn && !pkgAv) ) {
-                                               wrongverList << parts.at(0);
+                                               wrongstatusList << parts.at(0);
                                        }
                                        else if( pkgIn && pkgAv ) {
-                                               if( pkgIn->version() == parts.at(1) && pkgIn->isInstalled() && pkgIn->isUpgradeable() ) {
+                                               if( pkgIn->isInstalled() && pkgIn->isUpgradeable() )
+                                               {
                                                        pkgIn->setMarkedForOperation(Package::PkgOpInstallUpgrade);
                                                        success++;
+                                                       if( pkgIn->version() != parts.at(1) ) {
+                                                               wrongverList << parts.at(0);
+                                                       }
                                                } else {
-                                                       wrongverList << parts.at(0);
+                                                       wrongstatusList << parts.at(0);
                                                }
                                        }
 
@@ -1044,14 +1063,18 @@ void PackageView::on_actionLoad_selections_triggered()
                                                unknownList << parts.at(0);
                                        }
                                        else if( pkgAv && !pkgIn ) {
-                                               wrongverList << parts.at(0);
+                                               wrongstatusList << parts.at(0);
                                        }
                                        else if( pkgIn ) {
-                                               if( pkgIn->version() == parts.at(1) && pkgIn->isInstalled() ) {
+                                               if( pkgIn->isInstalled() )
+                                               {
                                                        pkgIn->setMarkedForOperation(Package::PkgOpRemove);
                                                        success++;
+                                                       if( pkgIn->version() != parts.at(1) ) {
+                                                               wrongverList << parts.at(0);
+                                                       }
                                                } else {
-                                                       wrongverList << parts.at(0);
+                                                       wrongstatusList << parts.at(0);
                                                }
                                        }
                                } else {
@@ -1067,14 +1090,25 @@ void PackageView::on_actionLoad_selections_triggered()
        ConfirmDialog d(false, this);
        QString msg;
        msg += QString("<b>%1 successful</b><br>").arg(success);
+
        if( wrongverList.count() > 0 ) {
-               msg += QString("%1 wrong versions/changed statuses (not selected):<br>").arg(wrongverList.count());
+               msg += QString("%1 version mismatches (selected anyway):<br>").arg(wrongverList.count());
                msg += "<font size=\"-1\">";
                for( int i=0; i<wrongverList.count(); i++ ) {
                        msg += wrongverList.at(i) + " ";
                }
                msg += "</font><br>";
        }
+
+       if( wrongstatusList.count() > 0 ) {
+               msg += QString("%1 status mismatches (packages ignored):<br>").arg(wrongstatusList.count());
+               msg += "<font size=\"-1\">";
+               for( int i=0; i<wrongstatusList.count(); i++ ) {
+                       msg += wrongstatusList.at(i) + " ";
+               }
+               msg += "</font><br>";
+       }
+
        if( unknownList.count() > 0 ) {
                msg += QString("%1 unknown packages:<br>").arg(unknownList.count());
                msg += "<font size=\"-1\">";
@@ -1083,10 +1117,11 @@ void PackageView::on_actionLoad_selections_triggered()
                }
                msg += "</font><br>";
        }
-       if( errors>0 || (wrongverList.count()==0 && unknownList.count()==0) ) {
+
+       if( errors>0 || (wrongstatusList.count()==0 && unknownList.count()==0) ) {
                msg += QString("%1 errors<br>").arg(errors);
        }
-       if( success==0 && wrongverList.count()==0 && unknownList.count()==0 )
+       if( success==0 && wrongstatusList.count()==0 && unknownList.count()==0 )
                msg = "No stored selections";
        QString title;
        if( success > 0 )
@@ -1096,6 +1131,14 @@ void PackageView::on_actionLoad_selections_triggered()
        d.setText(title, msg);
        d.exec();
 
+       if( unknownList.count()>0 && iAptInterface->needListOrDateRefresh() )
+       {
+               ConfirmDialog f(false, this);
+               f.setText("About Unknown packages","You encountered unknown packages. You might want to try "
+                                 "loading the selections again after loading the full package lists (by selecting install or upgrade view)");
+               f.exec();
+       }
+
        if( success > 0 ) {
                ui->btn_StatusFilter->setEnabled(false);
                iSelectedCatFilter = CatFilterAllMarked;
@@ -1108,7 +1151,14 @@ void PackageView::on_actionSave_selections_triggered()
        if( iAptInterface->numSelectedPackages() == 0 )
                return;
 
-       QFile f("/root/.fapman/selections.list");
+       QString filename = QFileDialog::getSaveFileName(this, "Save selections to...", KDefaultUserOpenSaveDir, "Selection lists (*.slist)");
+       if( filename.isNull() || filename.isEmpty() )
+               return;
+
+       if( !filename.endsWith(".slist") )
+               filename.append(".slist");
+
+       QFile f( filename );
        bool fail = false;
        int count = 0;
        if( f.open(QIODevice::WriteOnly | QIODevice::Text) )
@@ -1182,3 +1232,44 @@ void PackageView::on_actionRestore_all_triggered()
        iAptInterface->writeBlacklist();
        openWin();
 }
+
+void PackageView::on_actionStore_list_triggered()
+{
+       QString filename = QFileDialog::getSaveFileName(this, "Save application list to...", KDefaultUserOpenSaveDir, "Selection lists (*.slist)");
+       if( filename.isNull() || filename.isEmpty() )
+               return;
+
+       if( !filename.endsWith(".slist") )
+               filename.append(".slist");
+
+       QFile f( filename );
+       bool fail = false;
+       int count = 0;
+       if( f.open(QIODevice::WriteOnly | QIODevice::Text) )
+       {
+               QTextStream out(&f);
+
+               QHashIterator<QString, Package*> r( *iAptInterface->packagesInstalled() );
+               while (r.hasNext())
+               {
+                       r.next();
+
+                       if( r.value()->isInstalled() && r.value()->section().startsWith("user/") ) {
+                               out << r.value()->name() << " " << r.value()->version() << " install\n";
+                               count++;
+                       }
+               }
+
+               f.close();
+       } else {
+               fail = true;
+       }
+
+       ConfirmDialog d(false, this);
+       if( fail )
+               d.setText( "Error", "Failed to write application list" );
+       else
+               d.setText( "List stored", QString("Stored %1 selections.").arg(count) + "<br>"
+                                  "The list can be used to restore removed applications later." );
+       d.exec();
+}