使用mercurial来管理linux内核,标签和hg id

时间:2011-01-10 21:13:53

标签: mercurial linux-kernel

有人使用mercurial来管理linux内核吗?这有点长,但我不确定是否有答案。我想提供一些帮助的例子

这就是我所看到的:

在linux内核中,有一个命令在构建名为scripts / setlocalversion时使用。在此脚本中,它根据存储库信息设置内核版本。目前,它了解git,mercurial和svn repo。

对于git,它使用以下代码创建标记:

if head=`git rev-parse --verify --short HEAD 2>/dev/null`; then

    # If we are at a tagged commit (like "v2.6.30-rc6"), we ignore it,
    # because this version is defined in the top level Makefile.
    if [ -z "`git describe --exact-match 2>/dev/null`" ]; then

        # If we are past a tagged commit (like "v2.6.30-rc5-302-g72357d5"),
        # we pretty print it.
        if atag="`git describe 2>/dev/null`"; then
            echo "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}'
.....

所以,这是我做的一个例子来理解它是如何工作的:

[1536][mcrowe:test]$ git tag -a -m"Creating a tag" KernelTest
[1537][mcrowe:test]$ git rev-parse --verify --short HEAD 
d024e76
[1537][mcrowe:test]$ git describe --exact-match
KernelTest
[1537][mcrowe:test]$ git describe
KernelTest

因此,在此示例中,内核构建时本地版本将设置为“KernelTest”。

然而,在mercurial中,获取本地版本的代码是:

if hgid=`hg id 2>/dev/null`; then
    tag=`printf '%s' "$hgid" | cut -d' ' -f2`

    # Do we have an untagged version?
    if [ -z "$tag" -o "$tag" = tip ]; then
        id=`printf '%s' "$hgid" | sed 's/[+ ].*//'`
        printf '%s%s' -hg "$id"
    fi
....

我的期望是我可以标记一个版本,并将该标记作为此脚本使用的内容,就像在git中一样。但是,似乎“hg id”从未打印出像此脚本所期望的标记:

[1546][mcrowe:test2]$ hg tag -m"Creating a tag" KernelTest -r tip
[1548][mcrowe:test2]$ hg id
3ccda5e738ae+ tip
[1548][mcrowe:test2]$ hg tags
tip                              115:3ccda5e738ae
KernelTest                       114:be25df80ce76

因此标记操作会更改修订版本,因此hg id将永远不会显示标记的内容。

核心问题 :AFAIK,这对Linux内核无效。问题是如何在内核树中实现这一点以允许hg tag执行git tag

1 个答案:

答案 0 :(得分:3)

尝试做:

hg log -r . --template '{latesttag}'

我认为这就是你想要的。

还有{latesttagdistance}可以让你知道你是N提交过一个方便版本字符串的标签。