Description

The Precommit crawler looks recursively for every .pre-commit-config.yaml file from a root directory, and updates the rev pinned by each hook repository.

This crawler is enabled by default, so it can be used either automatically by running updatecli diff from a directory containing the files to update, or by providing a manifest. The automatic discovery behavior can be tuned by providing a YAML manifest with a precommit crawler in top-level directive autodiscovery as explained in the "Autodiscovery" page.

Generated manifests

Each repository produces a gittag source resolving the latest tag, and a target writing the new value to the repository’s rev.

The version filter is narrowed per repository from the currently pinned revision, so a hook on v4.5.0 is filtered with >=4.5.0.

Digest pinning

Unlike most crawlers, digest defaults to false, so hooks are pinned to a tag. Set digest: true to resolve and write the commit SHA behind that tag instead, which is the form pre-commit itself recommends for untrusted repositories.

Limitations

  • A repo: local entry declares hooks that live in the repository itself, so it has no upstream revision and is skipped.

  • Only files named exactly .pre-commit-config.yaml are scanned.

Manifest

Parameters

NameTypeDescriptionRequired
digestboolean

“digest” defines whether the generated manifests pin the commit hash instead of the tag.

default: false

remark:

  • it matches the “–freeze” option of “pre-commit autoupdate”, see https://pre-commit.com/#pre-commit-autoupdate
ignorearray

“ignore” defines rules to exclude matching hook repositories from the autodiscovery.

remark:

  • a hook repository is ignored when it matches at least one rule.
    pathstring

“path” defines a “.pre-commit-config.yaml” path pattern.

remark:

  • the pattern must match the whole path, not just a substring.
  • the pattern follows the Go filepath.Match syntax, such as “*” or “?”.
    reposobject

“repos” defines the hook repositories to match, keyed by repository URL.

remark:

  • an empty value matches any revision.
  • otherwise the value is a semantic version constraint, such as “>=1.0.0”.
  • when the revision or the constraint cannot be parsed, the value must equal the revision.
onlyarray

“only” defines rules to restrict the autodiscovery to matching hook repositories.

remark:

  • a hook repository is kept only when it matches at least one rule.
    pathstring

“path” defines a “.pre-commit-config.yaml” path pattern.

remark:

  • the pattern must match the whole path, not just a substring.
  • the pattern follows the Go filepath.Match syntax, such as “*” or “?”.
    reposobject

“repos” defines the hook repositories to match, keyed by repository URL.

remark:

  • an empty value matches any revision.
  • otherwise the value is a semantic version constraint, such as “>=1.0.0”.
  • when the revision or the constraint cannot be parsed, the value must equal the revision.
rootdirstring

“rootdir” defines the directory where the crawler starts searching for “.pre-commit-config.yaml” files.

default: the scm directory when “scmid” is set, otherwise the directory relative paths resolve from, by default the working directory.

remark:

  • a relative path is resolved from the default directory.
  • an absolute path is used as is, instead of the scm directory.
versionfilterobject

“versionfilter” defines the version filter used by the generated manifests.

default: kind “semver” with pattern “*”, any version greater than or equal to the current one.

remark:

  • with kind “semver”, “pattern” accepts:
    • “prerelease”: the latest prerelease of the current version.
    • “patch”: patch updates only.
    • “minor”: patch and minor updates.
    • “minoronly”: minor updates only.
    • “major”: patch, minor and major updates.
    • “majoronly”: major updates only.
    • a version constraint, such as “>= 1.0.0”.
  • with kind “regex”, “pattern” accepts a regular expression.
  • when “rev” is not a version, such as a commit hash, the version is read from the comment next to it.
  • more examples at https://www.updatecli.io/docs/core/versionfilter/

example:

versionfilter:
  kind: semver
  pattern: minor
    kindstring

“kind” defines the versioning scheme used to select a version.

default: latest

remark:

  • accepted values are “latest”, “semver”, “regex”, “regex/semver”, “time”, “regex/time”, “lex” and “pep440”.
  • “latest” returns the last version of the list.
  • “lex” sorts the versions lexicographically and returns the last one.
  • “pep440” follows https://peps.python.org/pep-0440/

example:

  • kind: semver
    patternstring

“pattern” defines the version pattern, according to “kind”.

default:

  • latest: “latest”
  • semver and pep440: “*”
  • regex: “.*”
  • time and regex/time: “2006-01-02”

remark:

  • for “latest”, “latest” returns the last version, any other value must match a version exactly.
  • for “semver” and “regex/semver”, it is a semantic versioning constraint.
  • for “pep440”, it is a pep440 version specifier.
  • for “regex”, it is a regular expression.
  • for “time” and “regex/time”, it is a Go date layout.
  • ignored by “lex”.

example:

  • pattern: ~1.2
  • pattern: “>=1.0.0 <2.0.0”
  • pattern: ^v\d+.\d+.\d+$
    regexstring

“regex” defines the regular expression extracting the version from each entry.

remark:

  • only used by the kinds “regex/semver” and “regex/time”.
  • the value of the first capture group is used as the version.

example:

  • regex: ^v(\d+.\d+.\d+)$
    replaceallobject

“replaceall” applies a regular expression replacement to each version before filtering.

remark:

  • only used by the kinds “regex”, “regex/semver” and “regex/time”.
  • the replacement runs before “pattern” or “regex” is evaluated.

example:

replaceall:
  pattern: "_"
  replacement: "."

turns “curl-8_15_0” into “curl-8.15.0”.

        patternstring

“pattern” defines the regular expression matching the text to replace.

example:

  • pattern: “_”
        replacementstring

“replacement” defines the text replacing each match of “pattern”.

remark:

  • capture groups can be referenced with $1, $2, and so on.

example:

  • replacement: “.”
    strictboolean

“strict” enforces strict semantic versioning rules when parsing versions.

default: false

remark:

  • only used by the kinds “semver” and “regex/semver”.
⚠ This table is generated from the Updatecli codebase and may contain inaccurate data. Feel free to report them on github.com/updatecli/updatecli

Example

# updatecli.d/default.yaml
name: "precommit autodiscovery"
scms:
  default:
    kind: git
    spec:
      url: https://github.com/updatecli/updatecli.git
      branch: "main"

autodiscovery:
  scmid: default
  crawlers:
    precommit:
      spec:
        digest: true