commitizen
commitizen copied to clipboard
`bump` is also changing dependency versions in `pyproject.toml`, when the versions are the same
Description
When a dep is specified using the {}
syntax, eg
smart-open = {version = ">=5.2.0,<6.1.0", extras = ["s3"]}
and the version of the dep matches the version of the project, then bump
will change both versions.
Is it possible to specify a regex in the configuration - ie to ensure that the version
string is at the start of line, not in the middle?
Ref https://commitizen-tools.github.io/commitizen/config/#pyprojecttoml-or-cztoml
Steps to reproduce
Create a project, where the project version is the same as a dependency version, and where the dependency uses poetry's optional {}
syntax
mkdir bug-report
cd bug-report
cat << EOF > pyproject.toml
[tool.poetry]
name = "foo"
version = "6.1.0"
description = "foo"
authors = ["First Last <[email protected]>"]
readme = "README.md"
[tool.poetry.dependencies]
python = "^3.9"
smart-open = {version = ">=5.2.0,<6.1.0", extras = ["s3"]}
[tool.commitizen]
name = "cz_conventional_commits"
version = "6.1.0"
version_files = ["pyproject.toml:version"]
tag_format = "v$version"
EOF
Init
git init
git add .
git commit -m 'first commit'
Check the current version of the project
❯ cz version --project
6.1.0
Make a change
mkdir src
touch src/__init__.py
git add .
git commit -m 'feat: a feature'
bump the project
❯ cz bump --yes
bump: version 6.1.0 → 6.2.0
tag to create: v6.2.0
increment detected: MINOR
Done!
See the version change in the dependency...
❯ cat pyproject.toml
[tool.poetry]
name = "foo"
version = "6.2.0"
description = "foo"
authors = ["Andrew Sheridan <[email protected]>"]
readme = "README.md"
packages = [{ include = "massmutual", from = "src"}]
[tool.poetry.dependencies]
python = "^3.9"
smart-open = {version = ">=5.2.0,<6.2.0", extras = ["s3"]}
[tool.commitizen]
name = "cz_conventional_commits"
version = "6.2.0"
version_files = ["pyproject.toml:version"]
tag_format = "v$version"
This line should not have changed: smart-open = {version = ">=5.2.0,<6.2.0", extras = ["s3"]}
Current behavior
bump erroneously changes more than it should in the toml file
Desired behavior
bump only changes the right strings in the toml file
Screenshots
No response
Environment
cz version -> 2.23.0
May be related to PR #370
where this syntax was proposed
version_files = [
"pyproject.toml:[tool.commitizen]\nversion",
"pyproject.toml:[tool.poetry]\nname = \"commitizen\"\nversion",
"commitizen/__version__.py"
]
However that seems a little inelegant - also does not appear that syntax was used.
I think changing it like this should work.
version_files = ["pyproject.toml:^version"]
Perhaps just the docs needs an update to say that regex is permitted?
Yes, updating the docs should be enough, would you mind sending a pr or describing here where would you update? Thanks
The docs already say that a regex is permitted.
Maybe what we need is adding it to the FAQ page might be a good idea
I suppose it might also help to clarify in the documentation I linked to above that the pattern is a Python regular expression matched using re.finditer. That would also serve the purpose of clarifying that the file isn't searched line by line. Or see #498 for a proposed alternative to the current matching behavior.
Just to be clear on this: Is the current recommended action to use version_files = ["pyproject.toml:^version"]
?
FWIW I was thinking that it would be great if we could specify a full TOML qualifier like version_files = ["pyproject.toml:tool.commitizen.version"]
. But that is likely a far larger lift, and I could fully understand not wanting to do it.
Basically, you can use whatever Python regex suits your needs. Worst case, you could add a comment to one line and not the other(s) if they are identical. The regex is matched line by line these days, which makes it simpler to choose one appropriate to your situation in my opinion.
Option 1
When selecting version, start with ^
, so it will check that the line starts with version
version_files = ["pyproject.toml:^version"]
Option 2 (recommended)
Use version_provider
, see https://commitizen-tools.github.io/commitizen/config/#version-providers
Sample:
[tool.commitizen]
version_provider = "poetry"
Option 1
When selecting version, start with
^
, so it will check that the line starts withversion
version_files = ["pyproject.toml:^version"]
Option 2 (recommended)
Use
version_provider
, see https://commitizen-tools.github.io/commitizen/config/#version-providersSample:
[tool.commitizen] version_provider = "poetry"
Should we add it as part of our FAQ? I think it's something worth mentioning
Yes, could be a good idea, under which question would be add it? They are both documented, but not together
I think we can just add a question to FAQ, paste your response and add come links to other parts of the document.