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:
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.1broke thereplacecommand on[[tool.bumpversion.files]]entries that do not apply. repomatic heldbump-my-versionat1.1.0until a later release fixed it.lychee#1930-lycheeread its configuration only from its own file, so repomatic translated[tool.lychee]into that file. Since0.24.0(lychee#2104),lycheereads the section frompyproject.tomlitself, and repomatic no longer translates it.mdformat-myst#45/mdformat-myst#46-mdformat-mystdepended onmdformat-frontmatter, which made it incompatible withmdformat1.0.0.#46replaced that dependency withmdformat-front-matters. repomatic ranmdformat-mystfrom itsmasterbranch, then from a fork, until a release carried the change.mdformat-pelican#3/mdformat-pelican#4-mdformat-pelicanandmdformat-gfmcould not run together, also reported asmdformat-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 tohtmlcode blocks. repomatic ran a patchedmdformat-webfrom June 2023 until0.2.0shipped the fix.Nuitka#3879/Nuitka#4024---main-entry-pointcrashed 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=-mfor a__main__.py, and skipped every src-layout project, until4.3fixed both.Nuitka#3994- A symlink inside an--include-data-dirtree shipped dangling, and crashed the macOS code signing. The tool runner staged a copy of the directory with no symlinks until4.3, which ships the content of such a link.Nuitka#3998-enableCcachereplaced a user-setCCACHE_SLOPPINESSwith its own value. Since4.3Nuitka adds its value to the user’s.Nuitka#4025---projectrefused to build over apy.typedand over a dependency’s package data, until4.3.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 oncetomlrt2.2.4fixed the clone path.zizmor#1664- Thetemplate-injectionaudit failed on a multiline YAML block. repomatic turned the audit off untilzizmor1.23.0fixed it, then turned it back on.
Also reported while building repomatic, and closed upstream:
setup-python#807- Feature request: Do not fail when caching on non-Python repositoriesruff#9186- docstring code formatter: add a--docstring-code-formatparameter toruff formatCLIuv#8770- CLI reported byuv runon Windows is not found on invocationuv#5185- Feature request: option to not updateuv.lockfileuv#4762-uv pip install --all-extras .fail to locatepyproject.tomluv#1481-uv pip installcannot fetch requirement file from remote URLbump-my-version#145- Add support forignore_missing_filesglobal option in configuration filebump-my-version#117- Empty string replacement (--replace "") is interpreted as absence of parameterbump-my-version#34- Traceback on--searchparameter with plain stringbump-my-version#25---no-configured-filesshould not updatecurrent_versionbump-my-version#19- Decouple search & replace from version bumpmdformat-admon#15- Latestmdformat-admonandmdformat-gfmconflictsmdformat-deflist#4- Latestmdformat-deflistandmdformat-admonconflictsmdformat-gfm#27- Latestmdformat-gfmandmdformat-admonconflictsmdformat-myst#43- Replace dependency ofmdformat-tablestomdformat-gfmmdformat-simple-breaks#3- Uncapmdformat < 0.8.0requirementmdformat-toc#19-mdformat-tocforces URL-encoding of non-ASCII charactersNuitka#3449- Why does nuitka reportsx86_64architecture onwindows-11-armrunner?pipdeptree#188- Graph stability: random order in Graphiz contenttomlrt#172- Reassigning a section relocates its AoT children to the end of the document
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¶
warehouse#11096- Trusted publishing: Support for GitHub reusable workflows: thepublish-pypijob stays in each repository’s ownrelease.yaml, so the OIDC claim names the file that the repository registered as its Trusted Publisher.warehouse#1388- 404 for registered package with no release andwarehouse#9536- Unable to get a consistent view of existing/changed packages from the various APIs: PyPI’s JSON API answers404for some registered projects. repomatic does not read that404as proof that a package is missing.
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:
actionlint#623- Support configuration in[tool.actionlint]section ofpyproject.tomlbiome#9239(discussion)zizmor#322(discussion comment)mdformat#432- Option to specify path to configuration file andmdformat#562- Add--configoption to specify explicit configuration file path:mdformatfinds its configuration only by discovery, so repomatic writes a temporary.mdformat.tomlfor the run and deletes it after.
Markdown formatting¶
repomatic post-processes the output of mdformat to undo two mdformat-myst rewrites, and changes one mdformat default:
mdformat-myst#21- myst formatting directive with only 1 parameter:mdformat-mystturns:key: valuedirective options into a YAML block. repomatic restores the field list. The open fix ismdformat-myst#49.mdformat-myst#13- colon fence syntax is broken by escape character:mdformat-mystescapes:::{name}colon fences. repomatic removes the escape. The open fixes aremdformat-myst#36andmdformat-myst#48.mdformat#312- Needless URL encoding of link destinations: repomatic turns off URL validation and bundlesmdformat-recover-urls, which decodes percent-encoded non-ASCII characters back.
Awesome lists¶
mdformat-toc#17- Feature request: ignore specific Headings /mdformat-toc#20:mdformat-toccannot leave a heading out of the table of contents, andawesome-lintforbids some entries there. Thefix-awesome-toccommand deletes them.
Python formatting¶
ruff#7414- Formatter: wrap comments (E501): Ruff does not wrap long comments. Theformat-pythonjob also runsautopep8, limited to that one fix.
Shell formatting¶
sh#1203- zsh: support inline loop syntax:shfmtcannot parse some Zsh constructs, so repomatic keeps Zsh files away from it.
Workflow linting¶
actionlint#711- Support the new$/self-repositoryuses:syntax /actionlint#732:actionlintrejects the$/self-repository syntax of GitHub. repomatic’s workflows call their own reusable workflows through workspace-relative./paths instead.
Test matrix¶
uv#12906- uv installs x86_64 Python on arm64 Windows:tests.yamlforces a native ARM64 interpreter on the Windows ARM64 runner, which would otherwise test an emulated x86_64 Python. uv0.13.0prefers the native interpreter (uv#22100), and the workflows pin an older uv.Todo
When
sync-workflow-pinsmoves the uv pin of thesetup-uvsteps to0.13.0or later:Delete the
Force native ARM64 Python on Windows ARM64step oftests.yaml, and theUV_PYTHONfallback in theInstall Pythonstep after it.Rewrite the
validate-archcomment oftests.yamlthat says uv prefers an x86_64 interpreter on aarch64.Build the two Windows binaries with
--managed-pythonin a canary run of_release-engine.yaml. If both passverify-binaryand the self-tests, pass the flag on every platform.Delete this entry, and the example that names the step in the
repomatic-auditskill.
When a Python version has no native build, uv
0.13.0falls back to x86_64 with no error. The explicit request of the step fails there. Python 3.10 has none, and the test matrix already excludes it onwindows-11-arm.
Nuitka binary builds¶
Nuitka integration details the workaround for each of these:
Nuitka#3909- With--projectthe[tool.nuitka]section ofpyproject.tomlis ignored: since4.2Nuitka reads[tool.nuitka], but only under--project, a mode repomatic cannot use, so the tool runner turns the section into command-line flags.Nuitka#2136asked for the same support earlier.Nuitka#3996-ccachenever hits across CI machines: the tool runner installs Nuitka into the project virtualenv, whose path is the same on every runner. The release workflow also writesbase_dirintoccache.conf.Nuitka#3997- Tool downloads are fetched and executed without integrity verification: the macOS builds turn ccache off, which keeps its unverified download out of the build.
Dependency cooldowns¶
uv#20995- Allow sharing exclude-newer-package across workspaces: file reference, env var, or repo-level config: uv has no configuration or environment knob for--exclude-newer-package, so repomatic adds the exemption to every frozen command line. Glob exemptions (uv#20788) or pin-based bypasses (uv#19864,uv#18921) would also remove the need.uv#18792- Prune staleexclude-newer-packageentries onuv lock: repomatic removes the stale entries itself after it relocks.
Dependency graph¶
mermaid#4182-clickcannot be used for node IDs: a Mermaid keyword breaks a graph when used as a node ID. repomatic keeps keywords out of the node IDs of its dependency graph, aspipdeptree#201does upstream.
Dependency choices¶
Two dependencies stand in for a feature that a preferred library lacks:
whenever#277(discussion):wheneverhas no humanizer, so repomatic usesarrowfor its human-readable times.wcmatch#226- Possibly add a gitignore parser:wcmatchcannot read.gitignorefiles, so repomatic also depends onpy-walk.
Issue reporting¶
create-issue-from-file#298- Avoid creating duplicate issues: the action opens a new issue on every run. repomatic manages the issues its jobs open, so a new run does not duplicate them.
Documentation¶
furo#921(discussion): Furo shows no icons in toctree entries. repomatic’s documentation adds them with CSS.
Declined by upstream¶
Pull requests and features that upstream maintainers rejected.
mypy#13294- Auto-detect minimal Python for--python-versionoption: repomatic derives--python-versionfromrequires-pythonwhen it runsmypy.pyupgrade#688- Auto-detect minimal Python version: repomatic computed the minimal Python version fromrequires-pythonwhile it still ranpyupgrade.sh#1268- Support configuration in[tool.shfmt]section ofpyproject.toml:shfmtreads its style from.editorconfigonly, so repomatic has no[tool.shfmt]section.
Open upstream¶
Pull requests and issues still pending upstream.
awesome-lint#229- Fix false positives inbalanced-punctuationbump-my-version#146- Non-matching glob patterns don’t raiseFileNotFoundErrorcoveragepy#2330- feat: name the data file in theCan't combineerror:coverage combinestops on a mix of branch and statement data, and its error names no data file. Thelowest-directcell oftests.yamlhit it: pytest-cov4.0.0measured a child interpreter that a test started in another directory. That test now removes theCOV_CORE_*andCOVERAGE_*variables from the environment of its child.lychee#2249- Recognize{#id}heading anchors in--include-fragments: closed bylychee#2250, which no stable release carries yet.lychee#1772- Suggest alternative frontend services from LibRedirectmarkdown-it-py#445- Imagealttext loses backslash escapes and entities: the cause ofmdformat#599andMyST-Parser#1210.mdformat#599- Backslash escapes and entities are deleted from imagealttext: theformat-markdownjob applies that loss to every image it formats. See A known mdformat defect.Todo
When a
markdown-it-pyrelease carries the fix for executablebooks/markdown-it-py#445, run the reproducer from hukkin/mdformat#599 throughrepomatic run mdformat. Then update this entry and A known mdformat defect to match the result.mdformat-myst#25- Block attributes formatting introduce extra empty linemdformat-web#8-format_xmldrops comments and the XML declaration: since0.2.0, formatting anxmlcode block deletes its comments and its<?xml ...?>declaration. repomatic pinsmdformat-web0.2.0, so theformat-markdownjob applies that loss to everyxmlblock it formats.Todo
When
sync-tool-versionsmoves themdformat-webpin past0.2.0, run the reproducer from hukkin/mdformat-web#8 throughrepomatic run mdformat. Then update this entry to match the result.MyST-Parser#1210- Imagealttext loses backslash escapes: the same loss in thealtattribute of a page that Sphinx builds.Nuitka#4087- One new local variable makes every C file missccachesince4.3: the canary build misses every file after a commit that adds or removes one frame type description. See Compile caching.Todo
When a Nuitka release carries the fix for Nuitka/Nuitka#4087, add it to the matrix of the
ccache-type-description.yamlworkflow in kdeldycke/nuitka-test, and run it. Then update this entry and Compile caching to match the result.py-walk#11-py-walkmaintenance status:sly, the only dependency ofpy-walk, is retired, andpy-walkhas had no commit since 2024-10-26. repomatic reads.gitignorethroughpy-walk: seerepomatic.file_inventory.py-walk#10- fix: read the pattern file as UTF-8 instead of the locale encoding:get_parser_from_filedecodes the pattern file with the locale encoding. repomatic decodes.gitignoreitself until a release carries the fix: seerepomatic.file_inventory.sphinx#14623-todolistproduce duplicate titles for admonitions