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

Uploaded CPython 3.8+Windows x86-64

lechange-0.3.1-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.1-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.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

Hashes for lechange-0.3.1-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 3f5731b32bdd8ecb40d7f157620c7c49078343b446fafac6213187c48d977718
MD5 37d2fc9bd19415058a0b7033235948c3
BLAKE2b-256 e7f3309828e95ba1c92fbd76d6be5a659d5bcebd9f5e5cd56f6560293eb31b7d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lechange-0.3.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 735c44817b17abfad52bd981c3a6e74183a9f2370c24b4d57038fbd15efbbae1
MD5 d4b68eb1af721da45d7ad1afe612033b
BLAKE2b-256 09b699ac043575c0d6677941dc11c3a126ee23bfe3429693aa5b5ac1d9881359

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lechange-0.3.1-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9cafad44dbeb0c00a556173a197e2df3a4d9b20cba8f7435f2ac195ac58fd904
MD5 bf6e94f8d5c5e350f0e63fb298ccc7d5
BLAKE2b-256 261518849f72b7712f2cdcaeefb78353ba0a25d13b4c9ddc3280bd77066929c4

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