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.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.Nuitka#4087- In4.3, a commit that added or removed one kind of local variable made every C file missccache. repomatic had no workaround, and4.3.1fixed 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 oncetomlrt2.2.4fixed the clone path.uv#12906- uv installed an x86_64 Python on arm64 Windows.tests.yamlforced a native ARM64 interpreter on that runner until uv0.13.0preferred the native one (uv#22100).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.
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.repomatic run nuitkaalso writesbase_dirintoccache.conf. The fix, Nuitka/Nuitka@381a18f17, is ondevelopand keeps the original paths on Windows.Todo
Once the Nuitka pin moves to a release carrying Nuitka/Nuitka@381a18f17, delete the
ccache.confbase_dirwrite ofprepare_compile_cache(), then move this entry to Upstreamed from repomatic. Keep the install into the project virtualenv: the fix keeps the original include paths on Windows.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.Nuitka#4136---main-entry-pointlauncher runs the entry point again in every multiprocessing worker: the tool runner loads a Nuitka user plugin that adds the__name__ == "__main__"guard to that launcher.
Dependency cooldowns¶
uv#20995- Allow sharing exclude-newer-package across workspaces: file reference, env var, or repo-level config:uvxreads no project configuration, and uv has no environment variable 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 remove the need too, but only ifuvxcan read them.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¶
A dependency can stand in for a feature that a preferred library lacks:
whenever#277(discussion):wheneverhas no humanizer, so repomatic phrased its relative times witharrowuntil8.0.0, whererepomatic.humanizephrases them itself.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.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.pypoints the moved nodes back at their page.Todo
Once MyST-Parser renders an
{eval-rst}block into the page’s own document, deleterehome_moved_nodesfromdocs/conf.py, then this entry. Keeptest_pickled_pages_carry_no_build_environmentintests/test_sphinx_crossrefs.py: it shows whether the upstream change holds.
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 raiseFileNotFoundErrorlychee#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.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 its ignore files throughpy-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 reads its ignore files as UTF-8 itself, and parses them withget_parser_from_text: seerepomatic.file_inventory.sphinx#14623-todolistproduce duplicate titles for admonitions
