pax_global_header 0000666 0000000 0000000 00000000064 13115020367 0014510 g ustar 00root root 0000000 0000000 52 comment=7173a9f0cf4dd5cb1f3f85ef44bd2acad89463d3
qdirstat-1.4/ 0000775 0000000 0000000 00000000000 13115020367 0013207 5 ustar 00root root 0000000 0000000 qdirstat-1.4/.gitignore 0000664 0000000 0000000 00000000026 13115020367 0015175 0 ustar 00root root 0000000 0000000 Makefile
.qmake.stash
qdirstat-1.4/LICENSE 0000664 0000000 0000000 00000043177 13115020367 0014230 0 ustar 00root root 0000000 0000000 GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
{description}
Copyright (C) {year} {fullname}
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
{signature of Ty Coon}, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
qdirstat-1.4/README.md 0000664 0000000 0000000 00000113374 13115020367 0014477 0 ustar 00root root 0000000 0000000 # QDirStat
Qt-based directory statistics: KDirStat without any KDE -- from the author of
the original KDirStat.
(c) 2015-2017 Stefan Hundhammer
Target Platforms: Linux, BSD, Unix-like systems
License: GPL V2
Updated: 2017-06-04
## Overview
QDirStat is a graphical application to show where your disk space has gone and
to help you to clean it up.
This is a Qt-only port of the old Qt3/KDE3-based KDirStat, now based on the
latest Qt 5. It does not need any KDE libs or infrastructure. It runs on every
X11-based desktop on Linux, BSD and other Unix-like systems.
QDirStat has a number of new features compared to KDirStat. To name a few:
- Multi-selection in both the tree and the treemap.
- Unlimited number of user-defined cleanup actions.
- Properly show errors of cleanup actions (and their output, if desired).
- File categories (MIME types) and their treemap color are now configurable.
- Exclude rules for directories are easily configurable.
- Desktop-agnostic; no longer relies on KDE or any other specific desktop.
See section _New Features_ for more details.
## Screenshots
[
](https://raw.githubusercontent.com/shundhammer/qdirstat/master/screenshots/QDirStat-main-win.png)
_Main window screenshot - notice the multi-selection in the tree and the treemap_
[
](https://raw.githubusercontent.com/shundhammer/qdirstat/master/screenshots/QDirStat-file-type-stats.png)
[
](https://raw.githubusercontent.com/shundhammer/qdirstat/master/screenshots/QDirStat-cleanup-output.png)
[
](https://raw.githubusercontent.com/shundhammer/qdirstat/master/screenshots/QDirStat-column-config.png)
[
](https://raw.githubusercontent.com/shundhammer/qdirstat/master/screenshots/QDirStat-locating-file-types.png)
[
](https://raw.githubusercontent.com/shundhammer/qdirstat/master/screenshots/QDirStat-cleanup-config.png)
[
](https://raw.githubusercontent.com/shundhammer/qdirstat/master/screenshots/QDirStat-mime-config.png)
[
](https://raw.githubusercontent.com/shundhammer/qdirstat/master/screenshots/QDirStat-exclude-rules-config.png)
[
](https://raw.githubusercontent.com/shundhammer/qdirstat/master/screenshots/QDirStat-histogram.png)
[
](https://raw.githubusercontent.com/shundhammer/qdirstat/master/screenshots/QDirStat-histogram-options.png)
[
](https://raw.githubusercontent.com/shundhammer/qdirstat/master/screenshots/QDirStat-stats-help.png)
_Full-size images and descriptions on the [Screenshots Page](https://github.com/shundhammer/qdirstat/blob/master/screenshots/README.md)_
-----------------------
## Latest News
**Latest stable release: V1.4**
- 2017-06-04 **New stable release: V1.4**
It's about time to ship all those latest changes.
- 2017-06-04 Fixed problem with directories that have read, but not execute
permissions thanks to _slodki_:
In that case, you'd get a warning in the log for every entry in such a
directory, and it would get the wrong icon (a locked folder) and null values
for all fields. Now checking for execute and read permission of the directory
in advance and not even trying to read any contents (because the values would
be bogus anyway).
- 2017-05-31 Fixed [GitHub Issue #61](https://github.com/shundhammer/qdirstat/issues/61):
Files and directories with UTF-8 special characters in the name not read
correctly when built with Qt 4.x
This happened only when QDirStat was built against Qt 4.x, but that is the
default for NHellFire's PPA, so this affects all Ubuntu users who installed
QDirStat from that PPA.
Thanks to _slodki_ who pointed this problem out!
- 2017-05-12 Checked code with [Coverity](https://scan.coverity.com/)
Coverity offers free static code analysis for Open Source projects.
This is really an outstanding tool, and it does a really thorough analysis.
You might be glad to hear that while it complained about some minor things,
there was not a single issue that would have been user relevant (let alone
any security problems - there were none). Still, I did my best to fix the
small complaints it had, and now we are down to zero outstanding defects
reported by Coverity in QDirStat's 130,000 lines of code.
- 2017-04-21 More consistency between file type and size statistics
Like the new file size statistics window, the older file type statistics
window now uses the currently selected directory (in the tree view), not
always the tree's toplevel directory. If nothing is selected, it still uses
the toplevel directory.
That means that F3 no longer toggles that window, but re-populates it with
the currently selected directory instead. This is consistent with the F2
view.
Of course, the "Locate Files by Type" window now is also restricted to that
subtree which actually gives it better functionality if you know that you
want to locate files only there.
This means that you can now select a subdirectory in the tree, open the file
type statistics for it (F3 key), then select any filename extension (suffix)
in that window and then open the file size statistics (F2 key) for that file
type in that subtree.
Previously, you would have to start QDirStat to show only that directory,
then open the file type statistics window (F3), then the file size statistics
window (F2) from there.
- 2017-04-14 _Let's do some real statistics_
It's been a while since the last official news here, but I wasn't idle during
that time:

This is a whole new kind of statistics in QDirStat showing how file sizes are
distributed. You can start that for any selected directory (menu _View_ ->
_File Size Statistics_ or F2) or from the _File Type Statistics" window if
you select any filename suffix (extension) there and then _File Type_ ->
_Size Statistics_ (or F2). In the latter case, you can see how large all your
photos (.jpg), your videos (.mp4) or whatever are.
This new statistics window deals with a lot of things you might have come to
hate at school or at university, and which your math teacher or your
statistics professor never explained in a way that mere mortals can
understand, so I added those explanations as a bonus. There is a landing page
for that in that new window:

Or you might use
[this](https://github.com/shundhammer/qdirstat/tree/master/doc/stats)
as a starting point.
Everybody thinking "I have no clue what this is all about", please have a
look at the
[Median, Quartiles and Percentiles Explained](https://github.com/shundhammer/qdirstat/blob/master/doc/stats/Median-Percentiles.md)
document to convince yourself that really **everybody** can easily understand
this.
I also opened a
[GitHub issue to discuss this](https://github.com/shundhammer/qdirstat/issues/60);
comments are welcome.
- 2017-03-10 Filling the gaps in the treemap
[GitHub issue #58](https://github.com/shundhammer/qdirstat/issues/58) shows
that users feel under-informed when there are grey areas in the treemap. The
explanation is simple: Treemap tiles are only displayed when they have at
least a certain minimum size (by default 3 pixels). Otherwise the treemap
just gets cluttered with tiny things that don't show any information
whatsoever.
The remaining space is taken by its parent directory's tile. They were
rendered just flat grey which makes their boundaries against each other
invisible, thus giving the impression that there is nothing.
So I experimented with visible borders, but that completely destroyed the
visual impression of the treemap because those borders were everywhere. Fill
patterns also didn't help: They were just ugly, and there was no way to tell
where one directory tile ends and where the next one starts.
Then I tried gradients. The first impression was good, but then I found that
it was hard to tell which item was a (now over-emphasized) directory and
which one a large file. Locating large files deep inside the directory
hierarchy is the major strong point of the treemap visualization, so I
wouldn't want to give that up. After playing a bit with the gradient
parameters (toning it down and giving it just a little blueish tint) I ended
up with this:

I think this is a good compromise.
Of course this is configurable: Edit `~/.config/QDirStat/QDirStat.conf`:
[Treemaps]
...
DirGradientEnd=#707080
DirGradientStart=#606070
...
UseDirGradient=true
Beware that QSettings sorts the entries alphabetically, so the start is after
the end (how philosophical...).
------------------------
- 2017-03-05 **New stable release: V1.3**
_See [DevHistory.md](https://github.com/shundhammer/qdirstat/blob/master/doc/DevHistory.md)
for older entries._
## History
This is just a rough summary. For more details, see [DevHistory.md](https://github.com/shundhammer/qdirstat/blob/master/doc/DevHistory.md)
- 2017-06-04 New stable release: V1.4
- 2017-03-05 New stable release: V1.3
- 2017-01-03 New stable release: V1.2
- 2016-10-31 New stable release: V1.1-Pumpkin
- 2016-05-16 First stable release: V1.0
- 2016-04-08 Beta 3 release
- 2016-03-20 Beta 2 release
- 2016-02-06 Beta 1 release
- 2015-11-28 QDirStat project start: Ported from the old KDE 3 KDirStat
- Predecessor: KDE 3 **KDirStat**
- 2006-06-01 KDirStat 2.5.3: The last KDE3 based version.
- 2003: Bernhard Seifert wrote **WinDirStat** based on the KDirStat idea of
coupling a tree view and a treemap and providing cleanup actions.
- 2003-01-05 KDirStat 2.3.3: Treemaps
- 2002-02-25 KDirStat 2.0.0: Complete rewrite for KDE 2 / Qt 2
- 2000-01-21 KDirStat 0.86 for KDE 1 announced: First public version.
## WinDirStat and QDirStat
I keep reading articles and user forum comments about QDirStat being a "nice
Linux port of WinDirStat". Well, nothing could be further from the truth:
**WinDirStat is a Windows port of KDirStat**, the predecessor of QDirStat.
So it's the other way round: **The Linux version was there first**, and
somebody liked it so much that he wrote a Windows version based on that
idea. That's a rare thing; usually people port Windows originals to Linux.
See also https://windirstat.net/background.html and the WinDirStat "About"
dialog.
## QDirStat and K4DirStat
K4DirStat is a port to KDE 4 / Qt 4 of my old KDE 3 / Qt 3 KDirStat. QDirStat is
independent of that; it is based on the old KDE 3 KDirStat directly.
## Motivation / Rant
After having used KDE since its early days (since about 1998), I didn't like
the direction any more that KDE has been taking. I loved KDE 1, KDE 2, KDE
3. When KDE 4 came along, it took me a long time to try to adopt it, and when I
did, I moved back to KDE 3 after a short while, then tried again with the next
release, moved back again -- several times.
I really tried to like it, but whenever I thought I tamed it to meet my
requirements, a new version came along that introduced yet another annoyance.
To name a few:
- A lot of things that used to be user configurable in KDE 3 are not
configurable anymore, and when you approach the KDE 4/5 developers about
that, they will tell you that this is intentional, and they do not intend to
bring those config options back. Well, thanks a lot; this is the Apple
approach where they think they know what is good for you, and you are just
too stupid.
- Konqueror as the old central tool is as good as dead. It's still there as an
alternate file manager (for those who find it), but the primary one is the
dumbed-down Dolphin that I consider unusable: It's only useful for complete
newbies, not for power users. The web browser part of Konqueror is so
outdated that you can't do much with it with most modern web sites, so the
great integration of web and local file manager that was the major strong
point of Konqueror (and thus KDE) no longer exists.
- I don't like the fact that I can't simply put icons on my desktop any more --
no, I have to create a plasmoid first as a container, and those things keep
doing weird stuff that drives every user crazy. With one false move of your
mouse, it might be gone, change shape, move to another place or whatever.
- I also don't like the desktop search that eats resources like there is no
tomorrow (disk space, disk I/O, CPU usage) and that for all practical
purposes you can't get rid of.
- I don't like the fact that the mail client relies on that MySQL based
framework called _Akonadi_ that is not only resource-hungry, but also so
fragile that I had to use the _akonadiconsole_ lots of times just to bring it
back to life. Seriously, if I as a Linux system developer have a hard time
doing that, what is a normal user expected to do?
- Activities vs. multiple desktops. I tried to use both, but they don't
integrate well. The desktops previewer is far inferior to the old one from
KDE3: Only monochrome rectangles, no real preview. The activities plasmoid
keeps rearranging my carefully placed and named activities at random. WTF?!
- Everything is so fragmented that not even the naming is clear anymore. What
used to be KDE is now a jumble of the KF Framework, the KF libs, the KF apps
and the Plasma desktop. Yeah, great job, folks; people used to know what KDE
stood for. Nobody knows what the hell all those components are, and neither
does anybody care anymore. You paved your way to oblivion with buzzwords.
Great marketing strategy for gaining more visibility!
Then the next generation KDE arrived, _Plasma 5_. When I was force-migrated to
it at work with the _SUSE Tumbleweed_ rolling release, the experience was so
bad that I moved to the _Xfce_ Desktop.
Now every time I started my own KDirStat, it started about a dozen KDE
processes along with it -- processes that it needs only for minor things like
loading icons or translations. I really don't need or want that.
So it was time to make KDirStat self-sufficient; it never used that much of all
the KDE infrastructure anyway. Time to make a pure Qt-based and self-sufficient
QDirStat.
And while I was at it, I took the chance to add some features that I had wanted
for a long time, yet I had never gotten myself to start working on:
- Multi-selection in the directory tree so you can delete several files at
once.
- Remove limitations like having only a fixed number of user-defined cleanup
actions.
- Properly show the output of cleanup actions, in particular when they reported
errors.
- Make treemap colors configurable: Use custom colors and match them to
user-defined filename extensions.
- Move away from the arcane KDE build system: Back with KDE 1/2/3 it was the
_Autotools_ with custom KDE extensions that only a handful people in the
world really understood (I was not among them), later _CMake_ which is little
better, just differently confusing.
Yes, there is a Qt4 / Qt5 port of KDirStat called K4DirStat. K4DirStat is an
independent project that started when I had not worked on the old KDirStat for
a long time (my last KDirStat release had been in mid-2006).
QDirStat is based on that same code from the 2006 KDirStat. It's an 80% rewrite
using a lot of newer Qt technologies. And there was a lot of cleaning up that
old code base that had been long overdue.
## New Features
- Multi-selection:
- Both views (the tree and the treemap) now support _extended_ selection,
i.e. you can select more than one item. This was the most requested feature
for the last KDirStat. Now you can select more than one item at the same
time to move it to the trash can, to directly delete it or whatever.
- Tree view:
- Shift-click: Select a range of items.
- Ctrl-Click: Select an additional item or deselect a selected one.
- Treemap:
- Ctrl-Click: Select an additional item or deselect a selected one.
- The current item is highlighted with a red rectangle, all other selected
ones with a yellow rectangle. If the current item is not also selected,
it has a dotted red outline.
- Proper output of cleanup actions with different colors for the commands that
are executed, for their output and for error messages (see screenshot
above). That output window can be configured to always open, to open after a
certain (configurable) timeout, or only if there are error mesages -- or not
at all, of course. If things go wrong, you can kill the external command
started by the cleanup action from there. You can zoom in and out (increase
or decrease the font size) as you like.
- File type statistics window. WinDirStat has it, and users wanted it in
QDirStat, too. Since filename extensions (suffixes) don't have as much
semantics in Linux/Unix systems as they do in Windows, many files are
categorized as "Other". This is a known limitation, but it's a limitation of
the whole concept of using suffixes to categorize files by type. And no,
checking file headers for magic byte sequences like the "file" command does
is not an option here; QDirStat would have to do that for (at least) all the
30,000+ files typically listed under the "Other" category. So we'll have to
live with that limitation.
- Locate files by file type window. If you double-click on any of the filename
extensions (suffixes) in the file type statistics window, you will get
another window that lists all the directories that contain files of that type
including the number and total size of those files. You can double-click each
of those lines, and that directory will open in the main window with the
files of that type preselected so you can start cleanup actions like moving
them to trash or converting them to a better format (.bmp -> .png)
immediately.
- File size statistics window with histogram, percentiles, buckets and a lot of
documentation that everybody should be able to understand. Even if (or,
better yet, in particular if) your math teacher or statistics professor never
explained it properly, please have a lot at it.
- New macros to use in cleanup actions:
- %d : Directory name with full path. For directories, this is the same as
%p. For files, this is their parent directory's %p.
- %terminal : Terminal window application of the current desktop; one of
"konsole", "gnome-terminal", "xfce4-terminal", "lxterminal", "eterm".
The fallback is "xterm".
- %filemanager : File manager application of the current desktop; one of
"konqueror", "nautilus", "thunar", "pcmanfm". The fallback is "xdg-open".
- Which desktop is used is determined by the _$XDG_CURRENT_DESKTOP_ environment
variable. Users can override this with the _$QDIRSTAT_DESKTOP_ environment
variable, so you can get, say, the Xfce terminal or file manager despite
currently running KDE if you set
export QDIRSTAT_DESKTOP="Xfce"
- Of course, you can still simply use your favourite file manager if you simply
change %filemanager in the default "Open File Manager Here" cleanup action to
the command to start it.
- You can now select the shell to use for the cleanup commands:
- $SHELL (the user's login shell) - using the same environment, syntax and
wildcard etc. behaviour of the shell the user is used to.
- /bin/bash for well-defined behaviour for wildcards etc.
- /bin/sh as a last resort (which might be a simplistic _dash_ on Ubuntu).
- Mouse actions in the treemap window:
- Left click: Select item and make it the current item.
- Right click: Open the context menu with cleanup actions and more.
- Ctrl+Left click: Add item to selection or toggle selection.
- Middle click: Select the current item's parent. Cycle back at toplevel.
- Double click left: Zoom treemap in.
- Double click middle: Zoom treemap out.
- Mouse wheel: Zoom treemap in or out.
- You can configure what columns to display in the tree view and in which
order. The only thing that is fixed is the "Name" column which is always
there and always the first (leftmost). Use the context menu in the tree
header to unlock column widths. Drag columns to the left or right to change
their order.
- Exclude rules are now greatly simplified. They no longer always get the
entire path to match which requires quite complex regexps; by default, they
only get the last path component -- i.e., no longer
"/work/home/sh/src/qdirstat/src/.git", but only ".git". You can now even tell
the exclude rule to use a simplified syntax: "FixedString" or "Wildcard" in
addition to the normal "RegExp". The old behaviour (matching against the full
path) is still available, though.
- Configuration dialog for exclude rules -- see screenshots.
- Subvolume detection for Btrfs. Btrfs subvolumes are just ordinary mount
points, so normally QDirStat would stop scanning there, leaving a large part
of a Btrfs partition unaccounted for. But for each mount point found while
scanning a directory tree, QDirStat checks /proc/mounts or /etc/mtab if it
has the same device name as its parent directory, and if yes, considers it a
subvolume and continues scanning.
- Actions to go one directory level higher or to the toplevel: Context menu and
menu "Go To" -> "Up One Level" or "Toplevel". This is useful if you clicked
on a file in the treemap that is deep down in some subdirectory, and you want
to know what subdirectory that is: Simply click "Go Up" twice (the first
click will get you to the pseudo subdirectory, the second one to the
real one).
- Open all tree branches up to a certain level and close all other ones: Menu
"View" -> "Expand Tree To Level" -> "Level 0" ... "Level 9".
- The total sum of the selected items (subtrees) is displayed in the status
line if more than one item is selected.
- Icons are now compiled into the source thanks to Qt's resource system; now
it's just one binary file, and nothing will go missing. No more dozens of
little files to handle.
- The build system is now Qt's _QMake_. I got rid of that _AutoTools_
(Automake, Autoconf, Libtool) stuff that most developers find intimidating
with its crude M4 macro processor syntax. QMake .pro files are so much
simpler, and they do the job just as well. And no, it will definitely never
be _CMake_: I don't like that thing at all. It's just as much as a PITA as
the AutoTools, just not as portable, no usable documentation, it's changing
all the time, and those out-of-source builds are a royal PITA all on their
own with constantly having to change back and forth between source and build
directories.
- QDirStat now has its own log file. It now logs to
`/tmp/qdirstat-$USER/qdirstat.log` (where $USER is your Linux user name).
No more messages on stdout that either clobber the shell you started the
program from or that simply go missing.
- No longer depending on dozens of KDE libs and a lot of KDE infrastructure; it
now only requires Qt which is typically installed anyway on a Linux / BSD /
Unix machine with any X11 (graphical) desktop.
- It should still compile and work with Qt4. We now have a contributor who is
very interested in that (Michael Matz), so it should be possible to maintain
this compatibility.
- Slow down display update from 333 millisec (default) to 3 sec (default) with
`qdirstat --slow-update` or `qdirstat -s`. The slow update interval can be
customized in `~/.config/QDirStat/QDirStat.conf`:
```
[DirectoryTree]
SlowUpdateMillisec = 3000
```
## Old Features
Features ported from the old KDirStat:
- Fast and efficient directory reading.
- Not crossing file system boundaries by default so you can see what eats up
all the disk space on your root file system without getting distorted numbers
due to all the other file systems that are mounted there. If you absolutely
wish, you can use "Continue reading at mount point" from the context menu or
from the "File" menu -- or configure QDirStat to always read across file
systems.
- Efficent memory usage. A modern Linux root file system has well over 500,000
objects (files, directories, symlinks, ...) and well over 40,000
directories. This calls for minimalistic C++ objects to represent each one of
them. QDirStat / KDirStat do their best to minimize that memory footprint.
- Hierarchical tree view that displays accumulated sums in each branch,
together with a percent bar so you can see at a glimpse how the
subdirectories compare with each other.
- All numbers displayed human readable -- e.g., 34.4 MB instead of 36116381
Bytes.
- Each tree level uses another color for that percent bar so you can easily
compare subdirectories even if some of them are opened in the tree.
- If a directory has files and subdirectories, all files in that subdirectory
are grouped into a pseudo directory (called _dot entry_ in the
QDirStat sources) so you can compare the disk usage of files on that
directory level with the subdirectories.
- Displaying the latest modification time of any object in each branch. You can
instantly see in what subdirectory where any changes lately. You can sort by
this column, of course.
- Treemap display. Treemaps are a way to visualize hierarchical data
structures, invented by Ben Shneiderman. Basically, the hierarchy is
flattened and each level grouped in a rectangle, inside which it is again
subdivided in rectangles. The area of each rectangle corresponds to the size
of each item or subdirectory. For the purposes of QDirStat, it is enough to
know that a large blob corresponds to a large file; you can instantly see
where large ISOs or movies are.
- You can zoom the treemap in and out (Ctrl + / Ctrl - / mouse wheel / menu /
tool bar) to see more details of directories that are otherwise dominated by
larger ones.
- You can move the boundary between treemap and tree view up and down as you
like. You can also get rid of the treemap completely (menu "Treemap" -> "Show
Treemap" or F9 key)
- Treemap and tree list view communicate. Select an item in one view, and it is
also selected in the other. If you click on that large blob in the treemap,
it is located in the tree view, all branches up to its directory are opened,
and the tree view scrolls to that item.
- Cleanup actions. Once you know what is consuming the disk space, you can
start cleanup actions from within QDirStat to reclaim disk space - or to
investigate further if you can safely delete a file. You can create your own
cleanup actions (as many as you like), and there are some predefined ones:
- Open file manager here. This will start a file manager in the directory of
the current item. QDirStat tries its best to guess the name of the relevant
file manager application for the current desktop, based on the
$XDG_CURRENT_DESKTOP environment variable. You can override this with the
$QDIRSTAT_DESKTOP environment variable.
- Open terminal window here. In most cases, this is much easier than to
navigate to that directory with 'cd' in an already open terminal window and
using tab-completion numerous times. As with the file manager application,
QDirStat tries its best to guess the name of the relevant terminal window
application for the current desktop.
- Move to trash bin. QDirStat has its own implementation of the XDG trash
specification.
- Delete immediately.
- Compress: Create a compressed tar archive from a directory and then delete
the directory.
- Delete junk files: Backup files left behind by editors, core dumps.
- All predefined cleanup actions are fully configurable, of course. You can
change any of them, disable them, or delete them.
- You can copy the complete path of the selected file or directory to the
system clipboard and paste it to another application.
- Reading and writing cache files:
- This is mostly meant for remote servers in some server room somewhere:
Rather than installing the Qt and X11 runtime environment and running
QDirStat over remote X (ssh with X forwarding), you can run the supplied
_qdirstat-cache-writer_ Perl script on the server, copy the resulting cache
file to your desktop machine and view the content there with QDirStat.
- For large directories (archives etc.) that don't change that much, you can
also generate a QDirStat cache file (either with the Perl script or with
QDirStat itself) and save it to that corresponding directory. If QDirStat
finds a file .qdirstat.cache.gz in a directory, it checks if the toplevel
directory in that cache file is the same as the current directory, and if
it is, it uses the cache file for that directory rather than reading all
subdirectories from disk. If you or the users that machine use QDirStat
often, this might take a lot of I/O load from the server.
- If you use the '-l' option of the qdirstat-cache-writer script, it uses the
long file format with a complete path for each entry, so you can use the
_zgrep_ command with it as a replacement for the _locate_ command.
- The KDirStat / QDirStat file format is well documented and very simple. It
seems to be used by a number of admins and some backup software.
See also the specification in the doc/ directory:
https://github.com/shundhammer/qdirstat/blob/master/doc/cache-file-format.txt
- You can specify a cache file to read directly at the command line:
```
qdirstat --cache cache-file
```
- Other command line options: See
```
qdirstat --help
```
## Features that are Gone
(Compared with the old KDirStat)
- KPacman: That was that PacMan animation wile reading directory reading. This
is gone now. KPacMan looked out of place pretty soon after it got to KDirStat
due to Qt styles doing fancy rendering of widget backgrounds with gradients
etc. I know that it does have its fans, but it's unrealistic to get this
back without breaking the menu bar rendering.
- KioDirReadJob: Network-transparent directory reading for network protocols
like FTP, HTTP, Fish (ssh-based). This depended on KDE's KIO slaves, so this
functionality is gone now without KDE. That's a pity, but this is a little
price to be paid to avoid the rest of the hassle with using the KDE libs.
- KFeedback: That was that form where users could tell their opinion about
KDirstat. But that was not used that often anyway - not nearly enough to
justify the effort that has gone into that part. And the KDE usability
people, like usability people generally tend to do, first discussed that to
death and then decided they didn't want anything like that in general in KDE
applications. So be it.
- KActivityTracker: That was a supporting class for KFeedback that kept track
of how much a user was using the program and after a while (when it was
determined that it made sense) asked if the user wouldn't like to give his
feedback about the program.
Don't you all just hate those dumbass web designers who tell you to do a
survey how much you like their grand web page before you even had a chance to
look at it? Shove a pop-up up your face covering the stuff you are
interesting in with their self-loving marketing bullshit? -- KActivityTracker
was made to avoid exactly this: Ask the user only once you know that he
actually used the program for a while.
## MacOS X Compatibility
I was amazed to find that it doesn't take more than the normal "qmake" and then
"make" to build QDirStat for MacOS X. We (Sonja Krause-Harder and I) did some
basic testing, and it seems to work.
The cleanups may need some adaptation, but this is something that might even be
configured by the user.
If anybody wants to give it a try, download Qt for MacOS X, install it, open a
shell window, search the _qmake_ command:
find . -name qmake
Add this to your $PATH, then do the normal
qmake
make
Not sure how well "make install" works, though.
**_Be advised that QDirStat on MacOS X is purely experimental at this stage._**
There is no support. If you try this, you are on your own. Even more so than
with the other platforms, you will have to make sure that your Qt build
environment is set up correctly.
_There be dragons._ ;-)
### Architecture maintainer wanted for QDirStat for MacOS X
If you are a developer with some prior C++ and Qt knowledge on the MacOS X
platform and you'd like to see QDirStat working there, please consider joining
the team.
## Windows Compatibility
None for the forseeable future.
Directory reading might be quite easy to replace for Windows; we don't have
that problem with devices and crossing filesystems on that platform.
But the cleanups might be a challenge, "move to trash" works completely
differently, and we'd need an installer for a Windows version.
So, for the time being, use [WinDirStat](https://windirstat.info/) instead.
WinDirStat is a close relative to the KDirStat family anyway; the author had
liked KDirStat on Linux so much that he decided to write a Windows clone and
called it WinDirStat.
## Ready-made Packages
### openSUSE / SUSE Linux Enterprise
QDirStat packages for:
- openSUSE Tumbleweed
- openSUSE Leap 42.2
- openSUSE Leap 42.1
- openSUSE 13.2
- SUSE Linux Enterprise (SLE) 12 SP2
- SUSE Linux Enterprise (SLE) 12 SP1
- SUSE Linux Enterprise (SLE) 12
Download page for the [**latest stable release**](https://software.opensuse.org/download/package?project=home:shundhammer:qdirstat-stable&package=qdirstat)
Download page for the [**current development version** (git master)](https://software.opensuse.org/download/package?project=home:shundhammer:qdirstat-git&package=qdirstat)
Since this version is in development, it may be not quite as stable and
reliable as the latest official stable release, although the QDirStat
developers try their best to keep it as stable as possible.
### Ubuntu
See Nathan Rennie-Waldock's
[**QDirStat PPA**](https://launchpad.net/~nathan-renniewaldock/+archive/ubuntu/qdirstat)
## Building
### Build Environment
Make sure you have a working Qt 5 build environment installed. This includes:
- C++ compiler (gcc recommended)
- Qt 5 runtime environment
- Qt 5 header files
- libz (compression lib) runtime and header file
If anything doesn't work, first of all **make sure you can build any of the
simple examples supplied with Qt**, e.g. the
[calculator example](http://doc.qt.io/qt-5/qtwidgets-widgets-calculator-example.html).
#### Ubuntu
Install the required packages for building:
sudo apt-get install build-essential qtbase5-dev zlib1g-dev
Dependent packages will be added automatically.
Recommended packages for developers:
sudo apt-get install qttools5-dev-tools qtbase5-doc qtbase5-doc-html qtbase5-examples
See also
http://askubuntu.com/questions/508503/whats-the-development-package-for-qt5-in-14-04
If you also have a Qt4 development environment installed, select the desired
one via _qtchooser_:
sudo apt-get install qtchooser
export QT_SELECT="qt5"
#### SUSE
Install the required packages for building:
sudo zypper install -t pattern devel_C_C++
sudo zypper install libQt5Widgets-devel libqt5-qttools zlib-devel
If you also have a Qt4 development environment installed, make sure that the
Qt5 version of 'qmake' is the first in your $PATH:
export PATH=/usr/lib64/qt5/bin:$PATH
### Compiling
Open a shell window, go to the QDirStat source directory, then enter these
commands:
qmake
make
### Installing
sudo make install
or
su -c make install
## Contributing
See file [Contributing.md](https://github.com/shundhammer/qdirstat/blob/master/doc/Contributing.md)
and [GitHub-Workflow.md](https://github.com/shundhammer/qdirstat/blob/master/doc/GitHub-Workflow.md)
## To Do
See file [TODO.md](https://github.com/shundhammer/qdirstat/blob/master/doc/TODO.md)
## Troubleshooting
### Can't Move a Directory to Trash
See file [Troubleshooting.md](https://github.com/shundhammer/qdirstat/blob/master/doc/Troubleshooting.md)
## Reference
### Original KDirStat
Home page: http://kdirstat.sourceforge.net/
Sources: https://github.com/shundhammer/kdirstat
### K4Dirstat
Home page: https://bitbucket.org/jeromerobert/k4dirstat/wiki/Home
Sources: https://bitbucket.org/jeromerobert/k4dirstat/src
### WinDirStat (for Windows)
Home page: https://windirstat.info/
### XDG Trash Spec
http://standards.freedesktop.org/trash-spec/trashspec-1.0.html
## Reviews
### YouTube
[Spatry: _Quick Look: QDirStat_](https://www.youtube.com/watch?v=ysm4-x_5ftI)
## Code Analysis Tools
[QDirStat at Coverity](https://scan.coverity.com/projects/qdirstat?tab=overview)
## Misc
http://moo.nac.uci.edu/~hjm/HOWTO_move_data.html#qdirstat
http://moo.nac.uci.edu/~hjm/kdirstat/kdirstat-for-clusters.html
qdirstat-1.4/debian/ 0000775 0000000 0000000 00000000000 13115020367 0014431 5 ustar 00root root 0000000 0000000 qdirstat-1.4/debian/changelog 0000664 0000000 0000000 00000000250 13115020367 0016300 0 ustar 00root root 0000000 0000000 qdirstat (0.86~beta1-1~precise) precise; urgency=low
* Initial release.
-- Nathan Rennie-Waldock Sat, 27 Feb 2016 16:59:43 +0000
qdirstat-1.4/debian/compat 0000664 0000000 0000000 00000000002 13115020367 0015627 0 ustar 00root root 0000000 0000000 8
qdirstat-1.4/debian/control 0000664 0000000 0000000 00000001371 13115020367 0016036 0 ustar 00root root 0000000 0000000 Source: qdirstat
Maintainer: Nathan Rennie-Waldock
Section: utils
Priority: extra
Build-Depends: debhelper (>= 8), zlib1g-dev, libqt5-dev | libqt4-dev
Homepage: https://github.com/shundhammer/qdirstat
Package: qdirstat
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: graphical disk usage display with cleanup facilities
QDirStat (Qt Directory Statistics) is a small utility program that sums
up disk usage for directory trees, very much like the Unix 'du' command.
It displays the disk space used up by a directory tree, both numerically
and graphically. It is network transparent (i.e., you can use it to sum
up FTP servers), and comes with predefined and user configurable cleanup
actions.
qdirstat-1.4/debian/copyright 0000664 0000000 0000000 00000001504 13115020367 0016364 0 ustar 00root root 0000000 0000000 This package was debianized by Nathan Rennie-Waldock
on 2016-02-27
License:
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
qdirstat-1.4/debian/rules 0000775 0000000 0000000 00000000035 13115020367 0015507 0 ustar 00root root 0000000 0000000 #!/usr/bin/make -f
%:
dh $@
qdirstat-1.4/debian/source/ 0000775 0000000 0000000 00000000000 13115020367 0015731 5 ustar 00root root 0000000 0000000 qdirstat-1.4/debian/source/format 0000664 0000000 0000000 00000000014 13115020367 0017137 0 ustar 00root root 0000000 0000000 3.0 (quilt)
qdirstat-1.4/doc/ 0000775 0000000 0000000 00000000000 13115020367 0013754 5 ustar 00root root 0000000 0000000 qdirstat-1.4/doc/Building.md 0000664 0000000 0000000 00000000162 13115020367 0016032 0 ustar 00root root 0000000 0000000 # Building QDirStat
See [main document]
(https://github.com/shundhammer/qdirstat/blob/master/README.md#building)
qdirstat-1.4/doc/Contributing.md 0000664 0000000 0000000 00000015640 13115020367 0016753 0 ustar 00root root 0000000 0000000 # Contributing to QDirStat
Contributions are welcome. Please follow the rules and guide lines in this
document:
## Guide Lines
Use the same style as the existing code.
Indentation is 4 blanks. One tab is 8 blanks. Do not indent with single tabs
for each indentation level and thus fuck up everybody else's editor. Letting
the editor automatically replace 8 blanks with a tab is okay, but indentation
level is still 4 blanks.
Brace style is braces **always** on a new line. Use blanks after opening and
before closing parentheses:
if ( someCondition )
{
doSomething( arg1, arg2 )
}
**No** K&R style indentation:
if (someCondition) { // WRONG!!!
doSomething(arg1, arg2) // WRONG!!!
}
Use blank lines liberally. No Rubocop-style code.
Use CamelCase for classes and camelCase for variables. Do not use
snake_case. Prefix member variables with an underscore: _someValue. Prefix its
setter with Set...(), use only the name (someValue()) for the getter, **Not**
getSomeValue():
private:
SomeType _someValue; // member variable
public:
const & SomeType someValue() const; // getter
void setSomeValue( const SomeType & newValue ); // setter
Use a const reference for the setter parameter and the getter return type for
nontrival data types (everything beyond a pointer or an int etc.), and the type
directly otherwise. Use your common sense.
Use Qt types whereever possible. Do not introduce types that are also available
in a Qt version. In particular, do not use STL or Boost types unless there is
no other reasonable way.
For Qt dialogs, use Qt Designer forms whenever possible. I know that many Qt
developers don't like Qt Designer (typically based on bad experiences years
back), but it's really worthwhile to use it. This avoids having tons of dumb
boilerplate code just for creating widget trees.
### Documenting Classes and their Methods
Document classes and their methods in their header file. Document them
immediately. If you don't do it right away, it will never happen. Don't wait
for somebody else to do that for you - nobody will be willing to do the
inconvenient part of the job for you.
Undocumented stuff will mercilessly be rejected.
In my 30+ years of programming I came to the conclusion that it helps immensely
to write down a function name in the header file and **immediately** write its
documentation:
- What does it do? (Do not just repeat the function name! **Explain** what it does!)
- What are the parameters?
- What does it return?
- In particular for functions returning bool: Which case returns 'true', which
case returns 'false'?
- What happens in fringe cases? (returning NULL pointer?)
- If the function creates any objects: Who owns them?
- Does the function transfer ownership of any objects it gets pointers to (as
parameters) to itself or wherever?
If you do that right, you might as well leave the implementation to somebody else.
**Do not** insert any doc template without content before each function.
This is worse than no documentation at all: Everybody has to wade through tons
of useless empty forms that don't contain any content whatsoever.
Been there. Done that. Hated it.
Be careful when copying and pasting documentation from some other place.
Misleading documentation is worse than no documentation at all.
### Legalese in the Sources
**Do not** copy 30+ lines of legalese bullshit into any source file. One line
in the header like
License: GPL V2 - see file LICENSE
is plenty. Seriously, what are those people thinking who put all that legalese
into source files? Sure, they listened to spineless corporate lawyers who just
want to make sure. But those lawyers are not going to have that crap smack up
their faces every time they open a file for editing. We developers do.
You lawyers out there, can you hear me? **This crap is in the way! Nobody wants
to read that!** It's in the way of people trying to do their jobs! We could
construct a harassment case from this!
### The GitHub Workflow
See separate document [GitHub-Workflow.md](https://github.com/shundhammer/qdirstat/blob/master/doc/GitHub-Workflow.md)
### Getting Help for Contributors
- Use the Qt reference documentation.
- Install and study carefully the available Qt examples for reference.
- Read the (extensive!) documentation in the QDirStat header files.
- Use Stack Overflow.
- Use Google.
- Make sure you can build a basic Qt program.
- Make sure you have the compiler and other developer tools set up correctly.
- Make sure you have the relevant -devel (SUSE) or -dev (Ubuntu/Debian)
packages installed.
If you did all of the above (and only then!) and still couldn't figure out
what's wrong:
- Use IRC (#qdirstat on irc.freenode.net; fallback: contact HuHa in #yast on
freenode IRC)
- Write a mail
It is a matter of professional courtesy to first use what is freely available
on the web before you consume somebody else's time and expertise. It is utterly
rude to let somebody else point you to the exact part of the Qt documentation
you couldn't be bothered to read.
Does this sound unfriendly? Well, maybe - but: Been there, done that, got the
fucking T-shirt -- countless times. This is not how I want to spend my spare
time.
There are some people who keep arguing that "it takes hours for me to read
through all the documentation, whereas you as an expert can give me the right
answer within a minute".
Well, yes, it might only take a minute to write the answer in IRC, but then
that newbie won't learn anything except that it pays off to disturb people
rather than learn for himself. And reading the documentation is always a good
investment of time; it is never wasted. In the process of searching for an
answer you will come across many things you hadn't known - and that might just
be useful for your next question.
Plus, it will take the expert that one or two minutes to write the answer to
IRC - and then **15-20 minutes to recover from the interrupt**, to restore the
fragile buildings in his mind he needs to solve the problem he was originally
working on.
Please keep in mind that every such interrupt will cost 20-30 minutes of time
on average, and a working day only has 16-24 such time slots; and those experts
tend to be in high demand on many different communication channels (IRC,
personal mail, mailing lists, bugzilla, phone, people walking into the office).
So, should you join the project as a newbie?
If you have patience, self-discipline and are willing to learn (which includes
reading the Qt documentation first), and, most importantly, if you are willing
to stay with the project and not let some unfortunate guy clean up half-ready
stuff, yes.
Just keep in mind that others are doing this because (a) it's fun for them
and/or (b) because they want that piece of software to be successful. Educating
newbies and cleaning up after them is very low on most developers' list of fun
things to do. They still do it, but it's painful for them. Please help
minimizing that pain.
qdirstat-1.4/doc/Debugging-Tips.md 0000664 0000000 0000000 00000002115 13115020367 0017105 0 ustar 00root root 0000000 0000000 # QDirStat Debugging Tips
## Problem: Directory reading is too fast to debug anything
### Symptom
Only the very first time, reading a large directory like / takes long enough to
experiment with anything in the tree widget. Any subsequent time, it's just too
fast - one or two seconds, and *bam* it's finished already.
### Reason
The Linux kernel has become incredibly good at caching directory information,
and today's PCs have so much RAM that the kernel tends to use a large amount of
it as cache - files, inodes, dentries (directories). Once a directory is read,
it remains in the cache for a long time, so the speedup upon a subsequent read
is enormous.
### Fix / Workaround
Drop the kernel caches (as root):
su -
echo 3 > /proc/sys/vm/drop_caches
or
echo 3 | sudo tee /proc/sys/vm/drop_caches
("sudo echo 3 > /proc/sys/vm/drop_caches" would NOT work because your non-root
shell would do the I/O redirection, so it would not have sufficient privileges)
### Reference
http://unix.stackexchange.com/questions/87908/how-do-you-empty-the-buffers-and-cache-on-a-linux-system
qdirstat-1.4/doc/DevHistory.md 0000664 0000000 0000000 00000130617 13115020367 0016406 0 ustar 00root root 0000000 0000000 # QDirStat Development History
This is more verbose than a traditional change log, thus the unusual name of
this file.
See the README.md file for the latest news:
https://github.com/shundhammer/qdirstat/blob/master/README.md
## QDirStat History
- 2017-03-05 **New stable release: V1.3**
- 2017-02-27 Implemented [GitHub issue #30](https://github.com/shundhammer/qdirstat/issues/30):
When hovering over a treemap tile, display the full path and the total size
of that element in the status bar. When the hover ends (when the mouse cursor
leaves the treemap tile), display the current selection again in the status
bar.
- 2017-02-24 Improved logging: More secure and automatically log-rotating.
QDirStat now uses its own log directory `/tmp/qdirstat-$USER` (where `$USER`
is your user name; the numeric user ID is now only used if the user name
cannot be obtained). It no longer keeps one single log file growing, but
starts a new one each time it is started. 3 old logs are kept; any older ones
are deleted.
The permissions for that directory are set up in a pretty restrictive way
(0700, i.e. `rwx------`) when it is created. If it already exists, QDirStat
checks the owner and creates a new one with a random name if it is owned by
anyone else than the user who started QDirStat.
[sh @ balrog] ~ 68 % ls -ld /tmp/qdirstat-sh
drwx------ 2 sh sh 4096 Feb 24 18:29 /tmp/qdirstat-sh
[sh @ balrog] ~ 69 % ls -l /tmp/qdirstat-sh
total 16
-rw-rw-r-- 1 sh sh 2067 Feb 24 18:29 qdirstat-00.old
-rw-rw-r-- 1 sh sh 2067 Feb 24 18:07 qdirstat-01.old
-rw-rw-r-- 1 sh sh 2067 Feb 24 18:07 qdirstat-02.old
-rw-rw-r-- 1 sh sh 2067 Feb 24 18:29 qdirstat.log
For anybody regularly watching the log file this means they will now have to
use `tail -F qdirstat.log` rather than `tail -f` since the latter does not
realize when the file it watches is renamed and a new one is created under
the same name.
- 2017-02-23 Fixed [GitHub issue #24](https://github.com/shundhammer/qdirstat/issues/24):
During directory reading, subdirectories would get out of sync when opening
a tree branch.
It looks like QDirStat's tree display was a bit too dynamic for the concepts
of the underlying Qt classes (QTreeView / QAbstractItemModel): During
reading, QDirStat would sort the tree by the number of pending read
jobs. That number is constantly changing, so the sort order would also
constantly need to change. This is very hard to do properly with the
limitations those underlying classes impose; basically it would require a
reset of all the data the QTreeView keeps, thus making it forget things like
its current scrollbar position or which tree branches were expanded or
collapsed. That would make the user interface pretty much unusable.
So the fix for this is to not sort by read jobs, but by directory names
instead since they don't change all the time. The user can still sort by any
other column, but that sort is a momentary thing that might become invalid
moments later as data (accumulated sizes, number of child items) are
updated. Everybody please notice that **this is a known limitation** and any
complaints about that will flatly be rejected. The alternative would be to
not allow the user to sort at all during directory reading, and that is
certainly a lot less desirable.
- 2017-02-22
- @flurbius contributed a patch to switch the main window layout from tree
view above and treemap below to side-by-side (Menu _Treemap_ -> _Treemap as
Side Panel_).
- Added new document [GitHub-Workflow.md](https://github.com/shundhammer/qdirstat/blob/master/doc/GitHub-Workflow.md)
explaining how to work with GitHub and Git to contribute to QDirStat.
- 2017-02-20 Locating files by type from the _File Type Statistics_ window

You can now locate files with a specific filename extension directly:
- You select a file type (a filename extension) in the "File Type Statistics" window.
- You click "Locate" or you double-click the item.
- The "Locate Files" window opens.
- You click a directory there.
- In the main window, the branch for that directory opens, and all matching
files are selected in the tree view and in the treemap.
- You can now directly start cleanup actions for those files.
See also [GitHub issue #48](https://github.com/shundhammer/qdirstat/issues/48).
- 2017-02-18 New document: [QDirStat for Servers](https://github.com/shundhammer/qdirstat/blob/master/doc/QDirStat-for-Servers.md)
describing how to use QDirStat and the `qdirstat-cache-writer` script on
headless (no X server, no X libs) servers.
- 2017-02-17 _File Type Statistics_ window merged to Git master
Latest screenshot:

**Limitations:**
Since filename extensions (suffixes) don't have as much semantics in
Linux/Unix systems as they do in Windows, many files are categorized as
"Other". This is a known limitation, but it's a limitation of the whole
concept of using suffixes to categorize files by type. And no, checking file
headers for magic byte sequences like the "file" command does is not an
option here; QDirStat would have to do that for (at least) all the 30,000+
files typically listed under the "Other" category. So we'll have to live with
that limitation.
Next thing to come: Locating files with a specific suffix from there.
See [GitHub issue #48](https://github.com/shundhammer/qdirstat/issues/48).
- 2017-02-12 Working on a _File Type Statistics_ window
People who know WinDirStat inevitably want that _File Type_ view in QDirStat,
too. I was really reluctant to do that because I didn't quite see the point;
in WinDirStat, it serves mostly as a legend to the treemap colors since they
are constantly changing in WinDirStat: The file type that consumes most disk
space always gets color #1, the next-most color #2 etc., so it depends which
directory you scan what color each file type gets. In QDirStat, the colors
are stable; they are predefined and configurable in the _MIME Type
Categories_ configuration dialog.
And as most of you probably know, filename extensions have a much stricter
meaning in Windows than on Linux/Unix systems; Linux people get very creative
when it comes to using dots in filenames. Sometimes those dots delimit a
filename's extension (suffix) from its base name, sometimes they are used for
entirely different purposes.
Anyway, there was one user who was insistent enough to make me reconsider,
and I did some experimenting this weekend, and now we have an (albeit still
experimental) **File Type Statistics** view. So far, that code lives in a Git
branch, but I think it will stabilize in the next one or two weeks, so I will
merge it to Git master.
See the whole discussion with more screenshots at
[GitHub issue #45](https://github.com/shundhammer/qdirstat/issues/45)
- 2017-01-03 **New stable release: V1.2**
_Upgrading to this release is highly recommended for Btrfs users:_
If you used QDirStat to scan a Btrfs partition, any subvolumes of that
partition were not scanned (see
[GitHub issue #39](https://github.com/shundhammer/qdirstat/issues/39)).
Btrfs subvolumes were treated just like ordinary mount points (which, to all
intents and purposes, they are). So you might have wondered why the _df_
command shows your 40 GB root filesystem as 97% full, yet QDirStat shows only
about 7 GB. The rest might be hidden in subvolumes.
QDirStat stops reading at mount points - which only makes sense because
normally you want to know what eats up the disk space on that one partition
that is filling up, not on any others like /home that are mounted
there. Unfortunately, a Btrfs subvolume is also just another mount point, and
QDirStat would stop reading there, too - at /var/log, at /var/spool, at
/var/lib/libvirt etc.; a typical Btrfs root filesystem has about a dozen
subvolumes, and all files in them were disregarded by QDirStat.
This is now fixed: Despite Btrfs doing its best to make this difficult (using
one single privileged system call for all its functionality, including simple
info calls), QDirStat now detects if a mount point is a Btrfs subvolume and
continues reading if it is. QDirStat uses /proc/mounts (or, if this is not
available, /etc/mtab) to find this out.
This is fixed in the _qdirstat-cache-writer_ script, too.
- 2016-12-11 Bernhard Walle contributed some patches for MacOS X support.
Thanks, Bernhard!
- 2016-12-09 Fixed Perl (_qdirstat-cache-writer_) part of
[GitHub issue #39](https://github.com/shundhammer/qdirstat/issues/39):
QDirStat doesn't scan Btrfs subvolumes
The _qdirstat-cache-writer_ script now also checks the device names of a
mount point and its parent directory, not only their major/minor device
numbers; so now it will not stop at Btrfs subvolumes while scanning.
That script uses a more simplistic approach than QDirStat itself: It invokes
the _df_ command with that path and parses its output. If the path contains
very weird special characters, this may fail, in which case that directory
(which at that point is already known to have a different device major/minor
number than its parent) is considered a filesystem boundary, and that branch
is not scanned.
- 2016-12-08 Fixed C++ (QDirStat binary) part of
[GitHub issue #39](https://github.com/shundhammer/qdirstat/issues/39):
QDirStat doesn't scan Btrfs subvolumes
This was a bit of a challenge since the relevant Btrfs commands to obtain any
useful information about subvolumes all require root privileges, and I really
wouldn't want to scare users off by prompting for a _sudo_ password. QDirStat
now fetches the information from /proc/mounts (or /etc/mtab if /proc/mounts
is unavailable) and does some heuristics (which are not completely fool
proof) to check if a potential mount point is still on the same device. That
means that it will no longer treat a Btrfs subvolume as an ordinary mount
point where it stops reading by default, but it just continues. On the other
hand, another Btrfs mounted into the current file system is of course treated
as a normal mount point. See also the corresponding
[GitHub issue](https://github.com/shundhammer/qdirstat/issues/39)
for details.
The Perl _qdirstat-cache-writer_ still has the old behaviour, i.e. it still
stops at a subvolume mount point. This will be addressed next.
- 2016-12-07 Fixed [GitHub issue #40](https://github.com/shundhammer/qdirstat/issues/40):
Crash without useful error message when no display available
When ssh'ing without -X to a remote machine and starting QDirStat there, it
would just dump core and not issue any meaningful message. The fatal error
message was only in the log file:
` :0 (): QXcbConnection: Could not connect to display`
Now this message is also repeated on stderr, and in this particular case
("Could not connect to display"), it does not dump core any more, but just
exits with error code 1.
- 2016-12-06 **Warning to Btrfs users** (Fixed as of 2012-12-09)
If you use QDirStat to scan a Btrfs partition,
[any subvolumes of that partition are not scanned](https://github.com/shundhammer/qdirstat/issues/39):
Btrfs subvolumes are treated just like ordinary
mount points (which, to all intents and purposes, they are). So you might
wonder why the _df_ command shows your 40 GB root filesystem as 97% full, yet
QDirStat shows only about 7 GB. The rest might be hidden in subvolumes.
QDirStat stops reading at mount points - which only makes sense because
normally you want to know what eats up the disk space on that one partition
that is filling up, not on any others like /home that are mounted
there. Unfortunately, a Btrfs subvolume is also just another mount point, and
QDirStat will stop reading there, too - at /var/log, at /var/spool, at
/var/lib/libvirt etc.; a typical Btrfs root filesystem has about a dozen
subvolumes, and all files in them are currently disregarded by QDirStat. You
can of course click on "Continue reading at mount point" individually in
QDirStat's directory tree for each one of them, but that's tedious.
I am working on a solution. One approach would be to check if the current
filesystem is Btrfs and list its subvolumes, but the Btrfs developers in
their infinite wisdom decided that `btrfs subvolume list ` is a
privileged operation, so QDirStat would have to use `sudo` with it and prompt
for the root password (at which point I as a user would terminate the program
and not use it any more). **This is broken by design.** A simple info command
like that should not require root privileges.
- 2016-10-31 (Halloween) **New stable release: V1.1-Pumpkin**
It's about time for another official release to get the accumulated fixes and
small changes out into the world. Since today is Halloween, this release
shall be named _Pumpkin_ (as in the unforgettable Charlie Brown's _Great
Pumpkin_).
The last stable release, V1.0, was in mid-May (2016-05-16). Since then, there
were 5 bug fixes and one small feature (the config file split up into
independent parts so admins can provide presets to their users without
overwriting the complete configuration), all described in greater detail
below.
- 2016-10-23
- Fixed [GitHub issue #32](https://github.com/shundhammer/qdirstat/issues/32):
%p does not escape single quotes properly
If you have a file name like `Don't do this.txt` (with a quote character in
the name), the shell used when executing a cleanup action with this would
complain about unmatched single quotes.
QDirStat had always escaped such single quotes, but not the way common
shells (Bash, Zsh) expect it: They don't want a backslash in front of that
embedded single quote. Rather, you need to terminate the string with a
single quote, escape the embedded quote with a backslash (or put it into
double quotes), and then re-open the old string with another single quote.
Thus, `'Don't do this'` becomes `'Don'\''t do this'`.
This is certainly not what most people expect. I just wonder how much other
software is out there that does it the intuitive (yet wrong) way: Just
escape the single quote with a backslash (`'Don\'t do this'`).
Of course, such file names should be avoided entirely, but you can't help
some slightly broken MP3 ripper program doing it, so it needs to be handled
correctly.
- Fixed [GitHub issue #31](https://github.com/shundhammer/qdirstat/issues/31):
Segfault with cleanup action while reading directories
Now disabling cleanups that have a refresh policy other than "No Refresh"
while directory reading is in progress; otherwise the re-read when the
cleanup action has finished clashes with the directory read already in
progress.
This is not an optimal solution, but a very pragmatic one; the optimal
solution might queue updates and execute them after the main read is done.
- Fixed [GitHub issue #33](https://github.com/shundhammer/qdirstat/issues/33):
Added command line option `--slow-update` (or `-s`) for slow remote X connections.
- 2016-08-12
- Fixed [GitHub issue #23](https://github.com/shundhammer/qdirstat/issues/23):
The internal cache writer would sometimes generate incorrect cache files
because of buggy URL escaping resulting in an empty file name and thus
invalid cache file syntax. This affected file names with colons (which is
weird, but legal).
One of these days I'm going to throw out all that QUrl stuff and replace the
few things that I need with something that actually works consistently and
not just under optimum conditions.
- 2016-08-10
- Fixed [GitHub issue #22](https://github.com/shundhammer/qdirstat/issues/22):
Cache files containing the root file system would not display correctly or
segfault under certain conditions. This is now fixed.
- Added "Refresh All" action to the main window tool bar. I had consciously
avoided that because it's just too tempting to re-read the complete
directory tree rather than think about what actually might have changed and
then refresh just that, but it has become so common to use that action in
web browsers that I found myself missing that more and more. And re-reading
is not that expensive on today's mainstream PCs.
- 2016-07-02
- Fixed [GitHub issue #21](https://github.com/shundhammer/qdirstat/issues/21):
When started from a desktop menu, i.e. without any command line parameters,
QDirStat would not prompt for a directory to read, but read the current
directory (typically the user's home directory) right away.
- More graceful handling for nonexisting paths specified on the commmand
line: It now no longer just throws an exception right after starting the
program (which looks like a crash to the unwary user), but posts an error
popup instead and then asks for a directory to read.
- 2016-06-29
- V1.01 (Development version)
- Split up config file into four separate ones below ~/.config/QDirStat:
- QDirStat.conf
- QDirStat-cleanup.conf
- QDirStat-exclude.conf
- QDirStat-mime.conf
This should make it much easier for site administrators to provide their
own site-wide cleanup actions, exclude rules, or MIME categories. I did
this with this in mind:
http://moo.nac.uci.edu/~hjm/kdirstat/kdirstat-for-clusters.html
Here, they describe how users should overwrite their KDirStat config file
with one provided by the site admin so all users have those carefully
crafted cleanup actions. But that also means that all other settings get
lost each time there is a change in any of those commands, and users have
to update that config file again.
With the latest change, it is now possible to only replace the cleanup
action config (QDirStat-cleanup.conf) and leave everything else untouched.
Notice that this is far from a perfect solution; all cleanup actions the
user added himself still get lost. But doing this perfectly might pretty
quickly become an overengineered solution that would be hard to understand
for everybody.
As for migration from previous single-file configurations, QDirStat does
that automatically: It reads the single file and moves the respective parts
where they belong. No need to bother with any migration scrips or anything
like that.
- 2016-05-16 **First stable release: V1.0**
After 3 months of Beta phase and 3 Beta releases, here is finally the
official first stable release of QDirStat: Version 1.0.
In terms of source code, there were very little changes from the last Beta
(0.98-Beta3 from 2016-04-08) and no real code change (only the version number
increased) from the last check-in from 2016-04-11. This version can really be
considered stable in the truest sense of the word. It was not rushed out the
door, and there were no hectic last minute changes. It is well tested, and
the community had ample opportunity to report any problems.
- 2016-04-11
- _buxit_ reported
[GitHub issue #16](https://github.com/shundhammer/qdirstat/issues/16)
and contributed the fix for it shortly afterwards:
When clicking in the treemap, the corresponding item in the tree view was
not always scrolled into the visible area. Now it is.
- 2016-04-08
- Beta 3
- Fixed
[GitHub issue #15](https://github.com/shundhammer/qdirstat/issues/15):
After a cleanup action is executed that needs refreshing the affected
subtree, the parent directory is selected, which is intentional so the
user's focus is not thrown off completely. There was a bug when you
selected an item in the treemap afterwards, that change was not correctly
propagated to the internal selection model: The parent directory remained
selected (which was wrong), and the newly selected item was just added to
the selection, i.e. that item and (typically) its parent directory was
selected. When a potentially dangerous cleanup operation was now started,
it would affect not only that item, but also the directory; and, worse,
that directory often went out of the visible scope of the tree view. Yes,
the confirmation popup would ask for both of them, but you all know how
quickly users click away those popups without really reading them.
This bug is now fixed.
- Improved the confirmation popup. Now highlighting directories much more if
there is a "mixed" selection, i.e., both directories and non-directories
are selected at the same time:
![New cleanup confirmation popup]
(https://cloud.githubusercontent.com/assets/11538225/14390476/8b022c9a-fdb7-11e5-8eef-a5ba304d3bab.png)
- 2016-03-20
- Beta 2
Beta 1 has now been out for 6 weeks, and I have not received one single bug
report during that time. Maybe it's just business as usual, and people
just keep waiting for others to do the testing, while they themselves are
waiting for a stable release. Well, okay, so let them have their way: The
current code is now officially V0.92 Beta 2. And it won't be another 6
weeks; the next versions will come a lot more quickly. Once V1.0 final is
out, any bug reports will have to wait until there is time to work on
them. So, folks, use those Betas wisely.
BTW those who actually did test it will find that QDirStat is a lot more
stable even in Beta 1 than other pieces of software in their official final
release.
- 2016-02-27
- Debian / Ubuntu packaging contributed by Nathan Rennie-Waldock.
He also made a PPA repository available for various Ubuntu versions - see
[Ubuntu packages](https://github.com/shundhammer/qdirstat#ubuntu) below.
- 2016-02-06
- Added tab for exclude rules configuration to the config dialog (see
screenshot above). That's it: That was the last missing major feature.
**I hereby declare QDirStat to be Beta.**
_Please use the GitHub issue tracker for any bug reports._
- Exclude rules can now optionally match against the full path again. I had
changed this for just the directory name without the path by default, which
makes regexps a lot simpler. You can now select the old behaviour, too, if
you wish. This is configurable in the exclude rules tab of the config
dialog.
- Made the config file format of the new view header columns human readable
and editable. The first version from yesterday used the native format of
Qt's QHeaderView -- a QByteArray in hex encoding. This was a sorry excuse
for a settings format - not usable for anybody, not legible, much less
editable. Trolls, WTF? Pretty and usable formats everywhere else, and a
glorified (well, not even glorified) hexdump here?
I hope some admins who might want to provide ready-made config files for
their users will appreciate that. If not, this is just for consistency's
sake; I want to be able to read and edit my config file as I like, even
without any graphical config dialogs.
- The tree view now uses "middle eliding" for texts that don't fit into a
column. It used to elide at the end of the text, but that's not necessarily
useful for long file names; they often differ only at the end with lots of
text at the start in common. So, now it's no longer "VeryLongTextBlurb...",
but "VeryLongTe...foo.o" if anything needs to be cut off. Of course, this
makes most sense with the new column width modes, otherwise your column
will simply be resized wide enough to fit everything in.
- 2016-02-05
- Extended the context menu of the tree view header columns -- see latest
screenshot above. The configuration is now saved and restored when entering
the program. You can move the columns around (i.e. change their order),
hide columns, and choose between automatic column width ("auto size") or
setting it manually ("interactive size") for each column individually or
for all columns at once.
- You can now read a cache file directly from the command line:
````
qdirstat --cache cache-file
````
- Fixed GitHub issue #9:
[qdirstat-cache-writer creates broken cache file if some directory lacks Exec flag]
(https://github.com/shundhammer/qdirstat/issues/9)
- Fixed GitHub issue #10:
[incorrect handling of sparse files with 0 allocated blocks]
(https://github.com/shundhammer/qdirstat/issues/10)
- 2016-02-02
- Fixed a bug where directory names with a colon ":" were cut off when
reading a cache file, thus all files and directories below that point could
not find their parent directory, so that complete branch was cut off.
- Much improved performance for treemaps of large directory trees: Now not
rebuilding the treemap immediately when the user resizes the window or
drags the splitter dividing the main window, but just scheduling an update
in 200 milliseconds. If another rebuild is requested during this time, the
previous one is discarded. The net effect is that the treemap now is
rebuilt only once, not for every pixel size change of the treemap
subwindow, so the application remains responsive during dragging the
splitter or resizing the main window.
- 2016-02-01
- Fixed GitHub issue #6:
[NullPointerException when reading cache file]
(https://github.com/shundhammer/qdirstat/issues/6)
The DirTreeModel and the DirCacheReader were somewhat out of sync with
regard to which directory is ready for display in the tree view.
- 2016-01-30
- Added a context menu for the tree view header. It's still very limited, but
you can now turn off auto-resizing of the tree columns for the current
session.
- Added a .desktop file so QDirStat should now show up in the menu of the
major desktop environments (KDE, GNOME, Xfce, Unity, ...) and in their file
managers' "Open With" menus when you right-click a directory.
- 2016-01-29
- Since the missing tabs in the config dialog will also have a list of things
at the left and details of the one current item of those things at the
right, I tried to move out the common part of this as a base class. Since
the things those config tabs manage have different types, I tried a C++
template class. But **it turns out that in this year 2016 Qt's moc still
does not support templates. WTF?!**
- 21:00 (Grrrr) Okay, I found a workaround, albeit a pretty ugly one: Work
with void pointers and forced type casts. Yuck. That's being bombed back to
the early 1990s - we had to do this kind of stuff back with OSF/Motif in
plain C all the time. Type safety was unknown back then; you could get all
kinds of nasty surprises by casting pointers slightly wrong, and the
compiler had no chance (even if it hadn't been that crappy SunOS C
compiler, but a decent GCC) to catch any of this.
25 years later, and we are still stuck with that kind of stone age
programming - just because some tool never got ported to the 21st
century. Sigh.
Yet another day of develpment completely wasted due to insufficiencies of
underlying tools. Just great. I am getting fed up with this.
- 2016-01-22
- Improved usability of refreshing the tree after cleanup actions: They used
to leave the tree behind with nothing selected, the branch the user just
worked in closed (which is natural since it needed to be re-read from disk)
and scrolled to another position - maximum disorientation for the user. Now
the parent directory is selected, giving at least some hint where the
action took place. It's not optimal yet, but much better than before.
- Improved usability of the tree widget: When an item in the treemap is
selected, all other branches in the tree are now collapsed before the new
branch is opened. But this required working around some design flaws in the
underlying _QTreeView_ class.
**Rant:** Trolls, didn't it ever occur to you that if you are _constantly_
using that _d->expandedIndexes_ from _QTreeViewPrivate_ in the _QTreeView_
public class, derived widgets might need that information, too? There is
**no way** to access the currently expanded items other than cheating in
some creative way. Seriously, I am not going to duplicate that bookkeeping
with the _expanded()_ and _collapsed()_ signals, always being off by some
items or not getting the information that items were removed (or listen to
half a dozen more signals for even more advanced bookkeeping). If a widget
class cannot provide that kind of elementary information to its derived
classes, it's poorly designed. Period.
- 2016-01-18
- Applied Qt4 compatibility patches from Michael Matz. The only nontrivial
issue was a thin wrapper around QProcess to make it store the program to
execute and its arguments in the constructor and use those later with a
plain start() without any more arguments.
- 2016-01-16
- The MIME categories and the corresponding treemap colors can now be
configured - see screenshot above. Yes, this is a real treemap widget as a
preview for the colors, complete with a demo directory tree with a random
number of files with random sizes (i.e. it looks different for each
invocation). That part was the last major feature that was missing; now
it's only little stuff that's left (still quite a number of it, though).
- Treemap colors are now no longer fixed; there is now a rules engine called
MimeCategorizer. It uses a new class MimeCategory that groups MIME types
(by filename, not by magic numbers in the file) into broad categories like
"Documents", "Videos", "Music", "Images". Each of these categories has a
list of filename extensions that belong to it (".mp4", ".wmv", ".mov"
etc. for "Videos", for example). The categorizer uses a very fast lookup
map for the vast majority of the rules (simple file extensions), but it
can also use more powerful wildcards wherever you like them.
- The log file is now created per user: It's now /tmp/qdirstat-$UID.log,
which for most Linux home users (with only one user account on the
machine) is typically /tmp/qdirstat-1000.log .
- 2016-01-15
- Added new macros for use within cleanups: %terminal and %filemanager. They
are expanded to the terminal window or file manager application,
respectively, of the current desktop (KDE, GNOME, Xfce, ...). I just
wasted four hours (that could have been put to better use adding missing
features - grrrr) because KDE's konsole misbehaves in every way possible
(leading today's WTF count with 3):
- It won't let me start it in the background from within QDirStat; it
simply exits. I tried all kinds of command line arguments (--nofork,
--hold), I tried to wrap it into a subshell, into the _nohup_ command -
nothing helped. WTF?
- It exits when QDirStat exits. Well, since it won't let me start it in the
background, that's not too surprising. Still, if it does its own fork(),
WTF?
- It doesn't give a damn about the current directory you start it from, it
needs its --workdir command line argument. WTF?
- Added %d macro for cleanups: This is the directory name with full path. For
directories, this is the same as %p. For files, this is their parent
directory's %p.
- %terminal : Terminal window application of the current desktop; one of
- konsole
- gnome-terminal
- xfce4-terminal
- lxterminal
- eterm
- xterm (fallback)
- %filemanager : File manager application of the current desktop; one of
- konqueror
- nautilus
- thunar
- pcmanfm
- xdg-open (fallback)
- Which desktop is used is determined by the _$XDG_CURRENT_DESKTOP_
environment variable. Currently supported:
- KDE
- GNOME
- Unity
- Xfce
- Lxde
- Enlightenment
(no clue how to start its file manager, though - using xdg-open here)
- Users can override this with the _$QDIRSTAT_DESKTOP_ environment variable,
so you can get, say, the Xfce terminal or file manager despite currently
running KDE if you set
export QDIRSTAT_DESKTOP="Xfce"
- Of course, you can still simply use your favourite file manager if you
simply use its command instead of %filemanager in the default "Open File
Manager Here" cleanup action.
- Added new standard cleanup actions:
- Git clean. Start "git clean -dfx" in the current item's directory. This
is relevant for developers or for people who regularly build software
from Git repositories.
- Clear directory contents. This removes everything inside a directory, but
leaves the directory itself intact. ~/.thumbnails or browser cache
directories are typical candidates for this with their ever-growing
content: You probably want to keep the directory, but get rid of
everything inside it.
- Redefined the semantics of the _file manager_ cleanup action: It no longer
tries to open files with the corresponding application depending on MIME
type, it now always opens a file manager in that directory (which can open
the file in its app if you want that). It's now also renamed to "open file
manager here". If you still want the old behaviour, you can easily add your
own cleanup action with the "xdg-open %p" command.
- Added "Troubleshooting" section in this document.
- Cleanup actions that have an icon are now added to the tool bar. Right now,
only some of the predefined actions have an icon. There is currently no way
for the user to specify an icon for a cleanup action.
- 2016-01-13 Added "move to trash", this time as a normal action in the "Edit"
menu, the toolbar and the context menus. This is a real implementation of the
XDG Trash specification. It does not rely on outside tools that might or
might not be available.
- 2016-01-12 We have a first MacOS X port! Sonja Krause-Harder volunteered to
install a Qt development environment (11 GB! Yikes!) on her MacBook. I would
have expected some changes, but a simple "qmake; make" just did the
job. Amazing! -- The major challenge was to find where "qmake" gets installed
in that MacOS Qt environment.
- 2016-01-10 Went through the old KDirStat changelog and found a few bugs that
I had fixed there -- and promptly repeated with the new QDirStat:
- Disable cleanups while reading directories. This would result in a segfault.
- No longer showing the path of the current directory being read. This sped
up reading /usr on my machine from 9.5 sec to 1.5 sec (!).
- 2016-01-09 Cleaned up this README.md file. It had grown much too long.
- 2016-01-08 Cleanups are now configurable - see screenshot.
- Cleanup actions can now be added, deleted, and moved up or down the list.
There is no longer a hard limit to the number of cleanup actions; create as
many as you like. Of course, your screen size is still the limit for those
menus. ;-)
- In addition to the old cleanup parameters, you can now configure the output
window behaviour. The default is "show after timeout" with a timeout of
half a second. This may sound pretty short, but I started with 3 seconds
and found that it felt sluggish. A modern PC can get a lot of things done
in half a second; yet waiting for more than that feels like an eternity. So
if any action takes longer than that, an output window pops up. Of course,
if there is any error, it pops up anyway.
- You can now configure the shell to use. I was weighing the pros and cons of
always using either /bin/sh or the user's login shell, and I found that
there is no killer argument in favour or against either option. For
example, I use the _zsh_, and while it's a great interactive shell, it did
give me problems for that "remove junk files" cleanup: "rm -f *.o *.bak *~"
-- when any of the wildcards cannot be expanded because there is no such
file, it complains. Okay, you can wrap the whole command in "/bin/bash -c",
but that's yet another indirection, so now you can configuare /bin/bash for
that particular cleanup action. On the other hand, for some things I might
want my original shell environment, so I do want my login shell by default.
This is now the default behaviour: Try $SHELL (the user's login shell), and
if that environment variable is not set or whatever is set there is not
executable, it falls back to /bin/bash and then /bin/sh. And you can still
enter your own in an editable combo box (but not "ruby" or "perl" because
the "-c" option is still added automatically).
- 2016-01-05 I admit I had never really liked the way the output of cleanup
actions was typically hidden. Most of the times I couldn't care less, but
sometimes there were error messages that mostly went unnoticed - such as no
permissions to convert a directory into a compressed tarball. Now we have
something new: A process watcher window that looks very much like a terminal
window. The commands and their output are displayed there: Normal output
(stdout) in amber, error output (stderr) in red. It will be configurable for
each individual cleanup action if this window is desired: You can choose to
always open it, to not open it at all -- or to have it automatically open
when there is any output on stderr. And there is also a checkbox to
automatically close it when the cleanup process finishes successfully. This
is all not 100% perfect yet, but it works quite well already.
- 2016-01-04 Cleanups are back. They still need some work, and you'll have to
edit the config file in ~/.config/QDirStat/QDirStat.conf to configure
anything, but they work.
- 2016-01-03 We are getting nearer to the target:
- Settings are read from and written to the settings file in all relevant
places. This includes what columns to display and their order. See section
'Settings' below.
- Refreshing the selected tree branch, continuing reading at mount points and
at excluded directories now works.
- Context menus are back. I am somewhat proud of the way my new ActionManager
handles that with Qt introspection to avoid duplicating stuff: I wanted to
keep the QActions in the Qt Designer file. That ActionManager keeps a
pointer to the MainWindow that is the parent of all those QActions, and
attached views can search that widget tree for action names (yes, that
works only if you keep those QObject names tidy - which I am doing anyway).
- Found some more icons for those actions.
- Exclude rules are now greatly simplified. They no longer get the entire
path to match which requires quite complex regexps, they only get the last
path component - i.e., no longer "/work/home/sh/src/qdirstat/src/.git", but
only ".git". You can now even tell the exclude rule to use a simplfied
syntax: "FixedString" or "Wildcard" in addition to the normal "RegExp".
- Still missing (this list is getting considerably shorter):
- Cleanups
- Settings dialog
- 2016-01-01 New Year release
- Added mouse operations to the treemap. Some where there in the old kdirstat
(but I guess not many users knew about them), some are new:
- Left click: Select item and make it the current item.
- Ctrl+Left click: Add item to selection or toggle selection.
- Middle click: Select the current item's parent. Cycle back at toplevel.
- Double click left: Zoom treemap in.
- Double click middle: Zoom treemap out.
- Mouse wheel: Zoom treemap in or out.
- Reliably sort by pending read jobs while reading.
- Fixed crashes if wildly clicking in the tree while reading. Yes, I
know... "Doctor, it hurts when I do that!" - "Then don't do that."
- 2015-12-31 New Year's Eve release
- Added the URL of the current item in the status bar at the bottom of the
main window. If more than one item is selected, it displays the total sum
of all selected items there.
- Treemap zoom in / out / zoom reset works. The treemap now automatically
zooms out if an item outside its current scope is clicked in the tree view.
- Added more menu and toolbar actions and icons for many of them.
- The treemap's red "current item" rectangle is now stippled instead of a
solid line if the current item is not also selected (users can do that with
ctrl-click).
- Added "about" dialogs for the program and the used Qt version.
- 2015-12-30 Treemap rendering now works as expected, and selecting items
(including multi-selection with shift-click and ctrl-click in the
tree view and ctrl-click in the treemap view) works. It was a bit
of a challenge to avoid Qt signal ping-pong between the selection
model object and the two views.
- 2015-12-28 Treemaps are back. It's not perfect yet, but the basic rendering
works. I admit I was somewhat scared of that part, but the
transition from Qt3 QCanvas to QGraphicsScene / QGraphicsView
went much smoother than I had expected. I am very glad I don't
have to dig deep into the math again with those cushioned
treemaps; that part worked completely unchanged. :-)
- 2015-12-27 The tree view now supports _extended_ selection, i.e. you can
shift-click to select a range of items or ctrl-click to select or
deselect individual items. This was the most requested feature
for the last KDirStat. This means you can now select more than
one item at once to move it to the trash can etc. (once cleanup
actions are back).
- 2015-12-25 Christmas release
- Sorting is now done internally in the DirTreeModel, and it's blazingly
fast. It uses lazy sorting - postponing sorting until the last possible
moment for each tree branch. Maybe the branch will never get visible, and
then it doesn't need to be sorted at all. The QSortProxyModel is gone.
- Reading cache files finally works again. It was quite some hassle to find
all the places where the invisible root item that is required for the
QTreeView / QAbstractItemModel make a difference. I hope now I caught all
of them.
- Fixed some bugs that resulted in segfaults. Well, it's a development
version. Such things happen.
- Removed the section about K4DirStat in this README.md; that information was
outdated. It turns out I hadn't looked at the most recent sources of
K4DirStat - that was entirely my own stupidity. My apologies. Since right
now I don't have an informed opinion about K4DirStat, I preferred to remove
that section entirely for the time being. Looks like K4DirStat is indeed
ported to Qt5 now.
- 2015-12-20 First usable preview version - see screenshot above. It's still
pretty rough, and sorting via the QSortProxyModel seems to be
awfully slow once a number of tree branches were ever
opened. Looks like I'll have to do that myself, too.
- 2015-12-18 Found the crippling bugs that made the DirTreeModel do crazy
things. None of the Qt classes proved to be helpful to find that
- they just happily do the crazy things. That's what I call poor
design. Now there is a first working QDirStat with a useful
display tree, including icons (but no percentage bar graph yet).
- 2015-12-07 First working DirTreeModel -- still minimalistic, but working.
- 2015-12-06 Created tree model based on QAbstractItemModel.
Compiles, but dumps core so far.
- 2015-12-05 Imported and ported directory tree data classes.
Hammered through the compiler, but nothing usable so far.
- 2015-11-28 QDirStat project is being set up. Nothing usable so far.
## KDirStat
KDirStat is the predecessor to QDirStat. QDirStat is an 80% rewrite of the KDE3
based KDirStat.
KDirStat home page: http://kdirstat.sourceforge.net/
Sources: https://github.com/shundhammer/kdirstat
### KDirStat History
_(Incomplete list, just highlighting important releases)_
- 2006-06-01 KDirStat 2.5.3: The last KDE3 based version.
- 2006-01-08 KDirStat 2.5.2:
- New: Read and write cache files
- 2005-02-22 KDirStat 2.4.4
- New: Handle hard links and sparse files
- 2003-01-30 KDirStat 2.3.5
- New: colored treemap
- 2003-01-05 KDirStat 2.3.3
- New: Treemaps (monochrome only)
- Communication between treemap and tree list view: Select an item in one
view, and it is automatically selected in the other one, too.
- 2002-02-25 KDirStat 2.0.0
- Complete rewrite for KDE 2 / Qt 2
- Doing internal caching and (very) lazy creating of QListViewItems for
improved performance and resource consumption
- 2000-01-21 KDirStat 0.86 for KDE 1 announced -- the first public version.
qdirstat-1.4/doc/GitHub-Workflow.md 0000664 0000000 0000000 00000026711 13115020367 0017277 0 ustar 00root root 0000000 0000000 # GitHub Workflow for Open Source Projects
(c) 2017 Stefan Hundhammer
License: GNU Free Documentation License
This is the workflow used for Open Source projects like QDirStat and YaST.
Some of this is mandated by the tools used (git, GitHub), some of it is just
best practices.
## Overview
Even though GitHub hosts the original source code repositories for those
projects, you don't work directly in them. Rather, you create your own forked
repository (your _fork_), work in that one, and when you finished something you
want to contribute to the original repository (called _upstream_), you create a
pull request.
That pull request is reviewed by the owner of the original project or by or
senior team members. They might ask you for changes if anything in your pull
request does not meet the project's quality criteria or violates the coding
style. In that case, you add more commits to the pull request, and it is
reviewed again etc. until everybody is satisfied and it is either merged (which
is the normal case) or it is finally rejected (which is a very rare thing).
When your changes are merged, you pull or rebase your fork against _upstream_
again so it is up to date, and then you can freely work on new things.
One holy rule is that **upstream master always has to work**, even between
official releases. This is much easier to achieve when everybody works in their
own fork, preferably in their own branch of their own fork.
## Initial Setup
- If you don't have one yet, create a user account at
[GitHub](https://www.github.com).
- Make sure to upload your ssh key to your GitHub account.
[More info...](https://help.github.com/articles/connecting-to-github-with-ssh/)
- Log in at GitHub.
- Fork the original (upstream) repository to your GitHub account.
You now have your own repo with that name.
**But it does not automatically sync itself with the upstream repo** as
others commit changes there after you forked; you have to do that manually
(see below).
- In a shell on your working machine (preferably Linux), clone your forked repo
to that machine:
cd ~/src
git clone -o mine git@github.com:kilroy/qdirstat.git
Where _kilroy_ is your GitHub user name which is part of the URL of that
fork. **Make sure to use the "git@github" URL**, not the "https://" URL: The
https URL is only useful for pulling (i.e. for read-only access), not for
pushing (i.e. for read-write access). Since you also want to commit changes
to that repo, you need read-write access.
_mine_ is the name of that _remote_. The default would be _origin_, but that
might lead to confusion because we'll add _upstream_ in a moment, so there
will be two remotes. If you have the same distinct name for all your forks,
your life will be considerably easier. You might also call it the same as
your user name (_kilroy_) here. Just make sure you use the same one for all
your repos.
You now have an entry like this in your `.git/config` file in that newly
cloned repo:
[remote "mine"]
url = git@github.com:kilroy/qdirstat.git
fetch = +refs/heads/*:refs/remotes/kilroy/*
- Add the original repo (_upstream_) as another _remote_ so you can pull /
fetch from there to keep your fork up to date:
git remote add upstream git@github.com:shundhammer/qdirstat.git
You now have two _remote_ entries in your `.git/config`:
[remote "mine"]
url = git@github.com:kilroy/qdirstat.git
fetch = +refs/heads/*:refs/remotes/kilroy/*
[remote "upstream"]
url = git@github.com:shundhammer/qdirstat.git
fetch = +refs/heads/*:refs/remotes/huha/*
You can also check this with this command:
git remote -v
mine git@github.com:kilroy/qdirstat.git (fetch)
mine git@github.com:kilroy/qdirstat.git (push)
upstream git@github.com:shundhammer/qdirstat.git (fetch)
upstream git@github.com:shundhammer/qdirstat.git (push)
Notice there is no _origin_ as would be the default if we hadn't used
`-o mine` during `git clone`. If you forgot that, you can always rename a
remote later (this affects only your working copy, not the repo on the GitHub
server):
git remote rename origin mine
- Make sure your user name and e-mail address are up to date and valid in your
`$HOME/.gitconfig`:
[user]
name = Kilroy Taylor
email = kilroy@mydomain.com
You can also use separate user names and e-mail addresses for different
projects; simply edit .git/config in that project and add a `[user]` section
there.
That name and that e-mail address will be recorded for each commit you make,
so this is where your karma points go and how you will be known to the
community. So choose that name wisely. Real names are preferred, albeit not
enforced.
## Common Tasks
### Working in Your Fork
Your fork is yours. You can do there whatever you like. But if you want to
contribute to the upstream project, you should follow some simple rules:
- Keep your fork in sync with upstream as good as possible (see next section
about rebasing).
- Work in a feature branch for everything you do. This makes your life much
easier when a pull request takes some time to get accepted: You can quickly
switch between the pull request and add some more changes there to satisfy
the reviewers and the next feature you might already be working on.
- Prefix your branches with your user name so you can easily tell them apart
form any upstream branches.
Example:
You plan to work on a _transmogrify_ feature. So you start from _master_,
create a branch for that and check it out:
git checkout master
git branch kilroy-transmogrify
git checkout kilroy-transmogrify
Now work in that branch and commit your changes there. Don't forget to push it
to your GitHub fork every once in a while:
git push mine kilroy-transmogrify
At some point, prepare a pull request to get your changes upstream. But before
you do that, you should rebase your branch so it is in sync with upstream
(except for your changes, of course).
### Rebasing (Updating Your Fork)
As mentioned before, when you fork a repo at GitHub, this will not
automatically update itself. As new commits are added to the upstream repo,
your fork will increasingly get out of date, so you have to update it on a
regular basis.
There are two methods: `pull` and `fetch` / `rebase`. As long as you don't do
any changes in your fork, there is no noticable difference; but when you work
in your fork, i.e. when you commit changes there, `fetch` / `rebase` is highly
recommended to keep the "railway yard" of parallel branches with merge and fork
points in the `gitk` display to a minimum.
First, get the data from the remote server (GitHub):
git fetch --all
**Make sure to use `--all`, not `-a`** which is something different (yes, this
is a common, stupid, unnecessary pitfall of that git command).
If that command remains silent, there was no change, so everything was still up
to date. If it reports something like
remote: Counting objects: 21, done.
remote: Compressing objects: 100% (21/21), done.
...
it did fetch some changes. Notice that the changes are only in the `.git/`
subdirectory so far; they are not applied to your source tree yet.
Now **make sure you don't have any pending changes** anymore. Check with
git status
If it reports any pending changes, you can choose to commit them or to _stash_
them, i.e. put them into temporary storage:
git stash
you can later retrieve them with
git stash pop
Now rebase. Typically, you want to do that based on the _master_ branch of
_upstream_:
git rebase upstream/master
This basically checks where you branched off your working copy, then
temporarily takes away your commits from that point on, then applies the
commits from upstream that have accumulated in the meantime. As a last step, it
tries to apply your commits on top of all that.
Since git commits are basically little more than patches (diffs) on top of
patches, this may or may not work flawlessly. If you are lucky, your commits
still apply cleanly, and you are set: You successfully rebased your repo.
If any of your commits does not apply cleanly, you will have to resolve merge
conflicts and afterwards call
git rebase --continue
to get to the next commit.
When all is done, you can push the result to your fork. Since the rebase caused
the parent SHAs of your commits to change, you will need to force-push; this is
normal and expected.
git push -f mine master
or
git push -f mine branch-name
if you were working in a branch.
### Preparing a Pull Request for Upstream
When you have some changes you would like to get upstream (to contribute to the
upstream project), you create a _Pull Request_.
To do that, make sure those changes are in a separate branch. If you worked on
a separate feature branch like recommended earlier in this document, you can
simply use that one as the branch for the pull request.
But remember to stop working on new features in that branch. As soon as you use
a branch for a pull request, you only commit changes there that were requested
by the reviewers.
Before creating a pull request, rebase your branch against upstream/master once
more and make sure to push your changes (even the latest ones) to your fork:
git fetch --all
git rebase upstream/master
git push mine kilroy-transmogrify
After that, go to your fork in the GitHub web UI, select your branch and click
"New Pull Request". Fill the form with a meaningful description of your changes
and send it off. Now you will have to wait for feedback from the upstream
project owner.
In the meantime, you will probably want to continue working on more
things. Remember to leave the pull request branch alone during that time;
create a new one for your next changes. It is perfectly okay to base that new
branch on the last one that has now become a pull request:
git branch kilroy-hyperforble
git checkout kilroy-hyperforble
...(work in that branch...)
When you get feedback about your pull request from your reviewers, you might
have to add some more changes to the pull request branch. So switch to that
branch (stash or commit any pending changes to your new working branch during
that time):
git checkout kilroy-transmogrify
...(add requested fixes)...
git commit -am "Added code review changes"
git push mine kilroy-transmogrify
Remember that despite the fact that your branch has become a pull request, it
is still hosted in your fork (_mine_) rather than upstream, so you still have
to push to your fork, not to upstream (which you probably can't anyway because
of insufficient permissions).
After that, switch back to your working branch and continue working there:
git checkout kilroy-hyperforble
git stash pop # if you stashed any changes
### Updating Your Fork After Your PR is Merged
Remember that after your pull request has been merged, _upstream/master_ has
changed, so make sure to fetch and rebase:
git fetch --all
git checkout master
git rebase upstream/master
There should be no conflicts (provided you are only working in branches - which
you should).
Don't forget to push the new master to your fork, too:
git push mine master
No `-f` or `--force` needed here either if you only work in branches.
## Further Reading
https://guides.github.com/activities/contributing-to-open-source/
https://guides.github.com/
https://www.atlassian.com/git/tutorials/merging-vs-rebasing
https://www.udacity.com/course/how-to-use-git-and-github--ud775
qdirstat-1.4/doc/Installing.md 0000664 0000000 0000000 00000000166 13115020367 0016405 0 ustar 00root root 0000000 0000000 # Installing QDirStat
See [main document]
(https://github.com/shundhammer/qdirstat/blob/master/README.md#installing)
qdirstat-1.4/doc/QDirStat-for-Servers.md 0000664 0000000 0000000 00000017317 13115020367 0020215 0 ustar 00root root 0000000 0000000 # QDirStat for Servers
## Executive Summary
QDirStat can be used for headless (no X server, no X libs) servers: It comes
with a Perl script qdirstat-cache-writer that can collect data on the
server. You just have to copy the data file from the server to your desktop
machine where you can view the data with the normal QDirStat application.
## Server-Side System Requirements
- Perl
- Some command to copy files to your desktop machine:
scp, ftp or whatever
## One-time Server Setup
Copy the qdirstat-cache-writer script to the server.
You can find that script in scripts/ in the QDirStat source directory or in
/usr/bin when you installed QDirStat as a binary package. Alternatively, you
can fetch it directly from GitHub:
ssh root@myserver
cd /usr/local/bin
wget https://github.com/shundhammer/qdirstat/blob/master/scripts/qdirstat-cache-writer
By all means, have a look inside to convince yourself that there is no
malicious code. It's a very simple script.
## Collecting Data on the Server Side
Like QDirStat itself, qdirstat-cache-writer limits its operation to one
filesystem. It does not by default descend into mounted filesystems. It scans
Btrfs subvolumes, though.
For each filesystem you wish to collect data from, create a qdirstat cache
file:
sudo qdirstat-cache-writer / myserver-root.cache.gz
sudo qdirstat-cache-writer /var myserver-var.cache.gz
sudo qdirstat-cache-writer /srv myserver-srv.cache.gz
...
You should invoke the script with root permissions (thus sudo) to make sure you
can read all the directories. The first parameter is the starting point of the
directory scan, typically that filesystem's mount point. The last parameter is
the name of the output file.
The default is .qdirstat.cache.gz which is useful for desktop machines, but not
for servers, so it is recommended to explicitly specify a name here.
You might consider collecting those data in a nightly cron job.
## Transfer Data to Your Desktop Machine
scp "root@myserver:~/tmp/*.cache.gz" ~/tmp
## View Data on Your Desktop Machine
qdirstat --cache ~/tmp/myserver-root.cache.gz
or
qdirstat -c ~/tmp/myserver-root.cache.gz
or start qdirstat and use "Read Cache File..." from the "File" menu.
## Limitations
You cannot use QDirStat's built-in cleanup operations, of course; they'd still
run on your desktop machine instead of your server. There is also no indication
that your are seeing the contents of a cache file rather than data collected
live from your local system, so be careful what you are doing.
## Security Concerns
Don't give a cache file to somebody you wouldn't trust to read all directories
on that server with root permissions. Don't even make it easily available to
such persons. If the directory contents include sensitive information, treat
the cache file with the same degree of confidentiality as you would the
original directory on the server.
## Why Not Use QDirStat over Remote X?
You can do that as well, of course. But that means you'll need at least the X11
libs and the Qt libs (Qt 5 by default) on the server. And you need to install
QDirStat on the server, too.
Also notice that with the advent of Qt 5, remote X has become very slow with Qt
applications: Qt 5 no longer uses Xlib / X protocol primitives for painting
(XDrawRectangle etc.), but renders into a pixel buffer and transfers that pixel
buffer. While this is a considerable speedup for local X, it is pretty slow for
remote X.
To ease that pain a little, QDirStat has a --slow-update (or -s) command line
option which is intended for remote X:
ssh -X myserver
qdirstat --slow-update
This makes QDirStat update its display only every 3 seconds rather than the
default 333 milliseconds during directory reading.
This interval can be configured in `~/.config/QDirStat/QDirStat.conf` :
[DirectoryTree]
SlowUpdateMillisec = 3000
## Looking Into a Cache File
A cache file is a gzipped text file, so it can be viewed with `zless`:
[qdirstat 1.0 cache file]
# Generated by qdirstat-cache-writer
# Do not edit!
#
# Type path size mtime
D /var 4096 0x53cef170
# Device: /dev/sda6
L run 4 0x54bbf0e3
L lock 9 0x54bbf0e3
D /var/cache 4096 0x58125237
D /var/cache/dictionaries-common 4096 0x53ceef0a
F hunspell.db 188 0x53ceef0a
F ispell-dicts-list.txt 0 0x53ceef0a
F wordlist.db 267 0x53cef022
F ispell.db 188 0x53ceef0a
F jed-ispell-dicts.sl 881 0x53cef024
F aspell.db 741 0x53cef024
F sqspell.php 366 0x53cef024
F emacsen-ispell-default.el 173 0x53ceef0a
F emacsen-ispell-dicts.el 897 0x53cef024
D /var/cache/cracklib 4096 0x53ceef8b
F cracklib_dict.pwi 22972 0x53ceef8b
F cracklib_dict.hwm 1024 0x53ceef8b
F src-dicts 104 0x53ceef8b
F cracklib_dict.pwd 412618 0x53ceef8b
D /var/cache/cups 4096 0x58a842ad
F job.cache 992 0x58a842ad
F ppd-updates 271 0x567b004a
The file format is described in detail in
[cache-file-format.txt]
(https://github.com/shundhammer/qdirstat/blob/master/doc/cache-file-format.txt).
In short, each line contains one entry for a file, directory, or symlink.
- The first field is the type: 'D' for directory, 'F' for file, 'L' for symlink.
- The second field is the name; for directories, that's always the full path, for
files, the path can be omitted.
- The third field is the size of the object (not including any child objects).
- The fourth field is the mtime in hex (seconds since 1970-01-01 00:00:00).
## Long file format
qdirstat-cache-writer -l /var /tmp/var.cache.gz
zless /tmp/var.cache.gz
[qdirstat 1.0 cache file]
# Generated by qdirstat-cache-writer
# Do not edit!
#
# Type path size mtime
D /var 4096 0x53cef170
# Device: /dev/sda6
L /var/run 4 0x54bbf0e3
L /var/lock 9 0x54bbf0e3
D /var/cache 4096 0x58125237
D /var/cache/dictionaries-common 4096 0x53ceef0a
F /var/cache/dictionaries-common/hunspell.db 188 0x53ceef0a
F /var/cache/dictionaries-common/ispell-dicts-list.txt 0 0x53ceef0a
F /var/cache/dictionaries-common/wordlist.db 267 0x53cef022
F /var/cache/dictionaries-common/ispell.db 188 0x53ceef0a
F /var/cache/dictionaries-common/jed-ispell-dicts.sl 881 0x53cef024
F /var/cache/dictionaries-common/aspell.db 741 0x53cef024
F /var/cache/dictionaries-common/sqspell.php 366 0x53cef024
F /var/cache/dictionaries-common/emacsen-ispell-default.el 173 0x53ceef0a
F /var/cache/dictionaries-common/emacsen-ispell-dicts.el 897 0x53cef024
D /var/cache/cracklib 4096 0x53ceef8b
F /var/cache/cracklib/cracklib_dict.pwi 22972 0x53ceef8b
F /var/cache/cracklib/cracklib_dict.hwm 1024 0x53ceef8b
F /var/cache/cracklib/src-dicts 104 0x53ceef8b
F /var/cache/cracklib/cracklib_dict.pwd 412618 0x53ceef8b
D /var/cache/cups 4096 0x58a842ad
F /var/cache/cups/job.cache 992 0x58a842ad
F /var/cache/cups/ppd-updates 271 0x567b004a
The only difference is that all entries are always specified with their full
path. That makes the file a bit larger, but now you can use it as a substitute
for the `locate` command:
zgrep cracklib /tmp/var.cache.gz
## Cache Files on Desktop Machines
See [scripts/README.md]
(https://github.com/shundhammer/qdirstat/blob/master/scripts/README.md)
qdirstat-1.4/doc/TODO.md 0000664 0000000 0000000 00000005234 13115020367 0015047 0 ustar 00root root 0000000 0000000 # QDirStat To Do List
This is roughly ordered by priority.
** See also the GitHub issue tracker! **
## Ready-made Packages for SUSE and Ubuntu
- Write a .control file for Ubuntu .deb packages
- Use the openSUSE build service to create .deb packages
## General
### Translations
- Add translation stuff. Setting up the Qt translator classes is easy
enough. The translation file(s) will probably also end up in the resource
file to avoid being dependent on external files (they can always go
missing).
- Check out available web services for Open Source translations.
- Once translations are there, definitely add config option to "force English".
As much as translations are welcomed, I do not agree to translate everything
to death, in particular when the English term is much more widely used. This
happens a lot in German translations. I don't want to be at the mercy of the
German translator; I want to be able to use my original English texts --
without switching my entire desktop and shell environment to English or the
POSIX locale.
## Some Time in the Future
### Reports?
- Format selected items in useful format and export to clipboard / to file?
- Text, CSV, YaML?
### Config Dialog
- General parameters config page - postponed for the time being. There are
currently not enough worthwhile parameters to be configured.
- Config dialog page for OutputWindow colors
- Find a better way to get objects like CleanupCollection and MimeCategorizer
to the respective config pages; the main window shouldn't need to know that
much about the internal structure of those pages.
- Create a subclass for things common to all the config pages:
- setup()
- apply()
- discardChanges()
### Treemap Parameters
Add config page for at least some of them?
Not sure if all those crazy treemap parameters need to be user configurable.
They are pretty much expert-only, and most of them look pretty scary to normal
people. I might leave them in the config file, but most likely anybody who
really wants to change any of them will need to use his favourite editor.
### MacOS X Support
- Find out how to package a MacOS app
- Find a volunteer for a MacOS X platform maintainer
### Windows Support
**Postponed to the very far future**
- Create DirReadJob subclass that strictly uses Qt classes (QFileInfo) and no
POSIX system calls
- Find out how to package a windows app
- Installer
## Unclassified / Undecided
### Support for non-UTF-8 Locales
See also
[Github Issue #19]
(https://github.com/shundhammer/qdirstat/issues/19)
Dropped. People who need that should finally try to arrive in the 21st century
and use UTF-8 like the civilized part of the world.
qdirstat-1.4/doc/Troubleshooting.md 0000664 0000000 0000000 00000006176 13115020367 0017477 0 ustar 00root root 0000000 0000000
## Troubleshooting
### Can't Move a Directory to Trash
QDirStat does not copy entire directory trees to the trash directory in your
home directory. It tries its best to copy single files there, but for anything
larger, it strictly sticks to the XDG trash specification. So, if you have a
separate /home partition (which is strongly recommended for a lot of reasons),
you cannot move a directory from /tmp to trash because that would mean to move
a directory across file systems -- from /tmp/somewhere to your
~/.local/share/Trash .
But there is an easy workaround. It's described in the XDG trash spec, but here
is a simple recipe what you can do:
Create a dedicated trash directory on the toplevel (mount point) of that file
system. If it is mounted at /data, do this:
cd /data
sudo mkdir .Trash
sudo chmod 01777 .Trash
Permissions '01777' means "rwx for all plus sticky bit". The sticky bit for a
directory means that only the owner of a file can remove it. The sticky bit is
required for security reasons and by the XDG trash spec (it's also required by
the spec that applications like QDirStat refuse to use that trash directory it
if it is not set).
Now you can move directory trees from /data/somewhere to the trash with
QDirStat. It will end up in /data/.Trash/1000/files/somewhere (if 1000 is your
numerical user ID which is common in Linux for the first created user). Your
desktop's native trash application (your trash icon on the desktop and the file
manager window you get when you click on it) should show it, and you can empty
the trash from there.
In Xfce, this works out of the box. KDE might need a forced refresh (press F5)
in that window.
For USB sticks, this explicit toplevel .Trash directory is usually not
necessary: If you have write permission on its toplevel directory, QDirStat
will (again in compliance to the XDG trash specification) create a trash
directory .Trash-1000 in its toplevel directory which is the fallback if there
is no .Trash directory there. This would also happen automatically on /data and
/ if you had write permission there -- which is, however, very uncommon.
What the major desktops (KDE, GNOME, Xfce) usually do with their native file
managers is to recursively copy the entire directory tree to your home trash
directory and then remove the original. Not only is this time-consuming and
wasteful (copy stuff before deleting?!), it might also be error-prone if that
directory tree contains symlinks, sockets or even just sparse files; and
permissions and timestamps (mtime, ctime, not to mention atime) might or might
not be the same as before. This might become a problem if you decide to restore
that directory tree from the trash.
I thought about emulating this behaviour, but this basically means to
reimplement large parts of what the _rsync_ command does (calling _rsync_ from
within QDirStat might not be such a good idea - what if it's not available or
anything goes wrong?), and frankly, I don't want to do that - in particular not
for something that typically gets deleted shortly afterwards anyway upon "empty
trash".
So, if you have this problem, please use the .Trash directory workaround
described above.
qdirstat-1.4/doc/cache-file-format.txt 0000664 0000000 0000000 00000016161 13115020367 0017770 0 ustar 00root root 0000000 0000000 The QDirStat Cache File Format
================================
Author: Stefan Hundhammer
Updated: 2016-01-09
QDirStat can read cache files in either gzip or plain text (uncompressed)
format. The file format is line oriented.
Empty lines as well as lines with a '#' character as their first
non-whitespace character are ignored.
To generate a cache file, you can use QDirstat ("File" -> "Write Cache File")
or the supplied qdirstat-cache-writer script in the scripts/ directory of the
QDirStat sources.
Example:
[qdirstat 1.0 cache file]
# Do not edit!
#
# Type path size mtime
D /work/home/sh/kde/kdirstat 159 0x43aea3d3
F ChangeLog 19288 0x43ae9a3b
F .cvsignore 207 0x41c194f3
F stamp-h1 23 0x43ae9d73
F acinclude.m4 357171 0x43ae9d52
F Makefile.am 1237 0x43ad58a0
F config.h 5460 0x43ae9977
D /work/home/sh/kde/kdirstat/kdirstat 549 0x43aea73b
F .cvsignore 108 0x3b7bda58
F kcleanupcollection.cpp 7615 0x41a3322d
F kdirstatapp.cpp 24254 0x43aea372
F kdirtree.cpp 33083 0x43adc843
F kdirstatsettings.cpp 30519 0x3e39540c
F kdirtreeiterators.cpp 7191 0x3e1ad131
F ktreemapview.cpp 17100 0x3f93ee7b
D /work/home/sh/kde/kdirstat/kdirstat/.libs 24 0x43ae9900
D /work/home/sh/kde/kdirstat/kdirstat/.deps 504 0x43aea73a
F ktreemaptile.Po 18074 0x43ae99a0
F kdirtree.Po 18134 0x43aea0ba
D /work/home/sh/kde/kdirstat/kdirstat/pics 144 0x43ae9d72
F hi32-action-symlink.png 1141 0x3c0b5152
F Makefile.am 59 0x41a47537
D /work/home/sh/kde/kdirstat/kdirstat/pics/CVS 64 0x41c194fc
F Entries 447 0x41c194fc
F Repository 23 0x41c194fb
F Root 54 0x41c194fb
D /work/home/sh/kde/kdirstat/kdirstat/CVS 64 0x434657ca
F Entries 2020 0x434657ca
F Repository 18 0x41c194f8
F Root 54 0x41c194f8
(End of example)
Header
======
The first line ( "[qdirstat 1.0 cache file]" ) is a header identifying the file
format. Future versions of QDirStat may or may not check the version number
(the second word of the header line) to make sure the file format is compatible
with that particular version of QDirStat.
For compatibility reasons, QDirStat will recognize both "qdirstat" and
"kdirstat" as file format keywords.
Data Lines
==========
The data lines are separated into fields by whitespace (blanks or tabs).
Fields are not surrounded by single or double quotes.
The maximum line length is 1024 bytes.
Mandatory fields are:
- Type
- Path or name
- Size
- MTime (time of last modification)
After those mandatory fields there may be optional fields in this order:
- "blocks:" followed by a field with the number of blocks
- "links:" followed by a field with the number of links
The identifiers of those optional fields ("blocks:", "links:") are case
insensitive.
Fields
======
Type
----
Any of:
"F" plain file
"D" directory
"L" (symbolic) link
"BlockDev" block device i-node
"CharDev" character device i-node
"FIFO" FIFO (named pipe)
"Socket" socket
The type field is case insensitive.
Path or Name
------------
Either an absolute path (starting with "/") or only a base name relative to
the last preceding full path in the file.
Directory entries are required to have an absolute path. Entries for plain
files, symlinks, or special files (devices, FIFOs, sockets) may have an
absolute or a relative path.
Hint: To save some disk space with relative paths, it makes sense to
list the plain files in a directory first and then descend into any
subdirectories when writing a cache file.
Paths and names are URL-encoded, i.e. any character (in particular whitespace)
that might otherwise be some kind of delimiter is specified as its hex code
with preceding "%":
with blank -> with%20blank
with%percent -> with%25percent
Take special care for blanks, tabs, newlines, and percent characters. It
does not hurt to escape a few more characters than would strictly be
neccessary.
As for encoding, unfortunately this is one big mess. 7 bit ASCII works
alright, but if there are any special characters, everything depends on the
locale in which the user created a file. There is no standard for file name
encodings in file systems; special characters may come in all kinds of
flavours - in Latin-1 (ISO-8859-1), Latin-2, UTF-8, Japanese, Korean, Chinese,
whatever. In an ideal world, the file system would take care about this and
normalize file names with non-ASCII (7 bit) characters, but that doesn't
happen. So if one user uses, say, Latin-1 and another uses UTF-8, a file system
may have files with different encodings for each file name. Worse yet, the same
(special, i.e. non-7-bit-ASCII) character will be be stored in different
character representations for different file names.
Those character representations is what readdir() returns. There is no way to
tell in which encoding a name may come, so there is also no way to convert it
to a well-defined standard encoding like, say, UTF-8. So what gets stored in
the cache file is the same byte sequence as returned by readdir(). Those names
encoded in something other than the current locale of KDE where QDirStat is
running will of course be displayed with garbage letters, but this cannot be
helped. This is just the same as when the name is read directly from the file
system with readdir(). Bad luck.
Size
----
The entry's size (st_size in struct stat as returned by lstat() ).
Note: This is the entry's own size, not the accumulated size of all
children!
This size is given in bytes. It may also have a trailing unit (directly
following the number, without whitespace):
- "K" for kB (1024 bytes)
- "M" for MB (1024 kB)
- "G" for GB (1024 MB)
The size is always specified in integer numbers, never in fractional
numbers. So if it cannot be divided by a bigger unit without a fractional
part, use the next-lower unit that fits without fraction.
Examples:
1024 -> 1K
1025 -> 1025 (NOT 1.01K or something like this!)
8589934592 -> 8G
8589934593 -> 8589934593 (bad luck)
MTime
------
The entry's last modification time as time_t, i.e., in seconds since
1970-01-01 00:00:00.
May be specified in hex (with preceding 0x) or decimal.
Blocks
------
If a file is a sparse file (and only then) it has a "blocks:" field.
This is the content of the st_blocks field of struct stat as returned by
lstat(): The number of disk blocks actually allocated.
This number multiplied by the block size may be less than what st_size
returns; in this case that file is considered to be a "sparse" file or a
file with "holes".
A block size of 512 bytes is assumed.
Example:
blocks: 17
This file has 17*512 bytes allocated.
Links
-----
If a non-directory entry has more than one hard link, the entry has a
"links:" field indicating the number of hard links:
links: 7
qdirstat-1.4/doc/doc.pro 0000664 0000000 0000000 00000000474 13115020367 0015250 0 ustar 00root root 0000000 0000000 # qmake .pro file for qdirstat/doc
TEMPLATE = app
TARGET = $(nothing)
doc.files = *.txt *.md ../*.md ../LICENSE
# Ubuntu / Debian pkg doc path
doc.path = /usr/share/doc/qdirstat
exists( /usr/share/doc/packages ) {
# SUSE pkg doc path
doc.path = /usr/share/doc/packages/qdirstat
}
INSTALLS += doc
qdirstat-1.4/doc/stats/ 0000775 0000000 0000000 00000000000 13115020367 0015112 5 ustar 00root root 0000000 0000000 qdirstat-1.4/doc/stats/Buckets-Table.md 0000664 0000000 0000000 00000003213 13115020367 0020060 0 ustar 00root root 0000000 0000000 # The Buckets Table

This shows the _buckets_ of the histogram as a table. It is the same
information you can get when hovering over the histogram bars.
For a histogram, files are put into _buckets_, i.e. they are classified by
their size: Files of similar sizes are put into the same bucket, and the
histogram shows how many files there are in each bucket.
Columns from left to right:
- Bucket number. How many buckets there are depends on the number of data
points, i.e. the total number of files. QDirStat uses the
[Rice Rule](https://en.wikipedia.org/wiki/Histogram#Rice_Rule)
to determine the number of buckets so there is a reasonable number of data
elements in each bucket. If there are too many buckets, many of them won't
have any data, and the others will have very similar numbers, so it would be
hard to make any sense of the histogram.
QDirStat uses a maximum of 100 buckets so each bucket is still wide enough to
be well visible and clickable.
- The start value of the bucket, i.e. the minimum file size for a file to be
put into that bucket.
- The end value of the bucket, i.e. the maximum file size for a file to be put
into that bucket. The end value of this bucket is also the start value for
the next one.
- The number of files in that bucket. This is what the histogram displays.
------------------------
## Navigation
[Up: Statistics Top Page](https://github.com/shundhammer/qdirstat/blob/master/doc/stats/Statistics.md)
[Top: QDirStat Home Page](https://github.com/shundhammer/qdirstat/blob/master/README.md)
qdirstat-1.4/doc/stats/File-Size-Histogram.md 0000664 0000000 0000000 00000016332 13115020367 0021163 0 ustar 00root root 0000000 0000000 # QDirStat's File Size Histogram
_This explains the histogram itself. The overflow ("cut off") area is described in a
[separate document](https://github.com/shundhammer/qdirstat/blob/master/doc/stats/Overflow-Area.md),
and the histogram options in
[yet another separate document](https://github.com/shundhammer/qdirstat/blob/master/doc/stats/Histogram-Options.md)._

## How to Get this Window
1. In QDirStat's tree view, select a directory, then menu _View_ ->
_File Size Statistics_ or hit the F2 key.
2. In QDirStat's _File Type Statistics_, open a file type category, then select
a filename suffix (e.g. `*.jpg`), then open the _File Type_ menu button and
select _Size Statistics_ or hit the F2 key.

_Histogram showing only .jpg files in that directory_
## Histogram Panel Content
This histogram displays the distribution of file sizes in the selected
directory (see window heading). If a filename suffix ("*.jpg" or similar) is
displayed, it is restricted to files of that type.
### The Colored Heading Values
From left to right, you see
- The first quartile (Q1) of the file sizes
- The median of the file sizes
- The third quartile (Q3) of the file sizes
- The total number of files in the histogram, i.e. the sum of all bucket
values.
If the terms _median_, _quartile_, _percentile_ don't mean anything to you, you
might want to read the
[intro document where they are explained](https://github.com/shundhammer/qdirstat/blob/master/doc/stats/Median-Percentiles.md).
### The Histogram
The horizontal (x) axis shows the file sizes, the vertical axis the bucket
values, i.e. the number of files in each bucket (in each size interval).
The vertical axis might be linear (if labeled just with **n**) or logarithmic
(if labeled with **log2(n)**) with a base 2 logarithm.

_Histogram with logarithmic scale_
The same principle still applies: The higher a bar, the more files are in a
bucket. But it's no longer a linear relationship between the bars; a bar that
is just slightly higher might have double the data points if a logarithmic
scale is used. Use tooltips to find out the true numbers.
### What is it Good For?
- You can see the vast amount of very small files on a Linux system.
- You can see the sizes of your MP3s, of your videos, of your photos and maybe
make educated decisions about them.
- You might use that information for optimizations for very special servers.
Back a long time ago, news servers were notorious for creating a large number
of very small files. Some http servers might be similar. Some database
servers might be completely different.
- Filesystem developers might find that information useful for optimizing or
fine-tuning parameters.
- You might want to compare the data from your Windows partition to your Linux
partition. You **will** notice differences.
- You might be just curious.
- Information is power. Use your imagination what to do with it.
### Tooltips
You can get a tooltip for each histogram item (bars or percentile marker) if
you hover the mouse over it. Sometimes you might have to click into the window
first so it gets focus.
A tooltip looks like this:
Bucket #20:
707 Files
1.6 MB .. 1.7 MB
You can get the same information for all buckets at once by switching to the
_Buckets_ page in that dialog.
### The Markers
Markers for Q1, the median and Q3 are superimposed over the histogram: They are
the colored vertical lines. Their respective color is the same as in the
heading above the histogram.
At the right, there are some more grey markers; they show some percentiles at
the border of the histogram. They are useful to get an idea how much the
percentiles are spaced out in that area. Typically, the last few percentiles
are very wide, i.e. the data points in that area are very widely spaced. You
could say "the air gets thinner" the more you get away from the center part.
### Histogram Boundaries
It is very common for file sizes on a real life filesystem to be vastly
different: You might have a large number of tiny files, and you might also have
a couple of ISOs or videos of 2 GB each. Put into the same histogram, this
looks like this:

This histogram does not really give away any useful information: You can see
that the vast majority of files is at the left side, and then there are wide
stretches of file sizes that don't appear anywhere in that directory tree
(where all the gaps are), and then there are some very large files in the 2 GB
area. This is not very useful.
This is why QDirStat by default uses some heuristics to determine useful
boundaries for the histogram: It uses the _interquartile distance_ (Q3 - Q1)
and adds some generous distance to the left and to the right of Q1 and Q3:
leftBoundary = Q1 - 3 * (Q3 - Q1)
rightBoundary = Q3 + 3 * (Q3 - Q1)
(maxed out at minValue (P0) and maxValue (P100), of course)
But in our extreme example (which is actually quite common), even if we leave
just one percentile out and display the histogram from P0 to P99, it becomes
much more useful:

As you can see, the right boundary is still at 8 MB, and the "interesting" area
between Q1 and Q3 is still pretty much crammed together at the left, but now at
least we can make some sense of it all (notice that it's using a logarithmic
vertical scale, so it's not nearly as evenly distributed as you might think).
Percentile data for reference:

### Why Not Use a Logarithmic Scale There, Too?
This is a tempting idea, but it would make the histogram display either
incorrect or very difficult to interpret: By definition, the area of each bar
corresponds to its numeric value (to the number of files in that bucket).
By using a logarithmic scale there, too, the width (!) of the bars would have
to get logarithmic, too: This would mean very fat bars on the left and very
thin bars on the right. If there are extreme differences like in this example,
the right bars would degenerate into thin lines, and even that would be
technically wrong because they would need to have sub-pixel widths. Remember
that we are comparing ranges of some few bytes with gigabytes; that's a factor
1024\*1024\*1024 difference. It's just not feasible to display that.
So the more pragmatic approach is to cut off at a sensible limit.
----------------------------------
## Navigation
[Next: The Overflow Area](https://github.com/shundhammer/qdirstat/blob/master/doc/stats/Overflow-Area.md)
[Up: Statistics Top Page](https://github.com/shundhammer/qdirstat/blob/master/doc/stats/Statistics.md)
[Top: QDirStat Home Page](https://github.com/shundhammer/qdirstat/blob/master/README.md)
qdirstat-1.4/doc/stats/Histogram-Options.md 0000664 0000000 0000000 00000003444 13115020367 0021027 0 ustar 00root root 0000000 0000000 # Histogram Options in QDirStat's File Size Histogram
When you click on the `Options >>` button below the histogram, some
interactive controls become visible:

Here you can change the left and right boundary of the histogram.
Typically, the left boundary is P0 (percentile #0, the minimum file size), but
the right boundary is below P100 (percentile #100, the maximum file size).
As explained in the
[file size histogram article](https://github.com/shundhammer/qdirstat/blob/master/doc/stats/File-Size-Histogram.md),
QDirStat automatically determines a useful values for both boundaries.
But that's just heuristics, and the value might not always be the optimal
one. So here you have the tool to experiment with better values: Use the
sliders or the _spin boxes_ below them to change the start and end percentile.
Notice you can't cut off above Q1 or below Q3: That part of the histogram will
always remain visible.
If you set the end percentile to P100, the overflow ("Cut off") panel will
disappear. This is normal and intentional since in that situation nothing is
cut off.
The _Auto_ button resets both to the automatically calculated values:
leftBoundary = Q1 - 3 * (Q3 - Q1)
rightBoundary = Q3 + 3 * (Q3 - Q1)
(maxed out at minValue (P0) and maxValue (P100), of course)
Hit `<< Options` again to close the histogram controls.
------------------------------
## Navigation
[Next: The Percentiles Table](https://github.com/shundhammer/qdirstat/blob/master/doc/stats/Percentiles-Table.md)
[Up: Statistics Top Page](https://github.com/shundhammer/qdirstat/blob/master/doc/stats/Statistics.md)
[Top: QDirStat Home Page](https://github.com/shundhammer/qdirstat/blob/master/README.md)
qdirstat-1.4/doc/stats/Histograms-in-General.md 0000664 0000000 0000000 00000011564 13115020367 0021542 0 ustar 00root root 0000000 0000000 # Histograms in General
(c) 2017 Stefan Hundhammer
License: GNU Free Documentation License
## Quick Overview
A histogram is a graphical representation of data: The data are grouped into
_buckets_ (or _bins_) of intervals (usually of equal width), and bars are drawn
to show how many data points fall into each bucket. The higher the bar, the
more data are in a bucket.
From the resulting graphics you can easily see if data points are concentrated
in any area, if there are any peaks, and how data are distributed.
## Detailed Explanation
### Number of Buckets
First you need to determine the number of buckets to use.
This is not anything as easy as it may sound: Too many buckets, and you will
end up with many buckets without any data, leaving gaps in the graphics; and at
the same time the buckets that do have data will have very few of them which
makes any comparison between them difficult.
If you have too few buckets, it is very likely that many data will be
concentrated in very few of them, which leaves you with the bars for those few
buckets being huge in comparison with the others. Again, it makes analysis of
the resulting histogram very difficult.
There are a number of formulas to calculate a reasonable number of
buckets. QDirStat uses the
[Rice Rule](https://en.wikipedia.org/wiki/Histogram#Rice_Rule).
It uses a maximum of 100 buckets so the resulting histogram bars don't
degenerate to very thin lines, but remain well visible and also clickable.
### Buckets vs. Percentiles
All buckets have the same width, while percentiles typically have very
different widths. Each percentile interval (the interval between a percentile
and the previous one) always has the same number of data points (by definition,
each of them has 1/100 of the data points).
### Histogram Bars
Each histogram bar corresponds to one bucket. In normal histograms, the height
of each bar shows the number of data points in the bucket.
_There are also histograms where the buckets have different widths; in that
case, it is not the height, but the area of the histogram bar that corresponds
to the number of data points. But that is hard to interpret, so that kind of
histogram shall be disregarded here._
Notice that unlike with bar graphs, there are no gaps between histogram bars:
This is because of the way the buckets are defined. The end point of one bucket
is also the start point of the next bucket; this is how each possible data
point can be unambiguously put into one bucket.
If you see any gaps in a histogram, you are seeing an empty bucket (or possibly
multiple empty buckets).
### Method
Scenario:
We measured 1000 data points. The minimum measured value is 100, the maximum
200.
According to the Rice Rule, we need `2 * 1000^(1/3) = 20` buckets.
The range we need to display is `max - min = 200 - 100 = 100`.
The bucket width is `range / bucketCount = 100 / 20 = 5`.
So we get those buckets:
| Bucket # | Start | End |
| -------: | ----: | --: |
| 1 | 100 | 105 |
| 2 | 105 | 110 |
| 3 | 110 | 115 |
| 4 | 115 | 120 |
| .. | ... | ... |
| .. | ... | ... |
| 18 | 185 | 190 |
| 19 | 190 | 195 |
| 20 | 195 | 200 |
How to handle the boundaries for its bucket is open to definition. A
practicable definition would be to check for `start <= x < end`.
Then we go through all data and determine the bucket where each data point
belongs. For that bucket, we increment its counter by one.
| Data Value | Bucket # |
| ---------: | -------: |
| 118 | 4 |
| 187 | 18 |
| 101 | 1 |
| 119 | 4 |
| ... | ... |
| ... | ... |
Notice that the data don't need to be sorted for that.
Finally, we determine the maximum counter of all buckets; this is the maximum
for the vertical scale. Then we can begin drawing the histogram bars.
##
###
######
######### ##
############ ####
#####################
---------------------
1 5 10 15 20
Bucket No. --->
In this example, we have two clearly defined peaks: One around bucket #9, and
another one around bucket #17.
Notice how the histogram shows information even without knowing anything about
the vertical scale; just the relative sizes of the bars against each other are
enough. It does help, though, to mark the horizontal (x) axis to get any idea
where the peaks or valleys are.
## Reference
https://en.wikipedia.org/wiki/Histogram
(Much better readable than the Wikipedia article about percentiles)
----------------------------------
## Navigation
[Next: The File Size Histogram](https://github.com/shundhammer/qdirstat/blob/master/doc/stats/File-Size-Histogram.md)
[Up: Statistics Top Page](https://github.com/shundhammer/qdirstat/blob/master/doc/stats/Statistics.md)
[Top: QDirStat Home Page](https://github.com/shundhammer/qdirstat/blob/master/README.md)
qdirstat-1.4/doc/stats/Median-Percentiles.md 0000664 0000000 0000000 00000023407 13115020367 0021112 0 ustar 00root root 0000000 0000000 # Median, Quartiles and Percentiles Explained
(c) 2017 Stefan Hundhammer
License: GNU Free Documentation License
## Motivation
_"Do not trust any statistics you did not fake yourself."_
(Joseph Goebbels, often wrongly attributed to Winston Churchill)
This is the instant reply some moron will ALWAYS bring up whenever anybody
begins talking about statistics, thus instantly discrediting whatever facts
were brought up.
But all that does is to make any intelligent discussion (that is, any
fact-based discussion) virtually impossible, replacing hard facts with mere
sentiments. While there might be some virtue to something meteorologists call
"perceived temperature" (because it takes the wind chill factor into account),
"perceived facts" are completely worthless. Yet they seem to rule the day in a
society where it is considered chic to state "I've always been bad at math"
(and nobody replies "you should be ashamed of yourself").
But important decisions should be based on facts, not on feelings. That's where
statistics come into play; and that's when average people feel overwhelmed
rather than informed. What is all that stuff? Everybody knows what an average
value is, but what is a median, what are percentiles? And who cares anyway?
It's actually very simple. It doesn't take a math genius to understand; every
average (here we go again!) person can do that. Just read on.
## The Farmers of Dairyville
Dairyville is a fictional village with a number of farmers; some small ones
with only very few cows, most with a pretty medium-sized number, and there is
also that big large corporation Agricorp, Inc. with a lot of cows:
#1 Collins 1 cow
#2 Myers 2 cows
#3 Davis 12 cows
#4 Thompson 12 cows
#5 Fletcher 14 cows
#6 Allen 15 cows
#7 Brown 16 cows
#8 Eliott 16 cows
#9 Robinson 17 cows
#10 Jones 18 cows
#11 Simpson 38 cows
#12 Agricorp, Inc. 400 cows
Total 561 cows
The average is 561 / 12 = 46.75.
But that does not describe any of the farmers well; worse, that average is a
meaningless number: It does not fit any of the normal farmers, much less the
big Agricorp, Inc. corporation.
Why this is so is obvious in this case: That big Agricorp, Inc. is greatly
distorting the result. There must be a better way to do this; one that actually
makes a meaningful statement about the typical farmer of Dairyville.
Well, there is. It is called the median.
## The Median
The median is a value determined by putting all the data in a sorted list and
then choosing the middle point. It is the point where as many data points are
below as there are above.
#1 Collins 1 cow
#2 Myers 2 cows
#3 Davis 12 cows
#4 Thompson 12 cows
#5 Fletcher 14 cows
#6 Allen 15 cows
------------------------------ Median
#7 Brown 16 cows
#8 Eliott 16 cows
#9 Robinson 17 cows
#10 Jones 18 cows
#11 Simpson 38 cows
#12 Agricorp, Inc. 400 cows
In our example the data are already conveniently sorted and numbered, so we
just have to pick the middle point from the 12 data points: Between #6 and #7,
i.e. between farmer Allen and farmer Brown, between 15 and 16 cows, i.e. 15.5
cows.
If you look at the data, that is a much more accurate description of the
typical Dairyville farmer.
Better yet, if you were to take Agricorp out of the calculation, you'd end up
with a very similar number: Then the median would be at #6, farmer Allen, with
15 cows. No big change (from the previous 15.5).
On the other hand, the average would change from 46.75 to 14.63 - quite a
drastic change.
If you were to disregard the very small farms #1 and #2, the median would be
16, no matter if Agricorp were still in the table or not.
The median is a very useful measure; it is very stable against weird "outliers"
(outlying data points very far from the center), unlike the average.
This is why the median is typically used for professional statistics of any
kind; never again let anyone fool you into believing that "the average income
in our country is only so high because of a few billionaires who greatly
distort the statistics". That is a flat-out lie. The pros use the median, and
the billionaires don't make a difference at all.
If you watch closely, the pros always talk about the "median household income",
never about the "average household income" because that would indeed be a
meaningless number. It's just the media who tend to misquote it and change it
from "median" to "average" because they think that makes it easier to
understand.
## Quartiles
The concept goes further. Now that we know what the median is, can we make any
more meaningful statements about the typical Dairyville farmer?
We can. Let's just cut the list in half at the median and apply the same
principle again:
Lower half:
#1 Collins 1 cow
#2 Myers 2 cows
#3 Davis 12 cows
----------------------------- 1st Quartile
#4 Thompson 12 cows
#5 Fletcher 14 cows
#6 Allen 15 cows
Upper half:
#1 Brown 16 cows
#2 Eliott 16 cows
#3 Robinson 17 cows
----------------------------- 3rd Quartile
#4 Jones 18 cows
#5 Simpson 38 cows
#6 Agricorp, Inc. 400 cows
Voila, we just cut our farmer population into quarters.
The dividing points (the medians of the lower and upper halves) are called the
"first quartile" and the "third quartile". The second quartile technically
exists, but it is much better known for its other name: The median.
In more advanced statistics, the segment between the 1st quartile (Q1) and the
3rd quartile (Q3) is considered the most important part of the data. The value
difference between them is called the "interquartile distance"; in our example,
this would be 17.5 - 12 = 7.5.
This is an important number for a lot of things, such as deciding where and how
to leave out data in certain types of graphical representations such as "box
plots": They typically cut off outlying data points beyond 1.5 * (Q3-Q1) on
either side so the graphics remain meaningful.
In our example, that would mean to cut off below Q1 - 1.5 * 7.5 = 0.75 and
above Q3 + 1.5 * 7.5 = 28.
That would mean that farmer Collins would still be in the graph, but Agricorp
and farmer Simpson would not.
## n-Quantiles, Deciles and Percentiles
In a mathematical sense, the concept is easy to generalize; it is called
"n-quantiles" where "n" is the number of segments after the division.
So, the median would be the 2-quantile, the quartiles would be 4-quantiles.
When used with n = 10, they are called "deciles"; with n = 100, they are called
"percentiles". And the percentiles are the most useful and come most natural to
us modern people who are used to think in terms of percent.
Dairyville has not enough farms to come up with a useful percentile table; with
a full one, that is.
But just think about it: The median is the middle point of the percentiles,
i.e. the 50th percentile (P50); the first quartile is the 25th percentile
(P25), the third quartile the 75th percentile (P75):
#1 Collins 1 cow
#2 Myers 2 cows
#3 Davis 12 cows
------------------------------ P25 (Q1)
#4 Thompson 12 cows
#5 Fletcher 14 cows
#6 Allen 15 cows
------------------------------ P50 (Median)
#7 Brown 16 cows
#8 Eliott 16 cows
#9 Robinson 17 cows
------------------------------ P75 (Q3)
#10 Jones 18 cows
#11 Simpson 38 cows
#12 Agricorp, Inc. 400 cows
Notice that strictly speaking, there is no P100, and no P0. But it is useful to
extend the concept a little further, and define P100 the maximum of the data
and P0 the minimum, so the percentiles (even if only very few of them can be
calculated with only 12 data points) can serve to completely describe the data
set:
------------------------------ P0 (Min)
#1 Collins 1 cow
#2 Myers 2 cows
#3 Davis 12 cows
------------------------------ P25 (Q1)
#4 Thompson 12 cows
#5 Fletcher 14 cows
#6 Allen 15 cows
------------------------------ P50 (Median)
#7 Brown 16 cows
#8 Eliott 16 cows
#9 Robinson 17 cows
------------------------------ P75 (Q3)
#10 Jones 18 cows
#11 Simpson 38 cows
#12 Agricorp, Inc. 400 cows
------------------------------ P100 (Max)
**Notice:** The percentiles/quartiles/median are the **dividing points**, not
the interval at either of their sides.
## Further Reading
Read the full description that is no doubt mathematically correct, but utterly
incomprehensible and thus useless to the normal human here:
https://en.wikipedia.org/wiki/Quantile
https://en.wikipedia.org/wiki/Median
https://en.wikipedia.org/wiki/Quartile
(This bunch of uselessness is why I wrote this document)
## Disclaimer
No animals (or farmers) were harmed in the making of this.
We'd like to thank the farmers and cows of Dairyville and the Dairyville
chamber of commerce for their kind cooperation.
;-)
## Navigation
[Next: Histograms in General](https://github.com/shundhammer/qdirstat/blob/master/doc/stats/Histograms-in-General.md)
[Up: Statistics Top Page](https://github.com/shundhammer/qdirstat/blob/master/doc/stats/Statistics.md)
[Top: QDirStat Home Page](https://github.com/shundhammer/qdirstat/blob/master/README.md)
qdirstat-1.4/doc/stats/Overflow-Area.md 0000664 0000000 0000000 00000011562 13115020367 0020112 0 ustar 00root root 0000000 0000000 # The Overflow Area in QDirStat's File Size Histogram
Since QDirStat in most cases does not display the full data range, but rather
cuts off at a sensible point, it displays a special panel next to the histogram
when it does that as a reminder that you are not seeing the complete data set.

In the above case, it's pretty harmless: The overflow ("Cut off") panel shows
that a small part of the data was cut off: Percentile P99 to P100.
Remember that each percentile contains by definition 1/100 of all data points
(in this case: of all files), so in this case it's just 1% of all data points
that were cut off; in this example, 292 files. But the histogram still shows
the remaining 99%, 28838 files total (this is the rightmost / black value above
the histogram).
The upper pie chart shows that information graphically. It's no big deal,
really.
But P99..P100 in this case means cutting off from 5 MB to 31.1 MB, so it's a
really wide part of the x axis that gets cut off; to show that all, it would
need to be more than 6 times as wide. If scaled to the same window width, that
would mean that the meaningful part of the histogram would only be 1/6 of the
total width with vast areas of emptiness to its right. That's _why_ that part
was cut off.
But even though it's only 1% of all files, those files together account for
8.4% of the disk space in that directory tree: 3.3 GB total. This is what the
lower pie chart shows. Again, this is not really significant, much less for the
purpose of file size distribution which this window is all about. But it's a
reminder not to just disregard those few files - because they are **big**.
## A More Extreme Example
_Oh PacMan, where art thou?_
_...and why art thou red?_

Going one directory level up, we get this histogram, and this is an entirely
different matter:
The heuristics for determining the histogram boundaries decided on displaying
P0 to P87. This does make sense in order to have the most important part of the
distribution between Q1 (P25) and Q3 (P75) in view.
But on the other hand, it cuts off 13% of all files (13 percentiles), the range
between 2 MB and 2 GB. That's three magnitudes (1024) of difference in file
size. The red slice of the upper pie chart is considerably bigger than in the
previous example.
For the accumulated size of those files that were cut off, it means that they
now contribute to 88.1% of the total disk space in that directory tree (the red
part of the pie charts is always the part that is cut off), by far dwarfing the
accumulated sizes of those files that are displayed in the histogram.
Again, this may or may not bother you; it depends on what information exactly
you are looking for in the histogram. But this is where you might want to
decide to show just a little more of the data range by opening the histogram
options and moving the sliders.
Moving the _End Percentile_ slider to P99 in this case gets you this:

OK, that did put things a bit more into proportion - at the price that the most
important part of the data, Q1 .. Q3, has now become a lot less visible: It now
has 1/4 of its previous display size (since the right boundary is now at 8 MB
from the previous 2 MB).
Still, the remaining 1% of the files that were cut off contribute to 62% of the
total disk space: The red slice is still the dominant one, albeit no longer
quite as much as before. _PacMan opened its mouth for us._ ;-)
But going full hog and moving the _End Percentile_ slider all the way to P100
is not helpful, either:

Duh. There is no longer an overflow panel since now nothing is cut off, but the
histogram is pretty worthless: We can now see that there are some files in the
2 GB range, but the core of the histogram (Q1..Q3) has now degenerated to some
5 pixels wide with colored lines. All we can see in this histogram is that
there is a lot of little stuff on the left, then it peters out for a wide
stretch, and there is another peak on the right. Notice, though, that due to
the logarithmic vertical scale that peak is not nearly as high as it appears:
It's just 18 files (!) in comparison to bucket #1 (the peak at the very left)
with 98206 files.
-----------------------------
## Navigation
[Next: Histogram Options](https://github.com/shundhammer/qdirstat/blob/master/doc/stats/Histogram-Options.md)
[Up: Statistics Top Page](https://github.com/shundhammer/qdirstat/blob/master/doc/stats/Statistics.md)
[Top: QDirStat Home Page](https://github.com/shundhammer/qdirstat/blob/master/README.md)
qdirstat-1.4/doc/stats/Percentiles-Table.md 0000664 0000000 0000000 00000004247 13115020367 0020745 0 ustar 00root root 0000000 0000000 # The Percentiles Table

This table shows the percentiles of the file size statistics.
If you don't know what percentiles are, please read the
[percentiles documentation](https://github.com/shundhammer/qdirstat/blob/master/doc/stats/Median-Percentiles.md)
first.
Columns from left to right:
- Percentile number (P0 .. P100).
- Percentile value. This is the file size where that percentile is. Remember
that percentiles are the dividing point, not an interval. Percentile P10 is
the point where 10% of all data points are below, 90% are above.
- The name of the percentile if there is any special name:
| Percentile | Name |
|------------|------------------|
| P0 | Min |
| P25 | 1. Quartile (Q1) |
| P50 | Median |
| P75 | 3. Quartile (Q3) |
| P100 | Max |
- The accumulated sum of all data points (of all files) between the the
previous percentile and this one.
If you wonder how many data points (files) fall into any interval between the
previous percentile and this one: That's always 1/100 of the total number of
data points (files). This is why this is not listed in the table; that would be
the same number for each percentile.
This table shows either all or only the interesting percentiles. Use the combo
box at the top right to switch between those two views.
Interesting percentiles in the context of this table are those with a special
name (see above), those with a number that can be divided (without remainder)
by 5, and a few around the extremes (min and max).

_Full percentiles table_
----------------------------
## Navigation
[Next: The Buckets Table](https://github.com/shundhammer/qdirstat/blob/master/doc/stats/Buckets-Table.md)
[Up: Statistics Top Page](https://github.com/shundhammer/qdirstat/blob/master/doc/stats/Statistics.md)
[Top: QDirStat Home Page](https://github.com/shundhammer/qdirstat/blob/master/README.md)
qdirstat-1.4/doc/stats/README.md 0000777 0000000 0000000 00000000000 13115020367 0021040 2Statistics.md ustar 00root root 0000000 0000000 qdirstat-1.4/doc/stats/Statistics.md 0000664 0000000 0000000 00000002031 13115020367 0017562 0 ustar 00root root 0000000 0000000 # Statistics in QDirStat
## Statistics Basics
### Median, Quartiles and Percentiles Explained
https://github.com/shundhammer/qdirstat/blob/master/doc/stats/Median-Percentiles.md
### Histograms in General
https://github.com/shundhammer/qdirstat/blob/master/doc/stats/Histograms-in-General.md
-----------------------------
## QDirStat File Size Statistics
### The File Size Histogram
https://github.com/shundhammer/qdirstat/blob/master/doc/stats/File-Size-Histogram.md
### The Overflow Area
https://github.com/shundhammer/qdirstat/blob/master/doc/stats/Overflow-Area.md
### Histogram Options
https://github.com/shundhammer/qdirstat/blob/master/doc/stats/Histogram-Options.md
### The Percentiles Table
https://github.com/shundhammer/qdirstat/blob/master/doc/stats/Percentiles-Table.md
### The Buckets Table
https://github.com/shundhammer/qdirstat/blob/master/doc/stats/Buckets-Table.md
----------------------------------
## Navigation
[Top: QDirStat Home Page](https://github.com/shundhammer/qdirstat/blob/master/README.md)
qdirstat-1.4/doc/stats/stats.pro 0000664 0000000 0000000 00000000474 13115020367 0016777 0 ustar 00root root 0000000 0000000 # qmake .pro file for qdirstat/doc/stats
TEMPLATE = app
TARGET = $(nothing)
doc.files = *.txt *.md
# Ubuntu / Debian pkg doc path
doc.path = /usr/share/doc/qdirstat/stats
exists( /usr/share/doc/packages ) {
# SUSE pkg doc path
doc.path = /usr/share/doc/packages/qdirstat/stats
}
INSTALLS += doc
qdirstat-1.4/qdirstat.pro 0000664 0000000 0000000 00000000305 13115020367 0015562 0 ustar 00root root 0000000 0000000 # Toplevel qmake .pro file. Create a Makefile from this with
#
# qmake
#
# Then build the program with
#
# make
TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS = src scripts doc doc/stats
qdirstat-1.4/qdirstat.pro.user 0000664 0000000 0000000 00000047660 13115020367 0016556 0 ustar 00root root 0000000 0000000
ProjectExplorer.Project.ActiveTarget
0
ProjectExplorer.Project.EditorSettings
true
false
true
Cpp
CppGlobal
QmlJS
QmlJSGlobal
2
UTF-8
false
4
false
true
1
true
0
true
2
8
true
1
true
false
true
true
ProjectExplorer.Project.PluginSettings
ProjectExplorer.Project.Target.0
Desktop
Desktop
{888b365f-2bde-4794-8b79-baa82c8a4ec2}
0
0
0
true
qmake
QtProjectManager.QMakeBuildStep
false
false
false
true
Make
Qt4ProjectManager.MakeStep
-w
-r
false
2
Build
ProjectExplorer.BuildSteps.Build
true
Make
Qt4ProjectManager.MakeStep
-w
-r
true
clean
1
Clean
ProjectExplorer.BuildSteps.Clean
2
false
Release
Qt4ProjectManager.Qt4BuildConfiguration
0
true
1
0
Deploy
ProjectExplorer.BuildSteps.Deploy
1
Deploy locally
ProjectExplorer.DefaultDeployConfiguration
1
false
false
false
false
true
0.01
10
true
1
25
1
true
false
true
valgrind
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
src
Qt4ProjectManager.Qt4RunConfiguration:/work/home/sh/src/qdirstat/src/src.pro
~/src
src/src.pro
false
false
3768
true
false
false
false
true
false
false
false
false
true
0.01
10
true
1
25
1
true
false
true
valgrind
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
doc
Qt4ProjectManager.Qt4RunConfiguration:/work/home/sh/src/qdirstat/doc/doc.pro
doc/doc.pro
false
false
3768
false
true
false
false
true
false
false
false
false
true
0.01
10
true
1
25
1
true
false
true
valgrind
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
scripts
Qt4ProjectManager.Qt4RunConfiguration:/work/home/sh/src/qdirstat/scripts/scripts.pro
scripts/scripts.pro
false
false
3768
false
true
false
false
true
3
ProjectExplorer.Project.TargetCount
1
ProjectExplorer.Project.Updater.EnvironmentId
{69a2b64a-6740-4d76-a751-dfd1210c7360}
ProjectExplorer.Project.Updater.FileVersion
15
qdirstat-1.4/screenshots/ 0000775 0000000 0000000 00000000000 13115020367 0015547 5 ustar 00root root 0000000 0000000 qdirstat-1.4/screenshots/QDirStat-buckets-table.png 0000664 0000000 0000000 00000334733 13115020367 0022510 0 ustar 00root root 0000000 0000000 PNG
IHDR sBIT|d pHYs + IDATxwx93RHBI &*UAEł
뽶kEE
&$-3s~Bz}NfsvvϞ=sB!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!BD
*cnۄB!C)W7&u'K0B!uA }8.B!ꢿ8u!yluCB!u\V/
{?n%W@~~yЅB!DK)O,^r`{!^S8