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__.py 和 version.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__.py 或 version.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.js、version.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.hxx、version.cxx、version.hpp、version.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.0、1.0.3、11.17.34 这样的标签。
4.2 短横线分隔数字 (tagfmt=dashed)
如 1-0、1-0-3、11-17-34 这样的标签。
4.3 带文本前缀的点格式 (tagfmt=pfx-dotted)
如 mylib-1.0 或 sth_11.3.17 这样的标签:字母数字字符串,破折号或下划线,然后是实际版本,如点分隔。
4.4 带文本前缀的短横线格式 (tagfmt=pfx-dashed)
如 mylib-1-0 或 sth_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)
如果您有工作的 pip 或 easy_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/
使用那里的问题跟踪器进行错误报告和改进建议。
感谢 Octobus 和 Clever Cloud 为托管此服务。
12 附加说明
有关此扩展的信息也可在 Mercurial Wiki 上找到: http://mercurial.selenic.com/wiki/UpdateVersionExtension
请参阅我编写的其他 Mercurial 扩展: 其他 Mercurial 扩展.
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源代码分发
mercurial_update_version-1.2.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b5b29f3ae130ed4521b1d120a9c0cd22bc5834d85b937ea30c86f2ce6d0b28a0 |
|
MD5 | 72cce8f1041fefc5921d6a318bd7a4d1 |
|
BLAKE2b-256 | 247102d052dca1cf50d2374d0d85a96ed013ebdd258fbe6ab49a6fafa2b04c13 |