watchexec/cargo-watch

Use kqueue backend on BSDs

ryanavella opened this issue · 3 comments

Apologies for the necro in the older issue, I genuinely thought my symptoms were identical. I hope opening a new issue is appropriate, but if not please gently guide me in the right direction.

I am running FreeBSD 14.0 and I find that the watch feature doesn't pick up immediately on changes, sometimes taking 30+ seconds or (rarely) hanging indefinitely.

The root problem appears to be that cargo-watch pulls in watchexec 1.17.2, which in turn pulls in notify 4.0.18 which relied on a polling backend on BSDs. notify does have support for a kqueue backend as of 5.0.0-pre.11, and the most straightforward way I can see to get this backend into cargo-watch would be to upgrade the watchexec dependency to (at minimum) 2.0.0-pre.0.

I've forked and spent a few hours attempted to upgrade watchexec to 2.0.0-pre.0, and understandably it is a difficult refactor, mostly due to the API having changed significantly between watchexec 1.17.2 and watchexec 2.0.0-pre.0, especially in regards to handlers and configuration. I think I first need to familiarize myself with both versions of watchexec and the organization of cargo-watch before I could even think of pulling off a refactor, but if you have any suggestions that would be greatly appreciated.

I maintain and develop both. Watchexec post 1.17 has issues with filtering that I believe would lead to a slew of complaints from cargo-watch use, even if they have workarounds; after many iterations over the past few years I aim to definitely fix these sometime in the next six months, then port cargo-watch over.

I would consider a ''beta'' cargo-watch port to the current version of the watchexec lib if so contributed, but won't do that myself before the above timeline to avoid burnout.

If you do attempt: do not upgrade to 2.0.0-pre.N. Go for the current release. The pre releases were all unstable and changed wildly before 2.0.0; there's zero advantage to using those.

Alternatively you could try to retrofit a newer notify into watchexec 1.17; I'd accept a PR for that over there and make a patch release (possibly gated behind a feature to obey semver) so it can then be pulled into current cargo watch.