Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Opening a file is *very* slow on slow FSes #6867

Closed
sam-mccall opened this issue Apr 24, 2023 · 21 comments · Fixed by #6890
Closed

Opening a file is *very* slow on slow FSes #6867

sam-mccall opened this issue Apr 24, 2023 · 21 comments · Fixed by #6890
Labels
C-enhancement Category: Improvements

Comments

@sam-mccall
Copy link
Contributor

TL;DR: On a slow network filesystem, opening files takes ~15x longer with helix than other editors such as vim. Helix is doing a bunch of blocking IO to detect git repos, it'd be nice to take this off the critical path or make it optional.

This is related to #6114 and #1987, but just opening files is painfully slow (e.g. when passing their path to hx on the command-line, or after using go-to-definition - there's no fuzzy-finding going on).


Looking at strace, helix is probing for several paths relative to ancestor directories: [commondir, HEAD (twice), tags/HEAD, heads/HEAD, remotes/HEAD, refs/remotes/HEAD/HEAD, .git]. I don't know what commondir is, the others all look git-related.

Details about this FS that help understand the log (I don't think you should care about this filesystem per se, but just to give context for the logs - the idea that accessing a bunch of unexpected parts of a network FS might be slow generalizes I think).

On this particular system the layout is /weirdfs/username/workspace/pathinworkspace. The first time you use a particular workspace is really slow - time stat says ~600ms. I guess the FUSE client has to load a bunch of metadata. Fortunately you don't do this very often, and the metadata is cached. Trying to access a workspace that doesn't exist is also slow (~200ms), and can't be cached. Fortunately you never do this... except helix's VCS probes.

Most of these are fairly fast, but reading nonexistent files in certain directories is slow. On my example helix makes >100 openat calls, of which 22 are slow (most 200ms, some a bit longer) for a total of ~5 seconds. Because their nonexistence is not cacheable, this happens every time a file is opened.

trimmed log for `strace -tT hx /weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx/cxx.bnf`

(This is lightly edited:/weirdfs isn't the real path etc. The log before this is all hx startup which is very fast, and after this it starts writing to the terminal)

16:20:17 getcwd("/weirdfs/sammccall/xkb/repo", 512) = 40 <0.000016>
16:20:17 statx(AT_FDCWD, "/usr/local/sbin/xclip", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7fffef9918b0) = -1 ENOENT (No such file or directory) <0.000013>
16:20:17 statx(AT_FDCWD, "/usr/local/bin/xclip", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7fffef9918b0) = -1 ENOENT (No such file or directory) <0.000016>
16:20:17 statx(AT_FDCWD, "/usr/sbin/xclip", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7fffef9918b0) = -1 ENOENT (No such file or directory) <0.000014>
16:20:17 statx(AT_FDCWD, "/usr/bin/xclip", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_ALL|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0755, stx_size=30736, ...}) = 0 <0.000017>
16:20:17 access("/usr/bin/xclip", X_OK) = 0 <0.000017>
16:20:17 statx(AT_FDCWD, "experimental/sammccall/grammar/cxx/cxx.bnf", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0664, stx_size=31436, ...}) = 0 <0.000141>
16:20:17 statx(AT_FDCWD, "experimental/sammccall/grammar/cxx/cxx.bnf", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0664, stx_size=31436, ...}) = 0 <0.000110>
16:20:17 getcwd("/weirdfs/sammccall/xkb/repo", 512) = 40 <0.000012>
16:20:17 readlink("/weirdfs", 0x7fffef991950, 1023) = -1 EINVAL (Invalid argument) <0.000128>
16:20:17 readlink("/weirdfs/sammccall", 0x7fffef991950, 1023) = -1 EINVAL (Invalid argument) <0.000115>
16:20:17 readlink("/weirdfs/sammccall/xkb", 0x7fffef991950, 1023) = -1 EINVAL (Invalid argument) <0.000053>
16:20:17 readlink("/weirdfs/sammccall/xkb/repo", 0x7fffef991950, 1023) = -1 EINVAL (Invalid argument) <0.000129>
16:20:17 readlink("/weirdfs/sammccall/xkb/repo/experimental", 0x7fffef991950, 1023) = -1 EINVAL (Invalid argument) <0.000115>
16:20:17 readlink("/weirdfs/sammccall/xkb/repo/experimental/sammccall", 0x7fffef991950, 1023) = -1 EINVAL (Invalid argument) <0.000120>
16:20:17 readlink("/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar", 0x7fffef991950, 1023) = -1 EINVAL (Invalid argument) <0.000120>
16:20:17 readlink("/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx", 0x7fffef991950, 1023) = -1 EINVAL (Invalid argument) <0.000048>
16:20:17 readlink("/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx/cxx.bnf", 0x7fffef991950, 1023) = -1 EINVAL (Invalid argument) <0.000121>
16:20:17 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx/cxx.bnf", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0664, stx_size=31436, ...}) = 0 <0.000125>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx/cxx.bnf", O_RDONLY|O_CLOEXEC) = 10 <0.001305>
16:20:17 read(10, "# Omitted for now:\n# - attribute"..., 8192) = 8192 <0.000214>
16:20:17 read(10, "unary-expression := ALIGNOF ( ty"..., 8192) = 8192 <0.000024>
16:20:17 read(10, "pecifier\ntype-specifier := typen"..., 8192) = 8192 <0.000121>
16:20:17 read(10, ":= import-keyword header-name\ngl"..., 8192) = 6860 <0.000016>
16:20:17 read(10, "", 8192)             = 0 <0.000012>
16:20:17 close(10)                      = 0 <0.000139>
16:20:17 readlink("/weirdfs", 0x7fffef991690, 1023) = -1 EINVAL (Invalid argument) <0.000049>
16:20:17 readlink("/weirdfs/sammccall", 0x7fffef991690, 1023) = -1 EINVAL (Invalid argument) <0.000103>
16:20:17 readlink("/weirdfs/sammccall/xkb", 0x7fffef991690, 1023) = -1 EINVAL (Invalid argument) <0.000118>
16:20:17 readlink("/weirdfs/sammccall/xkb/repo", 0x7fffef991690, 1023) = -1 EINVAL (Invalid argument) <0.000109>
16:20:17 readlink("/weirdfs/sammccall/xkb/repo/experimental", 0x7fffef991690, 1023) = -1 EINVAL (Invalid argument) <0.000101>
16:20:17 readlink("/weirdfs/sammccall/xkb/repo/experimental/sammccall", 0x7fffef991690, 1023) = -1 EINVAL (Invalid argument) <0.000059>
16:20:17 readlink("/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar", 0x7fffef991690, 1023) = -1 EINVAL (Invalid argument) <0.000115>
16:20:17 readlink("/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx", 0x7fffef991690, 1023) = -1 EINVAL (Invalid argument) <0.000108>
16:20:17 readlink("/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx/cxx.bnf", 0x7fffef991690, 1023) = -1 EINVAL (Invalid argument) <0.000208>
16:20:17 brk(0x55927cecc000)            = 0x55927cecc000 <0.000044>
16:20:17 getcwd("/weirdfs/sammccall/xkb/repo", 512) = 40 <0.000039>
16:20:17 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000331>
16:20:17 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000095>
16:20:17 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000131>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx/commondir", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000198>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000184>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000174>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx/tags/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000191>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx/heads/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000215>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx/remotes/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000181>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx/refs/remotes/HEAD/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000174>
16:20:17 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7fffef9903b0) = -1 ENOENT (No such file or directory) <0.000192>
16:20:17 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000088>
16:20:17 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000113>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/commondir", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000158>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000133>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000201>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/tags/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000179>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/heads/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000157>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/remotes/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000149>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/refs/remotes/HEAD/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000166>
16:20:17 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7fffef9903b0) = -1 ENOENT (No such file or directory) <0.000161>
16:20:17 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000123>
16:20:17 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000120>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/commondir", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000161>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000186>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000171>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/tags/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000175>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/heads/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000153>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/remotes/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000168>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/refs/remotes/HEAD/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000162>
16:20:17 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7fffef9903b0) = -1 ENOENT (No such file or directory) <0.000215>
16:20:17 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000132>
16:20:17 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000100>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/commondir", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000158>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000152>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000167>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/tags/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000162>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/heads/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000179>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/remotes/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000144>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/refs/remotes/HEAD/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000170>
16:20:17 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7fffef9903b0) = -1 ENOENT (No such file or directory) <0.000156>
16:20:17 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000184>
16:20:17 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000095>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/commondir", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000137>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000220>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000165>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/tags/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000172>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/heads/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000162>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/remotes/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000126>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/refs/remotes/HEAD/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000189>
16:20:17 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7fffef9903b0) = -1 ENOENT (No such file or directory) <0.000173>
16:20:17 statx(AT_FDCWD, "/weirdfs/sammccall/xkb", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000118>
16:20:17 statx(AT_FDCWD, "/weirdfs/sammccall/xkb", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000121>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/commondir", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000148>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000153>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000156>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/tags/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000152>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/heads/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000150>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/remotes/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000172>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/refs/remotes/HEAD/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000156>
16:20:17 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7fffef9903b0) = -1 ENOENT (No such file or directory) <0.000163>
16:20:17 statx(AT_FDCWD, "/weirdfs/sammccall", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000112>
16:20:17 statx(AT_FDCWD, "/weirdfs/sammccall", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000110>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/commondir", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.191226>
16:20:17 openat(AT_FDCWD, "/weirdfs/sammccall/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.191615>
16:20:18 openat(AT_FDCWD, "/weirdfs/sammccall/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.191353>
16:20:18 openat(AT_FDCWD, "/weirdfs/sammccall/tags/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.191550>
16:20:18 openat(AT_FDCWD, "/weirdfs/sammccall/heads/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.193934>
16:20:18 openat(AT_FDCWD, "/weirdfs/sammccall/remotes/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.191565>
16:20:18 openat(AT_FDCWD, "/weirdfs/sammccall/refs/remotes/HEAD/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.191614>
16:20:19 statx(AT_FDCWD, "/weirdfs/sammccall/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7fffef9903b0) = -1 ENOENT (No such file or directory) <0.000190>
16:20:19 statx(AT_FDCWD, "/weirdfs", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0777, stx_size=0, ...}) = 0 <0.000154>
16:20:19 statx(AT_FDCWD, "/weirdfs", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0777, stx_size=0, ...}) = 0 <0.000227>
16:20:19 openat(AT_FDCWD, "/weirdfs/commondir", O_RDONLY|O_CLOEXEC) = 10 <0.000450>
16:20:19 statx(10, "", AT_STATX_SYNC_AS_STAT|AT_EMPTY_PATH, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000136>
16:20:19 statx(10, "", AT_STATX_SYNC_AS_STAT|AT_EMPTY_PATH, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000164>
16:20:19 lseek(10, 0, SEEK_CUR)         = 0 <0.000022>
16:20:19 read(10, 0x55927ce717b0, 512)  = -1 EISDIR (Is a directory) <0.000021>
16:20:19 close(10)                      = 0 <0.000028>
16:20:19 openat(AT_FDCWD, "/weirdfs/HEAD", O_RDONLY|O_CLOEXEC) = 10 <0.000294>
16:20:19 statx(10, "", AT_STATX_SYNC_AS_STAT|AT_EMPTY_PATH, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000128>
16:20:19 lseek(10, 0, SEEK_CUR)         = 0 <0.000022>
16:20:19 read(10, 0x55927ce84710, 128)  = -1 EISDIR (Is a directory) <0.000021>
16:20:19 statx(AT_FDCWD, "/weirdfs/HEAD", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000124>
16:20:19 close(10)                      = 0 <0.000023>
16:20:19 openat(AT_FDCWD, "/weirdfs/HEAD", O_RDONLY|O_CLOEXEC) = 10 <0.000208>
16:20:19 statx(10, "", AT_STATX_SYNC_AS_STAT|AT_EMPTY_PATH, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000142>
16:20:19 lseek(10, 0, SEEK_CUR)         = 0 <0.000021>
16:20:19 read(10, 0x55927ce84710, 128)  = -1 EISDIR (Is a directory) <0.000019>
16:20:19 statx(AT_FDCWD, "/weirdfs/HEAD", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000124>
16:20:19 close(10)                      = 0 <0.000024>
16:20:19 openat(AT_FDCWD, "/weirdfs/tags/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.301772>
16:20:19 openat(AT_FDCWD, "/weirdfs/heads/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.428781>
16:20:19 openat(AT_FDCWD, "/weirdfs/remotes/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.296646>
16:20:20 openat(AT_FDCWD, "/weirdfs/refs/remotes/HEAD/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.298887>
16:20:20 statx(AT_FDCWD, "/weirdfs/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7fffef9903b0) = -1 ENOENT (No such file or directory) <0.000182>
16:20:20 statx(AT_FDCWD, "/etc/localtime", AT_STATX_SYNC_AS_STAT|AT_SYMLINK_NOFOLLOW, STATX_ALL, {stx_mask=STATX_ALL|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFLNK|0777, stx_size=33, ...}) = 0 <0.000026>
16:20:20 write(9, "2023-04-24T16:20:20.405 helix_vc"..., 292) = 292 <0.000048>
16:20:20 write(9, "2023-04-24T16:20:20.406 helix_vc"..., 154) = 154 <0.000026>
16:20:20 getcwd("/weirdfs/sammccall/xkb/repo", 512) = 40 <0.000023>
16:20:20 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.001493>
16:20:20 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000165>
16:20:20 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000134>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx/commondir", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000185>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000226>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000204>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx/tags/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000188>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx/heads/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000170>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx/remotes/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000166>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx/refs/remotes/HEAD/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000197>
16:20:20 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/cxx/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7fffef9903a0) = -1 ENOENT (No such file or directory) <0.000167>
16:20:20 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000128>
16:20:20 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000155>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/commondir", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000170>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000165>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000164>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/tags/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000172>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/heads/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000167>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/remotes/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000164>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/refs/remotes/HEAD/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000170>
16:20:20 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/grammar/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7fffef9903a0) = -1 ENOENT (No such file or directory) <0.000208>
16:20:20 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000090>
16:20:20 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000131>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/commondir", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000165>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000179>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000182>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/tags/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000187>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/heads/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000152>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/remotes/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000170>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/refs/remotes/HEAD/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000152>
16:20:20 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/sammccall/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7fffef9903a0) = -1 ENOENT (No such file or directory) <0.000172>
16:20:20 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000138>
16:20:20 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000147>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/commondir", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000184>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000165>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000176>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/tags/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000164>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/heads/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000147>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/remotes/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000156>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/refs/remotes/HEAD/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000104>
16:20:20 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/experimental/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7fffef9903a0) = -1 ENOENT (No such file or directory) <0.000165>
16:20:20 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000108>
16:20:20 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000131>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/commondir", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000158>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000153>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000174>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/tags/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000176>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/heads/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000161>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/remotes/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000149>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/refs/remotes/HEAD/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000166>
16:20:20 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/repo/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7fffef9903a0) = -1 ENOENT (No such file or directory) <0.000183>
16:20:20 statx(AT_FDCWD, "/weirdfs/sammccall/xkb", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000123>
16:20:20 statx(AT_FDCWD, "/weirdfs/sammccall/xkb", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000156>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/commondir", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000161>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000125>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000174>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/tags/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000163>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/heads/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000146>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/remotes/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000147>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/xkb/refs/remotes/HEAD/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000137>
16:20:20 statx(AT_FDCWD, "/weirdfs/sammccall/xkb/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7fffef9903a0) = -1 ENOENT (No such file or directory) <0.000197>
16:20:20 statx(AT_FDCWD, "/weirdfs/sammccall", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000108>
16:20:20 statx(AT_FDCWD, "/weirdfs/sammccall", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000131>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/commondir", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.368557>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.192890>
16:20:20 openat(AT_FDCWD, "/weirdfs/sammccall/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.193549>
16:20:21 openat(AT_FDCWD, "/weirdfs/sammccall/tags/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.191203>
16:20:21 openat(AT_FDCWD, "/weirdfs/sammccall/heads/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.194199>
16:20:21 openat(AT_FDCWD, "/weirdfs/sammccall/remotes/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.191563>
16:20:21 openat(AT_FDCWD, "/weirdfs/sammccall/refs/remotes/HEAD/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.192426>
16:20:21 statx(AT_FDCWD, "/weirdfs/sammccall/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7fffef9903a0) = -1 ENOENT (No such file or directory) <0.000183>
16:20:21 statx(AT_FDCWD, "/weirdfs", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0777, stx_size=0, ...}) = 0 <0.000189>
16:20:21 statx(AT_FDCWD, "/weirdfs", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0777, stx_size=0, ...}) = 0 <0.000165>
16:20:21 openat(AT_FDCWD, "/weirdfs/commondir", O_RDONLY|O_CLOEXEC) = 10 <0.000445>
16:20:21 statx(10, "", AT_STATX_SYNC_AS_STAT|AT_EMPTY_PATH, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000130>
16:20:21 statx(10, "", AT_STATX_SYNC_AS_STAT|AT_EMPTY_PATH, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000150>
16:20:21 lseek(10, 0, SEEK_CUR)         = 0 <0.000019>
16:20:21 read(10, 0x55927ccb5e80, 512)  = -1 EISDIR (Is a directory) <0.000024>
16:20:21 close(10)                      = 0 <0.000025>
16:20:21 openat(AT_FDCWD, "/weirdfs/HEAD", O_RDONLY|O_CLOEXEC) = 10 <0.000317>
16:20:21 statx(10, "", AT_STATX_SYNC_AS_STAT|AT_EMPTY_PATH, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000132>
16:20:21 lseek(10, 0, SEEK_CUR)         = 0 <0.000019>
16:20:21 read(10, 0x55927ce84710, 128)  = -1 EISDIR (Is a directory) <0.000019>
16:20:21 statx(AT_FDCWD, "/weirdfs/HEAD", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000128>
16:20:21 close(10)                      = 0 <0.000022>
16:20:21 openat(AT_FDCWD, "/weirdfs/HEAD", O_RDONLY|O_CLOEXEC) = 10 <0.000182>
16:20:21 statx(10, "", AT_STATX_SYNC_AS_STAT|AT_EMPTY_PATH, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000130>
16:20:21 lseek(10, 0, SEEK_CUR)         = 0 <0.000023>
16:20:21 read(10, 0x55927ce84710, 128)  = -1 EISDIR (Is a directory) <0.000031>
16:20:21 statx(AT_FDCWD, "/weirdfs/HEAD", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000121>
16:20:21 close(10)                      = 0 <0.000023>
16:20:21 openat(AT_FDCWD, "/weirdfs/tags/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.300257>
16:20:22 openat(AT_FDCWD, "/weirdfs/heads/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.351909>
16:20:22 openat(AT_FDCWD, "/weirdfs/remotes/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.445647>
16:20:23 openat(AT_FDCWD, "/weirdfs/refs/remotes/HEAD/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.310794>
16:20:23 statx(AT_FDCWD, "/weirdfs/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7fffef9903a0) = -1 ENOENT (No such file or directory) <0.000500>
16:20:23 statx(AT_FDCWD, "/etc/localtime", AT_STATX_SYNC_AS_STAT|AT_SYMLINK_NOFOLLOW, STATX_ALL, {stx_mask=STATX_ALL|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFLNK|0777, stx_size=33, ...}) = 0 <0.000042>
16:20:23 write(9, "2023-04-24T16:20:23.364 helix_vc"..., 292) = 292 <0.000047>
16:20:23 write(9, "2023-04-24T16:20:23.365 helix_vc"..., 164) = 164 <0.000025>
16:20:23 socketpair(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0, [10, 11]) = 0 <0.000054>
@sam-mccall sam-mccall added the C-enhancement Category: Improvements label Apr 24, 2023
@sam-mccall
Copy link
Contributor Author

I'd really like to be able to use helix out-of-the-box in arbitrary environments, so if fundamental operations like opening a file are going to probe the FS it would be nice to do it in a non-blocking and resilient way.
(To some extent this includes interactive :o, which is #6114).

That said, being able to disable probing behavior on certain paths would definitely work for my use case, and being able to disable it entirely would be better than nothing.

Finally, it seems surprising that it has to probe so many suffixes - if this was just probing one suffix it would be a lot less painful.

@archseer
Copy link
Member

I think our detection algorithm comes straight from gix (plus we search recursively in parent folders)

@archseer
Copy link
Member

@pascalkuthe it seems to me that polling for HEAD in current dir, heads/HEAD etc would be an edge case though, in 99% of cases there will be a .git subdirectory. We don't care about bare repositories

@pascalkuthe
Copy link
Member

I don't think gitoxide will want to add a "cropped" version of the repo detection algorithm (and I personally do use bare repos for working on helix). think the real fix is to just make this run async (maybe with a timeout). I wanted to do that anyway once we have file watching.

@archseer
Copy link
Member

Do we need the gitoxide algorithm though? Scanning for .git should cover most cases

@pascalkuthe
Copy link
Member

You can just open a repo directly but I am not sure if that works with detached worktrees (which are somewhat commonly used). I can try to optimize this. What we do right now is the same a call to the git CLI would do.

I would assume that recursive .git scan would still be slow on such a slow fs tough (since .git wouldn't exist most of the time) so doing this scan async and eventually caching the workspace/.git lookup (we do the workspace detection everytime we start an lsp, open the file picker or open file) will probably improve things much more. I wanted to cache git repos anyway.

@sam-mccall
Copy link
Contributor Author

sam-mccall commented Apr 25, 2023

FWIW I ran an strace on git status in the same dir. It looks at [.git, .git/HEAD, HEAD] relative to ancestors, so 3 paths instead of 8.
git also uses newfstatat instead of openat, and stats the ancestor directory itself. Neither of these matter in this case at least.

(As it happens, only the stat of /weirdfs/sammccall/HEAD is slow, so overall latency is <300ms. I suspect the FS has some special handling and knows quickly that .git is not a valid username or workspace name! This quirk isn't worth worrying about, other than the idea that doing exactly what git does is probably going to work well, because someone will have tested it).

All the ideas mentioned (async, caching, fewer lookups) sound like they would help a lot.

@pascalkuthe
Copy link
Member

Rust has no ergonomic interface for calling fstatat so that's pretty hard to change and probably not worth doing judt for the directory lookup. Not sure about looking at more directories that's probably intentional.

Cc @Byron

@Byron
Copy link
Contributor

Byron commented Apr 26, 2023

Thanks for letting me chime in! gitoxide's detection algorithm should not probe files unnecessarily, nor should it ultimately be slower than what git does. helix uses discover to find the containing git repository, and that should really be fast. Something that I found odd was seeing refs/remotes/HEAD/HEAD probed, and maybe all of this points to gitoxide needing to improve in that realm.

Maybe you can compare the straces of gix exclude query file with git check-ignore -vn file. Then we'd see if gix does too much and I would have a little more to go by. I'd also run this on my VM, but I'd love to see how things work in your particular setup.

Thanks for your help, it's much appreciated 🙏.

@sam-mccall
Copy link
Contributor Author

Thanks @Byron!
Results are similar to what I saw through invoking hx and git above: gix checks 8 suffixes (including HEAD twice), git checks 3.

git check-ignore -vn cxx.bnf (32 stats, ~0.2s)
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/clean/repo/experimental/sammccall/grammar/cxx", {st_mode=S_IFDIR|0775, st_size=0, ...}, 0) = 0 <0.000881>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/clean/repo/experimental/sammccall/grammar/cxx/.git", 0x7fffe4739260, 0) = -1 ENOENT (No such file or directory) <0.067965>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/clean/repo/experimental/sammccall/grammar/cxx/.git/HEAD", 0x7fffe4739120, AT_SYMLINK_NOFOLLOW) = -1 ENOENT (No such file or directory) <0.000308>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/clean/repo/experimental/sammccall/grammar/cxx/HEAD", 0x7fffe4739120, AT_SYMLINK_NOFOLLOW) = -1 ENOENT (No such file or directory) <0.000206>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/clean/repo/experimental/sammccall/grammar", {st_mode=S_IFDIR|0775, st_size=0, ...}, 0) = 0 <0.000137>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/clean/repo/experimental/sammccall/grammar/.git", 0x7fffe4739260, 0) = -1 ENOENT (No such file or directory) <0.000268>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/clean/repo/experimental/sammccall/grammar/.git/HEAD", 0x7fffe4739120, AT_SYMLINK_NOFOLLOW) = -1 ENOENT (No such file or directory) <0.000143>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/clean/repo/experimental/sammccall/grammar/HEAD", 0x7fffe4739120, AT_SYMLINK_NOFOLLOW) = -1 ENOENT (No such file or directory) <0.000168>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/clean/repo/experimental/sammccall", {st_mode=S_IFDIR|0775, st_size=0, ...}, 0) = 0 <0.000129>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/clean/repo/experimental/sammccall/.git", 0x7fffe4739260, 0) = -1 ENOENT (No such file or directory) <0.000166>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/clean/repo/experimental/sammccall/.git/HEAD", 0x7fffe4739120, AT_SYMLINK_NOFOLLOW) = -1 ENOENT (No such file or directory) <0.000161>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/clean/repo/experimental/sammccall/HEAD", 0x7fffe4739120, AT_SYMLINK_NOFOLLOW) = -1 ENOENT (No such file or directory) <0.000163>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/clean/repo/experimental", {st_mode=S_IFDIR|0775, st_size=0, ...}, 0) = 0 <0.000126>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/clean/repo/experimental/.git", 0x7fffe4739260, 0) = -1 ENOENT (No such file or directory) <0.000163>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/clean/repo/experimental/.git/HEAD", 0x7fffe4739120, AT_SYMLINK_NOFOLLOW) = -1 ENOENT (No such file or directory) <0.000154>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/clean/repo/experimental/HEAD", 0x7fffe4739120, AT_SYMLINK_NOFOLLOW) = -1 ENOENT (No such file or directory) <0.000126>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/clean/repo", {st_mode=S_IFDIR|0775, st_size=0, ...}, 0) = 0 <0.000118>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/clean/repo/.git", 0x7fffe4739260, 0) = -1 ENOENT (No such file or directory) <0.000161>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/clean/repo/.git/HEAD", 0x7fffe4739120, AT_SYMLINK_NOFOLLOW) = -1 ENOENT (No such file or directory) <0.000158>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/clean/repo/HEAD", 0x7fffe4739120, AT_SYMLINK_NOFOLLOW) = -1 ENOENT (No such file or directory) <0.000166>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/clean", {st_mode=S_IFDIR|0775, st_size=0, ...}, 0) = 0 <0.000119>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/clean/.git", 0x7fffe4739260, 0) = -1 ENOENT (No such file or directory) <0.052788>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/clean/.git/HEAD", 0x7fffe4739120, AT_SYMLINK_NOFOLLOW) = -1 ENOENT (No such file or directory) <0.000299>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/clean/HEAD", 0x7fffe4739120, AT_SYMLINK_NOFOLLOW) = -1 ENOENT (No such file or directory) <0.000230>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall", {st_mode=S_IFDIR|0775, st_size=0, ...}, 0) = 0 <0.000163>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/.git", 0x7fffe4739260, 0) = -1 ENOENT (No such file or directory) <0.000153>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/.git/HEAD", 0x7fffe4739120, AT_SYMLINK_NOFOLLOW) = -1 ENOENT (No such file or directory) <0.000133>
11:28:22 newfstatat(AT_FDCWD, "/weirdfs/sammccall/HEAD", 0x7fffe4739120, AT_SYMLINK_NOFOLLOW) = -1 ENOENT (No such file or directory) <0.209315>
11:28:23 newfstatat(AT_FDCWD, "/weirdfs", {st_mode=S_IFDIR|0777, st_size=0, ...}, 0) = 0 <0.000195>
11:28:23 newfstatat(AT_FDCWD, "/weirdfs/.git", 0x7fffe4739260, 0) = -1 ENOENT (No such file or directory) <0.000108>
11:28:23 newfstatat(AT_FDCWD, "/weirdfs/.git/HEAD", 0x7fffe4739120, AT_SYMLINK_NOFOLLOW) = -1 ENOENT (No such file or directory) <0.000101>
11:28:23 newfstatat(AT_FDCWD, "/weirdfs/HEAD", {st_mode=S_IFDIR|0775, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0 <0.000320>
gix exclude query cxx.bnf (23 stats, 43 opens, ~1.4s)
11:36:34 statx(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/sammccall/grammar", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000880>
11:36:34 statx(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/sammccall/grammar", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000060>
11:36:34 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/sammccall/grammar/commondir", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000168>
11:36:34 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/sammccall/grammar/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000219>
11:36:34 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/sammccall/grammar/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000165>
11:36:34 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/sammccall/grammar/tags/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000260>
11:36:34 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/sammccall/grammar/heads/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000142>
11:36:34 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/sammccall/grammar/remotes/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000151>
11:36:34 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/sammccall/grammar/refs/remotes/HEAD/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000181>
11:36:34 statx(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/sammccall/grammar/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7ffcc17bac10) = -1 ENOENT (No such file or directory) <0.000159>
11:36:34 statx(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/sammccall", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000136>
11:36:34 statx(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/sammccall", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000119>
11:36:34 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/sammccall/commondir", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000161>
11:36:34 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/sammccall/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000119>
11:36:34 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/sammccall/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000176>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/sammccall/tags/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000163>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/sammccall/heads/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000168>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/sammccall/remotes/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000179>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/sammccall/refs/remotes/HEAD/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000170>
11:36:35 statx(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/sammccall/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7ffcc17bac10) = -1 ENOENT (No such file or directory) <0.000180>
11:36:35 statx(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000179>
11:36:35 statx(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000134>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/commondir", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000160>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000125>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000141>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/tags/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000115>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/heads/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000167>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/remotes/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000156>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/refs/remotes/HEAD/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000178>
11:36:35 statx(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/experimental/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7ffcc17bac10) = -1 ENOENT (No such file or directory) <0.000152>
11:36:35 statx(AT_FDCWD, "/weirdfs/sammccall/clean2/repo", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000113>
11:36:35 statx(AT_FDCWD, "/weirdfs/sammccall/clean2/repo", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000075>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/commondir", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000159>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000152>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000155>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/tags/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000147>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/heads/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000136>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/remotes/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000105>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/refs/remotes/HEAD/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000151>
11:36:35 statx(AT_FDCWD, "/weirdfs/sammccall/clean2/repo/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7ffcc17bac10) = -1 ENOENT (No such file or directory) <0.000173>
11:36:35 statx(AT_FDCWD, "/weirdfs/sammccall/clean2", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000113>
11:36:35 statx(AT_FDCWD, "/weirdfs/sammccall/clean2", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000107>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/commondir", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.045372>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000167>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000201>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/tags/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000179>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/heads/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000170>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/remotes/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000162>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/clean2/refs/remotes/HEAD/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000157>
11:36:35 statx(AT_FDCWD, "/weirdfs/sammccall/clean2/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7ffcc17bac10) = -1 ENOENT (No such file or directory) <0.000119>
11:36:35 statx(AT_FDCWD, "/weirdfs/sammccall", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000134>
11:36:35 statx(AT_FDCWD, "/weirdfs/sammccall", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0775, stx_size=0, ...}) = 0 <0.000115>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/commondir", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.208847>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.190773>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.192313>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/tags/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.195357>
11:36:35 openat(AT_FDCWD, "/weirdfs/sammccall/heads/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.192372>
11:36:36 openat(AT_FDCWD, "/weirdfs/sammccall/remotes/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.193387>
11:36:36 openat(AT_FDCWD, "/weirdfs/sammccall/refs/remotes/HEAD/HEAD", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.192397>
11:36:36 statx(AT_FDCWD, "/weirdfs/sammccall/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7ffcc17bac10) = -1 ENOENT (No such file or directory) <0.000239>
11:36:36 statx(AT_FDCWD, "/weirdfs", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0777, stx_size=0, ...}) = 0 <0.000191>
11:36:36 statx(AT_FDCWD, "/weirdfs", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0777, stx_size=0, ...}) = 0 <0.000151>
11:36:36 openat(AT_FDCWD, "/weirdfs/commondir", O_RDONLY|O_CLOEXEC) = 3 <0.000377>

(Random aside: git could be faster here too, it appears to check .git/HEAD even after .git doesn't exist)

@pascalkuthe
Copy link
Member

@sam-mccall #6882 should reduce the stat calls by a decent amount. I still want to cache repos/do that async but that's more work

@Byron
Copy link
Contributor

Byron commented Apr 26, 2023

Thanks so much @sam-mccall !

Would it be possible for you to try this PR and share the stat calls?

I also tried it myself and got this:

statx(AT_FDCWD, ".", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_ALL|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0755, stx_size=4096, ...}) = 0
statx(AT_FDCWD, "./.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0xffffc044cf50) = -1 ENOENT (No such file or directory)
statx(0, NULL, AT_STATX_SYNC_AS_STAT, STATX_ALL, NULL) = -1 EFAULT (Bad address)
statx(AT_FDCWD, "./HEAD", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0xffffc044c790) = -1 ENOENT (No such file or directory)
statx(AT_FDCWD, "/home/parallels", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_ALL|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0755, stx_size=4096, ...}) = 0
statx(AT_FDCWD, "/home/parallels/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0xffffc044cf50) = -1 ENOENT (No such file or directory)
statx(AT_FDCWD, "/home/parallels/HEAD", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0xffffc044c790) = -1 ENOENT (No such file or directory)
statx(AT_FDCWD, "/home", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_ALL|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0755, stx_size=4096, ...}) = 0
statx(AT_FDCWD, "/home/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0xffffc044cf50) = -1 ENOENT (No such file or directory)
statx(AT_FDCWD, "/home/HEAD", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0xffffc044c790) = -1 ENOENT (No such file or directory)
statx(AT_FDCWD, "/", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_ALL|STATX_MNT_ID, stx_attributes=STATX_ATTR_MOUNT_ROOT, stx_mode=S_IFDIR|0755, stx_size=4096, ...}) = 0
statx(AT_FDCWD, "/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0xffffc044cf50) = -1 ENOENT (No such file or directory)
statx(AT_FDCWD, "/HEAD", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0xffffc044c790) = -1 ENOENT (No such file or directory)

I think that should be the optimal search sequence for a universal search that supports bare repo discovery :).

@Byron
Copy link
Contributor

Byron commented Apr 26, 2023

And for good measure, I have added an option just for helix and applications like it that will only find repos with worktree, which changes the search pattern to this:

statx(AT_FDCWD, ".", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_ALL|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0755, stx_size=4096, ...}) = 0
statx(AT_FDCWD, "./.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0xffffc012e300) = -1 ENOENT (No such file or directory)
statx(0, NULL, AT_STATX_SYNC_AS_STAT, STATX_ALL, NULL) = -1 EFAULT (Bad address)
statx(AT_FDCWD, "/home/parallels/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0xffffc012e300) = -1 ENOENT (No such file or directory)
statx(AT_FDCWD, "/home/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0xffffc012e300) = -1 ENOENT (No such file or directory)
statx(AT_FDCWD, "/.git", AT_STATX_SYNC_AS_STAT, STATX_ALL, 0xffffc012e300) = -1 ENOENT (No such file or directory)
Error: Could not find a git repository in '.' or in any of its parents

5 stats compared to 12 stats! Wow - unexpected!

Byron added a commit to Byron/starship that referenced this issue Apr 26, 2023
Please note that there is a new `dot_git_only` option which would further
speedup discovery. On even moderatly fast disks that probably not going
to make a difference, but it will on incredibly slow (networked) disks.

See helix-editor/helix#6867 for reference.
@Byron
Copy link
Contributor

Byron commented Apr 26, 2023

@sam-mccall You can now test this via #6890 and I am very curious about the results :). Thanks for sharing.

Byron added a commit to o2sh/onefetch that referenced this issue Apr 26, 2023
…o discovery.

As `onefetch` only cares about bare repositories, we now optimize discovery
to only find those, and do so much faster. This may play a role on very
slow filesystems.

See helix-editor/helix#6867 for reference.
o2sh pushed a commit to o2sh/onefetch that referenced this issue Apr 26, 2023
* Switch from `git-features` to `gix-features`

* upgrade `gitoxide` to v0.44 for native shallow support and faster repo discovery.

As `onefetch` only cares about bare repositories, we now optimize discovery
to only find those, and do so much faster. This may play a role on very
slow filesystems.

See helix-editor/helix#6867 for reference.

---------

Co-authored-by: Spenser Black <spenserblack01@gmail.com>
@archseer
Copy link
Member

Leaving this issue open until we verify

@archseer archseer reopened this Apr 27, 2023
@archseer
Copy link
Member

Also @Byron thanks for the quick patch! ❤️

@sam-mccall
Copy link
Contributor Author

Wow, thanks so much for the quick patch!

I can confirm I only see stats of .git directories now, and most importantly, opening files is really fast!

Zooming out a bit, on startup of hx some/path, I do see this scan happening twice (which would be fixed by caching I guess), and also a scan for [.git, .helix] which also runs twice. On my FS none of these operations are slow (I managed to find the code - it won't try to look up any workspaces with . in the name), so I'm very happy to call this fixed. OTOH, certainly happy to provide logs if it's still interesting.

@sam-mccall
Copy link
Contributor Author

Oh and because real numbers are more fun!

Time from start (execve(hx...)) until the first file content gets written to screen:
Before: 5.9s
After: 0.12s

I'm going to go open some more files now :-)

@pascalkuthe
Copy link
Member

The second scan is because we are looking for the workspace root when you press <space>f.

Byron added a commit to Byron/starship that referenced this issue Apr 27, 2023
Please note that there is a new `dot_git_only` option which would further
speedup discovery. On even moderatly fast disks that probably not going
to make a difference, but it will on incredibly slow (networked) disks.

See helix-editor/helix#6867 for reference.
andytom pushed a commit to starship/starship that referenced this issue Apr 27, 2023
…uring discovery (#5141)

upgrade gitoxide to v0.44 for performance improvements during discovery

Please note that there is a new `dot_git_only` option which would further
speedup discovery. On even moderatly fast disks that probably not going
to make a difference, but it will on incredibly slow (networked) disks.

See helix-editor/helix#6867 for reference.
@pascalkuthe
Copy link
Member

I think we can close this now. The performance problems have been confirmed to be (mostly) solved and the stat calls reduced as much as possible. I still want too look into caching/making this async but that's a larger effort that is required for other featured and already tracked in other issues anyway

Indyandie pushed a commit to Indyandie/starship that referenced this issue Jul 26, 2023
…uring discovery (starship#5141)

upgrade gitoxide to v0.44 for performance improvements during discovery

Please note that there is a new `dot_git_only` option which would further
speedup discovery. On even moderatly fast disks that probably not going
to make a difference, but it will on incredibly slow (networked) disks.

See helix-editor/helix#6867 for reference.
chipbuster pushed a commit to starship/starship that referenced this issue Sep 1, 2023
* build(deps): update clap crates

* build(deps): update rust crate notify-rust to 4.7.1

* build(deps): update rust crate shadow-rs to 0.20.1

* build(deps): update rust crate git-features to 0.26.5

* build(deps): update rust crate notify-rust to 4.8.0

* docs(kubernetes): Remove extra backspace from regex in example (#4905)

Remove extra backspace from regex in example

In the example, `[\\w-]` would match a literal backspace `\`, the
character `w` or a dash `-`. By removing the backspace, instead it
matches any "word character" `\w` or a dash `-`.

* docs(i18n): new Crowdin updates (#4877)

* chore: use updated gitoxide crate names (#4913)

* build(deps): update rust crate gix to 0.37.1

* build(deps): update rust crate toml_edit to 0.19.4

* docs(install): update nushell instructions in installation script (#4921)

Improve Nushell installation instruction

Consistently use `save -f` rather than `save`; the latter fails if the
file already exists

Signed-off-by: Michel Alexandre Salim <michel@michel-slm.name>

* build(deps): update rust crate clap_complete to 4.1.3

* build(deps): update rust crate gix to 0.37.2

* docs(i18n): new Crowdin updates (#4925)

* chore(master): release 1.13.0 (#4730)

* build(deps): update rust crate tempfile to 3.4.0

* fix: trigger release

* chore(master): release 1.13.1 (#4937)

* ci: set Node version for docs build

* ci: allow docs to be manually published via workflow_dispatch

* ci: remove unneeded dependency in publish job

* ci: add caching for docs publishing step

* build(deps): update rust crate schemars to 0.8.12

* build(deps): update dprint plugins

* build(deps): update rust crate shadow-rs to 0.21.0

* build(deps): update clap crates

* feat(release): handle chocolatey starship.portable and starship.install pkg publishing (#4723)

Handles starship.install (MSI installer) and starship.portable and makes starship an 
empty meta-package that only depends on starship.install. MSI/installer packages 
seem to be preferred over zip-based installers on chocolatey. Proper virtual packages 
that allow choosing either a portable or install variant aren't implemented in chocolatey yet.

* ci: replace `audit` with `deny` action (#4856)

* build(deps): update rust crate clap to 4.1.8

* build(deps): update gitoxide crates

* ci: use `reviewdog/action-suggester` for config-schema check (#4857)

* ci: use `reviewdog/action-suggester` for config-schema check

* increase workflow permissions

* fix(preset): add output-flag to avoid encoding issues (#4926)

* build(deps): update rust crate rayon to 1.7.0

* build(deps): update gitoxide crates

* build(deps): update pest crates to 2.5.6

* build(deps): update rust crate serde_json to 1.0.94

* build(deps): update npm to ^1.9.9

* build(deps): update rust crate open to 3.4.0

* docs(character): use updated `vimcmd_symbol` instead of older `vicmd_symbol` variant (#4960)

Fix typo in character example

* build(deps): update rust crate serde to 1.0.153

* docs(install): fix typo and update indentation and whitespaces (#4941)

* build(deps): update rust crate serde to 1.0.154

* build(deps): update rust crate gix to 0.40.0

* chore: fix clippy warnings for rust 1.68 (#4983)

* fix(init): avoid cygpath for starship binary path (#4970)

Update mod.rs

* build(deps): update rust crate open to v4 (#4982)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* build(deps): update rust crate toml_edit to 0.19.5

* build(deps): update rust crate gix to 0.41.0 (#4984)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* build(deps): update rust crate serde to 1.0.155

* build(deps): update rust crate chrono to 0.4.24

* build(deps): update rust crate semver to 1.0.17

* build(deps): update rust crate quick-xml to 0.28.0

* Update sponsors

* build(deps): update toml crates

* build(deps): update rust crate nu-ansi-term to 0.47.0

* build(deps): update rust crate windows to 0.46.0

* build(deps): update rust crate serde to 1.0.156

* docs(preset): Add `hostname.ssh_symbol` to nerd font preset (#4991)

docs(preset): Add missing ssh_symbol in nerd font

* fix(fossil_branch): fossil checkout database file name on windows (#4978)

fix(fossil_branch): use proper fossil checkout database file name on windows

* build(deps): update gitoxide crates

* build(deps): update rust crate toml_edit to 0.19.7

* build(deps): update clap crates

* build(deps): update rust crate serde to 1.0.157

* build(deps): update rust crate quick-xml to 0.28.1

* build(deps): update rust crate clap to 4.1.11

* docs(preset): add missing config for Java to no-runtime-version (#5011)

docs(preset): add missing Java to no-runtime-version

* build(deps): update rust crate serde to 1.0.158

* feat(aws): Adds support for AWS_CREDENTIAL_EXPIRATION environment variable (#5002)

feat(aws): supports AWS_CREDENTIAL_EXPIRATION environment variable

Adds support for the AWS_CREDENTIAL_EXPIRATION environment variable
which was adopted as the standard way to set the expiration for
temporary credentials. The existing AWS_SESSION_EXPIRATION environment
variable is not dropped for backwards compatibility.

See aws/aws-cli#7398

* build(deps): update rust crate open to 4.0.1

* build(deps): update rust crate regex to 1.7.2

* chore: add spell checker to workflows (#4975)

* chore: add spell checker to workflows

* fix: update config schema

* fix: revert for fennel.rs

* build(deps): update rust crate toml_edit to 0.19.8

* build(deps): update crate-ci/typos action to v1.14.3

* build(deps): update rust crate clap to 4.1.13

* build(deps): update embarkstudios/cargo-deny-action action to v1.5.0

* build(deps): update rust crate gix to 0.43.0

* fix(gradle): add support for unstable Gradle versions (#5021)

* build(deps): update rust crate serde_json to 1.0.95

* docs: Update nerd-font-symbols.toml pop_os! symbol (#5017)

Update nerd-font-symbols.toml

Use the specific pop_os! nerd symbol instead of the generic lollipop

* build(deps): update clap crates

* build(deps): update rust crate regex to 1.7.3

* build(deps): update rust crate serde to 1.0.159

* build(deps): update rust crate indexmap to 1.9.3

* build(deps): update clap crates to 4.2.0

* build(deps): update rust crate tempfile to 3.5.0

* build(deps): update rust crate windows to 0.47.0

* build(deps): update rust crate clap to 4.2.1

* build(deps): update rust crate gix to 0.43.1

* build(deps): update rust crate windows to 0.48.0

* fix(pulumi): Fix formatting on pulumi module when using version (#5038)

Fix formatting on pulumi module when using version

Sanitize `pulumi version` output to remove leading 'v' character and trailing
newlines.

* feat(fossil): detection of Fossil check-outs in subdirectories (#4910)

* Move PathExt::device_id() outside modules module

* Add upwards_sibling_scan-function

* Fix Fossil check-out detection in subdirectories

* Use shared upwards scanning function in hg_branch

* Let the caller specify if they're looking for a file or a folder

* fix merge

---------

Co-authored-by: David Knaack <davidkna@users.noreply.github.com>

* feat(aws): add support for source_profile (#4859)

feat(aws): add support for source_profile (#3834)

Co-authored-by:	@luiscamaral

* feat(custom): add option to check if pwd is in a repo (#4822)

* feat(custom): add option to check if pwd is in a repo

* Apply suggestions from code review

Co-authored-by: David Knaack <davidkna@users.noreply.github.com>

* change whenrepo to require_repo

* chore: fix doc formatting

---------

Co-authored-by: David Knaack <davidkna@users.noreply.github.com>

* build(deps): update rust crate terminal_size to 0.2.6

* build(deps): update rust crate process_control to 4.0.3 (#5046)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* build(deps): update pest crates to 2.5.7 (#5043)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* build(deps): update crate-ci/typos action to v1.14.4

* docs(presets): add azure and gcloud default symbols to plaintext preset (#5040)

* chore(nu): use updated closure syntax (#5054)

Update starship.nu to conform to Nushell changes

Nushell recently made a change to require that all closures have an explicit parameter list, even if it's empty, in nushell/nushell#8290.

This updates starship.nu to conform to this requirement.

I have casually tested this against both the latest released version of Nushell, and the latest version on HEAD; the changed code works well (for me) on both.

* build(deps): update crate-ci/typos action to v1.14.5

* build(deps): update embarkstudios/cargo-deny-action action to v1.5.1

* fix(java): wrong version number when using Android Studio JDK (#4966)

The regular expression would get the revision number found in:

    with gcc Android (7284624, based on r416183b)

so it would print "7284624".

* build(deps): update dprint plugins

* build(deps): update rust crate os_info to 3.7.0 (#5057)

* build(deps): update rust crate os_info to 3.7.0

* add new os symbols

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* docs(i18n): new Crowdin updates (#4956)

* chore(master): release 1.14.0 (#4948)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix: trigger release

* fix: bootstrap manifest for release-please (#5087)

* fix: update the release-please manifest

* chore: fix release-please-manifest version

* ci: Revert "fix: bootstrap manifest for release-please (#5087)"

This reverts commit e392d14.

* chore(master): release 1.14.1 (#5090)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* ci: add missing GH token to doc publishing flow

* build(deps): update rust crate serde to 1.0.160

* docs: update snap instructions (#5007)

As part of #4954, non-edge packages of Starship were removed from Snapcraft. This means the only way to install Starship is through the `edge` channel using `snap install --edge starship`.

* fix(git_commit): resolve panic on 32-bit targets (#5095)

* chore(choco): remove chocolatey dependency (#5078)

* docs(i18n): new Crowdin updates (#5093)

* New translations README.md (Ukrainian)

* New translations README.md (Ukrainian)

* New translations README.md (Ukrainian)

* New translations README.md (Ukrainian)

* New translations README.md (Ukrainian)

* New translations README.md (Ukrainian)

* New translations tokyo-night.md (Ukrainian)

* New translations README.md (Ukrainian)

* New translations README.md (Ukrainian)

* New translations README.md (Ukrainian)

* New translations README.md (Ukrainian)

* New translations README.md (Ukrainian)

* New translations README.md (Ukrainian)

* New translations README.md (Ukrainian)

* New translations README.md (Ukrainian)

* New translations bracketed-segments.md (Ukrainian)

* New translations nerd-font.md (Ukrainian)

* New translations no-runtimes.md (Ukrainian)

* New translations plain-text.md (Ukrainian)

* New translations pure-preset.md (Ukrainian)

* New translations pastel-powerline.md (Ukrainian)

* New translations no-nerd-font.md (Ukrainian)

* New translations no-empty-icons.md (Ukrainian)

* New translations README.md (French)

* New translations README.md (Russian)

* New translations README.md (Spanish)

* New translations README.md (Arabic)

* New translations README.md (German)

* New translations README.md (Italian)

* New translations README.md (Japanese)

* New translations README.md (Korean)

* New translations README.md (Dutch)

* New translations README.md (Polish)

* New translations README.md (Portuguese)

* New translations README.md (Turkish)

* New translations README.md (Chinese Simplified)

* New translations README.md (Chinese Traditional)

* New translations README.md (Vietnamese)

* New translations README.md (Portuguese, Brazilian)

* New translations README.md (Indonesian)

* New translations README.md (Sorani (Kurdish))

* New translations README.md (Ukrainian)

* New translations README.md (Norwegian)

* New translations README.md (Ukrainian)

* New translations README.md (Ukrainian)

* New translations README.md (Ukrainian)

* New translations README.md (Ukrainian)

* New translations README.md (Ukrainian)

* New translations README.md (Ukrainian)

* New translations README.md (Ukrainian)

* New translations README.md (Ukrainian)

* New translations README.md (Ukrainian)

* New translations README.md (Ukrainian)

* New translations README.md (Ukrainian)

* New translations bracketed-segments.md (Ukrainian)

* New translations nerd-font.md (Ukrainian)

* New translations no-runtimes.md (Ukrainian)

* New translations plain-text.md (Ukrainian)

* New translations pure-preset.md (Ukrainian)

* New translations pastel-powerline.md (Ukrainian)

* New translations no-nerd-font.md (Ukrainian)

* New translations no-empty-icons.md (Ukrainian)

* New translations tokyo-night.md (Ukrainian)

* New translations README.md (Ukrainian)

* chore(master): release 1.14.2 (#5098)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* build(deps): update embarkstudios/cargo-deny-action action to v1.5.2

* build(deps): update rust crate quick-xml to 0.28.2

* build(deps): update rust crate serde_json to 1.0.96

* build(deps): update rust crate starship-battery to 0.8.0 (#5106)

* build(deps): update rust crate gethostname to 0.4.2

* feat: add typechange to git_status module (#4829)

Co-authored-by: David Knaack <davidkna@users.noreply.github.com>

* feat(azure): subscription name aliases (#4949)

* From issue #4448, added `subscription_aliases`
as a field for the Azure module

Can be set in starship.toml with
[azure.subscription_aliases]

* Updated config file schema

* Added entry into documentation

* Update README.md

* Formatted with dprint

* feat(git_metrics): add option to ignore submodules (#5052)

* add docs

* update schema

* ok, actually update schema

* add test

* fix lint

* accidentally included my .devenv directory

* feat: Add Solidity Module (#5047)

* Adding documentation

* Documentation and schema addition

* Creating solidity config

* Module for solidity lang

* Updating all the files

* Changing according to clippy

* Fixing misspellings

* Changes suggested by clippy

* Updating schema , maybe fixing docs workflow error

* Updating schema

* Removing solcjs from default compiler list

* Fallback test added and test string fixed

* Fixing docs

* Updating schema

* Updating schema

* Fixing docs

* Updating schema

* Updating schema

* Typo fix

* Update docs/config/README.md

Co-authored-by: David Knaack <davidkna@users.noreply.github.com>

* Update src/utils.rs

Co-authored-by: David Knaack <davidkna@users.noreply.github.com>

* Fix build commit

---------

Co-authored-by: Anirban Halder <shaeo967@gmail.com>
Co-authored-by: David Knaack <davidkna@users.noreply.github.com>

* build(deps): update crate-ci/typos action to v1.14.6

* build(deps): update rust crate clap to 4.2.2

* fix(config): Make print-config not panic without a config (#5001)

* build(deps): update rust crate open to 4.0.2

* build(deps): update rust crate clap to 4.2.3

* build(deps): update rust crate gix-features to 0.29.0

* build(deps): update crate-ci/typos action to v1.14.8

* build(deps): update rust crate clap to 4.2.4

* build(deps): update rust crate dunce to 1.0.4

* build(deps): update rust crate regex to 1.8.0

* build(deps): update rust crate clap_complete to 4.2.1

* build(deps): update rust crate regex to 1.8.1

* docs(pwsh): use a more convenient method to update the window title (#5125)

docs: fix PowerShell example to update the window title

* fix(style): ensure nested style variables are processed during formatting (#5120)

fix: ensure nested style variables are processed during formatting

* refactor(Context): `set_config` method for `Context` (#5079)

* add `set_config` method to `Context`

* Made inline comment a doc comment

* use `default_context()` for `set_config()` test

* use `set_config()` in tests for `print.rs`

* set root config w `set_config()` (`print.rs` test)

* build(deps): update rust crate home to 0.5.5

* build(deps): update pest crates to 2.6.0

* build(deps): update rust crate open to 4.1.0

* build(deps): upgrade gitoxide to v0.44 for performance improvements during discovery (#5141)

upgrade gitoxide to v0.44 for performance improvements during discovery

Please note that there is a new `dot_git_only` option which would further
speedup discovery. On even moderatly fast disks that probably not going
to make a difference, but it will on incredibly slow (networked) disks.

See helix-editor/helix#6867 for reference.

* fix(snap): Update snapcraft.yaml to add personal-files interface (#5131)

* build(deps): update rust crate clap to 4.2.5

* docs: add Ukranian to the project README (#5147)

* Specify personal-file interface for snap

* fix(presets): Added ($style) to format in module 'sudo' in Bracketed Segments Preset (#5146)

* Fixed error in module 'sudo'

There was no ($style) in format. When module enabled this lead to the error [WARN] - (starship::modules::sudo): Error in module `sudo`

* Update docs/.vuepress/public/presets/toml/bracketed-segments.toml

typo fix

Co-authored-by: David Knaack <davidkna@users.noreply.github.com>

---------

Co-authored-by: David Knaack <davidkna@users.noreply.github.com>

* ci: remove actions-rs actions (#5115)

* build(deps): update rust crate clap to 4.2.7

* build(deps): update crate-ci/typos action to v1.14.9

* build(deps): update rust crate serde to 1.0.162

* build(deps): update rust crate rust-ini to 0.19.0 (#5172)

* build(deps): update rust crate rust-ini to 0.19.0

* add CC0-1.0 to allowed license list

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* build(deps): update rust crate versions to v5 (#5176)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* feat(aws): support aws sso with automatic authentication refresh (#5170)

* feat(aws): support aws sso with automatic authentication refresh

* docs(aws): add sso_session for profile detection

* feat(gcloud): add `detect_env_vars` option (#5166)

* feat(gcloud): add `detect_env_vars` option

* regenerate config schema

* docs: update CONTRIBUTING.md and README.md (#5153)

* build(deps): update rust crate clap_complete to 4.2.2

* fix: update of presets and default configuration to reflect changes in Nerd Fonts 3.0 (#5162)

* Updated nf-mdi-* to nf-md-* symbols

The following symbols where changed
- directory.read_only
- memory_usage
- meson
- nim
- os.symbols.Garuda
- os.symbols.HardenedBSD
- os.symbols.Illumos
- os.symbols.OpenBSD
- os.symbols.OracleLinux
- os.symbols.Redox
- os.symbols.Solus
- os.symbols.Windows
- package
- rlang

* Updated nf-mdi-* to nf-md-* symbols (for all other presets)

The following symbols where changed
for pastel-powerline:
- directory.substitutions.Documents
- nim
for tokyo-night
- directory.substitutions.Documents
- golang

* Updated nf-mdi-* to nf-md-* symbols for the default configuration in modules in src/configs/*.rs

The following symbols where changed
- azure
- battery.full_symbol
- battery.charging_symbol
- battery.discharging_symbol
- battery.unknown_symbol
- battery.empty_symbol

* Updated config-schema.json

* Updated src/modules/*.rs docs/config/README.md

and used `nerdfix` to check if I overlook anything

* Fixed the battery discharging symbol in the tests

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: jtrv <travershasemail@gmail.com>

* build(deps): disable unnecessary/unused regex features (#5175)

This will reduce the binary size by ~400 kB.

* build(deps): update rust crate serde to 1.0.163

* build(deps): update xalvarez/prevent-file-change-action action to v1.3.2

* build(deps): update rust crate clap_complete to 4.2.3

* build(deps): update rust crate gethostname to 0.4.3

* build(deps): update dprint plugins

* build(deps): update toml crates

* build(deps): update crate-ci/typos action to v1.14.10

* build(deps): update clap crates to 4.3.0

* build(deps): update crate-ci/typos action to v1.14.11

* build(deps): update rust crate regex to 1.8.2

* build(deps): update rust crate toml_edit to 0.19.10

* build(deps): update rust crate regex to 1.8.3

* build(deps): update rust crate shadow-rs to 0.22.0

* build(deps): update rust crate log to 0.4.18

* build(deps): update rust crate chrono to 0.4.25

* build(deps): update rust crate once_cell to 1.17.2

* build(deps): update rust crate chrono to 0.4.26

* refactor: simplify `shadow-rs` setup in `build.rs` (#5209)

Update build.rs

* feat(golang): adding `mod_version` variable (#5177)

* feat(nodejs): Add `expected_version` variable (#5081)

* add `expected_version` variable to `nodejs`

* show comparison symbols with `expected_version`

* documentation, formatting, more tests

* Remapped `engines_version` to $version

* Added better descriptions to docs

* Update docs/config/README.md

Co-authored-by: David Knaack <davidkna@users.noreply.github.com>

* Removed clone from `nodejs`, formatting

* refactored function calls

* rewrote `engines_version` formatter

* Moved Lazy variables into maps

---------

Co-authored-by: David Knaack <davidkna@users.noreply.github.com>

* build(deps): update crate-ci/typos action to v1.14.12

* build(deps): update clap crates to 4.3.1

* fix: bump libz-ng-sys (#5218)

* build(deps): update rust crate clap to 4.3.2

* build(deps): update rust crate shadow-rs to 0.23.0

* build(deps): update rust crate regex to 1.8.4

* build(deps): update rust crate once_cell to 1.18.0

* Update GA measurement ID

* build(deps): update rust crate nu-ansi-term to 0.48.0

* docs(i18n): new Crowdin updates (#5109)

* Revert "Specify personal-file interface for snap"

This reverts commit 2641a37.

This was reverted due to errors in the snap publishing pipeline:
interface 'starship-config' not found in base declaration declaration-snap-v2_plug_known (starship-config, starship-config)
invalid plugs interface definition 'starship-config' lint-snap-v2_app_plugs_plug_reference (starship, starship-config)
unknown interface 'starship-config' lint-snap-v2_plugs (starship-config, starship-config)

* chore(master): release 1.15.0 (#5108)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Checkout before running gh commands in CI

* Inline script for GA4

* build(deps): update gitoxide crates

* build(deps): update rust crate tempfile to 3.6.0

* Update GA4 tag attribute

* build(deps): update crate-ci/typos action to v1.15.0

* feat: update the nushell init file and make it valid module and overlay (#5188)

* break long commands into multiple lines for readability

* fix the format of closures

We generally write `{|| ...}` instead of `{ || ...}`.

* remove the `$"--opt=(val)"` structure when possible

`starship` does not require to use `--opt=val` and so we do not
need to do that with Nushell :)

the only place where this is required is with `--status` because
`$env.LAST_EXIT_CODE` can be negative and `starship` does not
appear to *like* values of the form `-2`...
so i left this line as it was.

on the other hand, `$env.CMD_DURATION_MS` and `(term size).columns`
should be fine 😌

* simplify the `config` mutation with new `?` syntax

This is a new very handy feature of Nushell which gives a much
simpler command combined with `default` and `merge`.

* put all `let-env`s inside an `export-env` with `load-env`

This commit has two reasons of existing:
- i think it makes it a bit easier to read with less `let-env`s
- it transforms the *script* into both a valid module and a valid
overlay

* bump the version to `0.78` in to docs

* add a note about the init file being also a module to all docs

* tweak the documentation

* update the Nushell part of the install script

* format the vuepress config file

as previous commit 1175801 was
not successful, let's try to make the CI happy manually 😌

* remove code quotes in the `config_cmd` of Nushell

* format the style in the Nushell `warning` section

* build(deps): update rust crate serde to 1.0.164 (#5231)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* build(deps): update rust crate starship-battery to 0.8.1 (#5232)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* feat(pwsh): Support vi command mode indicator (#5049)

Support vi command mode in powershell

* build(deps): update rust crate clap to 4.3.3 (#5235)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* build(deps): update rust crate gix to 0.46.0

* build(deps): update rust crate log to 0.4.19 (#5240)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore: fix typos (#5239)

* chore: fix new clippy lints (#5241)

* docs: Correct Arch Linux Repo Name (#5243)

* Correct Arch Linux repo name

* Revert changes to translated files.

* build(deps): update rust crate quick-xml to 0.29.0

* build(deps): update reviewdog/action-suggester action to v1.6.1

* build(deps): update rust crate clap to 4.3.4

* build(deps): update rust crate serde_json to 1.0.97

* build(deps): update rust crate shadow-rs to 0.23.0 (#5250)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(bash): Clear out completed jobs before counting NUM_JOBS (#5253)

Clear out completed jobs before counting NUM_JOBS

* build(deps): update pest crates to 2.6.1

* redesign

* jet link

* screenshot

* readme, config

* clean trails whitespace

* fmt

* comment vicmd

* mv pos, right prompt warn

* right prompt prereq

* reco and typo

* resolve build check error

* tidy

* resolve build check error

* resolve build check error

* request changes

* rm src contents

* rm git_status.rs

* tryint fix checks

* PR review request: rm comments

* PR review request: rm redundant default

* PR review request: enable aws

---------

Signed-off-by: Michel Alexandre Salim <michel@michel-slm.name>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Tom Fenech <tomjwfenech@gmail.com>
Co-authored-by: Matan Kushner <hello@matchai.dev>
Co-authored-by: David Knaack <davidkna@users.noreply.github.com>
Co-authored-by: Michel Alexandre Salim <michel@michel-slm.name>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Jan Dittrich <mail@jand.one>
Co-authored-by: Zhizhen He <hezhizhen.yi@gmail.com>
Co-authored-by: Swarnim Maheshwari <rexzeo0@gmail.com>
Co-authored-by: Guilhem Saurel <guilhem.saurel@laas.fr>
Co-authored-by: Stefan Cosma <66746+stefanc@users.noreply.github.com>
Co-authored-by: Christian Meusel <christian.meusel@posteo.de>
Co-authored-by: Harry Hodge <harry@harryhodge.co.uk>
Co-authored-by: Harsh Shandilya <me@msfjarvis.dev>
Co-authored-by: Dave Parr <8363743+DaveParr@users.noreply.github.com>
Co-authored-by: Ryan Sabatini <11415980+rjsab@users.noreply.github.com>
Co-authored-by: Vegard Skui <me@vegardskui.com>
Co-authored-by: Cosimo Matteini <dev.matteini@gmail.com>
Co-authored-by: jliaoh <48660001+hunterliao29@users.noreply.github.com>
Co-authored-by: Matthew T <tet68mt+github@gmail.com>
Co-authored-by: Samir Talwar <samir@functional.computer>
Co-authored-by: Aurélien Gâteau <mail@agateau.com>
Co-authored-by: Aki Kanellis <hello@akikanellis.com>
Co-authored-by: Chad Denyar <6653063+cdenyar@users.noreply.github.com>
Co-authored-by: marcybell <marcy@marcelinesystems.dev>
Co-authored-by: Colton Donnelly <colton@donn.io>
Co-authored-by: AnirbanHalder654322 <92542059+AnirbanHalder654322@users.noreply.github.com>
Co-authored-by: Anirban Halder <shaeo967@gmail.com>
Co-authored-by: Dom Slee <domslee1@gmail.com>
Co-authored-by: Micky Brunetti <micky2be@users.noreply.github.com>
Co-authored-by: Andrew Pantuso <ajpantuso@gmail.com>
Co-authored-by: Sebastian Thiel <sebastian.thiel@icloud.com>
Co-authored-by: Scott Parkhill <scott.parkhill@gmail.com>
Co-authored-by: Eldar Khurmamatov <74624554+e-khurmamatov@users.noreply.github.com>
Co-authored-by: kensasongko <ken.sasongko@gmail.com>
Co-authored-by: Denis Cornehl <denis@cornehl.org>
Co-authored-by: Mick Hohmann <gh@m69.im.net>
Co-authored-by: jtrv <travershasemail@gmail.com>
Co-authored-by: Jakub Jirutka <jakub@jirutka.cz>
Co-authored-by: baoyachi. Aka Rust Hairy crabs <liaoymxsdl@sina.com>
Co-authored-by: Antoine Stevan <44101798+amtoine@users.noreply.github.com>
Co-authored-by: Nemo157 <git@nemo157.com>
Co-authored-by: Dosenpfand <Dosenpfand@users.noreply.github.com>
Co-authored-by: Ajeet D'Souza <98ajeet@gmail.com>
@plewis110
Copy link

@pascalkuthe This is still an issue on the latest version of the editor on Linux. When typing :o ~ in order to open a file in my home directory, the editor completely locks up up for about 30s until it loads all of the other user's home directories for completion.

It may be good to place a timer on the autocomplete and give up if it exceeds 1s of waiting. That way typing remains responsive in the worst-case scenarios.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
C-enhancement Category: Improvements
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants