python-semantic-release 9.3.0__py3-none-any.whl → 9.3.1__py3-none-any.whl

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: python-semantic-release
3
- Version: 9.3.0
3
+ Version: 9.3.1
4
4
  Summary: Automatic Semantic Versioning for Python projects
5
5
  Author-email: Rolf Erik Lekang <me@rolflekang.com>
6
6
  License: MIT
@@ -35,7 +35,7 @@ Requires-Dist: shellingham >=1.5.0.post1
35
35
  Provides-Extra: dev
36
36
  Requires-Dist: pre-commit ; extra == 'dev'
37
37
  Requires-Dist: tox ; extra == 'dev'
38
- Requires-Dist: ruff ==0.3.2 ; extra == 'dev'
38
+ Requires-Dist: ruff ==0.3.3 ; extra == 'dev'
39
39
  Provides-Extra: docs
40
40
  Requires-Dist: Sphinx <=6.0.0 ; extra == 'docs'
41
41
  Requires-Dist: sphinxcontrib-apidoc ==0.3.0 ; extra == 'docs'
@@ -1,8 +1,8 @@
1
- semantic_release/__init__.py,sha256=qYRnb_pf_BuHF3kEEvr0fVJT6Oq1Vws13Zt6rob3OqQ,870
1
+ semantic_release/__init__.py,sha256=FskRwovkP1zTcZTjLsLItxs24ykLO8-6VyZ_ffSU9EU,870
2
2
  semantic_release/__main__.py,sha256=vXOARLV7KHeVXgpOMU0Q-8wovpdsOrtTsycxulI5xIE,106
3
3
  semantic_release/const.py,sha256=Z1o2QNh60wSLeF-_1TemMBjU3ZXbV0XghnUFsbTVfOs,831
4
4
  semantic_release/enums.py,sha256=D5B_reQGGKQQT22HO5PUtvn2Bok3fkht6TfJtXkmAUg,1020
5
- semantic_release/errors.py,sha256=KKKCV45vvE9tla0sxYDGHkHWvqDn1gEfGIpzujcDbeI,809
5
+ semantic_release/errors.py,sha256=8cNiMhgUTNZC0CecokLyl9YWxREHEh9otm1cRs9kkbU,1001
6
6
  semantic_release/helpers.py,sha256=d1jOX0SNyqPc_3wr14xR25FfpqhMd4Ev7MNBOWlScc0,5581
7
7
  semantic_release/changelog/__init__.py,sha256=Bg6Xe5Vt32rWoMscW-hd4sUwiZqzWmsg4CD1EhMesMY,262
8
8
  semantic_release/changelog/context.py,sha256=ItSz5Bon2mcJkLxyQZzBTukN0zEdcaVQ4iXvz3jGCLc,986
@@ -21,7 +21,7 @@ semantic_release/cli/commands/cli_context.py,sha256=fOLTUKb4UnZGQ6zVhftuvdfZ7fK7
21
21
  semantic_release/cli/commands/generate_config.py,sha256=2xZOu3NpyhBp0pWr7d8ugKl_kjqQgpSsSMHq5wHTfrE,1699
22
22
  semantic_release/cli/commands/main.py,sha256=LuL-O0LGonI5fQTZn0AUtYv2Ei_CYyNqYHMF_wN4InI,2900
23
23
  semantic_release/cli/commands/publish.py,sha256=_pz7rKx65tCH7J2uyWiBghQ61MmmIbxhF9bE4AkE0N8,1703
24
- semantic_release/cli/commands/version.py,sha256=qmEXBLQRnnyn5vBXKZdr5WOdBmevPxAj8eYatU864cs,21734
24
+ semantic_release/cli/commands/version.py,sha256=jz3ao9AV0YeMAwZULSnnanl6OL-NWIc5rnr9E7BrZL0,22111
25
25
  semantic_release/commit_parser/__init__.py,sha256=cv5HFBdw7OJd4Laj4Ex8ZZ5Tml8GwXgQcXW6Pasr2Ao,615
26
26
  semantic_release/commit_parser/_base.py,sha256=aDS0dhFosT5i11tA5Ez8BTeikk6jwXjSEpJnJC5D2cs,2609
27
27
  semantic_release/commit_parser/angular.py,sha256=bS7Wrzpg_6zFil5Y4GIZkeGDPhvWQdTlFdWTtGVcpp0,4393
@@ -41,14 +41,14 @@ semantic_release/hvcs/gitlab.py,sha256=qSvNdQK40QM20-HDh3eIO6Rz8Lo3PEND_4kluugVx
41
41
  semantic_release/hvcs/token_auth.py,sha256=ZjT56-NIPB4OKIt1qwHCu1TavXnrWFIBl9ARlg56hgU,663
42
42
  semantic_release/hvcs/util.py,sha256=PNKXApgL2np9lpnKjAbo77toRgElLPXrbS1q7621waI,2886
43
43
  semantic_release/version/__init__.py,sha256=CLhtGQry9dLIij5XyRa9ZevxU_1p8tjMTSQ-K_GMpWM,270
44
- semantic_release/version/algorithm.py,sha256=K9WkPRur0x5baXsqEi8kvaDfxduG4WNUiALXZRXujJ4,16484
44
+ semantic_release/version/algorithm.py,sha256=-9ulTy1z4u-jUvbc-FrvEdFL7Omc3O3HhaPohjiCmm0,16854
45
45
  semantic_release/version/declaration.py,sha256=f6Ld7hIhrqvDrRBapJHr-KDimuyo-4IG8009Zu9BIgU,7357
46
46
  semantic_release/version/translator.py,sha256=P1noIsVBn8u6zNOFjG0xKYOWapxqf_PHSMvMeLJ9kXg,3050
47
47
  semantic_release/version/version.py,sha256=6PCtSbLP88U1daoxnCwHc--YguZo4waGNLqJ5JfeczE,14175
48
- python_semantic_release-9.3.0.dist-info/AUTHORS.rst,sha256=XOReVvpymEFUPsS2QPH97jlfJBVrxwS2eu8-jVAe4gk,230
49
- python_semantic_release-9.3.0.dist-info/LICENSE,sha256=NE85nszX252sdQdu0xgS9qwfYES0k8qS6gW3uO4jRGE,1083
50
- python_semantic_release-9.3.0.dist-info/METADATA,sha256=jZWqWURvuOuLzgWtZPW50LllyHG-eS3sgAAc_bVjGh8,5365
51
- python_semantic_release-9.3.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
52
- python_semantic_release-9.3.0.dist-info/entry_points.txt,sha256=qojUBx_Ywf4u7KgP6NWlDaBDymZVUGQ7m5wF2duC2F0,95
53
- python_semantic_release-9.3.0.dist-info/top_level.txt,sha256=qYA24nyg3eP-ti5UW7Vuj2aXVmM0wqVHx4mREdRZNAA,17
54
- python_semantic_release-9.3.0.dist-info/RECORD,,
48
+ python_semantic_release-9.3.1.dist-info/AUTHORS.rst,sha256=XOReVvpymEFUPsS2QPH97jlfJBVrxwS2eu8-jVAe4gk,230
49
+ python_semantic_release-9.3.1.dist-info/LICENSE,sha256=NE85nszX252sdQdu0xgS9qwfYES0k8qS6gW3uO4jRGE,1083
50
+ python_semantic_release-9.3.1.dist-info/METADATA,sha256=5qM5BEHU7GNT6jkoRTluZCmmrJUJDtrWOKHbbwJUmII,5365
51
+ python_semantic_release-9.3.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
52
+ python_semantic_release-9.3.1.dist-info/entry_points.txt,sha256=qojUBx_Ywf4u7KgP6NWlDaBDymZVUGQ7m5wF2duC2F0,95
53
+ python_semantic_release-9.3.1.dist-info/top_level.txt,sha256=qYA24nyg3eP-ti5UW7Vuj2aXVmM0wqVHx4mREdRZNAA,17
54
+ python_semantic_release-9.3.1.dist-info/RECORD,,
@@ -24,7 +24,7 @@ from semantic_release.version import (
24
24
  tags_and_versions,
25
25
  )
26
26
 
27
- __version__ = "9.3.0"
27
+ __version__ = "9.3.1"
28
28
 
29
29
 
30
30
  def setup_hook(argv: list[str]) -> None:
@@ -585,12 +585,17 @@ def version( # noqa: C901
585
585
  indented(
586
586
  f"""
587
587
  would have run:
588
- git push --tags {runtime.masker.mask(remote_url)} {active_branch}
588
+ git push {runtime.masker.mask(remote_url)} tag {new_version.as_tag()}
589
589
  """ # noqa: E501
590
590
  )
591
591
  )
592
592
  elif create_tag:
593
- repo.git.push("--tags", remote_url, active_branch)
593
+ # push specific tag refspec (that we made) to remote
594
+ # ---------------
595
+ # Resolves issue #803 where a tag that already existed was pushed and caused
596
+ # a failure. Its not clear why there was an incorrect tag (likely user error change)
597
+ # but we will avoid possibly pushing an separate tag that we didn't create.
598
+ repo.git.push(remote_url, "tag", new_version.as_tag())
594
599
 
595
600
  gha_output.released = True
596
601
 
@@ -31,3 +31,10 @@ class CommitParseError(SemanticReleaseBaseError):
31
31
  Raised when a commit cannot be parsed by a commit parser. Custom commit parsers
32
32
  should also raise this Exception
33
33
  """
34
+
35
+
36
+ class MissingMergeBaseError(SemanticReleaseBaseError):
37
+ """
38
+ Raised when the merge base cannot be found with the current history. Generally
39
+ because of a shallow git clone.
40
+ """
@@ -4,12 +4,10 @@ import logging
4
4
  from queue import Queue
5
5
  from typing import TYPE_CHECKING, Iterable
6
6
 
7
- from semantic_release.commit_parser import (
8
- ParsedCommit,
9
- )
7
+ from semantic_release.commit_parser import ParsedCommit
10
8
  from semantic_release.const import DEFAULT_VERSION
11
9
  from semantic_release.enums import LevelBump
12
- from semantic_release.errors import InvalidVersion
10
+ from semantic_release.errors import InvalidVersion, MissingMergeBaseError
13
11
  from semantic_release.version.version import Version
14
12
 
15
13
  if TYPE_CHECKING:
@@ -278,9 +276,9 @@ def next_version(
278
276
  """
279
277
  # Step 1. All tags, sorted descending by semver ordering rules
280
278
  all_git_tags_as_versions = tags_and_versions(repo.tags, translator)
281
- all_full_release_tags_and_versions = [
282
- (t, v) for t, v in all_git_tags_as_versions if not v.is_prerelease
283
- ]
279
+ all_full_release_tags_and_versions = list(
280
+ filter(lambda t_v: not t_v[1].is_prerelease, all_git_tags_as_versions)
281
+ )
284
282
  log.info(
285
283
  "Found %s full releases (excluding prereleases)",
286
284
  len(all_full_release_tags_and_versions),
@@ -291,30 +289,59 @@ def next_version(
291
289
  iter(all_full_release_tags_and_versions),
292
290
  (None, translator.from_string(DEFAULT_VERSION)),
293
291
  )
294
- if latest_full_release_tag is None:
295
- # Workaround - we can safely scan the extra commits on this
296
- # branch if it's never been released, but we have no other
297
- # guarantees that other branches exist
298
- log.info(
299
- "No full releases have been made yet, the default version to use is %s",
300
- latest_full_release_version,
292
+
293
+ # we can safely scan the extra commits on this
294
+ # branch if it's never been released, but we have no other
295
+ # guarantees that other branches exist
296
+ # Note the merge_base might be on our current branch, it's not
297
+ # necessarily the merge base of the current branch with `main`
298
+ other_ref = (
299
+ repo.active_branch
300
+ if latest_full_release_tag is None
301
+ else latest_full_release_tag.name
302
+ )
303
+
304
+ # Conditional log message to inform what was chosen as the comparison point
305
+ # to find the merge base of the current branch with the latest full release
306
+ log_msg = (
307
+ str.join(
308
+ ", ",
309
+ [
310
+ "No full releases have been made yet",
311
+ f"the default version to use is {latest_full_release_version}",
312
+ ],
301
313
  )
302
- merge_bases = repo.merge_base(repo.active_branch, repo.active_branch)
303
- else:
304
- # Note the merge_base might be on our current branch, it's not
305
- # necessarily the merge base of the current branch with `main`
306
- log.info(
307
- "The last full release was %s, tagged as %r",
308
- latest_full_release_version,
309
- latest_full_release_tag,
314
+ if latest_full_release_tag is None
315
+ else str.join(
316
+ ", ",
317
+ [
318
+ f"The last full release was {latest_full_release_version}",
319
+ f"tagged as {latest_full_release_tag!r}",
320
+ ],
310
321
  )
311
- merge_bases = repo.merge_base(latest_full_release_tag.name, repo.active_branch)
322
+ )
323
+
324
+ log.info(log_msg)
325
+ merge_bases = repo.merge_base(other_ref, repo.active_branch)
326
+
327
+ if len(merge_bases) < 1:
328
+ raise MissingMergeBaseError(
329
+ f"Unable to find merge-base between {other_ref} and {repo.active_branch.name}"
330
+ )
331
+
312
332
  if len(merge_bases) > 1:
313
333
  raise NotImplementedError(
314
- "This branch has more than one merge-base with the "
315
- "latest version, which is not yet supported"
334
+ str.join(
335
+ " ",
336
+ [
337
+ "This branch has more than one merge-base with the",
338
+ "latest version, which is not yet supported",
339
+ ],
340
+ )
316
341
  )
342
+
317
343
  merge_base = merge_bases[0]
344
+
318
345
  if merge_base is None:
319
346
  str_tag_name = (
320
347
  "None" if latest_full_release_tag is None else latest_full_release_tag.name
@@ -350,6 +377,23 @@ def next_version(
350
377
  tag_format=translator.tag_format,
351
378
  )
352
379
 
380
+ # We only include pre-releases here if doing a prerelease.
381
+ # If it's not a prerelease, we need to include commits back
382
+ # to the last full version in consideration for what kind of
383
+ # bump to produce. However if we're doing a prerelease, we can
384
+ # include prereleases here to potentially consider a smaller portion
385
+ # of history (from a prerelease since the last full release, onwards)
386
+
387
+ # Note that a side-effect of this is, if at some point the configuration
388
+ # for a particular branch pattern changes w.r.t. prerelease=True/False,
389
+ # the new kind of version will be produced from the commits already
390
+ # included in a prerelease since the last full release on the branch
391
+ tag_sha_2_version_lookup = {
392
+ tag.commit.hexsha: (tag, version)
393
+ for tag, version in all_git_tags_as_versions
394
+ if prerelease or not version.is_prerelease
395
+ }
396
+
353
397
  # N.B. these should be sorted so long as we iterate the commits in reverse order
354
398
  for commit in commits_since_last_full_release:
355
399
  parse_result = commit_parser.parse(commit)
@@ -360,44 +404,24 @@ def next_version(
360
404
  )
361
405
  parsed_levels.add(parse_result.bump)
362
406
 
363
- # We only include pre-releases here if doing a prerelease.
364
- # If it's not a prerelease, we need to include commits back
365
- # to the last full version in consideration for what kind of
366
- # bump to produce. However if we're doing a prerelease, we can
367
- # include prereleases here to potentially consider a smaller portion
368
- # of history (from a prerelease since the last full release, onwards)
369
-
370
- # Note that a side-effect of this is, if at some point the configuration
371
- # for a particular branch pattern changes w.r.t. prerelease=True/False,
372
- # the new kind of version will be produced from the commits already
373
- # included in a prerelease since the last full release on the branch
374
- for tag, version in (
375
- (tag, version)
376
- for tag, version in all_git_tags_as_versions
377
- if prerelease or not version.is_prerelease
378
- ):
379
- log.debug(
380
- "testing if tag %r (%s) matches commit %s",
381
- tag.name,
382
- tag.commit.hexsha,
383
- commit.hexsha,
384
- )
385
- if tag.commit == commit:
386
- latest_version = version
387
- log.debug(
388
- "tag %r (%s) matches commit %s. the latest version is %s",
389
- tag.name,
390
- tag.commit.hexsha,
391
- commit.hexsha,
392
- latest_version,
393
- )
394
- break
395
- else:
407
+ log.debug("checking if commit %s matches any tags", commit.hexsha)
408
+ t_v = tag_sha_2_version_lookup.get(commit.hexsha, None)
409
+
410
+ if t_v is None:
396
411
  # If we haven't found the latest prerelease on the branch,
397
- # keep the outer loop going to look for it
412
+ # keep the loop going to look for it
398
413
  log.debug("no tags correspond to commit %s", commit.hexsha)
399
414
  continue
400
- # If we found it in the inner loop, break the outer loop too
415
+
416
+ # Unpack the tuple
417
+ tag, latest_version = t_v
418
+ log.debug(
419
+ "tag %r (%s) matches commit %s. the latest version is %s",
420
+ tag.name,
421
+ tag.commit.hexsha,
422
+ commit.hexsha,
423
+ latest_version,
424
+ )
401
425
  break
402
426
 
403
427
  log.debug(