commitizen icon indicating copy to clipboard operation
commitizen copied to clipboard

`bump` is also changing dependency versions in `pyproject.toml`, when the versions are the same

Open Andrew-Sheridan opened this issue 2 years ago • 5 comments

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

Andrew-Sheridan avatar Apr 04 '22 21:04 Andrew-Sheridan

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?

Andrew-Sheridan avatar Apr 04 '22 21:04 Andrew-Sheridan

Yes, updating the docs should be enough, would you mind sending a pr or describing here where would you update? Thanks

woile avatar Apr 07 '22 15:04 woile

Maybe what we need is adding it to the FAQ page might be a good idea

Lee-W avatar May 03 '22 14:05 Lee-W

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.

Kurt-von-Laven avatar May 04 '22 04:05 Kurt-von-Laven

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.

tarkatronic avatar Feb 21 '23 19:02 tarkatronic

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.

Kurt-von-Laven avatar Feb 21 '23 19:02 Kurt-von-Laven

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"

woile avatar Apr 28 '23 13:04 woile

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"

Should we add it as part of our FAQ? I think it's something worth mentioning

Lee-W avatar May 06 '23 10:05 Lee-W

Yes, could be a good idea, under which question would be add it? They are both documented, but not together

woile avatar May 06 '23 20:05 woile

I think we can just add a question to FAQ, paste your response and add come links to other parts of the document.

Lee-W avatar Aug 20 '23 06:08 Lee-W