Skip to main content

A fast git commit message linter written in Rust

Project description

Mixed Pickles

A fast git commit message linter written in Rust. Validates commit messages against best practices and provides actionable suggestions.

Installation

Python (Recommended)

pip install mixed-pickles

Or with uv:

uv pip install mixed-pickles

Rust

cargo install mixed-pickles

Or build from source:

git clone https://github.com/rommeld/mixed-pickles.git
cd mixed-pickles
cargo build --release

What It Checks

Validation Default Severity Description
WipCommit Error WIP markers, fixup!, squash!
ShortCommit Warning Messages below threshold (default: 30 chars)
NonImperative Warning Non-imperative mood ("Added" vs "Add")
VagueLanguage Warning Generic phrases ("fix bug", "update code")
MissingReference Info No issue reference (#123, PROJ-456)
InvalidFormat Info Not following conventional commits

Usage

CLI

# Analyze all commits in current repo
mixed-pickles

# Analyze last 10 commits
mixed-pickles --limit 10

# Analyze specific repo
mixed-pickles --path /path/to/repo

# Strict mode (warnings become errors)
mixed-pickles --strict

# Customize severity
mixed-pickles --error short,vague --ignore ref

# Quiet mode (output only on issues)
mixed-pickles --quiet

Python API

import mixed_pickles

# Basic analysis - auto-loads pyproject.toml config
mixed_pickles.analyze_commits()

# Analyze with options
mixed_pickles.analyze_commits(
    path=".",           # Repository path
    limit=10,           # Number of commits
    quiet=True,         # Suppress output unless issues
    strict=True         # Treat warnings as errors
)

# Disable auto-loading of config file
mixed_pickles.analyze_commits(use_config=False)

# Load config from pyproject.toml or .mixed-pickles.toml
config = mixed_pickles.ValidationConfig.discover()
config = mixed_pickles.ValidationConfig.discover("/path/to/project")

# Load config from specific file
config = mixed_pickles.ValidationConfig.from_file("pyproject.toml")
config = mixed_pickles.ValidationConfig.from_file(".mixed-pickles.toml")

# Manual configuration
config = mixed_pickles.ValidationConfig(
    threshold=50,                    # Minimum message length
    require_issue_ref=False,         # Disable issue reference check
    require_conventional_format=False,
    check_vague_language=True,
    check_wip=True,
    check_imperative=True
)
mixed_pickles.analyze_commits(config=config)

# Adjust severity levels
config = mixed_pickles.ValidationConfig()
config.set_severity(
    mixed_pickles.Validation.MissingReference,
    mixed_pickles.Severity.Error
)
config.set_severity(
    mixed_pickles.Validation.ShortCommit,
    mixed_pickles.Severity.Ignore
)
mixed_pickles.analyze_commits(config=config)

# Fetch commits for custom processing
commits = mixed_pickles.fetch_commits(limit=5)
for commit in commits:
    print(f"{commit.short_hash}: {commit.message}")

Pre-commit Hook

Add to your .pre-commit-config.yaml:

repos:
  - repo: local
    hooks:
      - id: mixed-pickles
        name: Validate commit messages
        entry: mixed-pickles
        language: python
        additional_dependencies: [mixed-pickles]
        always_run: true
        pass_filenames: false
        stages: [pre-push]

With uv, you can also run it directly:

repos:
  - repo: local
    hooks:
      - id: mixed-pickles
        name: Validate commit messages
        entry: uv run mixed-pickles
        language: system
        always_run: true
        pass_filenames: false
        stages: [pre-push]

CLI Options

Option Description
--path <PATH> Repository path (default: current directory)
--limit <N> Max commits to analyze
--threshold <N> Minimum message length (default: 30)
--quiet, -q Suppress output unless issues found
--strict Treat warnings as errors
--error <LIST> Validations to treat as errors
--warn <LIST> Validations to treat as warnings
--ignore <LIST> Validations to skip reporting
--disable <LIST> Validations to disable entirely
--config <PATH> Path to configuration file
--no-config Ignore configuration file

Validation aliases for CLI: short, ref, format, vague, wip, imperative

Configuration

Configure mixed-pickles via pyproject.toml for project-specific settings:

[tool.mixed-pickles]
# Minimum commit message length (default: 30)
threshold = 50

# Disable specific validations entirely
disable = ["reference", "format"]

# Override severity levels
[tool.mixed-pickles.severity]
wip = "error"          # Block on WIP commits (default)
short = "warning"      # Warn but allow (default)
vague = "ignore"       # Don't report
reference = "info"     # Informational only (default)

Or use a dedicated .mixed-pickles.toml file (takes precedence over pyproject.toml):

threshold = 50
disable = ["format"]

[severity]
short = "error"

Configuration Precedence

Settings are applied in this order (later overrides earlier):

  1. Defaults - Built-in default values
  2. Config file - pyproject.toml or .mixed-pickles.toml
  3. CLI arguments - Command-line flags

Available Validations

Name Aliases Default Description
short short-commit warning Message below threshold
wip wip-commit error WIP/fixup/squash markers
reference ref, missing-reference info Missing issue reference
format invalid-format info Not conventional commits
vague vague-language warning Generic descriptions
imperative non-imperative warning Past/continuous tense

Severity Levels

  • Error: Fails the check (exit code 1)
  • Warning: Reported but passes (fails with --strict)
  • Info: Informational only
  • Ignore: Tracked but not reported

Contributing

See CONTRIBUTING.md for contribution guidelines.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mixed_pickles-0.2.1.tar.gz (50.0 kB view details)

Uploaded Source

Built Distributions

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

mixed_pickles-0.2.1-cp38-abi3-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.8+Windows x86-64

mixed_pickles-0.2.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

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

mixed_pickles-0.2.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARM64

mixed_pickles-0.2.1-cp38-abi3-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

mixed_pickles-0.2.1-cp38-abi3-macosx_10_12_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.8+macOS 10.12+ x86-64

File details

Details for the file mixed_pickles-0.2.1.tar.gz.

File metadata

  • Download URL: mixed_pickles-0.2.1.tar.gz
  • Upload date:
  • Size: 50.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for mixed_pickles-0.2.1.tar.gz
Algorithm Hash digest
SHA256 4174db7a47f42404719b4400e172779d5db2f9fc479b03f712411dd9100df98c
MD5 f9d75c9ad9305ce6a396032e4933f59f
BLAKE2b-256 bf49ed90665dca24485dd7abb135b613b1a5ce4ce460989949a1028564fb13e7

See more details on using hashes here.

File details

Details for the file mixed_pickles-0.2.1-cp38-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for mixed_pickles-0.2.1-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 84ae4f28275924db9eb144abaa2e816f8b0c8af28b5a11ed6c26998d9c0b3686
MD5 bb44dd081498f2b08b536a933c908bf8
BLAKE2b-256 50c46799f2e67ec609d107f8db52a993dbd885b04a5fc0bb78d74b1f5e7bb02d

See more details on using hashes here.

File details

Details for the file mixed_pickles-0.2.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mixed_pickles-0.2.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dd59b80449088b9fd1f003c00c50f23328b6ba29b9fb9fba73ecf2a47663fba3
MD5 85c22490afb3edbe8a194da681dba4d0
BLAKE2b-256 5d25011bc959ea78258fff06df6e8e679caea3d3d2a8542a11cb639eec849f77

See more details on using hashes here.

File details

Details for the file mixed_pickles-0.2.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for mixed_pickles-0.2.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ce33bd77d35247004c8683a07fd633da71e8b6988c41e14e81f6b95ca18a268c
MD5 a5432df5728ee24bc15b23f391c66268
BLAKE2b-256 b40eccb9187c9b83fb357b885d7df8070eb0002572c94574e1bd0b77fb5fd6c0

See more details on using hashes here.

File details

Details for the file mixed_pickles-0.2.1-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mixed_pickles-0.2.1-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4d5bf0056ec6816df451bba4a64f63ea40d8fd4a34a3d1434da2a9048d355731
MD5 8362c23895ff89b2c4fb35f421035f1f
BLAKE2b-256 2d11fd6e6ac8af39896e1b5f91a2d45b29a8a5fe530a6ba7d55f78471adab6c0

See more details on using hashes here.

File details

Details for the file mixed_pickles-0.2.1-cp38-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for mixed_pickles-0.2.1-cp38-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 555b8dc4b38611be51e3d3dd3cb792a02e1aa9a26bebce7ebb93191dfe5d74ee
MD5 bca8c9a82418627d9ac2d70282b48150
BLAKE2b-256 406a04f25a88cb2f67d4d81fd2bd84914edc8fc3523d5ac0712d2f293d34c4b4

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