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
- 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 |
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 |
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 lechange-core # 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
Release history Release notifications | RSS feed
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.1.0-cp38-abi3-win_amd64.whl.
File metadata
- Download URL: lechange-0.1.0-cp38-abi3-win_amd64.whl
- Upload date:
- Size: 2.5 MB
- Tags: CPython 3.8+, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
08c57515a80893703283d10c6241a520899bb0a21e895f4e618a084f8652e026
|
|
| MD5 |
015d447d7822d00fb5bab2c24dfb0bea
|
|
| BLAKE2b-256 |
e3ce36e78639a3d43e80cb4061ff5d352b158c81a7994cd2f767a6e24fa18907
|
File details
Details for the file lechange-0.1.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: lechange-0.1.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 2.5 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.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eaf36df8bb277068c078a386d8b2478a0f0c962c92100e97e4d76226b375c327
|
|
| MD5 |
f63a77ae872579d86d0181889e04cfe8
|
|
| BLAKE2b-256 |
1a5e75e3da516a3a702f906f4d823b81e97bd737cf1414302ecdb179697dfd5e
|
File details
Details for the file lechange-0.1.0-cp38-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: lechange-0.1.0-cp38-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 2.1 MB
- Tags: CPython 3.8+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
81a450dd4670a58e4c04fbbc395d9c53afe693b8197fe8db979606c9bc75dfed
|
|
| MD5 |
00808d6f3ed1d81371ee9e49f45dee73
|
|
| BLAKE2b-256 |
133d6ba0f23c7d0f814d3db4058b3527a0f6a042768d0af4bcab31105ddd20e0
|