python-semantic-release 10.5.1__tar.gz → 10.5.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/PKG-INFO +1 -1
  2. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/configuration/automatic-releases/github-actions.rst +7 -7
  3. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/pyproject.toml +1 -1
  4. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/cli/commands/version.py +1 -0
  5. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/conftest.py +9 -1
  6. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/test_version_print.py +2 -25
  7. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/test_version_upstream_check.py +159 -0
  8. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/util.py +14 -19
  9. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/LICENSE +0 -0
  10. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/MANIFEST.in +0 -0
  11. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/README.rst +0 -0
  12. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/Makefile +0 -0
  13. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/api/commands.rst +0 -0
  14. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/concepts/changelog_templates.rst +0 -0
  15. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/concepts/commit_parsing.rst +0 -0
  16. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/concepts/getting_started.rst +0 -0
  17. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/concepts/index.rst +0 -0
  18. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/concepts/installation.rst +0 -0
  19. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/concepts/multibranch_releases.rst +0 -0
  20. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/concepts/strict_mode.rst +0 -0
  21. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/conf.py +0 -0
  22. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/configuration/automatic-releases/cronjobs.rst +0 -0
  23. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/configuration/automatic-releases/index.rst +0 -0
  24. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/configuration/automatic-releases/travis.rst +0 -0
  25. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/configuration/configuration-guides/index.rst +0 -0
  26. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/configuration/configuration-guides/monorepos-ex-easy-before-release.png +0 -0
  27. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/configuration/configuration-guides/monorepos-ex-easy-post-release.png +0 -0
  28. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/configuration/configuration-guides/monorepos.rst +0 -0
  29. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/configuration/configuration-guides/uv_integration.rst +0 -0
  30. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/configuration/configuration.rst +0 -0
  31. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/configuration/index.rst +0 -0
  32. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/contributing/contributing_guide.rst +0 -0
  33. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/contributing/index.rst +0 -0
  34. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/index.rst +0 -0
  35. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/make.bat +0 -0
  36. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/misc/psr_changelog.rst +0 -0
  37. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/misc/troubleshooting.rst +0 -0
  38. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/upgrading/08-upgrade.rst +0 -0
  39. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/upgrading/09-upgrade.rst +0 -0
  40. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/upgrading/10-upgrade.rst +0 -0
  41. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/docs/upgrading/index.rst +0 -0
  42. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/setup.cfg +0 -0
  43. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/python_semantic_release.egg-info/SOURCES.txt +0 -0
  44. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/__init__.py +0 -0
  45. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/__main__.py +0 -0
  46. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/changelog/__init__.py +0 -0
  47. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/changelog/context.py +0 -0
  48. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/changelog/release_history.py +0 -0
  49. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/changelog/template.py +0 -0
  50. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/cli/__init__.py +0 -0
  51. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/cli/changelog_writer.py +0 -0
  52. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/cli/cli_context.py +0 -0
  53. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/cli/commands/__init__.py +0 -0
  54. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/cli/commands/changelog.py +0 -0
  55. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/cli/commands/generate_config.py +0 -0
  56. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/cli/commands/main.py +0 -0
  57. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/cli/commands/publish.py +0 -0
  58. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/cli/config.py +0 -0
  59. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/cli/const.py +0 -0
  60. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/cli/github_actions_output.py +0 -0
  61. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/cli/masking_filter.py +0 -0
  62. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/cli/util.py +0 -0
  63. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/commit_parser/__init__.py +0 -0
  64. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/commit_parser/_base.py +0 -0
  65. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/commit_parser/angular.py +0 -0
  66. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/commit_parser/conventional/__init__.py +0 -0
  67. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/commit_parser/conventional/options.py +0 -0
  68. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/commit_parser/conventional/options_monorepo.py +0 -0
  69. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/commit_parser/conventional/parser.py +0 -0
  70. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/commit_parser/conventional/parser_monorepo.py +0 -0
  71. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/commit_parser/emoji.py +0 -0
  72. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/commit_parser/scipy.py +0 -0
  73. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/commit_parser/tag.py +0 -0
  74. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/commit_parser/token.py +0 -0
  75. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/commit_parser/util.py +0 -0
  76. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/const.py +0 -0
  77. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/data/templates/conventional/md/.components/changelog_header.md.j2 +0 -0
  78. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/data/templates/conventional/md/.components/changelog_init.md.j2 +0 -0
  79. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/data/templates/conventional/md/.components/changelog_update.md.j2 +0 -0
  80. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/data/templates/conventional/md/.components/changes.md.j2 +0 -0
  81. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/data/templates/conventional/md/.components/first_release.md.j2 +0 -0
  82. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/data/templates/conventional/md/.components/macros.md.j2 +0 -0
  83. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/data/templates/conventional/md/.components/unreleased_changes.md.j2 +0 -0
  84. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/data/templates/conventional/md/.components/versioned_changes.md.j2 +0 -0
  85. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/data/templates/conventional/md/.release_notes.md.j2 +0 -0
  86. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/data/templates/conventional/md/CHANGELOG.md.j2 +0 -0
  87. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/data/templates/conventional/rst/.components/changelog_header.rst.j2 +0 -0
  88. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/data/templates/conventional/rst/.components/changelog_init.rst.j2 +0 -0
  89. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/data/templates/conventional/rst/.components/changelog_update.rst.j2 +0 -0
  90. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/data/templates/conventional/rst/.components/changes.rst.j2 +0 -0
  91. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/data/templates/conventional/rst/.components/first_release.rst.j2 +0 -0
  92. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/data/templates/conventional/rst/.components/macros.rst.j2 +0 -0
  93. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/data/templates/conventional/rst/.components/unreleased_changes.rst.j2 +0 -0
  94. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/data/templates/conventional/rst/.components/versioned_changes.rst.j2 +0 -0
  95. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/data/templates/conventional/rst/CHANGELOG.rst.j2 +0 -0
  96. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/enums.py +0 -0
  97. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/errors.py +0 -0
  98. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/gitproject.py +0 -0
  99. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/globals.py +0 -0
  100. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/helpers.py +0 -0
  101. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/hvcs/__init__.py +0 -0
  102. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/hvcs/_base.py +0 -0
  103. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/hvcs/bitbucket.py +0 -0
  104. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/hvcs/gitea.py +0 -0
  105. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/hvcs/github.py +0 -0
  106. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/hvcs/gitlab.py +0 -0
  107. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/hvcs/remote_hvcs_base.py +0 -0
  108. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/hvcs/token_auth.py +0 -0
  109. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/hvcs/util.py +0 -0
  110. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/py.typed +0 -0
  111. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/version/__init__.py +0 -0
  112. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/version/algorithm.py +0 -0
  113. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/version/declaration.py +0 -0
  114. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/version/declarations/__init__.py +0 -0
  115. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/version/declarations/enum.py +0 -0
  116. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/version/declarations/i_version_replacer.py +0 -0
  117. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/version/declarations/pattern.py +0 -0
  118. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/version/declarations/toml.py +0 -0
  119. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/version/translator.py +0 -0
  120. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/src/semantic_release/version/version.py +0 -0
  121. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/__init__.py +0 -0
  122. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/const.py +0 -0
  123. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/__init__.py +0 -0
  124. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_changelog/__init__.py +0 -0
  125. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_changelog/test_changelog.py +0 -0
  126. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_changelog/test_changelog_custom_parser.py +0 -0
  127. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_changelog/test_changelog_parsing.py +0 -0
  128. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_changelog/test_changelog_release_notes.py +0 -0
  129. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_config/__init__.py +0 -0
  130. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_config/test_generate_config.py +0 -0
  131. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_publish/__init__.py +0 -0
  132. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_publish/test_publish.py +0 -0
  133. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/__init__.py +0 -0
  134. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/bump_version/__init__.py +0 -0
  135. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/bump_version/conftest.py +0 -0
  136. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/bump_version/git_flow/__init__.py +0 -0
  137. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/bump_version/git_flow/test_repo_1_channel.py +0 -0
  138. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/bump_version/git_flow/test_repo_2_channels.py +0 -0
  139. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/bump_version/git_flow/test_repo_3_channels.py +0 -0
  140. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/bump_version/git_flow/test_repo_4_channels.py +0 -0
  141. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/bump_version/github_flow/__init__.py +0 -0
  142. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/bump_version/github_flow/test_repo_1_channel.py +0 -0
  143. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/bump_version/github_flow/test_repo_1_channel_branch_update_merge.py +0 -0
  144. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/bump_version/github_flow/test_repo_2_channels.py +0 -0
  145. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/bump_version/github_flow_monorepo/__init__.py +0 -0
  146. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/bump_version/github_flow_monorepo/test_monorepo_1_channel.py +0 -0
  147. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/bump_version/github_flow_monorepo/test_monorepo_2_channels.py +0 -0
  148. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/bump_version/trunk_based_dev/__init__.py +0 -0
  149. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/bump_version/trunk_based_dev/test_repo_trunk.py +0 -0
  150. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/bump_version/trunk_based_dev/test_repo_trunk_dual_version_support.py +0 -0
  151. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/bump_version/trunk_based_dev/test_repo_trunk_dual_version_support_w_prereleases.py +0 -0
  152. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/bump_version/trunk_based_dev/test_repo_trunk_w_prereleases.py +0 -0
  153. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/bump_version/trunk_based_dev_monorepo/__init__.py +0 -0
  154. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/bump_version/trunk_based_dev_monorepo/test_monorepo_trunk.py +0 -0
  155. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/test_version.py +0 -0
  156. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/test_version_build.py +0 -0
  157. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/test_version_bump.py +0 -0
  158. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/test_version_changelog.py +0 -0
  159. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/test_version_changelog_custom_commit_msg.py +0 -0
  160. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/test_version_github_actions.py +0 -0
  161. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/test_version_partial_tag.py +0 -0
  162. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/test_version_release_notes.py +0 -0
  163. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/test_version_shallow.py +0 -0
  164. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/test_version_stamp.py +0 -0
  165. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/cmd_version/test_version_strict.py +0 -0
  166. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/conftest.py +0 -0
  167. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/test_help.py +0 -0
  168. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/e2e/test_main.py +0 -0
  169. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/__init__.py +0 -0
  170. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/commit_parsers.py +0 -0
  171. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/example_project.py +0 -0
  172. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/git_repo.py +0 -0
  173. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/monorepos/__init__.py +0 -0
  174. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/monorepos/example_monorepo.py +0 -0
  175. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/monorepos/git_monorepo.py +0 -0
  176. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/monorepos/github_flow/__init__.py +0 -0
  177. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/monorepos/github_flow/monorepo_w_default_release.py +0 -0
  178. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/monorepos/github_flow/monorepo_w_release_channels.py +0 -0
  179. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/monorepos/trunk_based_dev/__init__.py +0 -0
  180. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/monorepos/trunk_based_dev/monorepo_w_tags.py +0 -0
  181. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/repos/__init__.py +0 -0
  182. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/repos/git_flow/__init__.py +0 -0
  183. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/repos/git_flow/repo_w_1_release_channel.py +0 -0
  184. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/repos/git_flow/repo_w_2_release_channels.py +0 -0
  185. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/repos/git_flow/repo_w_3_release_channels.py +0 -0
  186. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/repos/git_flow/repo_w_4_release_channels.py +0 -0
  187. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/repos/github_flow/__init__.py +0 -0
  188. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/repos/github_flow/repo_w_default_release.py +0 -0
  189. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/repos/github_flow/repo_w_default_release_w_branch_update_merge.py +0 -0
  190. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/repos/github_flow/repo_w_release_channels.py +0 -0
  191. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/repos/repo_initial_commit.py +0 -0
  192. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/repos/trunk_based_dev/__init__.py +0 -0
  193. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/repos/trunk_based_dev/repo_w_dual_version_support.py +0 -0
  194. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/repos/trunk_based_dev/repo_w_dual_version_support_w_prereleases.py +0 -0
  195. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/repos/trunk_based_dev/repo_w_no_tags.py +0 -0
  196. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/repos/trunk_based_dev/repo_w_prereleases.py +0 -0
  197. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/repos/trunk_based_dev/repo_w_tags.py +0 -0
  198. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/fixtures/scipy.py +0 -0
  199. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/__init__.py +0 -0
  200. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/conftest.py +0 -0
  201. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/__init__.py +0 -0
  202. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/changelog/__init__.py +0 -0
  203. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/changelog/conftest.py +0 -0
  204. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/changelog/test_changelog_context.py +0 -0
  205. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/changelog/test_default_changelog.py +0 -0
  206. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/changelog/test_release_history.py +0 -0
  207. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/changelog/test_release_notes.py +0 -0
  208. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/changelog/test_template.py +0 -0
  209. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/changelog/test_template_render.py +0 -0
  210. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/cli/__init__.py +0 -0
  211. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/cli/test_config.py +0 -0
  212. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/cli/test_github_actions_output.py +0 -0
  213. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/cli/test_masking_filter.py +0 -0
  214. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/cli/test_util.py +0 -0
  215. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/cli/test_version.py +0 -0
  216. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/commit_parser/__init__.py +0 -0
  217. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/commit_parser/test_conventional.py +0 -0
  218. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/commit_parser/test_emoji.py +0 -0
  219. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/commit_parser/test_parsed_commit.py +0 -0
  220. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/commit_parser/test_scipy.py +0 -0
  221. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/commit_parser/test_util.py +0 -0
  222. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/hvcs/__init__.py +0 -0
  223. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/hvcs/test__base.py +0 -0
  224. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/hvcs/test_bitbucket.py +0 -0
  225. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/hvcs/test_gitea.py +0 -0
  226. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/hvcs/test_github.py +0 -0
  227. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/hvcs/test_gitlab.py +0 -0
  228. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/hvcs/test_token_auth.py +0 -0
  229. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/hvcs/test_util.py +0 -0
  230. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/test_gitproject.py +0 -0
  231. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/test_helpers.py +0 -0
  232. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/version/__init__.py +0 -0
  233. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/version/declarations/__init__.py +0 -0
  234. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/version/declarations/test_pattern_declaration.py +0 -0
  235. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/version/declarations/test_toml_declaration.py +0 -0
  236. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/version/test_algorithm.py +0 -0
  237. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/version/test_translator.py +0 -0
  238. {python_semantic_release-10.5.1 → python_semantic_release-10.5.2}/tests/unit/semantic_release/version/test_version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-semantic-release
3
- Version: 10.5.1
3
+ Version: 10.5.2
4
4
  Summary: Automatic Semantic Versioning for Python projects
5
5
  Author-email: Rolf Erik Lekang <me@rolflekang.com>, codejedi365 <codejedi365@gmail.com>
6
6
  License: MIT
@@ -893,14 +893,14 @@ to the GitHub Release Assets as well.
893
893
  - name: Action | Semantic Version Release
894
894
  id: release
895
895
  # Adjust tag with desired version if applicable.
896
- uses: python-semantic-release/python-semantic-release@v10.5.1
896
+ uses: python-semantic-release/python-semantic-release@v10.5.2
897
897
  with:
898
898
  github_token: ${{ secrets.GITHUB_TOKEN }}
899
899
  git_committer_name: "github-actions"
900
900
  git_committer_email: "actions@users.noreply.github.com"
901
901
 
902
902
  - name: Publish | Upload to GitHub Release Assets
903
- uses: python-semantic-release/publish-action@v10.5.1
903
+ uses: python-semantic-release/publish-action@v10.5.2
904
904
  if: steps.release.outputs.released == 'true'
905
905
  with:
906
906
  github_token: ${{ secrets.GITHUB_TOKEN }}
@@ -1005,7 +1005,7 @@ The equivalent GitHub Action configuration would be:
1005
1005
 
1006
1006
  - name: Action | Semantic Version Release
1007
1007
  # Adjust tag with desired version if applicable.
1008
- uses: python-semantic-release/python-semantic-release@v10.5.1
1008
+ uses: python-semantic-release/python-semantic-release@v10.5.2
1009
1009
  with:
1010
1010
  github_token: ${{ secrets.GITHUB_TOKEN }}
1011
1011
  force: patch
@@ -1064,14 +1064,14 @@ Publish Action.
1064
1064
 
1065
1065
  - name: Release submodule 1
1066
1066
  id: release-submod-1
1067
- uses: python-semantic-release/python-semantic-release@v10.5.1
1067
+ uses: python-semantic-release/python-semantic-release@v10.5.2
1068
1068
  with:
1069
1069
  directory: ${{ env.SUBMODULE_1_DIR }}
1070
1070
  github_token: ${{ secrets.GITHUB_TOKEN }}
1071
1071
 
1072
1072
  - name: Release submodule 2
1073
1073
  id: release-submod-2
1074
- uses: python-semantic-release/python-semantic-release@v10.5.1
1074
+ uses: python-semantic-release/python-semantic-release@v10.5.2
1075
1075
  with:
1076
1076
  directory: ${{ env.SUBMODULE_2_DIR }}
1077
1077
  github_token: ${{ secrets.GITHUB_TOKEN }}
@@ -1083,7 +1083,7 @@ Publish Action.
1083
1083
  # ------------------------------------------------------------------- #
1084
1084
 
1085
1085
  - name: Publish | Upload package 1 to GitHub Release Assets
1086
- uses: python-semantic-release/publish-action@v10.5.1
1086
+ uses: python-semantic-release/publish-action@v10.5.2
1087
1087
  if: steps.release-submod-1.outputs.released == 'true'
1088
1088
  with:
1089
1089
  directory: ${{ env.SUBMODULE_1_DIR }}
@@ -1091,7 +1091,7 @@ Publish Action.
1091
1091
  tag: ${{ steps.release-submod-1.outputs.tag }}
1092
1092
 
1093
1093
  - name: Publish | Upload package 2 to GitHub Release Assets
1094
- uses: python-semantic-release/publish-action@v10.5.1
1094
+ uses: python-semantic-release/publish-action@v10.5.2
1095
1095
  if: steps.release-submod-2.outputs.released == 'true'
1096
1096
  with:
1097
1097
  directory: ${{ env.SUBMODULE_2_DIR }}
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
6
6
 
7
7
  [project]
8
8
  name = "python-semantic-release"
9
- version = "10.5.1"
9
+ version = "10.5.2"
10
10
  description = "Automatic Semantic Versioning for Python projects"
11
11
  requires-python = "~= 3.8"
12
12
  license = { text = "MIT" }
@@ -722,6 +722,7 @@ def version( # noqa: C901
722
722
  )
723
723
  except GitCommitEmptyIndexError:
724
724
  logger.info("No local changes to add to any commit, skipping")
725
+ commit_changes = False
725
726
 
726
727
  # Tag the version after potentially creating a new HEAD commit.
727
728
  # This way if no source code is modified, i.e. all metadata updates
@@ -206,6 +206,10 @@ def run_cli(clean_os_environment: dict[str, str]) -> RunCliFn:
206
206
  invoke_kwargs: dict[str, Any] | None = None,
207
207
  ) -> Result:
208
208
  from semantic_release.cli.commands.main import main
209
+ from semantic_release.globals import logger
210
+
211
+ # Prevent logs from being propagated to the root logger (pytest)
212
+ logger.propagate = False
209
213
 
210
214
  cli_runner = CliRunner(mix_stderr=False)
211
215
  env_vars = {**clean_os_environment, **(env or {})}
@@ -213,7 +217,11 @@ def run_cli(clean_os_environment: dict[str, str]) -> RunCliFn:
213
217
 
214
218
  with mock.patch.dict(os.environ, env_vars, clear=True):
215
219
  # run the CLI with the provided arguments
216
- return cli_runner.invoke(main, args=args, **(invoke_kwargs or {}))
220
+ result = cli_runner.invoke(main, args=args, **(invoke_kwargs or {}))
221
+ # Force the output to be printed to stdout which will be captured by pytest
222
+ sys.stdout.write(result.stdout)
223
+ sys.stderr.write(result.stderr)
224
+ return result
217
225
 
218
226
  return _run_cli
219
227
 
@@ -105,7 +105,6 @@ def test_version_print_next_version(
105
105
  next_release_version: str,
106
106
  file_in_repo: str,
107
107
  run_cli: RunCliFn,
108
- mocked_git_fetch: MagicMock,
109
108
  mocked_git_push: MagicMock,
110
109
  post_mocker: Mocker,
111
110
  ):
@@ -270,7 +269,6 @@ def test_version_print_tag_prints_next_tag(
270
269
  get_cfg_value_from_def: GetCfgValueFromDefFn,
271
270
  file_in_repo: str,
272
271
  run_cli: RunCliFn,
273
- mocked_git_fetch: MagicMock,
274
272
  mocked_git_push: MagicMock,
275
273
  post_mocker: Mocker,
276
274
  ):
@@ -386,7 +384,6 @@ def test_version_print_tag_prints_next_tag_no_zero_versions(
386
384
  get_cfg_value_from_def: GetCfgValueFromDefFn,
387
385
  file_in_repo: str,
388
386
  run_cli: RunCliFn,
389
- mocked_git_fetch: MagicMock,
390
387
  mocked_git_push: MagicMock,
391
388
  post_mocker: Mocker,
392
389
  ):
@@ -450,7 +447,6 @@ def test_version_print_last_released_prints_version(
450
447
  repo_result: BuiltRepoResult,
451
448
  get_versions_from_repo_build_def: GetVersionsFromRepoBuildDefFn,
452
449
  run_cli: RunCliFn,
453
- mocked_git_fetch: MagicMock,
454
450
  mocked_git_push: MagicMock,
455
451
  post_mocker: Mocker,
456
452
  strip_logging_messages: StripLoggingMessagesFn,
@@ -502,7 +498,6 @@ def test_version_print_last_released_prints_released_if_commits(
502
498
  get_versions_from_repo_build_def: GetVersionsFromRepoBuildDefFn,
503
499
  commits: list[str],
504
500
  run_cli: RunCliFn,
505
- mocked_git_fetch: MagicMock,
506
501
  mocked_git_push: MagicMock,
507
502
  post_mocker: Mocker,
508
503
  file_in_repo: str,
@@ -552,10 +547,8 @@ def test_version_print_last_released_prints_released_if_commits(
552
547
  def test_version_print_last_released_prints_nothing_if_no_tags(
553
548
  repo_result: BuiltRepoResult,
554
549
  run_cli: RunCliFn,
555
- mocked_git_fetch: MagicMock,
556
550
  mocked_git_push: MagicMock,
557
551
  post_mocker: Mocker,
558
- caplog: pytest.LogCaptureFixture,
559
552
  ):
560
553
  repo = repo_result["repo"]
561
554
 
@@ -577,10 +570,7 @@ def test_version_print_last_released_prints_nothing_if_no_tags(
577
570
  # Evaluate (no release actions should have occurred on print)
578
571
  assert_successful_exit_code(result, cli_cmd)
579
572
  assert result.stdout == ""
580
-
581
- # must use capture log to see this, because we use the logger to print this message
582
- # not click's output
583
- assert "No release tags found." in caplog.text
573
+ assert "No release tags found." in result.stderr
584
574
 
585
575
  # assert nothing else happened (no code changes, no commit, no tag, no push, no vcs release)
586
576
  assert repo_status_before == repo_status_after
@@ -598,7 +588,6 @@ def test_version_print_last_released_on_detached_head(
598
588
  repo_result: BuiltRepoResult,
599
589
  get_versions_from_repo_build_def: GetVersionsFromRepoBuildDefFn,
600
590
  run_cli: RunCliFn,
601
- mocked_git_fetch: MagicMock,
602
591
  mocked_git_push: MagicMock,
603
592
  post_mocker: Mocker,
604
593
  strip_logging_messages: StripLoggingMessagesFn,
@@ -647,7 +636,6 @@ def test_version_print_last_released_on_nonrelease_branch(
647
636
  repo_result: BuiltRepoResult,
648
637
  get_versions_from_repo_build_def: GetVersionsFromRepoBuildDefFn,
649
638
  run_cli: RunCliFn,
650
- mocked_git_fetch: MagicMock,
651
639
  mocked_git_push: MagicMock,
652
640
  post_mocker: Mocker,
653
641
  strip_logging_messages: StripLoggingMessagesFn,
@@ -705,7 +693,6 @@ def test_version_print_last_released_tag_prints_correct_tag(
705
693
  get_cfg_value_from_def: GetCfgValueFromDefFn,
706
694
  get_versions_from_repo_build_def: GetVersionsFromRepoBuildDefFn,
707
695
  run_cli: RunCliFn,
708
- mocked_git_fetch: MagicMock,
709
696
  mocked_git_push: MagicMock,
710
697
  post_mocker: Mocker,
711
698
  strip_logging_messages: StripLoggingMessagesFn,
@@ -766,7 +753,6 @@ def test_version_print_last_released_tag_prints_released_if_commits(
766
753
  get_versions_from_repo_build_def: GetVersionsFromRepoBuildDefFn,
767
754
  commits: list[str],
768
755
  run_cli: RunCliFn,
769
- mocked_git_fetch: MagicMock,
770
756
  mocked_git_push: MagicMock,
771
757
  post_mocker: Mocker,
772
758
  file_in_repo: str,
@@ -817,10 +803,8 @@ def test_version_print_last_released_tag_prints_released_if_commits(
817
803
  def test_version_print_last_released_tag_prints_nothing_if_no_tags(
818
804
  repo_result: BuiltRepoResult,
819
805
  run_cli: RunCliFn,
820
- mocked_git_fetch: MagicMock,
821
806
  mocked_git_push: MagicMock,
822
807
  post_mocker: Mocker,
823
- caplog: pytest.LogCaptureFixture,
824
808
  ):
825
809
  repo = repo_result["repo"]
826
810
 
@@ -842,10 +826,7 @@ def test_version_print_last_released_tag_prints_nothing_if_no_tags(
842
826
  # Evaluate (no release actions should have occurred on print)
843
827
  assert_successful_exit_code(result, cli_cmd)
844
828
  assert result.stdout == ""
845
-
846
- # must use capture log to see this, because we use the logger to print this message
847
- # not click's output
848
- assert "No release tags found." in caplog.text
829
+ assert "No release tags found." in result.stderr
849
830
 
850
831
  # assert nothing else happened (no code changes, no commit, no tag, no push, no vcs release)
851
832
  assert repo_status_before == repo_status_after
@@ -872,7 +853,6 @@ def test_version_print_last_released_tag_on_detached_head(
872
853
  get_cfg_value_from_def: GetCfgValueFromDefFn,
873
854
  get_versions_from_repo_build_def: GetVersionsFromRepoBuildDefFn,
874
855
  run_cli: RunCliFn,
875
- mocked_git_fetch: MagicMock,
876
856
  mocked_git_push: MagicMock,
877
857
  post_mocker: Mocker,
878
858
  strip_logging_messages: StripLoggingMessagesFn,
@@ -931,7 +911,6 @@ def test_version_print_last_released_tag_on_nonrelease_branch(
931
911
  get_cfg_value_from_def: GetCfgValueFromDefFn,
932
912
  get_versions_from_repo_build_def: GetVersionsFromRepoBuildDefFn,
933
913
  run_cli: RunCliFn,
934
- mocked_git_fetch: MagicMock,
935
914
  mocked_git_push: MagicMock,
936
915
  post_mocker: Mocker,
937
916
  strip_logging_messages: StripLoggingMessagesFn,
@@ -989,7 +968,6 @@ def test_version_print_next_version_fails_on_detached_head(
989
968
  simulate_change_commits_n_rtn_changelog_entry: SimulateChangeCommitsNReturnChangelogEntryFn,
990
969
  get_commit_def_fn: GetCommitDefFn[CommitParser[ParseResult, ParserOptions]],
991
970
  default_parser: CommitParser[ParseResult, ParserOptions],
992
- mocked_git_fetch: MagicMock,
993
971
  mocked_git_push: MagicMock,
994
972
  post_mocker: Mocker,
995
973
  strip_logging_messages: StripLoggingMessagesFn,
@@ -1052,7 +1030,6 @@ def test_version_print_next_tag_fails_on_detached_head(
1052
1030
  simulate_change_commits_n_rtn_changelog_entry: SimulateChangeCommitsNReturnChangelogEntryFn,
1053
1031
  get_commit_def_fn: GetCommitDefFn[CommitParser[ParseResult, ParserOptions]],
1054
1032
  default_parser: CommitParser[ParseResult, ParserOptions],
1055
- mocked_git_fetch: MagicMock,
1056
1033
  mocked_git_push: MagicMock,
1057
1034
  post_mocker: Mocker,
1058
1035
  strip_logging_messages: StripLoggingMessagesFn,
@@ -291,6 +291,165 @@ def test_version_upstream_check_success_no_changes_untracked_branch(
291
291
  assert expected_vcs_url_post == post_mocker.call_count # one vcs release created
292
292
 
293
293
 
294
+ @pytest.mark.parametrize(
295
+ "repo_fixture_name, build_repo_fn",
296
+ [
297
+ (
298
+ repo_fixture_name,
299
+ lazy_fixture(build_repo_fn_name),
300
+ )
301
+ for repo_fixture_name, build_repo_fn_name in [
302
+ (
303
+ repo_w_trunk_only_conventional_commits.__name__,
304
+ build_trunk_only_repo_w_tags.__name__,
305
+ ),
306
+ ]
307
+ ],
308
+ )
309
+ @pytest.mark.usefixtures(change_to_ex_proj_dir.__name__)
310
+ def test_version_no_upstream_check_on_no_version_commit(
311
+ repo_fixture_name: str,
312
+ run_cli: RunCliFn,
313
+ build_repo_fn: BuildSpecificRepoFn,
314
+ example_project_dir: ExProjectDir,
315
+ git_repo_for_directory: GetGitRepo4DirFn,
316
+ post_mocker: Mocker,
317
+ get_cfg_value_from_def: GetCfgValueFromDefFn,
318
+ get_versions_from_repo_build_def: GetVersionsFromRepoBuildDefFn,
319
+ pyproject_toml_file: Path,
320
+ update_pyproject_toml: UpdatePyprojectTomlFn,
321
+ ):
322
+ """
323
+ Test that PSR succeeds when no version commit is needed, so the upstream check is skipped.
324
+
325
+ This replicates the scenario that occurred on python-semantic-release/publish-action@v10.5.1
326
+ where the version command was run and no version commit was needed, but it failed because
327
+ it attempted to check the upstream branch anyway and we hard coded HEAD~1 because it expects
328
+ a version commit to be created. This is the only reason why you would check the upstream branch
329
+ because pushing a tag to the remote can happen even if the upstream branch has changed.
330
+ """
331
+ remote_name = "origin"
332
+ # Create a bare remote (simulating origin)
333
+ local_origin = Repo.init(str(example_project_dir / "local_origin"), bare=True)
334
+
335
+ # build target repo into a temporary directory
336
+ target_repo_dir = example_project_dir / repo_fixture_name
337
+ commit_type: CommitConvention = (
338
+ repo_fixture_name.split("commits", 1)[0].split("_")[-2] # type: ignore[assignment]
339
+ )
340
+ target_repo_definition = build_repo_fn(
341
+ repo_name=repo_fixture_name,
342
+ commit_type=commit_type,
343
+ dest_dir=target_repo_dir,
344
+ )
345
+ target_git_repo = git_repo_for_directory(target_repo_dir)
346
+
347
+ # Configure the source repo to use the bare remote (removing any existing 'origin')
348
+ with contextlib.suppress(AttributeError):
349
+ target_git_repo.delete_remote(target_git_repo.remotes[remote_name])
350
+
351
+ target_git_repo.create_remote(remote_name, str(local_origin.working_dir))
352
+
353
+ # Remove last release before pushing to upstream
354
+ tag_format_str = cast(
355
+ "str", get_cfg_value_from_def(target_repo_definition, "tag_format_str")
356
+ )
357
+ latest_tag = tag_format_str.format(
358
+ version=get_versions_from_repo_build_def(target_repo_definition)[-1]
359
+ )
360
+ target_git_repo.git.tag("-d", latest_tag)
361
+ target_git_repo.git.reset("--hard", "HEAD~1")
362
+
363
+ # Remove any version variables to ensure no version commit is needed
364
+ update_pyproject_toml(
365
+ "tool.semantic_release.version_variables",
366
+ None,
367
+ target_repo_dir / pyproject_toml_file,
368
+ )
369
+ update_pyproject_toml(
370
+ "tool.semantic_release.version_toml",
371
+ None,
372
+ target_repo_dir / pyproject_toml_file,
373
+ )
374
+ # TODO: when available, switch this to use hvcs=none or similar config to avoid token use for push
375
+ update_pyproject_toml(
376
+ "tool.semantic_release.remote.ignore_token_for_push",
377
+ True,
378
+ target_repo_dir / pyproject_toml_file,
379
+ )
380
+ target_git_repo.git.commit(amend=True, no_edit=True, all=True)
381
+
382
+ # push the current state to establish the remote (cannot push tags and branches at the same time)
383
+ target_git_repo.git.push(remote_name, all=True) # all branches
384
+ target_git_repo.git.push(remote_name, tags=True) # all tags
385
+
386
+ # ensure bare remote HEAD points to the active branch so clones can checkout
387
+ local_origin.git.symbolic_ref(
388
+ "HEAD", f"refs/heads/{target_git_repo.active_branch.name}"
389
+ )
390
+
391
+ # Simulate CI environment after someone pushes to the repo
392
+ ci_commit_sha = target_git_repo.head.commit.hexsha
393
+ ci_branch = target_git_repo.active_branch.name
394
+
395
+ # current remote tags
396
+ remote_origin_tags_before = {tag.name for tag in local_origin.tags}
397
+
398
+ # Simulate a CI environment by fetching the repo to a new location
399
+ test_repo = Repo.init(str(example_project_dir / "ci_repo"))
400
+ with test_repo.config_writer("repository") as config:
401
+ config.set_value("core", "hookspath", "")
402
+ config.set_value("commit", "gpgsign", False)
403
+ config.set_value("tag", "gpgsign", False)
404
+
405
+ # Configure and retrieve the repository (see GitHub actions/checkout@v5)
406
+ test_repo.git.remote(
407
+ "add",
408
+ remote_name,
409
+ f"file:///{PureWindowsPath(local_origin.working_dir).as_posix()}",
410
+ )
411
+ test_repo.git.fetch("--depth=1", remote_name, ci_commit_sha)
412
+
413
+ # Simulate CI environment and recommended workflow (in docs)
414
+ # NOTE: this could be done in 1 step, but most CI pipelines are doing it in 2 steps
415
+ # 1. Checkout the commit sha (detached head)
416
+ test_repo.git.checkout(ci_commit_sha, force=True)
417
+ # 2. Forcefully set the branch to the current detached head
418
+ test_repo.git.checkout("-B", ci_branch)
419
+
420
+ # Act: run PSR on the cloned repo - it should verify upstream and succeed
421
+ with temporary_working_directory(str(test_repo.working_dir)):
422
+ # We don't use `--no-commit` here because we want to test that the upstream check is skipped
423
+ # when PSR determines that no version commit is needed. If we used `--no-commit`, it would skip the
424
+ # upstream check because it would think that a version commit was not needed.
425
+ cli_cmd = [
426
+ MAIN_PROG_NAME,
427
+ "--strict",
428
+ VERSION_SUBCMD,
429
+ "--no-changelog",
430
+ "--skip-build",
431
+ ]
432
+ result = run_cli(cli_cmd[1:], env={Github.DEFAULT_ENV_TOKEN_NAME: "1234"})
433
+
434
+ remote_origin_tags_after = {tag.name for tag in local_origin.tags}
435
+
436
+ # Evaluate
437
+ assert_successful_exit_code(result, cli_cmd)
438
+
439
+ # Verify release occurred as expected
440
+ with test_repo:
441
+ assert latest_tag in test_repo.tags, "Expected release tag to be created"
442
+ assert (
443
+ ci_commit_sha == test_repo.head.commit.hexsha
444
+ ), "Expected no new commit to be created on HEAD"
445
+ different_tags = remote_origin_tags_after.difference(remote_origin_tags_before)
446
+ assert latest_tag in different_tags, "Expected new tag to be pushed to remote"
447
+
448
+ # Verify VCS release was created
449
+ expected_vcs_url_post = 1
450
+ assert expected_vcs_url_post == post_mocker.call_count # one vcs release created
451
+
452
+
294
453
  @pytest.mark.parametrize(
295
454
  "repo_fixture_name, build_repo_fn",
296
455
  [
@@ -58,26 +58,21 @@ def get_func_qual_name(func: Callable) -> str:
58
58
  def assert_exit_code(
59
59
  exit_code: int, result: ClickInvokeResult, cli_cmd: list[str]
60
60
  ) -> bool:
61
- if result.exit_code != exit_code:
62
- raise AssertionError(
63
- str.join(
64
- os.linesep,
65
- [
66
- f"{result.exit_code} != {exit_code} (actual != expected)",
67
- "",
68
- # Explain what command failed
69
- "Unexpected exit code from command:",
70
- indent(f"'{str.join(' ', cli_cmd)}'", " " * 2),
71
- "",
72
- # Add indentation to each line for stdout & stderr
73
- "stdout:",
74
- indent(result.stdout, " " * 2) if result.stdout.strip() else "",
75
- "stderr:",
76
- indent(result.stderr, " " * 2) if result.stderr.strip() else "",
77
- ],
78
- )
61
+ if result.exit_code == exit_code:
62
+ return True
63
+
64
+ raise AssertionError(
65
+ str.join(
66
+ os.linesep,
67
+ [
68
+ f"{result.exit_code} != {exit_code} (actual != expected)",
69
+ "",
70
+ # Explain what command failed
71
+ "Unexpected exit code from command:",
72
+ indent(f"'{str.join(' ', cli_cmd)}'", " " * 2),
73
+ ],
79
74
  )
80
- return True
75
+ )
81
76
 
82
77
 
83
78
  def assert_successful_exit_code(result: ClickInvokeResult, cli_cmd: list[str]) -> bool: