#block #java #language #how #file #action #blockwatch

app blockwatch

Linter that tracks changes between dependent blocks of code

12 releases

Uses new Rust 2024

new 0.1.11 Apr 14, 2025
0.1.10 Apr 14, 2025

#84 in Text processing

Download history 1045/week @ 2025-04-07

1,046 downloads per month

MIT license

92KB
2.5K SLoC

blockwatch

Build Status codecov

Linter that tracks changes between dependent blocks of code.

How

Declare the blocks in the comments of the source file.

Validate by running git diff --patch | blockwatch:

Example

Whenever some block is modified then all its affected blocks (possibly in different files) should also be updated.

main.rs:

// <block affects="README.md:supported-languages">
const SUPPORTED_LANGUAGES = ["rust", "java", "python"];
// </block>

README.md:

## Supported languages

[//]: # (<block name="supported-languages">)

- Java
- Rust

[//]: # (</block>)

If the block in main.rs is modified (e.g. added python to the list) then the following command will produce an error:

git diff --patch | blockwatch

Run as a GitHub Action

Add the following to your workflow .yml file:

jobs:

  blockwatch:
    runs-on: ubuntu-latest

    steps:
      - uses: mennanov/blockwatch-action@v1

Install

From source

cargo install blockwatch

Prebuilt binary

See https://github.com/mennanov/blockwatch/releases

Supported languages

  • C/C++
  • Golang
  • Java
  • JavaScript
  • Markdown
  • Python
  • Rust
  • TOML
  • TypeScript (+TSX)
  • XML
  • YAML

More examples

Blocks may reference blocks in the same file

// <block name="foo" affects=":bar, :buzz">
fn main() {
    println!("Blocks can affect multiple other blocks declared in the same file");
    println!("Just omit the file name in the 'affects' attribute");
}
// </block>

// <block name="bar">
// Some other piece of code.
// </block>

// <block name="buzz">
// One more.
// </block>

``

Blocks may reference each other

// <block name="foo" affects=":bar">
fn foo() {
    println!("Hello");
}
// </block>

// <block name="bar" affects=":foo">
fn bar() {
    println!("Hi!");
}
// </block>

Blocks can be nested

// <block name="entire-file">
fn foo() {
    println!("Hello");
}

// <block name="small-block">
fn bar() {
    println!("Hi!");
}
// </block>
// </block>

Known limitations

  • deleted blocks are ignored
  • blocks declared in unsupported languages are ignored
  • multiple blocks can't be declared in a single line: <block><block>will not work</block/</block>

Contributing

Adding a language support

Follow the pull request for Python as an example.

Run tests

cargo test

Dependencies

~75MB
~2M SLoC