Skip to main content

Ultra-fast Git change detection powered by Rust

Project description

Le Change

CI Security Fuzz Testing License: AGPL v3

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_by templates (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: destroy matrix 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

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

lechange-0.3.0-cp38-abi3-win_amd64.whl (3.1 MB view details)

Uploaded CPython 3.8+Windows x86-64

lechange-0.3.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.3 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ x86-64

lechange-0.3.0-cp38-abi3-macosx_11_0_arm64.whl (2.9 MB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

File details

Details for the file lechange-0.3.0-cp38-abi3-win_amd64.whl.

File metadata

  • Download URL: lechange-0.3.0-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

Hashes for lechange-0.3.0-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 532350c31d234a43f82ce3404d7e301263d4f8d825cad24f5fe07636119e7553
MD5 f189434d420a94e039be37da37a02e59
BLAKE2b-256 f6fae4adf1d9fecc0b63096336134ae6101d3853b8d263c63d30e706a7a4cde4

See more details on using hashes here.

File details

Details for the file lechange-0.3.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for lechange-0.3.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6140c81424441e878fbc92cede23a10c84dd5d8ea7e850035f673bc32a8f709f
MD5 71495e64a4104c3590b75b801e71e709
BLAKE2b-256 bcfd1a731066b8286511a6099b81c840ddf450240ffb3c5778c44071b769aa3c

See more details on using hashes here.

File details

Details for the file lechange-0.3.0-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for lechange-0.3.0-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 25deb1eb93d2c56954df7148f8fd895287115aeb2285a9a75642ce3feccc60e0
MD5 fea009db64190eff2d22257aac17ea76
BLAKE2b-256 5a856a282cefcfaa5f6c54639393b14fbaa53b4c18b8fe475bb1f0b29a556824

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page