Skip to content
Snippets Groups Projects
Select Git revision
  • b96587c25feff6e52f0b5a5104359046c8c139d4
  • zig default
  • master
  • zig-threaded
  • openat
  • chdir
  • clear
  • compll
  • v1.18.1
  • v2.2.2
  • v1.18
  • v2.2.1
  • v2.2
  • v1.17
  • v2.1.2
  • v2.1.1
  • v2.1
  • v2.0.1
  • v2.0
  • v2.0-beta3
  • v2.0-beta2
  • v2.0-beta1
  • v1.16
  • v1.15.1
  • v1.15
  • v1.14.2
  • v1.14.1
  • v1.14
28 results

nccf

user avatar
Yorhel authored
I had planned to checkout out async functions here so I could avoid
recursing onto the stack alltogether, but it's still unclear to me how
to safely call into libc from async functions so let's wait for all that
to get fleshed out a bit more.
b96587c2
History

ncdu-zig

Description

Ncdu is a disk usage analyzer with an ncurses interface. It is designed to find space hogs on a remote server where you don't have an entire graphical setup available, but it is a useful tool even on regular desktop systems. Ncdu aims to be fast, simple and easy to use, and should be able to run in any minimal POSIX-like environment with ncurses installed.

This Zig implementation

This branch represents an experimental rewrite of ncdu using the Zig programming language. It is supposed to be fully compatible (in terms of behavior, UI and CLI flags) with the C version, so it can eventually be used as a drop-in replacement.

Since Zig itself is still very much unstable and things tend to break with each release, I can't in good conscience publish this rewrite as a proper release of ncdu (...yet). I intent to maintain the C version as long as necessary while Zig matures and gets more widely supported among Linux/BSD systems.

This rewrite is a test-bed for various improvements to the design of ncdu that would impact large parts of its codebase. The improvements may also be backported to the C version, depending on how viable a proper Zig release is.

Improvements compared to the C version

  • Significantly reduced memory usage, achieved by:
    • Removing pointers between nodes that are not strictly necessary for basic tree traversal (this impacts all code in the C version of ncdu).
    • Using separate structs for directory, file and hard link nodes, each storing only the information necessary for that particular type of node.
    • Using an arena allocator and getting rid of data alignment.
    • Refreshing a directory no longer creates a full copy of the (sub)tree.
  • Improved performance of hard link counting (fixing #121).
  • Add support for separate counting hard links that are shared with other directories or unique within the directory (issue #36).
  • Faster --exclude-kernfs thanks to statfs() caching.
  • Improved handling of Unicode and special characters.
  • Key to switch to path from a file's hard link listing.
  • Remembers item position when switching directories.

Potentially to be implemented:

  • Faster --exclude-pattern matching
  • Multithreaded scanning
  • Exporting a JSON dump after scanning into RAM
  • Transparent dump (de)compression by piping through gzip/bzip2/etc

Regressions compared to the C version

Aside from this implementation being unfinished:

  • Assumes a UTF-8 locale and terminal.
  • No doubt somewhat less portable.
  • Listing all paths for a particular hard link requires a full search through the in-memory directory tree.
  • Not nearly as well tested.
  • Directories that could not be opened are displayed as files.
  • The disk usage of directory entries themselves is not updated during refresh.

Minor UI differences

Not sure if these count as improvements or regressions, so I'll just list these separately:

  • The browsing UI is not visible during refresh or file deletion.
  • Some columns in the file browser are hidden automatically if the terminal is not wide enough to display them.
  • The file's path is not displayed in the item window anymore (it's redundant).
  • The item window's height is dynamic based on its contents.

Requirements

  • Zig 8.0
  • Some sort of POSIX-like OS
  • ncurses libraries and header files

Install

todo