summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Riebeling <Dominik.Riebeling@gmail.com>2007-10-07 21:47:49 +0000
committerDominik Riebeling <Dominik.Riebeling@gmail.com>2007-10-07 21:47:49 +0000
commit2b2c53689559de30968a5695d6b75ccccbd77570 (patch)
tree1377df20cd3cf4944eb314a3d35fba0802ef9b86
parent22cf8adf01bac924e2581458483a28dfd776c186 (diff)
downloadrockbox-2b2c53689559de30968a5695d6b75ccccbd77570.zip
rockbox-2b2c53689559de30968a5695d6b75ccccbd77570.tar.gz
rockbox-2b2c53689559de30968a5695d6b75ccccbd77570.tar.bz2
rockbox-2b2c53689559de30968a5695d6b75ccccbd77570.tar.xz
Upon uninstallation only remove a file if it isn't used in another section. A possible problematic case would've been two themes installing the same font.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15028 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--rbutil/rbutilqt/uninstall.cpp30
1 files changed, 26 insertions, 4 deletions
diff --git a/rbutil/rbutilqt/uninstall.cpp b/rbutil/rbutilqt/uninstall.cpp
index 2e96d49..4bd5c90 100644
--- a/rbutil/rbutilqt/uninstall.cpp
+++ b/rbutil/rbutilqt/uninstall.cpp
@@ -44,36 +44,58 @@ void Uninstaller::uninstall(ProgressloggerInterface* dp)
m_dp->setProgressMax(0);
m_dp->addItem(tr("Starting Uninstallation"),LOGINFO);
- QSettings installlog(m_mountpoint + "/.rockbox/rbutil.log", QSettings::IniFormat, 0);
+ QSettings installlog(m_mountpoint + "/.rockbox/rbutil.log", QSettings::IniFormat, this);
for(int i=0; i< uninstallSections.size() ; i++)
{
m_dp->addItem(tr("Uninstalling ") + uninstallSections.at(i) + " ...",LOGINFO);
+ // create list of all other install sections
+ QStringList sections = installlog.childGroups();
+ sections.removeAt(sections.indexOf(uninstallSections.at(i)));
installlog.beginGroup(uninstallSections.at(i));
QStringList toDeleteList = installlog.allKeys();
QStringList dirList;
+ installlog.endGroup();
- // iterate over all entrys
+ // iterate over all entries
for(int j =0; j < toDeleteList.size(); j++ )
{
+ // check if current file is in use by another section
+ bool deleteFile = true;
+ for(int s = 0; s < sections.size(); s++)
+ {
+ installlog.beginGroup(sections.at(s));
+ if(installlog.contains(toDeleteList.at(j)))
+ {
+ deleteFile = false;
+ qDebug() << "file still in use:" << toDeleteList.at(j);
+ }
+ installlog.endGroup();
+ }
+
+ installlog.beginGroup(uninstallSections.at(i));
QFileInfo toDelete(m_mountpoint + "/" + toDeleteList.at(j));
if(toDelete.isFile()) // if it is a file remove it
{
- if(!QFile::remove(toDelete.filePath()))
+ if(deleteFile && !QFile::remove(toDelete.filePath()))
m_dp->addItem(tr("Could not delete: ")+ toDelete.filePath(),LOGWARNING);
installlog.remove(toDeleteList.at(j));
}
else // if it is a dir, remember it for later deletion
{
+ // no need to keep track on folders still in use -- only empty
+ // folders will be rm'ed.
dirList << toDeleteList.at(j);
}
+ installlog.endGroup();
}
// delete the dirs
+ installlog.beginGroup(uninstallSections.at(i));
for(int j=0; j < dirList.size(); j++ )
{
installlog.remove(dirList.at(j));
QDir dir(m_mountpoint);
- dir.rmdir(dirList.at(j));
+ dir.rmdir(dirList.at(j)); // rm works only on empty folders
}
installlog.endGroup();