Upstream

repomatic installs, configures and runs a long list of external tools and libraries. When one of them misbehaves, the fix goes upstream where possible, and into repomatic where it cannot wait. This page tracks that relationship: code contributed back, workarounds provided, issues reported, and features declined.

A dependency that a sibling project consumes more directly is tracked on that project’s page: click-extra for Click, Cloup and python-tabulate, and meta-package-manager for Nuitka and the package managers it wraps.

Code contributed upstream

Pull requests authored by repomatic’s maintainer and merged into upstream projects.

arrow

awesome-lint

repomatic lints awesome lists with it:

coveragepy

gitignore.io

lychee-action

mdformat-deflist

mdformat-gfm

mdformat-myst

mdformat-pelican

mdformat-pyproject

mdformat-recover-urls

mdformat-simple-breaks

pipdeptree

pipdeptree drew repomatic’s dependency graph until uv export --format cyclonedx1.5 replaced it:

sphinx

sphinx-autodoc-typehints

sphinxcontrib-mermaid

Upstreamed from repomatic

Issues found while building repomatic and resolved upstream. Where repomatic carried a workaround in the meantime, the entry says what it was and when it went away.

  • bump-my-version#331 - 1.1.1 broke the replace command on [[tool.bumpversion.files]] entries that do not apply. repomatic held bump-my-version at 1.1.0 until a later release fixed it.

  • lychee#1930 - lychee read its configuration only from its own file, so repomatic translated [tool.lychee] into that file. Since 0.24.0 (lychee#2104), lychee reads the section from pyproject.toml itself, and repomatic no longer translates it.

  • mdformat-myst#45 / mdformat-myst#46 - mdformat-myst depended on mdformat-frontmatter, which made it incompatible with mdformat 1.0.0. #46 replaced that dependency with mdformat-front-matters. repomatic ran mdformat-myst from its master branch, then from a fork, until a release carried the change.

  • mdformat-pelican#3 / mdformat-pelican#4 - mdformat-pelican and mdformat-gfm could not run together, also reported as mdformat-gfm#38. repomatic depended on a personal fork that carried the fix, then on unreleased upstream, then on the release that shipped it.

  • mdformat-web#5 - The HTML formatter added an extra doctype to html code blocks. repomatic ran a patched mdformat-web from June 2023 until 0.2.0 shipped the fix.

  • Nuitka#3879 / Nuitka#4024 - --main-entry-point crashed without a positional main program, then built a binary that failed at startup when the entry point carried the name of its package. repomatic compiled each entry point from its file path, with --python-flag=-m for a __main__.py, and skipped every src-layout project, until 4.3 fixed both.

  • Nuitka#3994 - A symlink inside an --include-data-dir tree shipped dangling, and crashed the macOS code signing. The tool runner staged a copy of the directory with no symlinks until 4.3, which ships the content of such a link.

  • Nuitka#3998 - enableCcache replaced a user-set CCACHE_SLOPPINESS with its own value. Since 4.3 Nuitka adds its value to the user’s.

  • Nuitka#4025 - --project refused to build over a py.typed and over a dependency’s package data, until 4.3.

  • Nuitka#4087 - In 4.3, a commit that added or removed one kind of local variable made every C file miss ccache. repomatic had no workaround, and 4.3.1 fixed it.

  • tomlrt#171 - Table.section() dropped standalone comments and inline-array padding from the source document. repomatic rebuilt each section with a helper to keep them, and removed the helper once tomlrt 2.2.4 fixed the clone path.

  • uv#12906 - uv installed an x86_64 Python on arm64 Windows. tests.yaml forced a native ARM64 interpreter on that runner until uv 0.13.0 preferred the native one (uv#22100).

  • zizmor#1664 - The template-injection audit failed on a multiline YAML block. repomatic turned the audit off until zizmor 1.23.0 fixed it, then turned it back on.

Also reported while building repomatic, and closed upstream:

Addressed by repomatic

Issues still open or unfixed upstream. repomatic provides the solution.

GitHub Actions

The reusable workflows work around a set of GitHub Actions limitations. The GitHub Actions limitations table lists each one, its status and the mechanism that addresses it.

PyPI

Tool configuration in pyproject.toml

repomatic run translates a [tool.X] section into the native configuration file of a tool that cannot read pyproject.toml:

Markdown formatting

repomatic post-processes the output of mdformat to undo two mdformat-myst rewrites, and changes one mdformat default:

Awesome lists

Python formatting

Shell formatting

Workflow linting

Nuitka binary builds

Nuitka integration details the workaround for each of these:

Dependency cooldowns

Dependency graph

Dependency choices

A dependency can stand in for a feature that a preferred library lacks:

  • whenever#277 (discussion): whenever has no humanizer, so repomatic phrased its relative times with arrow until 8.0.0, where repomatic.humanize phrases them itself.

  • wcmatch#226 - Possibly add a gitignore parser: wcmatch cannot read .gitignore files, so repomatic also depends on py-walk.

Issue reporting

Documentation

  • furo#921 (discussion): Furo shows no icons in toctree entries. repomatic’s documentation adds them with CSS.

  • MyST-Parser#1212 - Nested rendering of fragments from another source, third item: MyST-Parser parses an {eval-rst} block into a throwaway document, and the nodes it moves into the page keep that document. Each API page then pickles the whole Sphinx build environment, about 15 MB, and a full build writes gigabytes of doctrees. A comment there reports this cost, with a reproducer. docs/conf.py points the moved nodes back at their page.

    Todo

    Once MyST-Parser renders an {eval-rst} block into the page’s own document, delete rehome_moved_nodes from docs/conf.py, then this entry. Keep test_pickled_pages_carry_no_build_environment in tests/test_sphinx_crossrefs.py: it shows whether the upstream change holds.

Declined by upstream

Pull requests and features that upstream maintainers rejected.

Open upstream

Pull requests and issues still pending upstream.