Package: release.debian.org Severity: normal Tags: buster User: release.debian....@packages.debian.org Usertags: pu
Hello, upstream just fixed a bug in qdirstat, where user configured MIME categories are not saved properly, as described here: https://github.com/shundhammer/qdirstat/issues/109 Upstream patch: https://github.com/shundhammer/qdirstat/commit/7ce3d1ebe51e55951c7b6d318dc8870b6f1eea77 I have prepared this patch: diff -Naur '--exclude=.svn' tags/1.5-1/debian/changelog branches/buster/debian/changelog --- tags/1.5-1/debian/changelog 2018-11-08 12:20:05.069481981 +0100 +++ branches/buster/debian/changelog 2019-07-09 10:18:06.341381029 +0200 @@ -1,3 +1,10 @@ +qdirstat (1.5-1+deb10u1) UNRELEASED; urgency=medium + + * Add upstream patch 01-mime-categories-save to fix a bug where user + configured MIME categories are not saved. + + -- Patrick Matthäi <pmatth...@debian.org> Tue, 09 Jul 2019 10:16:47 +0200 + qdirstat (1.5-1) unstable; urgency=medium * New upstream release. diff -Naur '--exclude=.svn' tags/1.5-1/debian/patches/01-mime-categories-save.diff branches/buster/debian/patches/01-mime-categories-save.diff --- tags/1.5-1/debian/patches/01-mime-categories-save.diff 1970-01-01 01:00:00.000000000 +0100 +++ branches/buster/debian/patches/01-mime-categories-save.diff 2019-07-09 10:15:19.878253032 +0200 @@ -0,0 +1,419 @@ +From 7ce3d1ebe51e55951c7b6d318dc8870b6f1eea77 Mon Sep 17 00:00:00 2001 +From: Stefan Hundhammer <stefan.hundham...@gmx.de> +Date: Mon, 1 Jul 2019 17:08:19 +0200 +Subject: [PATCH] Turned MimeCategorizer into a singleton to properly save + config (GitHub issue #109) + +--- + src/FileDetailsView.cpp | 11 ++-------- + src/FileDetailsView.h | 2 -- + src/FileTypeStats.cpp | 4 ++-- + src/MainWindow.cpp | 8 ++----- + src/MainWindow.h | 2 -- + src/MimeCategorizer.cpp | 23 +++++++++++++++++-- + src/MimeCategorizer.h | 40 ++++++++++++++++++++++++---------- + src/MimeCategoryConfigPage.cpp | 4 ++-- + src/MimeCategoryConfigPage.h | 12 ---------- + src/TreemapView.cpp | 18 +-------------- + src/TreemapView.h | 15 ------------- + 11 files changed, 59 insertions(+), 80 deletions(-) + +diff --git a/src/FileDetailsView.cpp b/src/FileDetailsView.cpp +index 0b8f60a..93788c4 100644 +--- a/src/FileDetailsView.cpp ++++ b/src/FileDetailsView.cpp +@@ -23,8 +23,7 @@ FileDetailsView::FileDetailsView( QWidget * parent ): + QStackedWidget( parent ), + _ui( new Ui::FileDetailsView ), + _pkgUpdateTimer( new AdaptiveTimer( this ) ), +- _labelLimit( 40 ), +- _mimeCategorizer( 0 ) ++ _labelLimit( 40 ) + { + CHECK_NEW( _ui ); + CHECK_NEW( _pkgUpdateTimer ); +@@ -423,13 +422,7 @@ QString FileDetailsView::limitText( const QString & longText ) + + QString FileDetailsView::mimeCategory( FileInfo * file ) + { +- if ( ! _mimeCategorizer ) +- { +- _mimeCategorizer = new MimeCategorizer( this ); +- CHECK_NEW( _mimeCategorizer ); +- } +- +- MimeCategory * category = _mimeCategorizer->category( file ); ++ MimeCategory * category = MimeCategorizer::instance()->category( file ); + + return category ? category->name() : ""; + } +diff --git a/src/FileDetailsView.h b/src/FileDetailsView.h +index e36792c..f677b92 100644 +--- a/src/FileDetailsView.h ++++ b/src/FileDetailsView.h +@@ -16,7 +16,6 @@ + + namespace QDirStat + { +- class MimeCategorizer; + class AdaptiveTimer; + + /** +@@ -153,7 +152,6 @@ namespace QDirStat + Ui::FileDetailsView * _ui; + AdaptiveTimer * _pkgUpdateTimer; + int _labelLimit; +- MimeCategorizer * _mimeCategorizer; + + }; // class FileDetailsView + } // namespace QDirStat +diff --git a/src/FileTypeStats.cpp b/src/FileTypeStats.cpp +index d50821f..f453776 100644 +--- a/src/FileTypeStats.cpp ++++ b/src/FileTypeStats.cpp +@@ -21,8 +21,8 @@ FileTypeStats::FileTypeStats( QObject * parent ): + QObject( parent ), + _totalSize( 0LL ) + { +- _mimeCategorizer = new MimeCategorizer( this ); +- CHECK_NEW( _mimeCategorizer ); ++ _mimeCategorizer = MimeCategorizer::instance(); ++ CHECK_PTR( _mimeCategorizer ); + + _otherCategory = new MimeCategory( tr( "Other" ) ); + CHECK_NEW( _otherCategory ); +diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp +index fdce914..b405565 100644 +--- a/src/MainWindow.cpp ++++ b/src/MainWindow.cpp +@@ -103,10 +103,7 @@ MainWindow::MainWindow(): + _ui->dirTreeView->setCleanupCollection( _cleanupCollection ); + _ui->treemapView->setCleanupCollection( _cleanupCollection ); + +- _mimeCategorizer = new MimeCategorizer(); +- CHECK_NEW( _mimeCategorizer ); +- +- _ui->treemapView->setMimeCategorizer( _mimeCategorizer ); ++ _ui->breadcrumbNavigator->clear(); + + #ifdef Q_OS_MACX + // This makes the application to look like more "native" on macOS +@@ -132,6 +129,7 @@ MainWindow::~MainWindow() + + writeSettings(); + ExcludeRules::instance()->writeSettings(); ++ MimeCategorizer::instance()->writeSettings(); + + // Relying on the QObject hierarchy to properly clean this up resulted in a + // segfault; there was probably a problem in the deletion order. +@@ -141,7 +139,6 @@ MainWindow::~MainWindow() + + delete _ui->dirTreeView; + delete _cleanupCollection; +- delete _mimeCategorizer; + delete _selectionModel; + delete _dirTreeModel; + +@@ -919,7 +916,6 @@ void MainWindow::openConfigDialog() + _configDialog = new ConfigDialog( this ); + CHECK_PTR( _configDialog ); + _configDialog->cleanupConfigPage()->setCleanupCollection( _cleanupCollection ); +- _configDialog->mimeCategoryConfigPage()->setMimeCategorizer( _mimeCategorizer ); + + if ( ! _configDialog->isVisible() ) + { +diff --git a/src/MainWindow.h b/src/MainWindow.h +index 9f8050b..3054db2 100644 +--- a/src/MainWindow.h ++++ b/src/MainWindow.h +@@ -31,7 +31,6 @@ namespace QDirStat + class ConfigDialog; + class DirTreeModel; + class FileInfo; +- class MimeCategorizer; + class SelectionModel; + } + +@@ -363,7 +362,6 @@ protected slots: + QDirStat::DirTreeModel * _dirTreeModel; + QDirStat::SelectionModel * _selectionModel; + QDirStat::CleanupCollection * _cleanupCollection; +- QDirStat::MimeCategorizer * _mimeCategorizer; + QDirStat::ConfigDialog * _configDialog; + QActionGroup * _layoutActionGroup; + QPointer<FileTypeStatsWindow> _fileTypeStatsWindow; +diff --git a/src/MimeCategorizer.cpp b/src/MimeCategorizer.cpp +index 7c8ad45..1d38f89 100644 +--- a/src/MimeCategorizer.cpp ++++ b/src/MimeCategorizer.cpp +@@ -17,10 +17,26 @@ + using namespace QDirStat; + + +-MimeCategorizer::MimeCategorizer( QObject * parent ): +- QObject( parent ), ++MimeCategorizer * MimeCategorizer::_instance = 0; ++ ++ ++MimeCategorizer * MimeCategorizer::instance() ++{ ++ if ( ! _instance ) ++ { ++ _instance = new MimeCategorizer(); ++ CHECK_NEW( _instance ); ++ } ++ ++ return _instance; ++} ++ ++ ++MimeCategorizer::MimeCategorizer(): ++ QObject( 0 ), + _mapsDirty( true ) + { ++ // logDebug() << "Creating MimeCategorizer" << endl; + readSettings(); + } + +@@ -212,6 +228,7 @@ void MimeCategorizer::readSettings() + + void MimeCategorizer::writeSettings() + { ++ // logDebug() << endl; + MimeCategorySettings settings; + + // Remove all leftover cleanup descriptions +@@ -226,6 +243,7 @@ void MimeCategorizer::writeSettings() + MimeCategory * category = _categories.at(i); + + settings.setValue( "Name", category->name() ); ++ // logDebug() << "Adding " << groupName << ": " << category->name() << endl; + writeColorEntry( settings, "Color", category->color() ); + + QStringList patterns = category->humanReadablePatternList( Qt::CaseInsensitive ); +@@ -303,6 +321,7 @@ void MimeCategorizer::addDefaultCategories() + << "jpeg" + << "jpg" + << "png" ++ << "svg" + << "tif" + << "tiff" + << "xcf.bz2" +diff --git a/src/MimeCategorizer.h b/src/MimeCategorizer.h +index 24a244f..a290a33 100644 +--- a/src/MimeCategorizer.h ++++ b/src/MimeCategorizer.h +@@ -25,22 +25,37 @@ namespace QDirStat + * This class is optimized for performance since the names of all files in + * QDirStat's DirTree need to be checked (something in the order of 200,000 + * in a typical Linux root file system). ++ * ++ * This is a singleton class. Use instance() to get the instance. Remember ++ * to call instance()->writeSettings() in an appropriate destructor in the ++ * application to write the settings to disk. + **/ + class MimeCategorizer: public QObject + { + Q_OBJECT + +- public: ++ protected: ++ + /** + * Constructor. ++ * This is a singleton class; use instance() instead. + **/ +- MimeCategorizer( QObject * parent = 0 ); ++ MimeCategorizer(); + + /** + * Destructor. + **/ + virtual ~MimeCategorizer(); + ++ ++ public: ++ ++ /** ++ * Get the singleton for this class. The first call to this will create ++ * it. ++ **/ ++ static MimeCategorizer * instance(); ++ + /** + * Return the MimeCategory for a FileInfo item or 0 if it doesn't fit + * into any of the available categories. +@@ -50,11 +65,11 @@ namespace QDirStat + /** + * Return the MimeCategory for a filename or 0 if it doesn't fit into + * any of the available categories. +- * +- * If 'suffix_ret' is non-null, it returns the suffix used if the +- * category was found by a suffix rule. If the category was not found +- * or if a regexp (rather than a suffix rule) matched, this returns an +- * empty string. ++ * ++ * If 'suffix_ret' is non-null, it returns the suffix used if the ++ * category was found by a suffix rule. If the category was not found ++ * or if a regexp (rather than a suffix rule) matched, this returns an ++ * empty string. + **/ + MimeCategory * category( const QString & filename, QString * suffix_ret = 0 ); + +@@ -96,6 +111,7 @@ namespace QDirStat + **/ + void writeSettings(); + ++ + protected: + + /** +@@ -128,11 +144,13 @@ namespace QDirStat + // Data members + // + +- bool _mapsDirty; +- MimeCategoryList _categories; ++ static MimeCategorizer * _instance; ++ ++ bool _mapsDirty; ++ MimeCategoryList _categories; + +- QMap<QString, MimeCategory *> _caseInsensitiveSuffixMap; +- QMap<QString, MimeCategory *> _caseSensitiveSuffixMap; ++ QMap<QString, MimeCategory *> _caseInsensitiveSuffixMap; ++ QMap<QString, MimeCategory *> _caseSensitiveSuffixMap; + + }; // class MimeCategorizer + +diff --git a/src/MimeCategoryConfigPage.cpp b/src/MimeCategoryConfigPage.cpp +index 1c4ba0a..6e1d3d0 100644 +--- a/src/MimeCategoryConfigPage.cpp ++++ b/src/MimeCategoryConfigPage.cpp +@@ -30,10 +30,11 @@ using namespace QDirStat; + MimeCategoryConfigPage::MimeCategoryConfigPage( QWidget * parent ): + ListEditor( parent ), + _ui( new Ui::MimeCategoryConfigPage ), +- _categorizer( 0 ), ++ _categorizer( MimeCategorizer::instance() ), + _dirTree( 0 ) + { + CHECK_NEW( _ui ); ++ CHECK_PTR( _categorizer ); + + _ui->setupUi( this ); + setListWidget ( _ui->listWidget ); +@@ -86,7 +87,6 @@ void MimeCategoryConfigPage::discardChanges() + // logDebug() << endl; + + listWidget()->clear(); +- _categorizer->clear(); + _categorizer->readSettings(); + } + +diff --git a/src/MimeCategoryConfigPage.h b/src/MimeCategoryConfigPage.h +index 4ae98a1..e9bf1a3 100644 +--- a/src/MimeCategoryConfigPage.h ++++ b/src/MimeCategoryConfigPage.h +@@ -30,18 +30,6 @@ namespace QDirStat + MimeCategoryConfigPage( QWidget * parent = 0 ); + virtual ~MimeCategoryConfigPage(); + +- /** +- * Set the MimeCategorizer to work on. +- **/ +- void setMimeCategorizer( MimeCategorizer * categorizer ) +- { _categorizer = categorizer; } +- +- /** +- * Return the internal MimeCategorizer. +- **/ +- MimeCategorizer * mimeCategorizer() const +- { return _categorizer; } +- + public slots: + + /** +diff --git a/src/TreemapView.cpp b/src/TreemapView.cpp +index f40e498..af9e6bb 100644 +--- a/src/TreemapView.cpp ++++ b/src/TreemapView.cpp +@@ -34,7 +34,6 @@ TreemapView::TreemapView( QWidget * parent ): + _selectionModel(0), + _selectionModelProxy(0), + _cleanupCollection(0), +- _mimeCategorizer(0), + _rebuilder(0), + _rootTile(0), + _currentItem(0), +@@ -632,15 +631,6 @@ QSize TreemapView::visibleSize() + } + + +-void TreemapView::setMimeCategorizer( MimeCategorizer * newCategorizer ) +-{ +- if ( _mimeCategorizer ) +- delete _mimeCategorizer; +- +- _mimeCategorizer = newCategorizer; +-} +- +- + void TreemapView::setFixedColor( const QColor & color ) + { + _fixedColor = color; +@@ -657,13 +647,7 @@ QColor TreemapView::tileColor( FileInfo * file ) + { + if ( file->isFile() ) + { +- if ( ! _mimeCategorizer ) +- { +- _mimeCategorizer = new MimeCategorizer( this ); +- CHECK_NEW( _mimeCategorizer ); +- } +- +- MimeCategory * category = _mimeCategorizer->category( file ); ++ MimeCategory * category = MimeCategorizer::instance()->category( file ); + + if ( category ) + return category->color(); +diff --git a/src/TreemapView.h b/src/TreemapView.h +index 1f1e0f7..00aaf5b 100644 +--- a/src/TreemapView.h ++++ b/src/TreemapView.h +@@ -43,7 +43,6 @@ namespace QDirStat + class SelectionModelProxy; + class CleanupCollection; + class FileInfoSet; +- class MimeCategorizer; + class DelayedRebuilder; + + +@@ -132,19 +131,6 @@ namespace QDirStat + **/ + QColor tileColor( FileInfo * file ); + +- /** +- * Return the MimeCategorizer (the class that maps filenames to treemap +- * colors) or 0 if it is not created yet. The MimeCategorizer is +- * created lazily when needed. +- **/ +- MimeCategorizer * mimeCategorizer() const { return _mimeCategorizer; } +- +- /** +- * Set the MimeCategorizer (the class that maps filenames to treemap +- * colors). +- **/ +- void setMimeCategorizer( MimeCategorizer * categorizer ); +- + /** + * Use a fixed color for all tiles. To undo this, set an invalid QColor + * with the QColor default constructor. +@@ -493,7 +479,6 @@ namespace QDirStat + SelectionModel * _selectionModel; + SelectionModelProxy * _selectionModelProxy; + CleanupCollection * _cleanupCollection; +- MimeCategorizer * _mimeCategorizer; + DelayedRebuilder * _rebuilder; + TreemapTile * _rootTile; + TreemapTile * _currentItem; diff -Naur '--exclude=.svn' tags/1.5-1/debian/patches/series branches/buster/debian/patches/series --- tags/1.5-1/debian/patches/series 1970-01-01 01:00:00.000000000 +0100 +++ branches/buster/debian/patches/series 2019-07-09 10:16:36.229853140 +0200 @@ -0,0 +1 @@ +01-mime-categories-save.diff -- System Information: Debian Release: 10.0 APT prefers stable APT policy: (500, 'stable') Architecture: amd64 (x86_64) Kernel: Linux 4.19.0-5-amd64 (SMP w/2 CPU cores) Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8), LANGUAGE=de_DE.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Init: systemd (via /run/systemd/system) LSM: AppArmor: enabled