Executes commands in response to file modifications
Go to file
thislooksfun 3ad0e1aa57
Respect `applies_in` scope when processing nested ignores (#746)
Previously, when importing multiple nested ignore files, some info from
the parent—notably the "root" path—would be inherited. This lead to some
problems with matching of "pseudo-absolute" rules (those with a leading
slash) in nested ignore files (see #745 for more details). To fix this,
we now fully isolate each path of the tree during the import process.
This leads to more accurate, though unfortunately slightly less
performant, rule matching. The only time a builder is reused now is if
two input files have the same `applies_in` value, in which case they are
merged together.

I have added tests to ensure correctness and prevent a regression. I
also was careful to make sure no previous tests broke in any way (all
changes to existing tests were made in isolation, and thus are not
affected by the logic changes). As far as I can tell, the only behavior
change is that now some previously-ignored rules will now be applied,
which could, in very rare configurations, lead to files being
unintentionally ignored. However, due to the aforementioned logic bug,
those files were all ignored by git already, so I suspect the number of
people actually caught off guard by this change to be extremely low,
likely zero.

Fixes #745.
2023-12-30 14:12:59 +13:00
.cargo Learn some build optimisations from binstall (#416) 2022-09-07 06:00:08 +00:00
.github Fix CLI release workflow more (#740) 2023-12-20 01:06:41 +00:00
bin Fix queueing behaviour (#734) 2023-12-19 11:22:59 +00:00
completions New option: --signal-map (#710) 2023-12-09 09:30:58 +00:00
crates Respect `applies_in` scope when processing nested ignores (#746) 2023-12-30 14:12:59 +13:00
doc release: watchexec-cli v1.24.2 (#736) 2023-12-19 13:10:59 +00:00
.clippy-lints Clippy fixes (#465) 2023-01-07 02:53:49 +13:00
.editorconfig Fix cli tests 2021-08-24 22:53:44 +12:00
.gitattributes Fix and adjust docs (#530) 2023-03-18 10:23:46 +00:00
.gitignore Clap 4 and revamp manpage, completions (#513) 2023-03-05 14:57:34 +13:00
.rustfmt.toml Apply tabs project-wide 2021-08-24 20:22:25 +12:00
CITATION.cff release: watchexec-cli v1.24.2 (#736) 2023-12-19 13:10:59 +00:00
CONTRIBUTING.md Remove obsolete release order (#683) 2023-11-26 03:15:29 +00:00
Cargo.lock Respect `applies_in` scope when processing nested ignores (#746) 2023-12-30 14:12:59 +13:00
Cargo.toml Watchexec lib v3 (#601) 2023-11-25 20:33:44 +00:00
LICENSE Create LICENSE 2016-09-18 16:43:26 -04:00
README.md New option: --signal-map (#710) 2023-12-09 09:30:58 +00:00

README.md

CI status on main branch

Watchexec

Software development often involves running the same commands over and over. Boring!

watchexec is a simple, standalone tool that watches a path and runs a command whenever it detects modifications.

Example use cases:

  • Automatically run unit tests
  • Run linters/syntax checkers
  • Rebuild artifacts

Features

  • Simple invocation and use, does not require a cryptic command line involving xargs
  • Runs on OS X, Linux, and Windows
  • Monitors current directory and all subdirectories for changes
  • Coalesces multiple filesystem events into one, for editors that use swap/backup files during saving
  • Loads .gitignore and .ignore files
  • Uses process groups to keep hold of forking programs
  • Provides the paths that changed in environment variables or STDIN
  • Does not require a language runtime, not tied to any particular language or ecosystem
  • And more!

Quick start

Watch all JavaScript, CSS and HTML files in the current directory and all subdirectories for changes, running npm run build when a change is detected:

$ watchexec -e js,css,html npm run build

Call/restart python server.py when any Python file in the current directory (and all subdirectories) changes:

$ watchexec -r -e py -- python server.py

More usage examples: in the CLI README!

Install

Packaging status

All options in detail: in the CLI README, in the online help (watchexec -h, watchexec --help, or watchexec --manual), and in the manual page.

Augment

Watchexec pairs well with:

  • checkexec: to run only when source files are newer than a target file
  • just: a modern alternative to make
  • systemfd: socket-passing in development

Extend

Downstreams

Selected downstreams of watchexec and associated crates: