跳转到主要内容

Mercurial更新版本扩展

项目描述

不再需要手动编辑版本号。

每次您发出 hg tag 命令时,此扩展会扫描您的仓库,寻找包含各种 VERSION = 行的文件,适当地更新这些常量,提交更改,然后才标记发布。

可以在每个仓库中启用功能,或者(通过 ~/.hgrc)一次为多个仓库启用(这样您就不需要在每个创建的或克隆的仓库上记住激活它)。

1 启用扩展

按照以下说明安装扩展。然后可以按仓库启用它,或者一次为多个仓库启用。

1.1 按仓库启用

在仓库 .hg/hgrc 中写入

[update_version]
active = true
language = python
tagfmt = dotted

(当然使用适当的设置)。这里

  • language 表示版本常量语法,有时会限制扫描的文件列表,

  • tagfmt 描述期望的标签语法(以及如何从标签中提取实际版本号)。

例如,language = python 表示在仓库内部任何位置查找 setup.py__init__.pyversion.py 文件,并更新类似 VERSION = "1.2.3" 的行,而 tagfmt = dotted 表示简单的点格式数字用作标签(hg tag 1.0.9)。

语言和标签格式都是可配置的,扩展提供了合理的默认值,但可以被覆盖,可以定义新样式。请参阅以下内容。

还可以启用多种语言。例如,要更新 python 和 javascript 文件中的数字,可以在 .hg/hgrc 中写入

[update_version]
py.active = true
py.language = python
py.tagfmt = dotted
js.active = true
js.language = javascript
js.tagfmt = dotted

名称前缀(如上例中的 py 和 js)仅用于分组设置,并不重要(可以使用任何喜欢的名称)。通常,所有条目中的 tagfmt 设置应相同。

1.2 一次为多个仓库启用

~/.hgrc 中写入类似的内容

[update_version]
pydev.active_on = ~/sources/pymodules, ~/work/python
pydev.language = python
pydev.tagfmt = dotted
myperl.active_on = ~/scripts, ~/work/scripts
myperl.language = perl
myperl.tagfmt = dashed
excvs.active_on = ~/legacy
excvs.expand_keywords = 1

名称前缀(如 pydev 和 myperl)仅用于将三个设置分组在一起(可以使用任何名称)。

在两种情况下

  • .active_on 列出可以应用给定规则的目录树(允许绝对路径、~~user),

  • .language.tagfmt 定义为这些目录使用哪些语言设置和哪些标签格式。

  • .expand_keywords 启用 CVS 关键字扩展(替换 $Name$ 和类似的构造)。注意,它的工作方式与关键字扩展不同,替换会被提交(因此始终存在于检出的代码中)。

如果多个指令匹配同一仓库,则都会处理,例如使用

[update_version]
pydev.active_on = ~/sources
pydev.language = python
pydev.tagfmt = dotted
jsdev.active_on = ~/sources
jsdev.language = javascript
jsdev.tagfmt = dotted

在仓库 ~/sources/myweb 中,python 和 javascript 文件都将被处理。

1.3 在TortoiseHg中使用

上述设置对于从 TortoiseHg GUI(通过 thg tag 或 TortoiseHg 主窗口的标记对话框)创建的标记是不够的。要使这些标记生效,您必须手动启用更新版本钩子。请将以下内容添加到您的 ~/.hgrc

[hooks]
pre-tag.update_version = python:mercurial_update_version.pre_tag_hook

请务必使用确切的名称和值(扩展程序将使用它来检测您是否启用了钩子,因此无需在裸 Mercurial 下再次启用)。

其余的配置保持不变。

2 使用

启用扩展后

  • 确保您的代码有一些初始版本变量(在适当的位置放置类似 VERSION = "0.0.0" 的内容)

  • 简单地进行 hg tag «适当标记」

然后,您的版本常量将被更新,更改将被提交,并且仅对生成的更改集进行标记。

当使用修订版放置标记时(hg tag -r 「版本号」 「标记」),版本号不会更新,除非指定的修订版与当前签出的修订版匹配。

不匹配预期模式的标记将被忽略,就像本地标记一样(这是很少使用的 Mercurial 功能)。

扩展程序会通知您是否以及做了什么,例如

$ hg tag 2.0
update_version: Version number in src/version.py set to 2.0. List of changes:
    Line 2
    < VERSION = "1.0"
    > VERSION = "2.0"

$ hg tag -r 2 0.5.0
update_version: ignoring tag placed -r revision (tag is placed, but version number not updated)

3 预定义语言

语言 设置定义

  • 哪些文件要检查和修补(通过文件名模式)

  • 适当的常量格式和名称

目前支持以下语言

3.1 Python (language=python)

查找名为 setup.py__init__.pyversion.py 的文件(在仓库的任何位置)。在这些文件中,更新类似于以下内容的行

VERSION = '1.2.3'

(至少一个点 - 但可以有更多,支持单引号和双引号,就像各种间隔和缩进一样)。

插入的版本号以相同的方式格式化(作为点分隔的数字列表)。放置的标记应该包含至少两部分的版本号以使用。

3.2 Perl (language=perl)

在仓库周围查找名为 *.pl*.pm*.pod 的文件。如果找到,查找类似以下内容的行

our $VERSION = '1.00';
my $VERSION = '11.72';
use constant VERSION => '21.3374';

(期望正好一个点,允许各种间隔和缩进,允许使用双引号)和

Version 1.23

(通常在 POD 部分遇到)。

此外,查找 dist.ini 并如果找到,修复类似以下内容的行

version = 0.02

支持两种标记数字类型。如果标记包含两个版本项,则保持不变(标记 1.0 结果是版本 1.0,破折号标记 1-03 带来 1.03)。如果标记有三个部分,则第一部分在点之前保留,而第二和第三部分在点之后各占两位数字(标记 1.7.2 转换为版本 1.0702,标记 17-0-9 转换为 17.0009)。其他标记是无效的。

3.3 JavaScript (language=javascript)

查找名为 version.jsversion.jsx*_version.js*_version.jsx 的文件。在这些文件中的任何一个,查找类似以下内容的行

var VERSION = "1.2.3";
const VERSION = "1.2.3";
let VERSION = "1.2.3";

(最后的分号是可选的)。

此外,查找 package.json 文件并如果找到,更新类似以下内容的行

"version": "1.0.0",

(带或不带分号,带或不带缩进)。注意:目前期望该行只包含一个项目,没有其他键。

3.4 JSON (language=json)

检查名为 *.json 的文件中的行

"version": "1.0.0",

(无论是否包含分号,是否缩进,使用单引号或双引号,同一行上不包含其他键)。

与其他大多数语言相反,还有一些额外的限制

  • 检查限制在文件的最初30行

  • 仅修改此类格式中的一种(第一条)行。

3.5 YAML (language=yaml)

检查名为 *.yaml*.yml 的文件中的类似行

version: "1.0.0"
package_version: "1.0.0"
module_version: "1.0.0"

(无论是否包含引号,是否缩进)。

与其他大多数语言相反,还有一些额外的限制

  • 检查限制在文件的最初20行

  • 仅修改匹配的第一个行。

3.6 Logstash (language=logstash)

检查名为 *version*.conf (扩展名为 conf 且基本名中包含单词 version)的文件中的类似行

add_field => { "[version]" => "1.0.2" }

或许

add_field => { "[some][prefix][version]" => "1.0.2" }

(键的最后一个部分必须是 [version],空格可以是灵活的,但整个行必须按照上述方式构造)。

我建议使用类似于 01-version.conf 的文件(这样它会被早期处理),内容如下

filter {
    mutate {
        add_field => { "[@metadata][myapp][version]" => "1.0.2" }
    }
}

然后在需要的地方(复制它,在格式化字符串中使用)引用此字段。

3.7 C++ (language=c++)

寻找名为 version.hxxversion.cxxversion.hppversion.cpp 的文件。寻找并更新类似行

const string VERSION = "1.2.3";
const char* VERSION = "1.2.3";
const char VERSION[] = "1.2.3";
string VERSION = "1.2.3";

计划支持更多语言,欢迎提出建议。

4 预定义标签格式

支持以下标签格式。

4.1 点分隔数字 (tagfmt=dotted)

1.01.0.311.17.34 这样的标签。

4.2 短横线分隔数字 (tagfmt=dashed)

1-01-0-311-17-34 这样的标签。

4.3 带文本前缀的点格式 (tagfmt=pfx-dotted)

mylib-1.0sth_11.3.17 这样的标签:字母数字字符串,破折号或下划线,然后是实际版本,如点分隔。

4.4 带文本前缀的短横线格式 (tagfmt=pfx-dashed)

mylib-1-0sth_11-3-17 这样的标签:字母数字字符串,破折号或下划线,然后是实际版本,如破折号分隔。前缀部分不能以数字结尾。

5 关键字扩展

设置 expand_keywords=1 启用CVS关键字扩展。将扫描源代码中的CVS关键字(如 $Name$(或 $Name: mytag_0.7.0 $))、$Revision$ 等,并将它们适当地更新。此更改将被提交,使这些更改永久(直到被新的标签替换)。

这是标准关键字扩展的替代方案,它在更新时更新这些关键字(并可能导致合并、编辑、扩展配置等问题)。使用 update_version 方法,关键字值将在标记前简单地提交,因此它们始终存在于检出中。

请注意,替换有点简单:主要目的是获取适当的 $Name$,其他一切($Revision$$Header$ 等)都将填充为最后一个预标记更改集的数据(计算每个文件最后一个更改的真正日期或版本是可能的,但成本相当高)。

示例配置(~/.hgrc

[update_version]
cvsconverts.active_on = ~/devel/legacy ~/devel/libs
cvsconverts.expand_keywords = 1

6 自定义语言

尚未支持,但计划中(通过配置设置定义新语言,或覆盖某些默认语言特性)。一般想法是内置一些合理的默认设置,但允许重新配置。

7 自定义标签格式

尚未支持,但计划中(通过配置设置定义新标签格式)。

8 命令

8.1 hg tag

扩展主要通过对 hg tag 进行增强来实现,如上所述。

8.2 hg tag_version_test

这是一个 dry run 检查。命令

hg tag_version_test 1.0

列出要检查的文件、是否在其中找到版本行以及它们如何更改,但不会进行任何更改。

9 安装

9.1 Linux/Unix (来自 PyPI)

如果您有工作的 pipeasy_install

pip install --user mercurial_update_version

或者也许

sudo pip install mercurial_update_version

(或者使用 easy_install 而不是 pip)。然后通过以下方式激活:

[extensions]
mercurial_update_version =

要升级,使用 --upgrade 选项重复相同的命令,例如

pip install --user --upgrade mercurial_update_version

9.2 Linux/Unix (来自源代码)

如果您没有 pip,或者希望更紧密地跟踪开发

  • 克隆此存储库和 mercurial_extension_utils,并将它们放在同一目录中,例如

    cd ~/sources
    hg clone https://foss.heptapod.net/mercurial/mercurial-extension_utils/
    hg clone https://foss.heptapod.net/mercurial/mercurial-update_version/
  • 更新到最新标签

  • 通过以下方式激活

    [extensions]
    mercurial_update_version = ~/sources/mercurial-update_version/mercurial_update_version.py

要升级,请拉取并更新。

有关此类安装的更详细信息,请参阅 mercurial_extension_utils 文档。

9.3 Windows

如果您已安装任何 Python,您可以使用 pip 进行安装

pip install mercurial_update_version

然而,由于 Mercurial(无论是从 TortoiseHg 取得还是自己的包)使用它自己的捆绑 Python,您必须通过指定路径来激活

[extensions]
mercurial_update_version = C:/Python27/Lib/site-packages/mercurial_update_version.py
;; Or wherever pip installed it, depending on the version it can also be
;; sth like (replace john with proper username and 37 with proper version)
;; mercurial_update_version =  C:\Users\john\AppData\Local\Programs\Python\Python37\Lib\site-packages\mercurial_update_version.py

要升级到新版本

pip install --upgrade mercurial_update_version

如果您没有 Python,克隆存储库

cd c:\hgplugins
hg clone https://foss.heptapod.net/mercurial/mercurial-extension_utils/
hg clone https://foss.heptapod.net/mercurial/mercurial-update_version/

更新到标记版本,并通过路径激活

[extensions]
mercurial_update_version = C:/hgplugins/mercurial-update_version/mercurial_update_version.py
;; Or wherever you cloned

有关 Windows 安装的更多详细信息,请参阅 mercurial_extension_utils 文档。

10 历史

有关更多信息,请参阅 HISTORY.rst

11 仓库,错误报告,增强建议

开发在 HeptaPod 上进行跟踪,请参阅 https://foss.heptapod.net/mercurial/mercurial-update_version/

使用那里的问题跟踪器进行错误报告和改进建议。

感谢 OctobusClever Cloud 为托管此服务。

12 附加说明

有关此扩展的信息也可在 Mercurial Wiki 上找到: http://mercurial.selenic.com/wiki/UpdateVersionExtension

请参阅我编写的其他 Mercurial 扩展: 其他 Mercurial 扩展.

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

mercurial_update_version-1.2.1.tar.gz (32.8 kB 查看哈希值)

上传时间 源代码

由以下提供支持