From 38b35f30b448a3156e6010c06e7b62615d04f6f9 Mon Sep 17 00:00:00 2001 From: Yorhel Date: Sat, 31 Jul 2021 07:33:47 +0200 Subject: [PATCH] Ncdu 2 announcement + beta releases --- .gitignore | 1 + Makefile | 1 + dat/doc.md | 2 + dat/doc/ncdu2.md | 328 ++++++++++++++++++ dat/index.md | 5 + dat/ncdu.md | 31 +- mkchangelog.pl | 5 +- .../ncdu-2.0-beta1-linux-aarch64.tar.gz.asc | 16 + .../ncdu-2.0-beta1-linux-aarch64.tar.gz.md5 | 1 + .../ncdu-2.0-beta1-linux-aarch64.tar.gz.sha1 | 1 + ...ncdu-2.0-beta1-linux-aarch64.tar.gz.sha256 | 1 + .../ncdu-2.0-beta1-linux-arm.tar.gz.asc | 16 + .../ncdu-2.0-beta1-linux-arm.tar.gz.md5 | 1 + .../ncdu-2.0-beta1-linux-arm.tar.gz.sha1 | 1 + .../ncdu-2.0-beta1-linux-arm.tar.gz.sha256 | 1 + .../ncdu-2.0-beta1-linux-i386.tar.gz.asc | 16 + .../ncdu-2.0-beta1-linux-i386.tar.gz.md5 | 1 + .../ncdu-2.0-beta1-linux-i386.tar.gz.sha1 | 1 + .../ncdu-2.0-beta1-linux-i386.tar.gz.sha256 | 1 + .../ncdu-2.0-beta1-linux-x86_64.tar.gz.asc | 16 + .../ncdu-2.0-beta1-linux-x86_64.tar.gz.md5 | 1 + .../ncdu-2.0-beta1-linux-x86_64.tar.gz.sha1 | 1 + .../ncdu-2.0-beta1-linux-x86_64.tar.gz.sha256 | 1 + pub/download/ncdu-2.0-beta1.tar.gz.asc | 16 + pub/download/ncdu-2.0-beta1.tar.gz.md5 | 1 + pub/download/ncdu-2.0-beta1.tar.gz.sha1 | 1 + pub/download/ncdu-2.0-beta1.tar.gz.sha256 | 1 + .../ncdu-2.0-beta2-linux-aarch64.tar.gz.asc | 16 + .../ncdu-2.0-beta2-linux-aarch64.tar.gz.md5 | 1 + .../ncdu-2.0-beta2-linux-aarch64.tar.gz.sha1 | 1 + ...ncdu-2.0-beta2-linux-aarch64.tar.gz.sha256 | 1 + .../ncdu-2.0-beta2-linux-arm.tar.gz.asc | 16 + .../ncdu-2.0-beta2-linux-arm.tar.gz.md5 | 1 + .../ncdu-2.0-beta2-linux-arm.tar.gz.sha1 | 1 + .../ncdu-2.0-beta2-linux-arm.tar.gz.sha256 | 1 + .../ncdu-2.0-beta2-linux-i386.tar.gz.asc | 16 + .../ncdu-2.0-beta2-linux-i386.tar.gz.md5 | 1 + .../ncdu-2.0-beta2-linux-i386.tar.gz.sha1 | 1 + .../ncdu-2.0-beta2-linux-i386.tar.gz.sha256 | 1 + .../ncdu-2.0-beta2-linux-x86_64.tar.gz.asc | 16 + .../ncdu-2.0-beta2-linux-x86_64.tar.gz.md5 | 1 + .../ncdu-2.0-beta2-linux-x86_64.tar.gz.sha1 | 1 + .../ncdu-2.0-beta2-linux-x86_64.tar.gz.sha256 | 1 + pub/download/ncdu-2.0-beta2.tar.gz.asc | 16 + pub/download/ncdu-2.0-beta2.tar.gz.md5 | 1 + pub/download/ncdu-2.0-beta2.tar.gz.sha1 | 1 + pub/download/ncdu-2.0-beta2.tar.gz.sha256 | 1 + pub/img/ncdu2-shared.png | Bin 0 -> 23494 bytes pub/img/ncdu2-unique.png | Bin 0 -> 22137 bytes pub/img/ncdu2.png | Bin 0 -> 6971 bytes pub/style.css | 5 +- 51 files changed, 553 insertions(+), 15 deletions(-) create mode 100644 dat/doc/ncdu2.md create mode 100644 pub/download/ncdu-2.0-beta1-linux-aarch64.tar.gz.asc create mode 100644 pub/download/ncdu-2.0-beta1-linux-aarch64.tar.gz.md5 create mode 100644 pub/download/ncdu-2.0-beta1-linux-aarch64.tar.gz.sha1 create mode 100644 pub/download/ncdu-2.0-beta1-linux-aarch64.tar.gz.sha256 create mode 100644 pub/download/ncdu-2.0-beta1-linux-arm.tar.gz.asc create mode 100644 pub/download/ncdu-2.0-beta1-linux-arm.tar.gz.md5 create mode 100644 pub/download/ncdu-2.0-beta1-linux-arm.tar.gz.sha1 create mode 100644 pub/download/ncdu-2.0-beta1-linux-arm.tar.gz.sha256 create mode 100644 pub/download/ncdu-2.0-beta1-linux-i386.tar.gz.asc create mode 100644 pub/download/ncdu-2.0-beta1-linux-i386.tar.gz.md5 create mode 100644 pub/download/ncdu-2.0-beta1-linux-i386.tar.gz.sha1 create mode 100644 pub/download/ncdu-2.0-beta1-linux-i386.tar.gz.sha256 create mode 100644 pub/download/ncdu-2.0-beta1-linux-x86_64.tar.gz.asc create mode 100644 pub/download/ncdu-2.0-beta1-linux-x86_64.tar.gz.md5 create mode 100644 pub/download/ncdu-2.0-beta1-linux-x86_64.tar.gz.sha1 create mode 100644 pub/download/ncdu-2.0-beta1-linux-x86_64.tar.gz.sha256 create mode 100644 pub/download/ncdu-2.0-beta1.tar.gz.asc create mode 100644 pub/download/ncdu-2.0-beta1.tar.gz.md5 create mode 100644 pub/download/ncdu-2.0-beta1.tar.gz.sha1 create mode 100644 pub/download/ncdu-2.0-beta1.tar.gz.sha256 create mode 100644 pub/download/ncdu-2.0-beta2-linux-aarch64.tar.gz.asc create mode 100644 pub/download/ncdu-2.0-beta2-linux-aarch64.tar.gz.md5 create mode 100644 pub/download/ncdu-2.0-beta2-linux-aarch64.tar.gz.sha1 create mode 100644 pub/download/ncdu-2.0-beta2-linux-aarch64.tar.gz.sha256 create mode 100644 pub/download/ncdu-2.0-beta2-linux-arm.tar.gz.asc create mode 100644 pub/download/ncdu-2.0-beta2-linux-arm.tar.gz.md5 create mode 100644 pub/download/ncdu-2.0-beta2-linux-arm.tar.gz.sha1 create mode 100644 pub/download/ncdu-2.0-beta2-linux-arm.tar.gz.sha256 create mode 100644 pub/download/ncdu-2.0-beta2-linux-i386.tar.gz.asc create mode 100644 pub/download/ncdu-2.0-beta2-linux-i386.tar.gz.md5 create mode 100644 pub/download/ncdu-2.0-beta2-linux-i386.tar.gz.sha1 create mode 100644 pub/download/ncdu-2.0-beta2-linux-i386.tar.gz.sha256 create mode 100644 pub/download/ncdu-2.0-beta2-linux-x86_64.tar.gz.asc create mode 100644 pub/download/ncdu-2.0-beta2-linux-x86_64.tar.gz.md5 create mode 100644 pub/download/ncdu-2.0-beta2-linux-x86_64.tar.gz.sha1 create mode 100644 pub/download/ncdu-2.0-beta2-linux-x86_64.tar.gz.sha256 create mode 100644 pub/download/ncdu-2.0-beta2.tar.gz.asc create mode 100644 pub/download/ncdu-2.0-beta2.tar.gz.md5 create mode 100644 pub/download/ncdu-2.0-beta2.tar.gz.sha1 create mode 100644 pub/download/ncdu-2.0-beta2.tar.gz.sha256 create mode 100644 pub/img/ncdu2-shared.png create mode 100644 pub/img/ncdu2-unique.png create mode 100644 pub/img/ncdu2.png diff --git a/.gitignore b/.gitignore index 542e5f9..d30bbee 100644 --- a/.gitignore +++ b/.gitignore @@ -47,6 +47,7 @@ pub/doc/commvis.html pub/doc/dcstats.html pub/doc/easyipc.html pub/doc/funcweb.html +pub/doc/ncdu2.html pub/doc/pwlookup.html pub/doc/sqlaccess.html pub/doc/sqlobject.html diff --git a/Makefile b/Makefile index ca59a6d..1b07df8 100644 --- a/Makefile +++ b/Makefile @@ -20,6 +20,7 @@ PAGES=\ "doc/dcstats.md"\ "doc/easyipc.md"\ "doc/funcweb.md"\ + "doc/ncdu2.md"\ "doc/pwlookup.md"\ "doc/sqlaccess.md"\ "doc/sqlobject.md"\ diff --git a/dat/doc.md b/dat/doc.md index bbce18f..c9fa68e 100644 --- a/dat/doc.md +++ b/dat/doc.md @@ -6,6 +6,8 @@ rare occasions are published on this page. ## Articles That May As Well Be Considered Blog Posts +`2021-07-22` - [Ncdu 2: Less hungry and more Ziggy](/doc/ncdu2) + `2019-08-13` - [From SQL to Nested Data Structures](/doc/sqlobject) : How to easily fetch complex nested data structures from a normalized relational database. diff --git a/dat/doc/ncdu2.md b/dat/doc/ncdu2.md new file mode 100644 index 0000000..3165841 --- /dev/null +++ b/dat/doc/ncdu2.md @@ -0,0 +1,328 @@ +% Ncdu 2: Less hungry and more Ziggy + +(Published on **2021-07-22**) + +![Worst logo ever](/img/ncdu2.png){.right} + +[Ncdu (NCurses Disk Usage)](https://dev.yorhel.nl/ncdu) is a terminal-based +disk usage analyzer for Linux and other POSIX-y systems, (formerly) written in +C and available in the package repositories of most distributions. + +Over the past months I have been working on a complete rewrite of ncdu and just +released 2.0-beta1. Ncdu 2 is a full replacement of ncdu 1.x, keeping all the +same features, the same UI, keybindings and command-line flags, all to make it +a proper drop-in replacement. There is, after all, nothing more annoying than +having to get re-acquainted with every piece of software you've installed every +time you decide to update. + + +# Why rewrite, then? + +Of course, there wouldn't really be a point in rewriting ncdu if the new +version doesn't improve at least *something*. This rewrite is, in fact, the +result of me agonizing for a long time about several major shortcoming of ncdu +1.x: + +1. It has always been a bit of a memory hog. Part of this is inherent to what + it does: analyzing a full directory tree and making it smoothly browsable + requires keeping track of every node in that tree, and with large + directories containing millions of files... yeah, that'll require some + memory. I had, of course, already implemented all the low-hanging fruit to + ensure that ncdu wasn't *overly* inefficient with memory, but there was + certainly room for improvements. +2. Ncdu 1.x does not handle hard link counting very efficiently and can in some + (fortunately rare) cases [get stuck in an `O(n²)` + loop](https://code.blicky.net/yorhel/ncdu/issues/121). This one is + particularly nasty to fix without increasing memory use. +3. Another hard link-related problem: hard links are counted only once in a + directory's cumulative size, as is consistent with what most other + hard link-supporting disk usage analyzers do. This is useful, since a file + that has been "duplicated" by means of hard links only really occurs on disk + once, the file's data is not actually duplicated. But at the same time this + feature can be misleading: deleting a directory does not necessarily reclaim + as much disk space as was indicated by ncdu, since it's possible for + hard links *outside* of that directory to point to the same file data, and + hence for that data to remain on disk. I've had a good idea on how to better + present such scenarios, but an efficient implementation always eluded me. + +None of the above issues are easy, or even possible, to solve within the data +model of ncdu 1.x, so major changes to the core data model were necessary. +Since each and every aspect of ncdu - both the UI and all algorithms - are +strongly tied to the data model, this effectively comes down to a full rewrite. +It was during a hike through the local forests that I finally came to a +promising solution that addresses all three points. + + +# But first: an apology + +I'm sorry. I was anxious to try out that "promising solution" of mine and C +isn't the kind of language that makes quick prototyping very easy or +pleasurable. So I ended up prototyping with [Zig](https://ziglang.org/) instead +and it ended up being more than just a prototype. + +Zig is an excellent programming language and uniquely well suited for little +tools like ncdu, but it currently has a **major** flaw: It's not even close to +stable. There's no stable version of the language, the standard library nor of +the compiler, and each new release comes with major breakage left and right. It +also has a fair amount of (known) bugs and its portability story, while +impressive for the stage the language is in, is not yet on par with C. The +language is looking very promising and I have no doubt that Zig will eventually +reach the level of stability and portability to make it a good target for ncdu. +But, judging from an outsider's perspective, that's likely to take a few more +years. And that's okay, after all, every language needs time to mature. + +But what does that mean for ncdu? For regular users, probably not that much. I +provide static binaries for Linux as I've always done, so you can just grab +those and run the fancy new ncdu as usual. If you want to compile from source, +you only need to grab the right Zig version and run `zig build`. Assuming you +don't run into bugs, that is, but for the most part things tend to work just +fine out of the box. For distributions, the Zig situation is rather more +problematic, primarily because the version of ncdu is now strongly tied to the +version of Zig, which in turn means that distributions are unable to upgrade +these packages independently from each other. If they package Zig 0.8, then +they may also have to package a version of ncdu that can be compiled with Zig +0.8. If they want to upgrade to a newer version of Zig, they may not be able +to do so without waiting for me to release a new version that works with that +particular Zig, or maintain their own local patches for ncdu. The alternative +is that distributions will have to support multiple versions of Zig at the same +time, but few have the time and infrastructure to do that. Either solution is +messy, and for that I apologize. + +Considering the above, I will continue to maintain the C version of ncdu for as +long as there are people who use it. *Maintenance* meaning pretty much what +I've been doing for the past few years: not particularly active in terms of +development, just occasional improvements and fixes here and there. I may also +backport some additions from future 2.x versions back into the C version, +especially with regards to visible interfaces (CLI flags, keybindings, UI, +etc), to dampen the inevitable agony that arises when switching between systems +that happen to have different versions installed, but features that seem like a +pain to implement in the 1.x codebase will likely remain exclusive to the Zig +version. + +As long as there is no stable version of Zig yet, I will *try* to keep ncdu 2.x +current with the Zig version that [most distributions have packages +for](https://repology.org/project/zig/versions), which in practice generally +means the latest tagged release. + + + +On the upside, ncdu 2.0 only requires the Zig compiler (plus the standard +library that comes with it) and ncurses. There's no other external dependencies +and none of that vendoring, bundling and insane package management stuff that +haunts projects written in other fancy new languages.[^1] + + +# Less hungry + +Ncdu 2 uses less than half the memory in common scenarios, but may in some +cases use *more* memory if there are a lot of hard links. Quick comparison +against a few real-world directories: + +| Test | #files | ncdu 1.16 | ncdu 2.0-beta1 | +|:----------------|-------:|----------:|---------------:| +| -x / | 3,8 M | 429 M | _162 M_| +| -ex / | ~ | 501 M | _230 M_| +| backup dir | 38.9 M | 3,969 M | _1,686 M_| +| backup dir -e | ~ | 4,985 M | _2,370 M_| +| many hard links | 1.3 M | _155 M_| 194 M | + +I have to put a disclaimer here that both my desktop's root filesystem and my +backups play into the strengths of ncdu 2.0: relatively many files per +directory and, with ~10 bytes on average, fairly short file names. Nonetheless, +you should still see significant improvements if your directory tree follows a +different distribution. The big exception here is when you have a lot of +hard links. The "many hard links" directory I tested above represents a +hard link-based incremental backup of ~43k files, "duplicated" 30 times. + +The reason for these differences in memory use are clear when you look at how +many bytes are needed to represent each node in the tree: + +| | ncdu 1.16 | ncdu 2.0-beta1 | +|--------------|---------------------------|----------------| +| Regular file | 78 | 25 | +| Directory | 78 | 56 | +| Hardlink | 78 + 8 per unique dev+ino | 36 + 20 per ino\*directory combination | + +(These numbers assume 64-bit pointers and exclude storage for file names and +overhead from memory allocation and hash tables. Extended mode (-e) uses an +extra 18 bytes per node in both versions, and both versions use the same memory +allocation strategy for the file names.) + +While there is room for improvements in the hard link situation, the +performance issue in ncdu 1.x that I mentioned earlier isn't really fixable +without a memory increase. I've always been cautious with accepting an option +to disable hard link detection altogether as the results may not be very +useful, but maybe I'll reconsider that for a future release. A directory that +can't be analyzed at all because you've ran out of memory isn't very useful, +either. + +Another difference that is worth mentioning: when refreshing a directory from +within the browser, ncdu 1.x will allocate a fresh structure for the new tree +and then, after the scan is complete, free the old structure. This may cause +ncdu 1.x to temporarily use twice as much memory if you refresh the top-most +directory. Ncdu 2.0 instead does an in-place update of the existing in-memory +tree and thereby avoids this duplication. On the other hand, ncdu 2.0 is +(currently) unable to re-use tree nodes that have been renamed or deleted, so +frequently refreshing a directory that has many renames or deletions will +increase memory use over time. I don't think this is a very common scenario, +but should it become a problem, it *can* be fixed. + + +# Shared links + +As I mentioned in the introduction, counting hard links can be very confusing +because they cause data to be shared between directories. So rather than try +and display a directory's cumulative size a single number, these cases are +better represented by a separate column. Here's what that looks like in ncdu +2.0: + +Amount of data shared between directories in `/usr`: + +![](/img/ncdu2-shared.png) + +And the amount of unique data in each incremental backup[^2]: + +![](/img/ncdu2-unique.png) + +To my knowledge, no other disk usage analyzer has this feature (but please do +correct me if I'm wrong!) + +You can, for the time being, switch between the two views by pressing 'u'. But +if I keep assigning keys to each new feature I may be running out of available +keys rather soon, so maybe I'll reclaim that key before the stable 2.0 release +and implement a quick-configuration menu instead. + +This feature does come with a large disclaimer: the displayed shared/unique +sizes will be incorrect if the link count for a particular file changes during +a scan, or if a directory refresh or deletion causes the cached link counts to +change. The only way to get correct sizes when this happens is to quit ncdu and +start a new scan, refreshing from the browser isn't going to fix it. There is +currently no indicator or warning when this happens, that'll need to be fixed +before I do a stable release. + + +# Other changes + +There's a bunch of other changes in ncdu 2 that came naturally as part of the +rewrite. Some changes are good, others perhaps less so. + +The good: + +- Improved handling of Unicode filenames. It still doesn't handle Unicode + combining marks, but at least it can now recognize full-width characters and + it won't cut off filenames in the middle of a UTF-8 sequence. +- Improved performance when using `--exclude-kernfs` thanks to caching the + result of `statfs()` calls. I tried to measure it and only noticed a ~2% + improvement at best, but it's something. +- In the 'Links' tab in the info window for hard links, it is now possible to + jump directly to the selected path. +- The file browser now does a better job at remembering the position of the + selected item on your screen when switching directories. + +The ambiguous: + +- Ncdu 2.0 doesn't work well with non-UTF-8 locales anymore, but I don't expect + this to be a problem nowadays. It can still deal with non-UTF-8 filenames + just fine, but these will be escaped before output rather than directly + thrown at your terminal as ncdu 1.x does. +- The item information window organization is a little bit different. Just a + tiny little bit, I promise. +- Ncdu 2 now uses the `openat()` family of system calls to scan directories. + This is generally an improvement over the `chdir()` and `opendir()` approach + of ncdu 1.x, but does require a few more file descriptors (big deal) and is + less portable to ancient systems (would Zig even work on those?). + +The less good: + +- Opening the 'Links' tab in the info window for hard links now requires a scan + through the in-memory tree, so it's noticeably slower. To my surprise, + though, a full scan through a tree with 30+ million files takes less than a + second on my system, so in practice this probably isn't going to be a problem + (and who uses that 'Links' tab, anyway?). +- Refreshing a directory may leak memory (as discussed earlier). +- The browser UI is not visible anymore when refreshing or deleting a + directory. The problem is that the browser keeps cached information about + the opened directory, and this cache may be invalidated while the + refresh/deletion is running. This is also kind-of a problem in ncdu 1.x, but + it's less pronounced. There have been requests for allowing interactive + browsing while ncdu is still scanning, so this won't a problem if I ever get + around to implementing that, but it's not much of a priority on my end. + Updating the browser's cache on each UI draw is going to be too expensive, so + I'm not yet sure how to handle it. +- Lots of new bugs, no doubt. + + +# Next steps + +[Grab yourself an ncdu-2.0-beta1](/ncdu) and test! The source code is available +in the ['zig' branch in the +repository](https://code.blicky.net/yorhel/ncdu/src/branch/zig). + +My first priority is to get 2.0 ready for a "stable" release, which means it +needs to get some serious testing in the wild to evaluate how well it works and +to flesh out the inevitable bugs. It's still a bit unclear to me if it even +makes sense to release a stable version when the foundation it's built on is +inherently unstable, but let's just see how things go. + +On the slightly longer term, the rewrite to Zig opened up the possibility for a +few more features that I've been wanting to see for a while, but that seemed +tricky to implement in 1.x. + +- Multithreaded scanning. This will be useless for old fashioned rotating + hard drives, but for SSDs and especially NVMe, scanning performance can be + greatly improved by distributing the work across multiple threads. While + rewriting the code I came up with a promising idea on how to implement this, + so I'd love to experiment with that in future versions (io\_uring is also an + interesting target, but potentially even more complex). +- Faster `--exclude-pattern` matching. Honestly, this feature is currently so + slow in both versions that I'm surprised nobody has ever complained about it + (not to me, in any case). It's possible to slow ncdu's scanning performance + down to a crawl with just a few patterns, a more clever matching + implementation could provide major improvements. +- Exporting an in-memory tree to a file. Ncdu already has export/import + options, but exporting requires a separate command invocation - it's not + currently possible to write an export while you're in the directory browser. + The new data model *could* support this feature, but I'm still unsure how to + make it available in the UI. +- Transparent export compression. The export function dumps uncompressed JSON + data and is designed to be piped through `gzip` or similar commands. While + this is documented in the manual page, I still see many people writing the + export to disk without any sort of compression. That's a pretty big waste of + space, so it would be nice if ncdu could transparently run the exported data + through external (de)compression tools to make this easier and more + discoverable. + +These features are in addition to a long list of other possible improvements +that I've been meaning to work on for the past decade, so don't expect too +much. :) + + + + + +[^1]: That's not to say Zig is immune to the problem of projects using hundreds + of tiny little dependencies, but that development style isn't strongly + encouraged in its current state: the standard library already covers a lot of + ground, package management solutions are still being worked on and it's easy + enough to just use existing C libraries instead. +[^2]: I would absolutely *love* for directory-level reports like these to be + available for other forms of data sharing, such as reflinks or btrfs/ZFS + snapshots. But alas, I doubt I'll ever be able to implement that in ncdu. + Even if I could somehow grab and untangle the underlying data, keeping track + of every block in a large filesystem is no doubt going to be very costly in + both CPU and memory. I did write a [little tool](/dump/btrfssize) some time + ago to generate such reports for quota-enabled btrfs subvolumes, but I ended + up disabling the quota feature later on because even that is pretty costly. + There's also [btdu](https://github.com/CyberShadow/btdu), which takes a very + interesting approach to analyze btrfs filesystems. diff --git a/dat/index.md b/dat/index.md index 079a3eb..829e069 100644 --- a/dat/index.md +++ b/dat/index.md @@ -20,6 +20,11 @@ the incidental article on this site. Enjoy your stay! ## Announcements Atom feed +`2021-07-22` - ncdu 2.0-beta1 released +: This marks the initial beta version of a complete rewrite of ncdu, written + in Zig. This version significantly reduces memory usage and improves hard + link counting. [Full release announcement](/doc/ncdu2) - [Ncdu homepage](/ncdu). + `2021-07-02` - ncdu 1.16 released : A minor feature & bugfix release. This adds dynamic sizing of the file size bar, an `$NCDU_LEVEL` environment variable when spawning a subshell, more diff --git a/dat/ncdu.md b/dat/ncdu.md index e1c6b68..c331fa9 100644 --- a/dat/ncdu.md +++ b/dat/ncdu.md @@ -8,30 +8,39 @@ POSIX-like environment with ncurses installed. ## Download -Latest version +C version (stable) : 1.16 ([ncdu-1.16.tar.gz](/download/ncdu-1.16.tar.gz) - [changes](/ncdu/changes)) I also have convenient static binaries for Linux [i486](/download/ncdu-linux-i486-1.16.tar.gz), [x86_64](/download/ncdu-linux-x86_64-1.16.tar.gz), [ARM](/download/ncdu-linux-arm-1.16.tar.gz) and - [AArch64](/download/ncdu-linux-aarch64-1.16.tar.gz). Download, extract - and run; no compilation or installation necessary (uses + [AArch64](/download/ncdu-linux-aarch64-1.16.tar.gz). + Download, extract and run; no compilation or installation necessary (uses [musl](http://www.musl-libc.org/)). -Project status -: *Maintenance mode*: I consider ncdu to be mostly complete. I'm still here - to keep it alive and to fix issues as they come along, but I don't actively - work on adding new features. Bug reports are still very welcome. Feature - requests are welcome too, but don't expect much from that. Patches and pull - requests for new features will likely end up getting ignored. +Zig version (beta) +: 2.0-beta2 ([ncdu-2.0-beta2.tar.gz](/download/ncdu-2.0-beta2.tar.gz) - [changes](/ncdu/changes) - requires Zig 0.8) + + See the [release announcement](/doc/ncdu2) for information about the + differences with the C version. + + Static binaries for Linux: + [i486](/download/ncdu-2.0-beta2-linux-i386.tar.gz), + [x86_64](/download/ncdu-2.0-beta2-linux-x86_64.tar.gz), + [ARM](/download/ncdu-2.0-beta2-linux-arm.tar.gz) and + [AArch64](/download/ncdu-2.0-beta2-linux-aarch64.tar.gz). Development version : The most recent code is available on a git repository and can be cloned with `git clone git://g.blicky.net/ncdu.git/`. The repository is also - available for [online browsing](https://g.blicky.net/ncdu.git/). + available for [online browsing](https://code.blicky.net/yorhel/ncdu/) (and + [through cgit](https://g.blicky.net/ncdu.git/) if you prefer that). The + master branch represents the C version, the Zig version can be found in the + 'zig' branch. -Ncdu is entirely written in C and available under a liberal MIT license. +License +: MIT. ## Packages and ports diff --git a/mkchangelog.pl b/mkchangelog.pl index 2ec4666..303ffde 100755 --- a/mkchangelog.pl +++ b/mkchangelog.pl @@ -6,8 +6,9 @@ $title = shift; print "---\ntitle: $title\npage-type: changelog\n...\n"; -for (split /\n\n/, join '', <>) { - s/^([0-9]+\.[0-9]+(?:\.[0-9]+)?)\s+-\s+([0-9]{4}-[0-9]{2}-[0-9]{2})//; +for (split /\n\n/, join '', grep !/^#/, <>) { + s/^\s*//; + s/^([^\s]+)\s+-\s+([0-9]{4}-[0-9]{2}-[0-9]{2})//; print "\n- **$1** - $2"; $dl = "$project-$1.tar.gz"; $dl = "$project-linux-amd64-$1.tar.gz" if !-f "pub/download/$dl"; diff --git a/pub/download/ncdu-2.0-beta1-linux-aarch64.tar.gz.asc b/pub/download/ncdu-2.0-beta1-linux-aarch64.tar.gz.asc new file mode 100644 index 0000000..f366190 --- /dev/null +++ b/pub/download/ncdu-2.0-beta1-linux-aarch64.tar.gz.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIzBAABCgAdFiEEdEYNMrgIEOupr6LpYjlMaYwnOfoFAmD5gt4ACgkQYjlMaYwn +OfoY7Q//RvFpKtGtO+dNKJIrimYbJ3sGgxd/L+Io3yCf6wWUZhGqJl9ob6Lf0bCS +yvAUNrDRAVT+N5R+NuetWKgwzEHUQ7Mh/sfBfTChQFGBKFcbFX7SwO6Iyx9hPojE +DGj8cWbyDozquZo/TwfGUw9bAoavnDBdHiIFAdP8Rvc3Ek9C/rBEpwEx7X1mYRSG +ZW4C3lHcMzpi64sgT1wTVFot6YJL693ISzsyAyx+z5NE5nmhvPbjjsfFntdGo5TW +1w6WBlckaPIi3pqAdwYjjcGakHCRD/4RVcrBzpvxD7tbfEyr7C6648/WuvLTuyyS +HPxkS0yd1tACOEpx/Rcrhbz1MHt3LWW9til294puS2t6097As1Tv1Q8ii6ToHksv +dMlz7E/N3d2dQLSbpvpAJcRVQtDyVbfc8HqgRWS24Z0i8a7ShZY7rz06vloFc83G +nDxkgpe1poNJAaCaWHafOHXHDv5bFdE0n09LQETqo1dXY23swz/LGNxfww15+I4G +DDUugdJ6bvAWg4EJWOiPf9hdjDeD1J2GxavJ/cWWJco1kTCSlmWgl+VtP9JlDWnU +3sUhsaKJVZVI7CC2OiKQ1RRIs58RoJfYylEOnZRib90HwLVC45eq9ggjR/msHgF/ +jWnjltLlA9JwPtWkjmDocg7BwqWYL9lzdXyKeWT50PVLp0SRzPw= +=PUU6 +-----END PGP SIGNATURE----- diff --git a/pub/download/ncdu-2.0-beta1-linux-aarch64.tar.gz.md5 b/pub/download/ncdu-2.0-beta1-linux-aarch64.tar.gz.md5 new file mode 100644 index 0000000..b6356bb --- /dev/null +++ b/pub/download/ncdu-2.0-beta1-linux-aarch64.tar.gz.md5 @@ -0,0 +1 @@ +fee2e87457fb9a9ee8ea90c1aba990e1 ncdu-2.0-beta1-linux-aarch64.tar.gz diff --git a/pub/download/ncdu-2.0-beta1-linux-aarch64.tar.gz.sha1 b/pub/download/ncdu-2.0-beta1-linux-aarch64.tar.gz.sha1 new file mode 100644 index 0000000..fe681c1 --- /dev/null +++ b/pub/download/ncdu-2.0-beta1-linux-aarch64.tar.gz.sha1 @@ -0,0 +1 @@ +1b1e360151a4fa33e6fc460fe4fe94f4d6aad2d4 ncdu-2.0-beta1-linux-aarch64.tar.gz diff --git a/pub/download/ncdu-2.0-beta1-linux-aarch64.tar.gz.sha256 b/pub/download/ncdu-2.0-beta1-linux-aarch64.tar.gz.sha256 new file mode 100644 index 0000000..d25dab4 --- /dev/null +++ b/pub/download/ncdu-2.0-beta1-linux-aarch64.tar.gz.sha256 @@ -0,0 +1 @@ +8e545c77a74d420d473dd308a5562e634c11d1b8bf84fe6f9aa1ee3739e95989 ncdu-2.0-beta1-linux-aarch64.tar.gz diff --git a/pub/download/ncdu-2.0-beta1-linux-arm.tar.gz.asc b/pub/download/ncdu-2.0-beta1-linux-arm.tar.gz.asc new file mode 100644 index 0000000..9cf3237 --- /dev/null +++ b/pub/download/ncdu-2.0-beta1-linux-arm.tar.gz.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIzBAABCgAdFiEEdEYNMrgIEOupr6LpYjlMaYwnOfoFAmD5guYACgkQYjlMaYwn +OfoxaBAAkkJQjgcIPspXQjolqcro5UJyE3Hl3MuTqRtaR169DLgkIg0Ai8ueXLzv +8CE8UagozzfOhVcGQvqWJdJQ5/Dw6dfL9AIWwyBhmD9RVDm79RbdR9JBZ4bWuUBS +kthGr09MVSJLqYKWLGDi/85VgcmpuVxNhfn8lcNzWd4tJlFBd29mnusFX/BfkQCD +BZwPxNAaqtNzml2gSbCqnjB++aDGHkJsPgNEUaUmOGOLnOFQYHOhk1SgGNQ7Vqo1 +mNBBnYF5s3dNgNLe5yLxDuQ5dUfMTjpM0HwYBoh50sTUf/XlLVu4o2EVAKB3LuCx +nXqtX/HrCdxLxgTPSkW373d1Sr8sNLxWxFqXpXIIeYyGJwz46yDeKVhZwCA6XSXw +tiA+smmEacKENHhC40ECFmaZut7QxBIg4/zNCHWF96w1sI6tQV2Y8lsDBW9G7oNb +gXTqNx7NMBgs5IpZzVfy2TYTgxduQ1xOo33gESZW1nkVGvslQNAmxoiuvkU/EaxJ +XLWDi34gCxQOk1VAjjjxRccVY2UdAdO7/rppUsmvB+nlOuwpqanPjOgNbA/fmcMB +HR5vJnI1kp57AULfGULqJMn0nn4op4EChTNNocvUXJKQ4tK6ItpPssyegJGxpkUv +NLADNnXlHsgM83D8T6hZAvTcVNv73s4g1E9etCWgNu3bn1jWc2o= +=sIdP +-----END PGP SIGNATURE----- diff --git a/pub/download/ncdu-2.0-beta1-linux-arm.tar.gz.md5 b/pub/download/ncdu-2.0-beta1-linux-arm.tar.gz.md5 new file mode 100644 index 0000000..91c5ee7 --- /dev/null +++ b/pub/download/ncdu-2.0-beta1-linux-arm.tar.gz.md5 @@ -0,0 +1 @@ +15f7bccc12aa5e345ffe320d9d3599fa ncdu-2.0-beta1-linux-arm.tar.gz diff --git a/pub/download/ncdu-2.0-beta1-linux-arm.tar.gz.sha1 b/pub/download/ncdu-2.0-beta1-linux-arm.tar.gz.sha1 new file mode 100644 index 0000000..bfd66de --- /dev/null +++ b/pub/download/ncdu-2.0-beta1-linux-arm.tar.gz.sha1 @@ -0,0 +1 @@ +8878062bcb1468ffd5f203c022a9493204192c15 ncdu-2.0-beta1-linux-arm.tar.gz diff --git a/pub/download/ncdu-2.0-beta1-linux-arm.tar.gz.sha256 b/pub/download/ncdu-2.0-beta1-linux-arm.tar.gz.sha256 new file mode 100644 index 0000000..f7d1589 --- /dev/null +++ b/pub/download/ncdu-2.0-beta1-linux-arm.tar.gz.sha256 @@ -0,0 +1 @@ +d7c95dc8f3abbc4c0070fc30d5b5d55c942a4f6823c077729423083bd7c596d1 ncdu-2.0-beta1-linux-arm.tar.gz diff --git a/pub/download/ncdu-2.0-beta1-linux-i386.tar.gz.asc b/pub/download/ncdu-2.0-beta1-linux-i386.tar.gz.asc new file mode 100644 index 0000000..b58690b --- /dev/null +++ b/pub/download/ncdu-2.0-beta1-linux-i386.tar.gz.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIzBAABCgAdFiEEdEYNMrgIEOupr6LpYjlMaYwnOfoFAmD5guoACgkQYjlMaYwn +Ofokfw//Z0FKIUpBYVAoGQGByyYJOTG2/w/nCfKXvmiFs5NfTjR0RoFf7ZJgD8ul +lOgN20bUIvBWXSoIN83f5aRSS1kFa7gDiVxI5nwgo7pKB0sjdvVVVst/0mqojx+t +sOFjphh17W4u83GlByeQWoU9qGRmi2nRahRB/bKgwLBzaZWclmWr+Bx89dB1RDEu +Tev+E9mgCixo1pEebwx0pc1q+LXCLuehgL4bcZrVVwFX1GR9d7PtJ+WUPzek63nb +bqqySZ/oND/8WHpUzULrAoPb5Jyxq9RvJ5yBxUdZANyWeu53+yBfMVZlqCLrZYvB +VmGIjL71Etq+0qteLyaqhrcGVjS9Al8bvG6yxMDs2wFtEZpFYekFY3Eab0cBj7qR +PaT4Y+JeWMK7Od5E8SlzBfpZeSSya3thzgqkV9gNVjUpiIJqVFak3sO57Dt0DKpp +/F4//8o2Ez7CiYxMqxPk5nnDknZiB39r4lxI4ZVIHajXfGOXqTJUojOAPQdO12a4 +JK7n+CkkuQ4EYmlabaMFY9f9Typ0QJP6dqexRiNyKiNrLlObPyKYvC1XGN+6ufC9 +x/HT2xwAdSvEUT57FASoIQMtGBTcBJjoC5xkBh3jNG+EjNdRi5zwNp42xvMoUj7q +D/dsr4xxMBCyAwaHTLn8w3R0wV5ac506xSn4mdA8AMCVHSl40ac= +=GA66 +-----END PGP SIGNATURE----- diff --git a/pub/download/ncdu-2.0-beta1-linux-i386.tar.gz.md5 b/pub/download/ncdu-2.0-beta1-linux-i386.tar.gz.md5 new file mode 100644 index 0000000..571ee66 --- /dev/null +++ b/pub/download/ncdu-2.0-beta1-linux-i386.tar.gz.md5 @@ -0,0 +1 @@ +ca34002ffb7d4651cd7f55cb84f430cf ncdu-2.0-beta1-linux-i386.tar.gz diff --git a/pub/download/ncdu-2.0-beta1-linux-i386.tar.gz.sha1 b/pub/download/ncdu-2.0-beta1-linux-i386.tar.gz.sha1 new file mode 100644 index 0000000..51bf8c8 --- /dev/null +++ b/pub/download/ncdu-2.0-beta1-linux-i386.tar.gz.sha1 @@ -0,0 +1 @@ +6860b98cf1039e72cd6990c24301db39a983238e ncdu-2.0-beta1-linux-i386.tar.gz diff --git a/pub/download/ncdu-2.0-beta1-linux-i386.tar.gz.sha256 b/pub/download/ncdu-2.0-beta1-linux-i386.tar.gz.sha256 new file mode 100644 index 0000000..803efa6 --- /dev/null +++ b/pub/download/ncdu-2.0-beta1-linux-i386.tar.gz.sha256 @@ -0,0 +1 @@ +a225e51bc8c841941d912083706ac005c4761aaa7394a6b5a2f8809cc946565f ncdu-2.0-beta1-linux-i386.tar.gz diff --git a/pub/download/ncdu-2.0-beta1-linux-x86_64.tar.gz.asc b/pub/download/ncdu-2.0-beta1-linux-x86_64.tar.gz.asc new file mode 100644 index 0000000..2cdc0fa --- /dev/null +++ b/pub/download/ncdu-2.0-beta1-linux-x86_64.tar.gz.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIzBAABCgAdFiEEdEYNMrgIEOupr6LpYjlMaYwnOfoFAmD5gu8ACgkQYjlMaYwn +Ofpakg//TZ0qcLf79SqrCpyr4LeiEJehFeNvs1/ywuZKV7LIhEocn9DhDVEIVKhi +0K2mRq5QS+t7T+B3UJgLuHoGSXK7y132y8/Ae21ktVtcTqVqTE58blmNNbWXMUp4 +9z2qAnHFgi7NeppNwuDRQQOipFPHVkeM+t5CdbP7XNOvNXinEP5+ffr4J09Cvj6L +KXbAlGfRHzlGz+FYI5k62r+mmcAOkVghDDVO3BdSutuWYLrF6OgBwDpAAsPVYfU4 +rC3+11XZbHWDHp9zXJuKy7l6kfjFOIVmo9kMr9BtBvOWAUA0yDq63nlAB4e4AMji +WZV1rMPIMbIuhrFeE70r6pKQSC4P8O1fRkG2izafqcCzjt7rJYIQrmp2ktB6Cilw +fdjBhI/qqTacOdnSDycHdtgFQ300IuBnW2C3C+m9QWJXL4im4dP8AQ6VqDBa9vAP +j3DY3wuS1+PSFy1g4GabQuTBZ96XENeX+wWng3Mey+JM/X4NSkIDUU1S6n11JhzN +0qMSW/wC90nZ4S9FtVLXcmEMFjxuKZpZs2JDwypHKQz9J4zq4RillxnAqA01vFDe +dAFFloOWlEIE8wd9nouzbiZjUxvL5oOWGyVXJifWDpK/NTPUgTjZ0hzfSft3veDG +CV8BThliCwMkyMn/UVbihQAl7AgLQxZP/IFUSDxwtUwiD4TIsvs= +=RC4q +-----END PGP SIGNATURE----- diff --git a/pub/download/ncdu-2.0-beta1-linux-x86_64.tar.gz.md5 b/pub/download/ncdu-2.0-beta1-linux-x86_64.tar.gz.md5 new file mode 100644 index 0000000..6b5d754 --- /dev/null +++ b/pub/download/ncdu-2.0-beta1-linux-x86_64.tar.gz.md5 @@ -0,0 +1 @@ +324d9050279910bf02809fdec39e54af ncdu-2.0-beta1-linux-x86_64.tar.gz diff --git a/pub/download/ncdu-2.0-beta1-linux-x86_64.tar.gz.sha1 b/pub/download/ncdu-2.0-beta1-linux-x86_64.tar.gz.sha1 new file mode 100644 index 0000000..c55c829 --- /dev/null +++ b/pub/download/ncdu-2.0-beta1-linux-x86_64.tar.gz.sha1 @@ -0,0 +1 @@ +281227064163e4850111d08145ffd572ef907db3 ncdu-2.0-beta1-linux-x86_64.tar.gz diff --git a/pub/download/ncdu-2.0-beta1-linux-x86_64.tar.gz.sha256 b/pub/download/ncdu-2.0-beta1-linux-x86_64.tar.gz.sha256 new file mode 100644 index 0000000..8008cda --- /dev/null +++ b/pub/download/ncdu-2.0-beta1-linux-x86_64.tar.gz.sha256 @@ -0,0 +1 @@ +314b672d1a13924ef76f018a7682437320124cc2c2bbebfe956f69cc0ed02f32 ncdu-2.0-beta1-linux-x86_64.tar.gz diff --git a/pub/download/ncdu-2.0-beta1.tar.gz.asc b/pub/download/ncdu-2.0-beta1.tar.gz.asc new file mode 100644 index 0000000..1463852 --- /dev/null +++ b/pub/download/ncdu-2.0-beta1.tar.gz.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIzBAABCgAdFiEEdEYNMrgIEOupr6LpYjlMaYwnOfoFAmD5gvUACgkQYjlMaYwn +OfowDQ//cgl6+hjda6HEltMtlFxMlMNlDtYFqo579yALE6tzUc6x8YlXLCY9jN2t +tCShSXrKTMfmr+A4jp9okE0AFUQv3e4/SanOchav3SqAqys8JQFOzkD1tTfGXRWH +OdOkCCH8pqDWlmsRv4xQQvoG1+HEhkZgfmMosQZEINF35k9RZA8otN2Ljv0yj3Fd +t6Atmg0mjrQ7kyo5aEUUtEVtTRfycCCJaP3N17iSWC9ovw1sQlc9V4Lx3sbaxlwy +xtxXbESEscCbFhaK40LRYw8o/KRNmG6JdSeVXGU20wPSgtV2ZjUsFfPogYHOFM4n +fQaIZMkgqSUZh7I9/quFPafM4hx0RcqRM86Oy2JiePvg04dkcFiaf4Kv05eABpdd +O/PCaaLvmrg4aF3IFS32fV5g3rVcN/3bmNl5ZkjZ6sDljp/8ZBUFMghfggREVbu0 +gLgTSBatMY6kDpnvH3i4/NCymwxF9SuTbqr3VEq/lZD8EaqPAdJD4QlrWPIM5BdZ +pQcjoapfNjfNZ5Ay+jpAPJS3RARPlh2o7s24xOZBgEwmuyQzvriGuNfP7dYC6C+f +K48zccRiDKVAIc6aijNtiwC5ie/LQOxSm4TFVa6o/uoVNsmPltVAEOtaIlshmpBb +VjAH9MVZMdJws62JAwFiMtQ5SoZ9OraYcfozswV8Cc0fpzAPLzU= +=PUde +-----END PGP SIGNATURE----- diff --git a/pub/download/ncdu-2.0-beta1.tar.gz.md5 b/pub/download/ncdu-2.0-beta1.tar.gz.md5 new file mode 100644 index 0000000..c7e6790 --- /dev/null +++ b/pub/download/ncdu-2.0-beta1.tar.gz.md5 @@ -0,0 +1 @@ +6803d1b26d7c97f3d6092c6b9f99d10e ncdu-2.0-beta1.tar.gz diff --git a/pub/download/ncdu-2.0-beta1.tar.gz.sha1 b/pub/download/ncdu-2.0-beta1.tar.gz.sha1 new file mode 100644 index 0000000..ea38e1d --- /dev/null +++ b/pub/download/ncdu-2.0-beta1.tar.gz.sha1 @@ -0,0 +1 @@ +e788ea6cd0348f458284e54a2325ce35b12c63fe ncdu-2.0-beta1.tar.gz diff --git a/pub/download/ncdu-2.0-beta1.tar.gz.sha256 b/pub/download/ncdu-2.0-beta1.tar.gz.sha256 new file mode 100644 index 0000000..1a0debf --- /dev/null +++ b/pub/download/ncdu-2.0-beta1.tar.gz.sha256 @@ -0,0 +1 @@ +1d1430524c9a3e95dee55a55f2a55feec3bb7630ff1363c0515a9fff3a772901 ncdu-2.0-beta1.tar.gz diff --git a/pub/download/ncdu-2.0-beta2-linux-aarch64.tar.gz.asc b/pub/download/ncdu-2.0-beta2-linux-aarch64.tar.gz.asc new file mode 100644 index 0000000..28a5aad --- /dev/null +++ b/pub/download/ncdu-2.0-beta2-linux-aarch64.tar.gz.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIzBAABCgAdFiEEdEYNMrgIEOupr6LpYjlMaYwnOfoFAmEE3L4ACgkQYjlMaYwn +OfplIRAAlMQgcivVtE6A/isIgDCmtP2OGDcHpy4MMcNqBhWIVDW/SoLOkn3fnwYC +yObziQ8NouWt/E6NA34zoAH2rgmcQIaI46wfJCDbICSr9LWYCzsYsdEL7H5Cpbmn +e63/lKD+Ap+Q4t7aSOWIje/j6W+9ihw0NZ9bdEBK796/eF63myQcuMuSGNDaemho +gZ9bfgBu9Izhr6AH3retuQz5c8PfIut8m+z+OuSE3jxZJx+PlbZzx1gbBz5nIQKm +g7OZYB23aFiC1p6L8ZtzuzTZGNkW7jNe7s+4wqQwrytQdo6TxUCaX2JF87YYQZ4M +A9/8FiTzR8G5ifoXoK5Fn4Zl+Li+iTBPNTUcgpjvO1Cqv8CWGAdxjHh1rgkHuZtW +Q46g7IbvRuCQ6j02orQNmQgACsIxhB2Ke0kUmwVbSubJtGmg/QMI9NJTY2WYDg6d +BuatG2GAtZ68rYCt53/QXMWhljNIMnHYvO3RxFVfPsLYGyDMOeSXTE06I91i/5Sm +Q23wVgGSboQVEkuozA3H+1RMMxlNsmRHB/QV2loalMDDyaawxP7QWBYxRoSa94/a +60JqXM8g/v8/fPK1HY022g+AUQLi5/ote85tF5eMFd30141mn/HiZCBC1PediWQh +1dzsg3wXlGjqJSe/ZEwUxjVvNdEs/IIuABwYOpCf8+Z0PytRmNQ= +=kmEM +-----END PGP SIGNATURE----- diff --git a/pub/download/ncdu-2.0-beta2-linux-aarch64.tar.gz.md5 b/pub/download/ncdu-2.0-beta2-linux-aarch64.tar.gz.md5 new file mode 100644 index 0000000..bb21357 --- /dev/null +++ b/pub/download/ncdu-2.0-beta2-linux-aarch64.tar.gz.md5 @@ -0,0 +1 @@ +490c4231e1d8155181f7b38d4cfc14c2 ncdu-2.0-beta2-linux-aarch64.tar.gz diff --git a/pub/download/ncdu-2.0-beta2-linux-aarch64.tar.gz.sha1 b/pub/download/ncdu-2.0-beta2-linux-aarch64.tar.gz.sha1 new file mode 100644 index 0000000..5e0c5e0 --- /dev/null +++ b/pub/download/ncdu-2.0-beta2-linux-aarch64.tar.gz.sha1 @@ -0,0 +1 @@ +ffc5ec1650be31b92fa1e2b3c9cec272642a002d ncdu-2.0-beta2-linux-aarch64.tar.gz diff --git a/pub/download/ncdu-2.0-beta2-linux-aarch64.tar.gz.sha256 b/pub/download/ncdu-2.0-beta2-linux-aarch64.tar.gz.sha256 new file mode 100644 index 0000000..22ee613 --- /dev/null +++ b/pub/download/ncdu-2.0-beta2-linux-aarch64.tar.gz.sha256 @@ -0,0 +1 @@ +385d3d7e7696a98c3a8a49e5c25e2ab40e2b1c613418993c213b1c51272727fd ncdu-2.0-beta2-linux-aarch64.tar.gz diff --git a/pub/download/ncdu-2.0-beta2-linux-arm.tar.gz.asc b/pub/download/ncdu-2.0-beta2-linux-arm.tar.gz.asc new file mode 100644 index 0000000..7faac62 --- /dev/null +++ b/pub/download/ncdu-2.0-beta2-linux-arm.tar.gz.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIzBAABCgAdFiEEdEYNMrgIEOupr6LpYjlMaYwnOfoFAmEE3L4ACgkQYjlMaYwn +Ofp7/RAA6/RWwXigQxicb1X5UMCYyTNMvYc36I6hp2JNOnDibgPL+nUQAKgmvTpH +KkCc9c6iZpNg0iFPhzRSsQMRyaX0aw2jxBIeJz/5FMPXvPwxdvHv81ODphiSejtH +g1D8ZPFQViLlEzKnDZ1AA25yS6UDf/AUpf+uXa1AaXi2CJPyRcPSV2B7EOSKl/Wa +kWMssydx9eR0GLB5RxezhHiNv8m5aC5HUkV+lD7WrCy3JBIDrLpKsF0Lm0/+JLJH +/Xg+1vXKrsjyMOcMOWQdbYoE+Q9RXjmdTtUY9cqPMr+5Hm2A3ApphgThjmEOC1x+ +/q4nCOypd3naeXJ7u7gWeWfrMVYpwOtxxSJKCf6n/Cx2Oo2LyttN6UojNc6y6zrV +JlxyWHgCr9N5rUcfMHR6NPaAickGxSSn5aFy2LaDjMTRVV842kCrm1AInEYx73cM +5DNbTYntlY3LPvuVSWv2/JQ4//PhvVsYc9VHn0ReUkbCM/VLUuiqMikU62B0tzwp +u94r09nFRZ/J4VucX/7svtXpViTqEqQKn3PbnW0QQBmLTP+7YKAr2Y3kAJw9krxb ++OfWXZjROMLA1oYy85QtAVo3IlxeOuCMgCLBR9Ce6v44ZPh0iYm/SQiQ44j672+h +W3I0BnK637RECdGPSdEuguElvqqfmWGa9bJSMRVfwUJ8VWoqSJc= +=ijb1 +-----END PGP SIGNATURE----- diff --git a/pub/download/ncdu-2.0-beta2-linux-arm.tar.gz.md5 b/pub/download/ncdu-2.0-beta2-linux-arm.tar.gz.md5 new file mode 100644 index 0000000..922d75f --- /dev/null +++ b/pub/download/ncdu-2.0-beta2-linux-arm.tar.gz.md5 @@ -0,0 +1 @@ +e086558b26ee52abbde36fe92c6ed7ce ncdu-2.0-beta2-linux-arm.tar.gz diff --git a/pub/download/ncdu-2.0-beta2-linux-arm.tar.gz.sha1 b/pub/download/ncdu-2.0-beta2-linux-arm.tar.gz.sha1 new file mode 100644 index 0000000..9090299 --- /dev/null +++ b/pub/download/ncdu-2.0-beta2-linux-arm.tar.gz.sha1 @@ -0,0 +1 @@ +e8aeaccac77c9877f97d160ce575c251acce0bde ncdu-2.0-beta2-linux-arm.tar.gz diff --git a/pub/download/ncdu-2.0-beta2-linux-arm.tar.gz.sha256 b/pub/download/ncdu-2.0-beta2-linux-arm.tar.gz.sha256 new file mode 100644 index 0000000..e6db025 --- /dev/null +++ b/pub/download/ncdu-2.0-beta2-linux-arm.tar.gz.sha256 @@ -0,0 +1 @@ +b10e50fbd85674abd63630284bd087ca354988e6971c13556a3165cb6f5de1ef ncdu-2.0-beta2-linux-arm.tar.gz diff --git a/pub/download/ncdu-2.0-beta2-linux-i386.tar.gz.asc b/pub/download/ncdu-2.0-beta2-linux-i386.tar.gz.asc new file mode 100644 index 0000000..4f3717d --- /dev/null +++ b/pub/download/ncdu-2.0-beta2-linux-i386.tar.gz.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIzBAABCgAdFiEEdEYNMrgIEOupr6LpYjlMaYwnOfoFAmEE3L4ACgkQYjlMaYwn +OfrqBhAA7zASv48/FFXGGtjSlFRemYvXf9ftCnh8P7AdyTgzcfRi/d8EtFSoXh3K +x3d5d0b2jXuKHCxb5ctRipwrcd1qK2AP9CI7EuI/iu93F0tuZd7YOln1hw4NBx1c +afwb3jEwlk+B+h0dzaWU+WaQYzPbTTF5ToTJ0L1meLG999QzxfFYPNCPsBicDGP7 +aczKaMnZw0VwowxkIooaHoD6wP6L0/jWWd58u2R/LuBNqCKcB5hgxIfiqIDyR4YB +KshPcrj/0BbPQPOo06kKvaCXK0KrhJ8hd3G/wDHAPxtd+YQDEmiPSGmERExFWcgV +VUbu6uuccYTl/kJVIyvbrD5shVdu3AN5zwkzAkdz2TDEfOuCnVP8/ADPNqWut/Fa +uDre72mbGMsCAwewgaTJXiVgXvlmhqulw3qs/4i2VxROm9wtdXV4nreyHlJLIRRF +h2f9qdHQddcMTSaSOZBkB9KOQEqdInD0LgQ/+1GBdfFbIm7oIVI279E/XexW2ibp +AGnUu1lC9Ou6AzhXB0ZxCDT1plmbzpnN78r65KCQZiCT10ybs6Y+W658cZkHDohc +FM/gBlCqgpk2mpf8uv5XJ4cAT711VkMO7jKyJXwIs8XG8AbnqjQ1a0cZMVyX2DOn +oyi8LxodA2jOMbMi67LTOk/G2jzsn3Z6ddtzIDFMPx+A1+/9nC8= +=5mrR +-----END PGP SIGNATURE----- diff --git a/pub/download/ncdu-2.0-beta2-linux-i386.tar.gz.md5 b/pub/download/ncdu-2.0-beta2-linux-i386.tar.gz.md5 new file mode 100644 index 0000000..ae93e90 --- /dev/null +++ b/pub/download/ncdu-2.0-beta2-linux-i386.tar.gz.md5 @@ -0,0 +1 @@ +0aa5501722a5b65c99cdc48f9ea2e332 ncdu-2.0-beta2-linux-i386.tar.gz diff --git a/pub/download/ncdu-2.0-beta2-linux-i386.tar.gz.sha1 b/pub/download/ncdu-2.0-beta2-linux-i386.tar.gz.sha1 new file mode 100644 index 0000000..a15f8cb --- /dev/null +++ b/pub/download/ncdu-2.0-beta2-linux-i386.tar.gz.sha1 @@ -0,0 +1 @@ +060573968bc828f081d769482b4e51103e322a35 ncdu-2.0-beta2-linux-i386.tar.gz diff --git a/pub/download/ncdu-2.0-beta2-linux-i386.tar.gz.sha256 b/pub/download/ncdu-2.0-beta2-linux-i386.tar.gz.sha256 new file mode 100644 index 0000000..32f4d16 --- /dev/null +++ b/pub/download/ncdu-2.0-beta2-linux-i386.tar.gz.sha256 @@ -0,0 +1 @@ +de798acd5c694777015f6dd5d78bc6d1a3003ac0925fd97a5b7e2bcaf07662e9 ncdu-2.0-beta2-linux-i386.tar.gz diff --git a/pub/download/ncdu-2.0-beta2-linux-x86_64.tar.gz.asc b/pub/download/ncdu-2.0-beta2-linux-x86_64.tar.gz.asc new file mode 100644 index 0000000..462796b --- /dev/null +++ b/pub/download/ncdu-2.0-beta2-linux-x86_64.tar.gz.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIzBAABCgAdFiEEdEYNMrgIEOupr6LpYjlMaYwnOfoFAmEE3L4ACgkQYjlMaYwn +OfoIZhAAsIonaS2LtoHN4AA6ExgD6Vdqh9ruS/WCBdjPPGikvjfAhS+gim33LGpj +uJLu1gq7xMiMW/cwg3yCSAadZVxV2W2+nuGI9P0HmLTOWwJKaTl/bOBt0/84jn2c +RlOzCYa/vcMYZFRjWS1X5h4CxqmfCY2QnORyeOfMIshqy0ljwknGOATE/EaoZAh1 +aroX6nMSXcvl0BsJiLSuza6F1SBoPhf+MXVWvSH/j4B2Qy4TiEaL7KTnxScISIuv +YIisj4nWFkIwOsLMxheBmRDL4ZehJ+5A9ArLBtBv85+0X4Cz+EgSgczeWAffjxdM +aixR6afH/F5faBplsb5z+FeU1oJDKAUZuvlZKcXYrV7PDVuL53+Vv0fJ1cVXkk8l +mIVlkGNMO1LaoGcAl2RPkn14LpIc3LxfwuMc4M7uLvfzWS0D2Uz5dP5xYOeYwmGd +6krgXGuCriciY6Md4YKDupnH7EXM7CJo9ZK+faTOlnadJr/xhUIe67BXiP149Tm8 +BILKgi7dGbkTrlhLMw6I2aX2+GUF+eZbPpW2QCAQmIzUv+xC+m7/k8epcyb6I8+g +l4iZh0JY9PCLq697gdjA9Qe+lPENGb2Hgo5xgYHXwlRx067LhvUubsKvWfRAjJQ1 +WheNo1PXZsO/+vXBEG/L64KYVnGsjunxalvRJYa4hQqb3Sw6IFw= +=I7uq +-----END PGP SIGNATURE----- diff --git a/pub/download/ncdu-2.0-beta2-linux-x86_64.tar.gz.md5 b/pub/download/ncdu-2.0-beta2-linux-x86_64.tar.gz.md5 new file mode 100644 index 0000000..e4a9cce --- /dev/null +++ b/pub/download/ncdu-2.0-beta2-linux-x86_64.tar.gz.md5 @@ -0,0 +1 @@ +085eed92101055902b543cc1e46aa2db ncdu-2.0-beta2-linux-x86_64.tar.gz diff --git a/pub/download/ncdu-2.0-beta2-linux-x86_64.tar.gz.sha1 b/pub/download/ncdu-2.0-beta2-linux-x86_64.tar.gz.sha1 new file mode 100644 index 0000000..6f7806e --- /dev/null +++ b/pub/download/ncdu-2.0-beta2-linux-x86_64.tar.gz.sha1 @@ -0,0 +1 @@ +0baabedb16d575e23f6f4c9f4a2bc832ee5d52a3 ncdu-2.0-beta2-linux-x86_64.tar.gz diff --git a/pub/download/ncdu-2.0-beta2-linux-x86_64.tar.gz.sha256 b/pub/download/ncdu-2.0-beta2-linux-x86_64.tar.gz.sha256 new file mode 100644 index 0000000..ca844f6 --- /dev/null +++ b/pub/download/ncdu-2.0-beta2-linux-x86_64.tar.gz.sha256 @@ -0,0 +1 @@ +c363c460b2da27d3d14c7b76513296113cccd1f5226317a788564024155ac470 ncdu-2.0-beta2-linux-x86_64.tar.gz diff --git a/pub/download/ncdu-2.0-beta2.tar.gz.asc b/pub/download/ncdu-2.0-beta2.tar.gz.asc new file mode 100644 index 0000000..101dab3 --- /dev/null +++ b/pub/download/ncdu-2.0-beta2.tar.gz.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIzBAABCgAdFiEEdEYNMrgIEOupr6LpYjlMaYwnOfoFAmEE3L8ACgkQYjlMaYwn +Ofr25RAA5BcqgR2N0kNwcutuH5Gfqt/WTFotXVLmOoWO4xQudbz/2K+9NuiZ+Wbz +FBaXCvybUutZIBt25eGlDn1eg4cVAYGf+6/riQbavp5SlsucxkE3SZhEWFCMg0Oi +qDWuMqUh1hRZGBaV7zr0IU1z0OttfA7RUszDynLW3AAgwIoWt4+5lrZRFLJ/qC41 +yQQ6B1JcN2AIxtXxZD4E7nGUJS+F9EjJiXEL0vtpJ3QQeYWSnaZvtHReBsRbaOiZ +8vw8p7cEn2zJtQSTAkVwTWIB3UgxiFYGxbPPsC7nWYsOYKT4gbfVPb5SqYmESwJt +YQ1eVzqT0MYcMWtKZ2nlcwbFwjUwdzSD6pyDGzVDCkfEJaYgU269TquML2OO5Q2f +dg/pMg9GVbt1p6YjOhVU/7mH7akY37Q0KO2Wy6+uHViDT2W20oVTzt/Xkx4W5/82 +pnuSak8pjqrLVJETaFKE8MuqVumVklfxuTa04iuZb+lUoRZv71XheCgocLQDarnx +HVz9X/5D1UnND54ZEdHxHwEkL8sL/Uxqlbdzz5O8yBH14ZWXag+7hSVbTFxrq4TO +64J6gKVDZrFOxWp5gwE/3p/SD3xfLpHSyDfqfqlsDKahvlaUM2Qn/XRfSxHcpoNN +A7qRO8lQ5unoZ2leLOtFE4MAjCylP6VoVOF0n98KtcaEDqdGdTc= +=RNef +-----END PGP SIGNATURE----- diff --git a/pub/download/ncdu-2.0-beta2.tar.gz.md5 b/pub/download/ncdu-2.0-beta2.tar.gz.md5 new file mode 100644 index 0000000..042aca5 --- /dev/null +++ b/pub/download/ncdu-2.0-beta2.tar.gz.md5 @@ -0,0 +1 @@ +01ef6b7371dcc85ddd9f79cd92f1a922 ncdu-2.0-beta2.tar.gz diff --git a/pub/download/ncdu-2.0-beta2.tar.gz.sha1 b/pub/download/ncdu-2.0-beta2.tar.gz.sha1 new file mode 100644 index 0000000..145e463 --- /dev/null +++ b/pub/download/ncdu-2.0-beta2.tar.gz.sha1 @@ -0,0 +1 @@ +5d40f1ac1c3cd39e745b89e0cec4357eb8d89c00 ncdu-2.0-beta2.tar.gz diff --git a/pub/download/ncdu-2.0-beta2.tar.gz.sha256 b/pub/download/ncdu-2.0-beta2.tar.gz.sha256 new file mode 100644 index 0000000..c1a8646 --- /dev/null +++ b/pub/download/ncdu-2.0-beta2.tar.gz.sha256 @@ -0,0 +1 @@ +211eed83de56acd19df6333a9a72c92fb2b2b410ff1502c174a7ac29c0c69aab ncdu-2.0-beta2.tar.gz diff --git a/pub/img/ncdu2-shared.png b/pub/img/ncdu2-shared.png new file mode 100644 index 0000000000000000000000000000000000000000..f77ab217872a6b9a074f91d47a0a50d93de40bde GIT binary patch literal 23494 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 XuLrm^Ow?Sa00000NkvXXu0mjf<09G; literal 0 HcmV?d00001 diff --git a/pub/img/ncdu2.png b/pub/img/ncdu2.png new file mode 100644 index 0000000000000000000000000000000000000000..197c4d61cbe43daec58e1bab074a38a64eb34056 GIT binary patch literal 6971 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