--- Begin Message ---
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
--- End Message ---