Ultra-fast Git change detection powered by Rust
Project description
Le Change
Fast Git change detection with deploy matrix generation.
Rust core library with a CLI binary, GitHub Action, and Python bindings.
Features
- Diff two commits and list changed files by type (added, modified, deleted, renamed)
- Glob pattern filtering and exclusion
- Dynamic group discovery via
files_group_bytemplates (e.g.stacks/{group}/**) - Deploy matrix JSON output for GitHub Actions
strategy.matrix - Workflow failure tracking with per-run or per-job granularity
- Concurrent workflow detection with deadlock-safe priority ordering
- Ancestor directory file association for monorepo layouts
- Vanished-file detection: files added then removed within a PR (invisible to endpoint diffs) surface as
action: destroymatrix entries with the commit to reconstruct them from - Static musl binaries for Linux (zero runtime dependencies)
GitHub Action
jobs:
detect:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.changes.outputs.matrix }}
has_changes: ${{ steps.changes.outputs.has_changes }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: lituus-io/le-change@v1
id: changes
with:
files: 'stacks/**/*.yaml'
files_group_by: 'stacks/{group}/**'
deploy:
needs: detect
if: needs.detect.outputs.has_changes == 'true'
strategy:
matrix: ${{ fromJson(needs.detect.outputs.matrix) }}
runs-on: ubuntu-latest
steps:
- run: echo "Deploying ${{ matrix.stack }}"
Action Inputs
| Input | Default | Description |
|---|---|---|
files |
Glob patterns to include (comma-separated) | |
files_ignore |
Glob patterns to exclude | |
files_group_by |
Group discovery template (e.g. stacks/{group}/**) |
|
files_group_by_key |
name |
Group key mode: name, path, or hash |
files_ancestor_lookup_depth |
0 |
Ancestor directory lookup depth (max 3) |
track_workflow_failures |
false |
Enable workflow failure tracking |
failure_tracking_level |
run |
Tracking granularity: run or job |
wait_for_active_workflows |
false |
Wait for concurrent overlapping workflows |
workflow_max_wait_seconds |
300 |
Max wait time in seconds |
workflow_name_filter |
Glob pattern to filter workflow names | |
deploy_matrix_include_reason |
false |
Add action/reason to matrix entries |
deploy_matrix_include_concurrency |
false |
Add concurrency info to matrix entries |
detect_vanished |
false |
Detect files added then removed within the PR history (needs fetch-depth: 0) |
vanished_max_commits |
500 |
Max commits the vanished walk visits (0 = unlimited) |
deleted_to_destroy |
false |
Emit action: destroy matrix entries for fully-deleted groups |
token |
github.token |
GitHub token for API access |
base_sha |
Override base commit SHA | |
sha |
Override head commit SHA |
Action Outputs
| Output | Description |
|---|---|
matrix |
Deploy matrix JSON for fromJson() |
has_changes |
true if any deployable changes detected |
any_changed |
true if any files changed |
changed_files |
Space-separated changed file paths |
changed_files_count |
Number of changed files |
added_files |
Space-separated added file paths |
modified_files |
Space-separated modified file paths |
deleted_files |
Space-separated deleted file paths |
deploy_decisions |
JSON array of per-group deploy decisions |
files_to_rebuild |
Files needing rebuild |
files_to_skip |
Files safe to skip |
diagnostics |
JSON array of diagnostic messages |
vanished_files |
Space-separated files added then removed within the PR history |
vanished |
JSON array of {path, last_seen_sha} for vanished files |
CLI
lechange detect \
--files 'stacks/**/*.yaml' \
--files-group-by 'stacks/{group}/**' \
--base-sha abc123 \
--sha def456 \
--output-format json
All options accept environment variables with LECHANGE_ prefix (e.g. LECHANGE_FILES).
Exit codes: 0 = changes detected, 1 = error, 2 = no changes.
Python
pip install lechange
from lechange import ChangeDetector, Config
detector = ChangeDetector(".")
config = Config(
files=["src/**/*.py"],
files_group_by="src/{group}/**",
base_sha="abc123",
sha="def456",
)
result = detector.get_changed_files(config)
print(result.all_changed_files)
print(result.deploy_matrix)
print(result.has_deployable_groups)
Development
cargo test -p le-change # Core library tests
cargo test -p lechange-cli # CLI tests
cargo build --release -p lechange-cli # Release binary
License
Copyright (c) 2024-2026 Lituus-io. All rights reserved.
AGPL-3.0-or-later. Commercial license available — contact spicyzhug@gmail.com.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file lechange-0.3.1-cp38-abi3-win_amd64.whl.
File metadata
- Download URL: lechange-0.3.1-cp38-abi3-win_amd64.whl
- Upload date:
- Size: 3.1 MB
- Tags: CPython 3.8+, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3f5731b32bdd8ecb40d7f157620c7c49078343b446fafac6213187c48d977718
|
|
| MD5 |
37d2fc9bd19415058a0b7033235948c3
|
|
| BLAKE2b-256 |
e7f3309828e95ba1c92fbd76d6be5a659d5bcebd9f5e5cd56f6560293eb31b7d
|
File details
Details for the file lechange-0.3.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: lechange-0.3.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 3.3 MB
- Tags: CPython 3.8+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
735c44817b17abfad52bd981c3a6e74183a9f2370c24b4d57038fbd15efbbae1
|
|
| MD5 |
d4b68eb1af721da45d7ad1afe612033b
|
|
| BLAKE2b-256 |
09b699ac043575c0d6677941dc11c3a126ee23bfe3429693aa5b5ac1d9881359
|
File details
Details for the file lechange-0.3.1-cp38-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: lechange-0.3.1-cp38-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 2.9 MB
- Tags: CPython 3.8+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9cafad44dbeb0c00a556173a197e2df3a4d9b20cba8f7435f2ac195ac58fd904
|
|
| MD5 |
bf6e94f8d5c5e350f0e63fb298ccc7d5
|
|
| BLAKE2b-256 |
261518849f72b7712f2cdcaeefb78353ba0a25d13b4c9ddc3280bd77066929c4
|