jarun / nnn

n³ The unorthodox terminal file manager
BSD 2-Clause "Simplified" License
18.96k stars 756 forks source link

Not all files are listed in list mode #463

Closed jarun closed 4 years ago

jarun commented 4 years ago

Inside the nnn directory, if I run:

find . -print0 | nnn

only the .git directory is listed.

However, if I run:

find . -print0 > out
./nnn < out

all files are listed.

jarun commented 4 years ago

Debug logs:

ln 6534: VERSION=2.9
ln 6120: paths[i]=/home/vaio/GitHub/nnn
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/HEAD
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/ORIG_HEAD
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/index
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/description
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/refs
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/refs/tags
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/refs/heads
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/refs/heads/master
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/refs/remotes
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/refs/remotes/origin
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/refs/remotes/origin/master
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/refs/remotes/origin/HEAD
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/info
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/info/exclude
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/COMMIT_EDITMSG
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/packed-refs
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/hooks
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/hooks/pre-applypatch.sample
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/hooks/fsmonitor-watchman.sample
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/hooks/applypatch-msg.sample
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/hooks/pre-push.sample
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/hooks/post-update.sample
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/hooks/commit-msg.sample
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/hooks/pre-commit.sample
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/hooks/prepare-commit-msg.sample
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/hooks/pre-rebase.sample
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/hooks/pre-receive.sample
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/hooks/update.sample
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/FETCH_HEAD
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/branches
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/ae
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/ae/788ddbdb4e1286bf214cb872e107b821333d54
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/2e
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/2e/893680b511a5b6751721f1a3c927af81539eed
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/40
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/40/7616c29f176140c34afc8c736b87e16cb73fba
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/a6
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/a6/f5f1ebc862637fb19d44369b3dffdf1ac5ae1a
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/12
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/12/896c1d46abbc9bb62a272aaff383f89bc125e6
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/2b
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/2b/4928094dff9169e089b0f7c9144a46640b494f
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/2b/731b918c809f0617c991143c9cb23ef402e13e
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/a4
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/a4/a568079321bb0f25f6701953b9703187f3ca90
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/a4/aecbcd29e3462d1bc38d0c7b1c67dfc332b17a
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/5e
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/5e/7c42c8223d8328bce2157023cd2887f4ea2491
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/a8
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/a8/7be622049622b4a9af411f7cbd552cd7860a43
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/a8/b4f946321dce790583df683bb9f9834fbdabf7
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/02
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/02/211c337dbe5b6bb6794ed079044f088540484a
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/02/0710248d431aa49092406a5bf9b8933a57721b
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/31
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/31/6b3add2910e841c73e926dc80285cfb793b224
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/31/e24f539a7bc6b52e9a37fc8997cb581db82bc3
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/70
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/70/c9947ce826ec0577f5e1abd2483c11833f4076
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/70/973f102744863722be2ddf241d013245909db9
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/bd
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/bd/6e926ec370db482f085dd5104a6f4728a3cd49
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/bd/b783315a2048a45f9fd6ed536250a523ec6471
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/6c
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/6c/2dc7fc95c1e36432118c17b2926952cc5e739b
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/6c/52248343e7c4d3ed12d15774cc9adf3a21d877
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/6c/daf5c941afe4d978a7e73f73448cdd85a83f76
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/6c/bc0595c862469d601508cca77671e593ca8791
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/77
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/77/c9b103100f0d171cbb4d4205a8accd32e08af7
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/c4
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/c4/4ecc58f9a86ff31d179bf610653599e17669de
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/c4/4a659c1c23d96a9ef3b4173e255d5a36f8caa2
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/c4/34d8d4bcc5b875bf75ecb80b175c6088e5419c
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/c4/d6da67db7ebc93e71f67c808a4abd6686717d9
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/9c
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/9c/9059389ed878870242dc78b9162fbdbc5d1188
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/9c/badc12be7dcc71cbadcf2fe79d873987eaa569
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/e3
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/e3/d80da2ad6662e1d0bee6ebed5d7ac2bf104bc5
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/00
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/00/6ca3c74adec6ba3dd97151881c45357d392e7b
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/00/7838a6f3434903f92f13a833e103cb8e3b266a
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/53
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/53/fad5c93f09c3e20e882cf3277f79e716057b6a
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/53/5209cb8767fc160ba3253d93da84bf593ab8f7
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/f0
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/f0/d987694c910085cb202b727221002a0b2cd61a
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/cc
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/cc/70bf9daa86ffb70639138119bf93c62887e573
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/cc/f6aea514f8fc2829549ada8fdeaa202a16ad6c
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/c0
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/c0/f423496ea7b0d149bb64324e6590049e97d561
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/c0/7a41dce07ad40740cf7a8e56320aa4845068b0
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/16
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/16/f7529cc07d65d7ed63ffacbedd43a6ec70be9d
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/16/8b43badf1980fa22ae360b83e46ef59ea5897e
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/16/d4c4b678b6ead4da66034a827aa10ab463b055
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/16/14ce172bdfeec652c8222eb0a08999a4fcb76b
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/16/84d7b24efa49f890d59f260a86be3aaddad256
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/c1
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/c1/33d57be3539fff9368c91bc44c7f3c00052547
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/ec
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/ec/f17e177759678236d57ad357c538f1d812996e
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/ec/87910849892cf6236e376b3b83495ecc083f2e
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/ec/fc13c30bb699067af283de78e70937c6e193a8
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/76
ln 6121: strerror(errno)=File exists
ln 6567: home=/home/vaio
ln 6343: cfgdir=/home/vaio/.config
ln 6349: cfgdir=/home/vaio/.config/nnn
ln 6353: cfgdir=/home/vaio/.config/nnn/plugins
ln 6356: plugindir=/home/vaio/.config/nnn/plugins
ln 6365: cfgdir=/home/vaio/.config/nnn/sessions
ln 6368: sessiondir=/home/vaio/.config/nnn/sessions
ln 6377: cfgdir=/home/vaio/.config/nnn
ln 6390: g_selpath=/home/vaio/.config/nnn/.selection
ln 6574: opener=/home/vaio/.config/nnn/plugins/nuke
ln 6651: getenv(envs[ENV_VISUAL])=ewrap
ln 6652: getenv(envs[ENV_EDITOR])=vim
ln 6653: editor=ewrap
ln 6657: pager=less -Ri
ln 6661: shell=/usr/bin/zsh
ln 6663: getenv("PWD")=/home/vaio/GitHub/nnn
ln 4799: path=/tmp/nnnoXeCeF
ln 4799: path=/tmp/nnnoXeCeF
ln 1546: status=0
ln 1624: pid=10778
jarun commented 4 years ago

Are we missing chunks?

jarun commented 4 years ago

If I remove the .git directory, all files are showing (I guess it had too many files and we hit some limit). However, other than CHANGELOG, all files are showing as directories:

[1 2 3 4] /tmp/nnnNDuiWp

 LICENSE/
 Makefile/
 misc/
 nnn/
 nnn.1/
 plugins/
 README.md/
 src/
 CHANGELOG@

logs:

ln 6538: VERSION=2.9
ln 6196: chunk_count=2
ln 6197: entries=129
ln 6198: total_read=2678
ln 6120: paths[i]=/home/vaio/GitHub/nnn
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/HEAD
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/index
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/description
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/refs
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/refs/tags
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/refs/heads
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/refs/heads/master
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/refs/remotes
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/refs/remotes/origin
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/refs/remotes/origin/HEAD
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/info
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/info/exclude
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/packed-refs
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/hooks
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/hooks/pre-applypatch.sample
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/hooks/fsmonitor-watchman.sample
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/hooks/applypatch-msg.sample
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/hooks/pre-push.sample
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/hooks/post-update.sample
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/hooks/commit-msg.sample
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/hooks/pre-commit.sample
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/hooks/prepare-commit-msg.sample
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/hooks/pre-rebase.sample
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/hooks/pre-receive.sample
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/hooks/update.sample
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/branches
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/pack
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/pack/pack-eea5999dffb3b401ab4586cc3c1554107d5914b9.idx
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/pack/pack-eea5999dffb3b401ab4586cc3c1554107d5914b9.pack
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/objects/info
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/logs
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/logs/HEAD
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/logs/refs
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/logs/refs/heads
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/logs/refs/heads/master
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/logs/refs/remotes
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/logs/refs/remotes/origin
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/logs/refs/remotes/origin/HEAD
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/config
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.gitignore
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/README.md
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.travis.yml
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/nnn
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/Makefile
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/dragdrop
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/treeview
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/dups
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/upgrade
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/fzcd
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/picker
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/pskill
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/renamer
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/mocplay
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/.cbcp
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/.nnn-plugin-helper
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/README.md
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/pdfread
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/ipinfo
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/ringtone
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/launch
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/hexview
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/mediainf
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/nuke
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/wall
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/imgview
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/pdfview
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/fzhist
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/nmount
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/boom
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/vidthumb
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/getplugs
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/imgur
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/kdeconnect
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/upload
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/uidgid
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/chksum
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/autojump
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/oldbigfile
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/.ntfy
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/imgthumb
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/gutenread
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/suedit
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/diffs
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/moclyrics
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/fzopen
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/splitjoin
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/imgresize
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/organize
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.circleci
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.circleci/config.yml
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/LICENSE
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.github
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.github/FUNDING.yml
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.github/ISSUE_TEMPLATE.md
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/misc
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/misc/quitcd
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/misc/quitcd/quitcd.fish
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/misc/quitcd/quitcd.zsh
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/misc/quitcd/quitcd.bash
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/misc/quitcd/quitcd.csh
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/misc/auto-completion
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/misc/auto-completion/fish
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/misc/auto-completion/zsh
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/misc/auto-completion/bash/nnn-completion.bash
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/misc/test
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/misc/test/mktest.sh
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/misc/natool
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/misc/natool/natool
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/misc/packagecore
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/misc/haiku
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/nnn.1
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/src
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/src/dbg.h
ln 6121: strerror(errno)=File exists
ln 6120: paths[i]=/home/vaio/GitHub/nnn/src/nnn.h
ln 6121: strerror(errno)=File exists
ln 6571: home=/home/vaio
ln 6347: cfgdir=/home/vaio/.config
ln 6353: cfgdir=/home/vaio/.config/nnn
ln 6357: cfgdir=/home/vaio/.config/nnn/plugins
ln 6360: plugindir=/home/vaio/.config/nnn/plugins
ln 6369: cfgdir=/home/vaio/.config/nnn/sessions
ln 6372: sessiondir=/home/vaio/.config/nnn/sessions
ln 6381: cfgdir=/home/vaio/.config/nnn
ln 6394: g_selpath=/home/vaio/.config/nnn/.selection
ln 6578: opener=/home/vaio/.config/nnn/plugins/nuke
ln 6655: getenv(envs[ENV_VISUAL])=ewrap
ln 6656: getenv(envs[ENV_EDITOR])=vim
ln 6657: editor=ewrap
ln 6661: pager=less -Ri
ln 6665: shell=/usr/bin/zsh
ln 6667: getenv("PWD")=/home/vaio/GitHub/nnn
ln 4463: ts2.tv_nsec - ts1.tv_nsec=27569
ln 4799: path=/tmp/nnneXyKPJ
ln 1546: status=0
ln 1624: pid=11065
jarun commented 4 years ago

If I exit after load_input() and list the entries, I see they are created as directories:

~/GitHub/nnn$ ls -l /tmp/nnnYUHsEv   
total 36
drwxrwxr-x  2 vaio vaio 4096 Feb  6 04:44 LICENSE/
drwxrwxr-x  2 vaio vaio 4096 Feb  6 04:44 Makefile/
drwxrwxr-x  8 vaio vaio 4096 Feb  6 04:44 misc/
drwxrwxr-x  2 vaio vaio 4096 Feb  6 04:44 nnn/
drwxrwxr-x  2 vaio vaio 4096 Feb  6 04:44 nnn.1/
drwxrwxr-x  2 vaio vaio 4096 Feb  6 04:44 out/
drwxrwxr-x 46 vaio vaio 4096 Feb  6 04:44 plugins/
drwxrwxr-x  2 vaio vaio 4096 Feb  6 04:44 README.md/
drwxrwxr-x  4 vaio vaio 4096 Feb  6 04:44 src/
lrwxrwxrwx  1 vaio vaio   31 Feb  6 04:44 CHANGELOG -> /home/vaio/GitHub/nnn/CHANGELOG
jarun commented 4 years ago

However, the entries are not created as directories if I use the maxdepth option:

find . -maxdepth 1 -print0 | nnn

I see:

[1 2 3 4] /tmp/nnnEO0CDY

 misc@
 plugins@
 src@
 CHANGELOG@
 LICENSE@
 Makefile@
 nnn@
 nnn.1@
 out@
 README.md@
jarun commented 4 years ago

I think the problem is, even if I run:

~/GitHub/nnn$ find . -type f -print0 | nnn

the following is wrong:

g_prefixpath=/
KlzXS commented 4 years ago

Ohhhh. I think I just got it. At lest the

ln 6121: strerror(errno)=File exists

message. You gave it both a directory and a file in that directory. So it gets a bit confused.

But it is only reading 4096 bytes. That could be due to the pipe, perhaps find has a weird output pattern?

KlzXS commented 4 years ago

I'll take a more detailed look at it a bit later today.

KlzXS commented 4 years ago

Also where on master are you?

jarun commented 4 years ago

I am on latest commit. Added some local logs for testing.

KlzXS commented 4 years ago

I think the problem is, even if I run: ~/GitHub/nnn$ find . -type f -print0 | nnn the following is wrong: g_prefixpath=/

I can't reproduce this. For me it does run "correctly", that is, it displays some of the hidden files, like .git, .gitignore and .travis.yml, but it cuts out at a certain point for some reason.

KlzXS commented 4 years ago

However, the entries are not created as directories if I use the maxdepth option:

They are created as symlinks to dirs, that's the expected behavior.

jarun commented 4 years ago

Please remove the .git directory and try,

jarun commented 4 years ago

They are created as symlinks to dirs, that's the expected behavior.

If you see my comment https://github.com/jarun/nnn/issues/463#issuecomment-582655168, the file LICENSE becomes a directory.

KlzXS commented 4 years ago

the file LICENSE becomes a directory.

A wrong length was used for a function call, I'll fix that.

Also we quit reading after not reading a full chunk, that's not always good. In this case it isn't, we read output from find faster than it can write it so we call it a day. I'll redo it so we read until read a 0.

KlzXS commented 4 years ago

I submited #465

jarun commented 4 years ago

@KlzXS there are issues still. Steps:

However, if I run find . -print0 | nnn everything is listed.

jarun commented 4 years ago

@KlzXS

We need to resolve this for the next release to happen. I will also try to stay awake tonight for some joint debugging session. I am in IST. Probably I can pitch in at 23:00 PM my time.

KlzXS commented 4 years ago

run find . -type f -print0 | nnn

And... everything is listed. I assume you wrote "nnn" just form brevity and that you meant "path/to/this/pr/nnn".

I checked it out on two systems and it works. I'll need some more information. Also "nothing listed". Is nothing listed, or "nothing" is listed as in there are hidden files?

I will also try to stay awake tonight for some joint debugging session. I am in IST. Probably I can pitch in at 23:00 PM my time.

This is referring to today, 7th of February, right?

jarun commented 4 years ago

Yes, for me it's nothing... not even dots. I'll check again.

Yes, it's tonight.

KlzXS commented 4 years ago

I couldn't replicate what you are experiencing but I found a clone where it doesn't display .git/ref/remotes/origin. I'll look into that later.

KlzXS commented 4 years ago

It would seem that's it's another "wrong length" type of issue that I missed. Since it's directory content dependent.

jarun commented 4 years ago

I confirmed. I have the patch in place. Now if I run:

find . -type f -print0 | nnn

nothing is listed.

jarun commented 4 years ago

With debug enabled, I see the following logs:

ln 6543: VERSION=2.9
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/HEAD
ln 6121: strerror(errno)=No such file or directory
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/index
ln 6121: strerror(errno)=No such file or directory
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/refs/heads/master
ln 6121: strerror(errno)=No such file or directory
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/refs/remotes/origin/master
ln 6121: strerror(errno)=No such file or directory
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/refs/remotes/origin/HEAD
ln 6121: strerror(errno)=No such file or directory
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/info/exclude
ln 6121: strerror(errno)=No such file or directory
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/logs/HEAD
ln 6121: strerror(errno)=No such file or directory
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/logs/refs/heads/master
ln 6121: strerror(errno)=No such file or directory
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/logs/refs/remotes/origin/master
ln 6121: strerror(errno)=No such file or directory
ln 6120: paths[i]=/home/vaio/GitHub/nnn/.git/logs/refs/remotes/origin/HEAD
ln 6121: strerror(errno)=No such file or directory
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/dragdrop
ln 6121: strerror(errno)=No such file or directory
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/treeview
ln 6121: strerror(errno)=No such file or directory
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/dups
ln 6121: strerror(errno)=No such file or directory
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/upgrade
ln 6121: strerror(errno)=No such file or directory
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/fzcd
ln 6121: strerror(errno)=No such file or directory
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/picker
ln 6121: strerror(errno)=No such file or directory
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/pskill
ln 6121: strerror(errno)=No such file or directory
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/renamer
ln 6121: strerror(errno)=No such file or directory
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/mocplay
ln 6121: strerror(errno)=No such file or directory
ln 6120: paths[i]=/home/vaio/GitHub/nnn/plugins/.cbcp
ln 6121: strerror(errno)=No such file or directory
ln 6120: paths[i]=/home/vaio/GitHub/nnn/misc/auto-completion/fish/nnn.fish
ln 6121: strerror(errno)=No such file or directory
ln 6120: paths[i]=/home/vaio/GitHub/nnn/misc/auto-completion/zsh/_nnn
ln 6121: strerror(errno)=No such file or directory
ln 6120: paths[i]=/home/vaio/GitHub/nnn/misc/natool/natool
ln 6121: strerror(errno)=No such file or directory
ln 6120: paths[i]=/home/vaio/GitHub/nnn/src/dbg.h
ln 6121: strerror(errno)=No such file or directory
ln 6120: paths[i]=/home/vaio/GitHub/nnn/src/nnn.h
ln 6121: strerror(errno)=No such file or directory
ln 6576: home=/home/vaio
ln 6352: cfgdir=/home/vaio/.config
ln 6358: cfgdir=/home/vaio/.config/nnn
ln 6362: cfgdir=/home/vaio/.config/nnn/plugins
ln 6365: plugindir=/home/vaio/.config/nnn/plugins
ln 6374: cfgdir=/home/vaio/.config/nnn/sessions
ln 6377: sessiondir=/home/vaio/.config/nnn/sessions
ln 6386: cfgdir=/home/vaio/.config/nnn
ln 6399: g_selpath=/home/vaio/.config/nnn/.selection
ln 6583: opener=/home/vaio/.config/nnn/plugins/nuke
ln 6660: getenv(envs[ENV_VISUAL])=ewrap
ln 6661: getenv(envs[ENV_EDITOR])=vim
ln 6662: editor=ewrap
ln 6666: pager=less -Ri
ln 6670: shell=/usr/bin/zsh
ln 6672: getenv("PWD")=/home/vaio/GitHub/nnn
ln 4799: path=/tmp/nnnmory8v
ln 2250: event->wd=0
ln 2251: event->mask=0
ln 2261: "inotify read done"=inotify read done
ln 1546: status=0
ln 1624: pid=29324
jarun commented 4 years ago

If I print common_prefix:

ln 6240: common_prefix=H<85>ÿ^O<84>w^A

The patch is in place. Note that the line number is at the beginning so you know where I added the log.

KlzXS commented 4 years ago

I just pushed another commit that's supposed to fix the wrong lengths. For me it works.

KlzXS commented 4 years ago

ln 6240: common_prefix=H<85>ÿ^O<84>w^A

Unless you renamed something that's a function and not a variable. It makes sense that it's garbage.

KlzXS commented 4 years ago

Oh and as for the debugging session, I probably won't have access to a machine at the time, if there is a need for such a session, I could maybe try to chime in over my phone. But hopefully this time I got it right.

jarun commented 4 years ago

Let me test the latest version...

jarun commented 4 years ago

Still the same... :(

I picked the complete file from your changes. So no local changes either.

maximbaz commented 4 years ago

I know you guys are on it, but as you asked me to test, I can confirm that I repro the issue, and the latest code from #465 segfaults for me on find . -print0 | ./nnn

KlzXS commented 4 years ago

segfaults for me on find . -print0 | ./nnn

Yes it does. Thanks for noticing.

Still the same... :(

What I've gathered is that it doesn't create some directories that it has to. That's the "ln 6121: strerror(errno)=No such file or directory". But I don't see right now why this could be happening.

jarun commented 4 years ago

See how g_prefixpath changes when we are switching from file config to .gitignore. The common prefix should have been: /home/vaio/GitHub/nnn/ but it comes as /:

ln 6243: paths[i]=/home/vaio/GitHub/nnn/.git/config
ln 6250: g_prefixpath=/home/vaio/GitHub/nnn/.git
ln 6243: paths[i]=/home/vaio/GitHub/nnn/.gitignore
ln 6250: g_prefixpath=/

Update: The segfault would be from one of the recent changes in this patch BTW. I see it too.

jarun commented 4 years ago

I think common_prefix is not calculating the prefix properly.

jarun commented 4 years ago

One note: we should always pass 2 directories to common_prefix. For each path[i[ we should stat and see if it's a file or a path. If it's a file we should use xbasename() to determine the dir and then call common_prefix. In brief, we should not end up in a situation where the prefix is not a dir but a file path.

KlzXS commented 4 years ago

In brief, we should not end up in a situation where the prefix is not a dir but a file path.

That can't happen. common_prefix() should only return prefixes ending with at a '/'. This would be problem in case only one path is supplied, should we then discard input when only one entry is given?

KlzXS commented 4 years ago

The common prefix should have been: /home/vaio/GitHub/nnn/ but it comes as /

I can't reproduce this. And I also can't debug it since the whole function is optimized away. Does the issue still exist if you compile with -O0 or -Og?

jarun commented 4 years ago

I meant dirname() earleir, not basename().

Does the issue still exist if you compile with -O0 or -Og?

Yes.

find . -type f -print0 | nnn

works with the following patch:

diff --git a/src/nnn.c b/src/nnn.c
index 20e082e..05c1785 100644
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -973,7 +973,7 @@ static char *common_prefix(const char *s, char *prefix)
        blocks = len >> _WSHIFT;
        len &= LONG_SIZE - 1;

-       while (i < blocks && !(*x ^ *y))
+       while (i < blocks && (*x == *y))
            ++x, ++y, ++i;

        /* This should always return */
@@ -6093,6 +6093,9 @@ static char *make_tmp_tree(char **paths, ssize_t entries, const char *prefix)
    xstrlcpy(tmpdir, g_tmpfpath, g_tmpfplen);
    xstrlcpy(tmp, "/nnnXXXXXX", 11);

+   /* Points right after the base tmp dir */
+   tmp += 10;
+
    if (!mkdtemp(tmpdir)) {
        free(tmpdir);

@@ -6109,14 +6112,19 @@ static char *make_tmp_tree(char **paths, ssize_t entries, const char *prefix)
            continue;
        }

-       xstrlcpy(tmp + 10, paths[i] + len, strlen(paths[i]) + 1);
+       /* Don't copy the common prefix */
+       xstrlcpy(tmp, paths[i] + len, strlen(paths[i]) - len + 1);

-       slash = xmemrchr((uchar *)tmp, '/', strlen(paths[i]) + 11);
-       *slash = '\0';
+       /* Get the dir containing the path */
+       slash = xmemrchr((uchar *)tmp, '/', strlen(paths[i]) - len);
+       if (slash)
+           *slash = '\0';

        xmktree(tmpdir, TRUE);

-       *slash = '/';
+       if (slash)
+           *slash = '/';
+
        if (symlink(paths[i], tmpdir)) {
            DPRINTF_S(paths[i]);
            DPRINTF_S(strerror(errno));
@@ -6126,7 +6134,8 @@ static char *make_tmp_tree(char **paths, ssize_t entries, const char *prefix)
    if (ignore)
        g_states |= STATE_MSG;

-   tmp[10] = '\0';
+   /* Get the dir in which to start */
+   *tmp = '\0';
    return tmpdir;
 }

@@ -6151,12 +6160,15 @@ static char *load_input()
    }

    while (chunk_count < 512) {
-       input_read = read(STDIN_FILENO, input, chunk);
+       input_read = read(STDIN_FILENO, input + total_read, chunk);
        if (input_read < 0) {
            DPRINTF_S(strerror(errno));
            goto malloc_1;
        }

+       if (input_read == 0)
+           break;
+
        total_read += input_read;
        ++chunk_count;

@@ -6177,12 +6189,18 @@ static char *load_input()
            off = next - input;
        }

-       if (input_read < chunk)
-           break;
-
        if (chunk_count == 512)
            goto malloc_1;

+       /* We don't need to allocate another chunk */
+       if (chunk_count == (total_read - input_read) / chunk)
+           continue;
+
+       chunk_count = total_read / chunk;
+       if (total_read % chunk)
+           ++chunk_count;
+
+
        if (!(input = xrealloc(input, (chunk_count + 1) * chunk)))
            return NULL;
    }
@@ -6194,6 +6212,10 @@ static char *load_input()
        offsets[entries++] = off;
    }

+   DPRINTF_D(entries);
+   DPRINTF_D(total_read);
+   DPRINTF_D(chunk_count);
+
    if (!entries)
        goto malloc_1;

@@ -6213,7 +6235,10 @@ static char *load_input()
    if (!(paths[0] = xrealpath(paths[0], cwd)))
        goto malloc_1; // free all entries

-   xstrlcpy(g_prefixpath, paths[0], strlen(paths[0]) + 1);
+   DPRINTF_S(paths[0]);
+   xstrlcpy(g_prefixpath, dirname(paths[0]), strlen(dirname(paths[0])) + 1);
+
+   DPRINTF_S(g_prefixpath);

    for (i = 1; i < entries; ++i) {
        if (!(paths[i] = xrealpath(paths[i], cwd))) {
@@ -6222,12 +6247,18 @@ static char *load_input()

        }

+       DPRINTF_S(paths[i]);
+
        if (!common_prefix(paths[i], g_prefixpath)) {
            entries = i + 1; // free from the current entry
            goto malloc_2;
        }
+
+       DPRINTF_S(g_prefixpath);
    }

+   DPRINTF_S(g_prefixpath);
+
    if (entries == 1) {
        tmp = xmemrchr((uchar *)g_prefixpath, '/', strlen(g_prefixpath));
        if (!tmp)
jarun commented 4 years ago

The segfault was happening due to the setting of *slash without NULL check.

With the above patch we now have problem with:

find . -print0 | nnn

That's because if there's a . as the first file, dirname() will give the parent directory and we will list only the parent dir.

We should skip . in some way.

KlzXS commented 4 years ago

You only changed the comparison. How are the two different logically?

Nevermind. If it works, great, try it out a bit more and if there are no more issues, I'll put that in. That's what I get for trying to be fancy.

The segfault was happening due to the setting of *slash without NULL check.

Didn't I push a commit for that?

jarun commented 4 years ago

Didn't I push a commit for that?

Maybe I didn't notice.

What would be the simplest way to remove . if it is the first file?

jarun commented 4 years ago

The following patch works in all cases. @maximbaz please test and confirm.

@KlzXS shall we keep the debug logs for now?

diff --git a/src/nnn.c b/src/nnn.c
index 20e082e..8c7cfc3 100644
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -973,7 +973,7 @@ static char *common_prefix(const char *s, char *prefix)
        blocks = len >> _WSHIFT;
        len &= LONG_SIZE - 1;

-       while (i < blocks && !(*x ^ *y))
+       while (i < blocks && (*x == *y))
            ++x, ++y, ++i;

        /* This should always return */
@@ -6093,6 +6093,9 @@ static char *make_tmp_tree(char **paths, ssize_t entries, const char *prefix)
    xstrlcpy(tmpdir, g_tmpfpath, g_tmpfplen);
    xstrlcpy(tmp, "/nnnXXXXXX", 11);

+   /* Points right after the base tmp dir */
+   tmp += 10;
+
    if (!mkdtemp(tmpdir)) {
        free(tmpdir);

@@ -6109,14 +6112,19 @@ static char *make_tmp_tree(char **paths, ssize_t entries, const char *prefix)
            continue;
        }

-       xstrlcpy(tmp + 10, paths[i] + len, strlen(paths[i]) + 1);
+       /* Don't copy the common prefix */
+       xstrlcpy(tmp, paths[i] + len, strlen(paths[i]) - len + 1);

-       slash = xmemrchr((uchar *)tmp, '/', strlen(paths[i]) + 11);
-       *slash = '\0';
+       /* Get the dir containing the path */
+       slash = xmemrchr((uchar *)tmp, '/', strlen(paths[i]) - len);
+       if (slash)
+           *slash = '\0';

        xmktree(tmpdir, TRUE);

-       *slash = '/';
+       if (slash)
+           *slash = '/';
+
        if (symlink(paths[i], tmpdir)) {
            DPRINTF_S(paths[i]);
            DPRINTF_S(strerror(errno));
@@ -6126,7 +6134,8 @@ static char *make_tmp_tree(char **paths, ssize_t entries, const char *prefix)
    if (ignore)
        g_states |= STATE_MSG;

-   tmp[10] = '\0';
+   /* Get the dir in which to start */
+   *tmp = '\0';
    return tmpdir;
 }

@@ -6139,6 +6148,7 @@ static char *load_input()
    size_t offsets[LIST_FILES_MAX];
    char **paths = NULL;
    ssize_t input_read, total_read = 0, off = 0;
+   bool dotfirst = FALSE;

    if (!input) {
        DPRINTF_S(strerror(errno));
@@ -6151,12 +6161,15 @@ static char *load_input()
    }

    while (chunk_count < 512) {
-       input_read = read(STDIN_FILENO, input, chunk);
+       input_read = read(STDIN_FILENO, input + total_read, chunk);
        if (input_read < 0) {
            DPRINTF_S(strerror(errno));
            goto malloc_1;
        }

+       if (input_read == 0)
+           break;
+
        total_read += input_read;
        ++chunk_count;

@@ -6177,12 +6190,18 @@ static char *load_input()
            off = next - input;
        }

-       if (input_read < chunk)
-           break;
-
        if (chunk_count == 512)
            goto malloc_1;

+       /* We don't need to allocate another chunk */
+       if (chunk_count == (total_read - input_read) / chunk)
+           continue;
+
+       chunk_count = total_read / chunk;
+       if (total_read % chunk)
+           ++chunk_count;
+
+
        if (!(input = xrealloc(input, (chunk_count + 1) * chunk)))
            return NULL;
    }
@@ -6194,6 +6213,10 @@ static char *load_input()
        offsets[entries++] = off;
    }

+   DPRINTF_D(entries);
+   DPRINTF_D(total_read);
+   DPRINTF_D(chunk_count);
+
    if (!entries)
        goto malloc_1;

@@ -6210,10 +6233,20 @@ static char *load_input()
    if (!g_prefixpath)
        goto malloc_1;

+   if (paths[0][0] == '.' && paths[0][1] == '\0')
+       dotfirst = TRUE;
+
    if (!(paths[0] = xrealpath(paths[0], cwd)))
        goto malloc_1; // free all entries

-   xstrlcpy(g_prefixpath, paths[0], strlen(paths[0]) + 1);
+   DPRINTF_S(paths[0]);
+
+   if (dotfirst)
+       xstrlcpy(g_prefixpath, paths[0], strlen(paths[0]) + 1);
+   else
+       xstrlcpy(g_prefixpath, dirname(paths[0]), strlen(dirname(paths[0])) + 1);
+
+   DPRINTF_S(g_prefixpath);

    for (i = 1; i < entries; ++i) {
        if (!(paths[i] = xrealpath(paths[i], cwd))) {
@@ -6222,12 +6255,18 @@ static char *load_input()

        }

+       DPRINTF_S(paths[i]);
+
        if (!common_prefix(paths[i], g_prefixpath)) {
            entries = i + 1; // free from the current entry
            goto malloc_2;
        }
+
+       DPRINTF_S(g_prefixpath);
    }

+   DPRINTF_S(g_prefixpath);
+
    if (entries == 1) {
        tmp = xmemrchr((uchar *)g_prefixpath, '/', strlen(g_prefixpath));
        if (!tmp)
jarun commented 4 years ago

When you update the PR with this patch, please rebase as well.

jarun commented 4 years ago

OR, shall I push the changes from my local?

KlzXS commented 4 years ago

OR, shall I push the changes from my local?

I'm fine with either.

What would be the simplest way to remove .if it is the first file?

It doesn't have to be the first file, nor only one appearance of it. The simplest would be to just handle all the NULLs preperly. The mkdir thing will fail as it should.

I'm fine with the debug logs it's just that they are very verbose.

jarun commented 4 years ago

Fixed at commit 1d60b6a4759c0d78c5046e21a12dff9a667d90ae.

jarun commented 4 years ago

Another point I was thinking of - when we list, we should probably tweak dentfill to use stat(). That way even for the symlinks, the sizes will show.

jarun commented 4 years ago

See commit 72668069edc5499b6f4f3dce16a1de208f147075.