bump2version 在删除 post-release 段时增加预发布

bump2version to increment pre-release while removing post-release segment

我将如何使用 bump2version(关于它的调用 and/or 它的配置)来递增:

1.0.0.a2.post0 # post-release of a pre-release a2

1.0.0.a3 # pre-release a3

可重现的例子:

$ python3 -m pip install 'bump2version==1.0.*'

__init__.py:

__version__ = "1.0.0.a2.post0"

setup.cfg:

[bumpversion]
current_version = 1.0.0.a2.post0
parse = ^
    (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)  # minimum major.minor.patch, 1.2.3
    (?:
    \.
    (?P<prerel>a|alpha|b|beta|d|dev|rc)  # pre-release segment
    (?P<prerelversion>\d+)  # pre-release version num
    )?
    (?:\.post(?P<post>\d+))?  # post-release
serialize =
    {major}.{minor}.{patch}.{prerel}{prerelversion}.post{post}
    {major}.{minor}.{patch}.{prerel}{prerelversion}
    {major}.{minor}.{patch}.post{post}
    {major}.{minor}.{patch}

[bumpversion:file:__init__.py]

[bumpversion:part:prerel]
optional_value = dev
values =
    dev
    d
    alpha
    a
    beta
    b
    rc

此方案的有效版本示例,它采用 PEP 440 中的一些但不是全部规则:

1.2.3             # (1) final

1.2.3.dev0        # (2) prerelease
1.2.3.a0
1.2.3.alpha0
1.2.3.b0
1.2.3.beta0
1.2.3.rc0

1.2.3.rc3.post0   # (3) postrelease (of a pre-release version)

1.2.3.post0       # (4) postrelease (of a final version)

我试过,例如,bump2version --verbose prerelversion 或者 --new-version=1.0.0.a3 明确。这两次尝试都保留了 .post0 而不是删除它。


注意:几周前我在 bump2version 回购中作为 usage question issue 问过这个问题,但没有成功。

我们不得不努力解决这个问题(而且,在过去,使用原始 bumpversion,而不是更好的 bump2version)。

使用下面的配置,您可以使用 bumpversion pre1.0.0.a2.post01.0.0.a3

解释:

由于prepost都有一个字符串前缀和一个数字,我认为有必要相应地拆分它们。例如,pre 部分可以拆分为 prekind(字符串)和 pre(数字)。然后,好的事情是你可以独立于问题号(一个序列,像往常一样)增加 prekind'dev''alpha''beta' 等)。

下面,我按顺序给出了完整的配置和一个包含多个调用的示例,以显示可能的各种变化。我确信下面的设置可以进一步定制,但希望它能让你和其他人在正确的轨道上着陆。

cat > .bumpversion.cfg << "EOF"
[bumpversion]
current_version = 1.0.0.a2.post0
files = __init__.py
commit = False
parse = ^
        (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)
        (\.(?P<prekind>a|alpha|b|beta|d|dev|rc)
        (?P<pre>\d+)  # pre-release version num
        )?
        (\.(?P<postkind>post)(?P<post>\d+))?  # post-release
serialize = 
        {major}.{minor}.{patch}.{prekind}{pre}.{postkind}{post}
        {major}.{minor}.{patch}.{prekind}{pre}
        {major}.{minor}.{patch}.{postkind}{post}
        {major}.{minor}.{patch}

[bumpversion:part:prekind]
optional_value = _
values =
    _
    dev
    d
    alpha
    a
    beta
    b
    rc

[bumpversion:part:postkind]
optional_value = _
values =
    _
    post
EOF

echo '__version__ = "1.0.0.a2.post0"' > __init__.py

测试:

这些执行一系列 bumpversion 操作来演示一些可能的突变。当然,您可以使用--new-version=...强制设置新版本。

for op in \
    start post post pre pre prekind prekind pre postkind post prekind minor \
    postkind post pre postkind prekind postkind post major prekind postkind post; do
  if [[ $op == 'start' ]]; then
    printf "starting from: %s\n" $(perl -ne 'print "\n" if /"(.*)"/' __init__.py)
  else
    bumpversion $op
    printf "%10s --> %s\n" $op $(perl -ne 'print "\n" if /"(.*)"/' __init__.py)
  fi
done

输出(注释):

starting from: 1.0.0.a2.post0
      post --> 1.0.0.a2.post1   # no issue incrementing post
      post --> 1.0.0.a2.post2   
       pre --> 1.0.0.a3         # can move to the next 'pre'release
       pre --> 1.0.0.a4 
   prekind --> 1.0.0.beta0      # can upgrade the kind of prerelease
   prekind --> 1.0.0.b0 
       pre --> 1.0.0.b1         # and keep incrementing 
  postkind --> 1.0.0.b1.post0   # bring a post component again  
      post --> 1.0.0.b1.post1   # and incrementing
   prekind --> 1.0.0.rc0        # upgrade pre kind directly
     minor --> 1.1.0            # patch/minor/major cut the optional parts
  postkind --> 1.1.0.post0      # but we can bring a post component (without pre)
      post --> 1.1.0.post1
       pre --> 1.1.0            # BAD & silent: cannot increment a missing part 
  postkind --> 1.1.0.post0
   prekind --> 1.1.0.dev0       # default: pre part starts at 'dev'
  postkind --> 1.1.0.dev0.post0 # can add post part to a pre part
      post --> 1.1.0.dev0.post1 # etc...
     major --> 2.0.0
   prekind --> 2.0.0.dev0
  postkind --> 2.0.0.dev0.post0
      post --> 2.0.0.dev0.post1