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.2.0-cp38-abi3-win_amd64.whl (3.1 MB view details)

Uploaded CPython 3.8+Windows x86-64

lechange-0.2.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.2.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.2.0-cp38-abi3-win_amd64.whl.

File metadata

  • Download URL: lechange-0.2.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.2.0-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 2e427bad1febe8703ed75ce8ec0edd8994c1d8c088b75ef18dff4fe06c1c43a6
MD5 e9e740aadac8bf11d383f75aee14b537
BLAKE2b-256 0ff53fb9ec8b5357590adf609e93e9fdf645d0d5701e090dc228077e84e9b495

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lechange-0.2.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 38288628dfa4528a36fa00dc5a14531f885dc886d7b5873040c41eb3b3cb46ed
MD5 37b1f31f46c482495183c1a8f37e6785
BLAKE2b-256 394716bf2cbabff20618d9269db13800118b5b74a55c53399cdbc6b7229cf4d5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lechange-0.2.0-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7e0d747449e98047fed7dfad06f66db27c76e545f16cb84552da58c9b785d34d
MD5 9b56a8e6f1eab4cdb3f0e45e7b3980d4
BLAKE2b-256 0fd1c37e02247d901d8bfd41ac08250c070cc510be879a2700c5aca024514e7c

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