z icon indicating copy to clipboard operation
z copied to clipboard

z history is pruned if a filesystem is not mounted

Open systemmonkey42 opened this issue 4 years ago • 3 comments

Issue: If I use z when a filesystem (like /home) is unmounted, all references to /home are instantly purged from the cd history.

This has caught me out enough times ( I have a 100TB zfs pool I unmount for maintenance occasionally ) that I use a patched z which tracks the mountpoint.

Missing paths are filtered as normal when deciding where to go, but paths are only deleted if they are missing AND the mountpoint is actually mounted.

systemmonkey42 avatar Sep 06 '21 23:09 systemmonkey42

not opposed to a way to deal with this, but not 100 sure how I'd go about it. If you want to share your patch maybe I'll get inspired :) (or a PR if your implementation is tidy)

rupa avatar Sep 09 '21 20:09 rupa

Hi

Unfortunately my code isn't a "patch" to your code, but more of a reimplementation "inspired" by z which suits my needs.

The mountpoint stuff is also linux specific in that it reads /proc/self/mounts rather than parsing the output of df, but I'm pretty sure they are very similar (make sure you use the -P flag on df if it is supported on the platform you are using.)

The logic was simple:

  • When "adding", check the mountpoint a path is under, and save that as a column
    • eg, /home/user/work/project/test -> saved as /home|/home/usr/work/project/test|...
  • When scanning the z history file, get awk to pre-load the list of mountpoints
    • eg. awk 'BEGIN{while("df -P" | getline ) { mount[$NF]=1 }}{...}'
    • When the first field (mountpoint) isnt in 'mounts', ignore it when picking a directory to go to, and avoid pruning it when adding (but age it out, in case it never comes back).

Regards

systemmonkey42 avatar Sep 10 '21 01:09 systemmonkey42

My ZSH-z plugin accomplishes this by having a ZSHZ_KEEP_DIRS array of directories that should never be removed and whose subdirectories should never be removed. Something similar could be done in the _z_dirs function.

agkozak avatar Sep 16 '21 17:09 agkozak