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

missingdeps tool has some odd false positives #2454

Open
eli-schwartz opened this issue May 23, 2024 · 3 comments
Open

missingdeps tool has some odd false positives #2454

eli-schwartz opened this issue May 23, 2024 · 3 comments
Labels

Comments

@eli-schwartz
Copy link

https://gitlab.freedesktop.org/xorg/xserver

build rules:

build build.ninja: REGENERATE_BUILD ../meson.build ../meson_options.txt ../man/meson.build ../man/Xserver.man ../include/meson.build ../include/xorg-server.h.meson.in ../include/xorg-config.h.meson.in ../include/xwin-config.h.meson.in ../include/xwayland-config.h.meson.in ../config/meson.build ../dix/meson.build ../dri3/meson.build ../glx/meson.build ../fb/meson.build ../mi/meson.build ../os/meson.build ../composite/meson.build ../damageext/meson.build ../dbe/meson.build ../miext/damage/meson.build ../miext/shadow/meson.build ../miext/sync/meson.build ../present/meson.build ../randr/meson.build ../record/meson.build ../render/meson.build ../xfixes/meson.build ../xkb/meson.build ../Xext/meson.build ../Xi/meson.build ../glamor/meson.build ../exa/meson.build ../doc/meson.build ../doc/dtrace/meson.build ../hw/meson.build ../hw/vfb/meson.build ../hw/vfb/man/Xvfb.man ../hw/xfree86/meson.build ../hw/xfree86/common/meson.build ../hw/xfree86/ddc/meson.build ../hw/xfree86/dri/meson.build ../hw/xfree86/dri2/meson.build ../hw/xfree86/i2c/meson.build ../hw/xfree86/loader/meson.build ../hw/xfree86/modes/meson.build ../hw/xfree86/os-support/meson.build ../hw/xfree86/parser/meson.build ../hw/xfree86/ramdac/meson.build ../hw/xfree86/xkb/meson.build ../hw/xfree86/dixmods/meson.build ../hw/xfree86/exa/meson.build ../hw/xfree86/exa/man/exa.man ../hw/xfree86/fbdevhw/meson.build ../hw/xfree86/fbdevhw/man/fbdevhw.man ../hw/xfree86/glamor_egl/meson.build ../hw/xfree86/x86emu/meson.build ../hw/xfree86/int10/meson.build ../hw/xfree86/shadowfb/meson.build ../hw/xfree86/vgahw/meson.build ../hw/xfree86/drivers/modesetting/meson.build ../hw/xfree86/drivers/modesetting/modesetting.man ../hw/xfree86/drivers/inputtest/meson.build ../hw/xfree86/drivers/inputtest/inputtestdrv.man ../hw/xfree86/man/Xorg.man ../hw/xfree86/man/xorg.conf.man ../hw/xfree86/man/xorg.conf.d.man ../hw/xfree86/utils/man/gtf.man ../hw/xfree86/doc/meson.build ../test/meson.build ../test/bigreq/meson.build ../test/damage/meson.build ../test/sync/meson.build ../test/bugs/meson.build /usr/bin/gawk ../hw/xfree86/common/xf86Module.h ../xorg-server.pc.in meson-private/coredata.dat
 pool = console

build ../meson.build ../meson_options.txt ../man/meson.build ../man/Xserver.man ../include/meson.build ../include/xorg-server.h.meson.in ../include/xorg-config.h.meson.in ../include/xwin-config.h.meson.in ../include/xwayland-config.h.meson.in ../config/meson.build ../dix/meson.build ../dri3/meson.build ../glx/meson.build ../fb/meson.build ../mi/meson.build ../os/meson.build ../composite/meson.build ../damageext/meson.build ../dbe/meson.build ../miext/damage/meson.build ../miext/shadow/meson.build ../miext/sync/meson.build ../present/meson.build ../randr/meson.build ../record/meson.build ../render/meson.build ../xfixes/meson.build ../xkb/meson.build ../Xext/meson.build ../Xi/meson.build ../glamor/meson.build ../exa/meson.build ../doc/meson.build ../doc/dtrace/meson.build ../hw/meson.build ../hw/vfb/meson.build ../hw/vfb/man/Xvfb.man ../hw/xfree86/meson.build ../hw/xfree86/common/meson.build ../hw/xfree86/ddc/meson.build ../hw/xfree86/dri/meson.build ../hw/xfree86/dri2/meson.build ../hw/xfree86/i2c/meson.build ../hw/xfree86/loader/meson.build ../hw/xfree86/modes/meson.build ../hw/xfree86/os-support/meson.build ../hw/xfree86/parser/meson.build ../hw/xfree86/ramdac/meson.build ../hw/xfree86/xkb/meson.build ../hw/xfree86/dixmods/meson.build ../hw/xfree86/exa/meson.build ../hw/xfree86/exa/man/exa.man ../hw/xfree86/fbdevhw/meson.build ../hw/xfree86/fbdevhw/man/fbdevhw.man ../hw/xfree86/glamor_egl/meson.build ../hw/xfree86/x86emu/meson.build ../hw/xfree86/int10/meson.build ../hw/xfree86/shadowfb/meson.build ../hw/xfree86/vgahw/meson.build ../hw/xfree86/drivers/modesetting/meson.build ../hw/xfree86/drivers/modesetting/modesetting.man ../hw/xfree86/drivers/inputtest/meson.build ../hw/xfree86/drivers/inputtest/inputtestdrv.man ../hw/xfree86/man/Xorg.man ../hw/xfree86/man/xorg.conf.man ../hw/xfree86/man/xorg.conf.d.man ../hw/xfree86/utils/man/gtf.man ../hw/xfree86/doc/meson.build ../test/meson.build ../test/bigreq/meson.build ../test/damage/meson.build ../test/sync/meson.build ../test/bugs/meson.build /usr/bin/gawk ../hw/xfree86/common/xf86Module.h ../xorg-server.pc.in meson-private/coredata.dat: phony 

Notice how ../hw/xfree86/common/xf86Module.h appears here (it is used during the configure stage).

missingdeps report:

$ ninja -C builddir/ -t missingdeps
Missing dep: test/tests.p/xfree86.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/meson-generated_.._xf86DefModeSet.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86fbBus.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86noBus.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86Configure.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86Bus.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86Config.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86Cursor.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86DPMS.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86Events.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86Globals.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86AutoConfig.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86Option.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86Init.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86VidMode.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86fbman.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86cmap.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86Helper.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86PM.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86RandR.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86Xinput.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xisb.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86Mode.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xorgHelper.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86Extensions.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86DGA.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86xv.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86xvmc.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86platformBus.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86pciBus.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/common/libxorg_common.a.p/xf86VGAarbiter.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/ddc/libxorg_ddc.a.p/ddc.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/ddc/libxorg_ddc.a.p/interpret_edid.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/ddc/libxorg_ddc.a.p/print_edid.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/ddc/libxorg_ddc.a.p/ddcProperty.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/dri/libxorg_dri.a.p/dri.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/dri/libxorg_dri.a.p/xf86dri.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/dri2/libxorg_dri2.a.p/dri2.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/dri2/libxorg_dri2.a.p/dri2ext.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/i2c/libxorg_i2c.a.p/xf86i2c.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/loader/libxorg_loader.a.p/loader.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/loader/libxorg_loader.a.p/loadmod.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/modes/libxorg_modes.a.p/xf86Crtc.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/modes/libxorg_modes.a.p/xf86Cursors.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/modes/libxorg_modes.a.p/xf86gtf.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/modes/libxorg_modes.a.p/xf86EdidModes.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/modes/libxorg_modes.a.p/xf86Modes.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/modes/libxorg_modes.a.p/xf86RandR12.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/modes/libxorg_modes.a.p/xf86Rotate.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/modes/libxorg_modes.a.p/xf86DiDGA.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/os-support/libxorg_os_support.a.p/shared_posix_tty.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/os-support/libxorg_os_support.a.p/shared_sigio.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/os-support/libxorg_os_support.a.p/shared_vidmem.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/os-support/libxorg_os_support.a.p/linux_lnx_bell.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/os-support/libxorg_os_support.a.p/linux_lnx_init.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/os-support/libxorg_os_support.a.p/linux_lnx_kmod.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/os-support/libxorg_os_support.a.p/linux_lnx_video.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/os-support/libxorg_os_support.a.p/misc_SlowBcopy.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/os-support/libxorg_os_support.a.p/shared_VTsw_usl.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/os-support/libxorg_os_support.a.p/shared_drm_platform.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/os-support/libxorg_os_support.a.p/linux_lnx_agp.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/os-support/libxorg_os_support.a.p/linux_systemd-logind.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/os-support/libxorg_os_support.a.p/shared_pm_noop.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/parser/libxorg_parser.a.p/read.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/ramdac/libxorg_ramdac.a.p/xf86CursorRD.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/ramdac/libxorg_ramdac.a.p/xf86HWCurs.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/xkb/libxorg_xkb.a.p/xkbVT.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/xkb/libxorg_xkb.a.p/xkbPrivate.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/xkb/libxorg_xkb.a.p/xkbKillSrv.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/dixmods/libwfb.so.p/fbmodule.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/dixmods/libshadow.so.p/shmodule.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/dixmods/libglx.so.p/glxmodule.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/dixmods/libglx.so.p/.._.._.._glx_glxdri2.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/exa/libexa.so.p/examodule.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/fbdevhw/libfbdevhw.so.p/fbdevhw.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/glamor_egl/libglamoregl.so.p/.._.._.._glamor_glamor_egl.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/glamor_egl/libglamoregl.so.p/.._.._.._glamor_glamor_eglmodule.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/glamor_egl/libglamoregl.so.p/glamor_xf86_xv.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/int10/libint10.so.p/vbe.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/int10/libint10.so.p/vbeModes.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/int10/libint10.so.p/helper_exec.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/int10/libint10.so.p/helper_mem.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/int10/libint10.so.p/xf86int10.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/int10/libint10.so.p/xf86int10module.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/int10/libint10.so.p/generic.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/int10/libint10.so.p/xf86x86emu.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/shadowfb/libshadowfb.so.p/shadowfb.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/shadowfb/libshadowfb.so.p/sfbmodule.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/vgahw/libvgahw.so.p/vgaHW.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/vgahw/libvgahw.so.p/vgaHWmodule.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/drivers/modesetting/modesetting_drv.so.p/dri2.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/drivers/modesetting/modesetting_drv.so.p/driver.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/drivers/modesetting/modesetting_drv.so.p/drmmode_display.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/drivers/modesetting/modesetting_drv.so.p/pageflip.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/drivers/modesetting/modesetting_drv.so.p/present.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/drivers/modesetting/modesetting_drv.so.p/vblank.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Missing dep: hw/xfree86/drivers/inputtest/inputtest_drv.so.p/xf86-input-inputtest.c.o uses ../hw/xfree86/common/xf86Module.h (generated by phony)
Processed 635 nodes.
Error: There are 97 missing dependency paths.
97 targets had depfile dependencies on 1 distinct generated inputs (from 1 rules)  without a non-depfile dep path to the generator.
There might be build flakiness if any of the targets listed above are built alone, or not late enough, in a clean output directory.

This is being handled via the documented special case:

phony can also be used to create dummy targets for files which may not exist at build time. If a phony build statement is written without any dependencies, the target will be considered out of date if it does not exist. Without a phony build statement, Ninja will report an error if the file does not exist and is required by the build.

Such rules should not count as a generator for the purpose of calculating missingdeps.

@digit-google
Copy link
Contributor

I cannot reproduce any of that locally, and to be frank your example is barely readable.

Can you provide a simpler build.ninja plan that reproduces the problem you are describing? That would help understand what's going on tremendously.

Also please specify which version of Ninja you are using. Thanks.

@eli-schwartz
Copy link
Author

I cannot reproduce your failure to reproduce, and to be frank your reply is barely readable. It's probably the strength of your criticism that my report "isn't readable" that's throwing me off.1

I find it hard to interpret the meaning of your reply. What did you do to reproduce? My description of the issue involves building the xorg-server project, are you saying you tried to do that and it didn't report these missingdeps?

I'm sure it's possible for me to create a freestanding self-contained example. I'd rather not invest the time in doing that when xorg-server should provide a straightforward way to do so, and isn't exactly an unknown or untrustworthy project, and is overall pretty easy to build. In particular I won't have time to look into making one until next week anyway.

As for which version of ninja I used, okay, that's a good question. The answer is that I wondered the same thing myself (that is, I wanted to make sure it wasn't fixed in git) so I rebuilt ninja from a fresh git clone and still got the same issue.

Footnotes

  1. ninja is intentionally designed to be unreadable and awkward to write by hand as a tradeoff for making it fast and well suited to generating them, so it's not surprising per se that a ninja file is "unreadable". What confuses me is why this matters, or at least, why it's a criticism specific to my report. All I did was quote a miniscule fragment of a generated build.ninja in order to highlight what it's doing to create phony rules specifically. It's structurally trivial, and the only thing "unreadable" about it is that the lines are long. But this is what CTRL+F is for?

@digit-google
Copy link
Contributor

Sorry, I meant I could not reproduce anything close to what you are describing by writing several build.ninja files manually from your description (i.e. I tried to produce free-standing examples, but nothing could trigger what you're describing). It is likely that there are details in the xorg build.ninja that are missing from your description (which is ok, this is complex stuff).

On my side I do not have the time to download / build xorg-server on my machine, so a simpler way to reproduce the issue would help a lot.

@jhasse jhasse added the bug label May 25, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants