1

这是我知道的一个常见问题,但我想将它提升到一个新的水平,我知道如何使用捆绑包,但是不得不通过“hg log”来查看我的最后更改有点无聊,所以我想使其自动化,通过 bash/awk 检查我的日志并通过日期和邮件识别工作/家庭更改(我在 .hgrc、me@work 和 me@home 中有不同的邮件)。

我已经有了这个 bash 功能,但我必须手动传递基本修订:

hgb () {
    hg bundle --base $1 ~/changes-`date +%Y-%m-%d-%H-%M`.hg
}

所以我想要类似的东西:

mkwbundle #make work bundle for home

和:

mkhbundle #make home bundle for work

我刚开始使用 awk/sed,但我已经看到了奇迹,我在使用 Python 之前询问过,Python 是我几乎可以处理任何事情的 goto 工具。

更新:

对于善变的不可知论者,这就是 hg 日志的样子:

changeset:   28:f5200232460e
tag:         tip
user:        Manuel@home
date:        Tue Jan 15 23:39:57 2013 -0500
summary:     Adding DevTodo

changeset:   27:828dbba6830a
user:        Manuel@home
date:        Tue Jan 15 23:24:57 2013 -0500
summary:     login twig

changeset:   26:781477f86f6f
user:        Manuel@home
date:        Tue Jan 15 00:18:54 2013 -0500
summary:     UI mockup

changeset:   25:0c9365b200a8
user:        Manuel@home
date:        Mon Jan 14 23:50:22 2013 -0500
summary:     using twig blocks, remember reuse parent

changeset:   24:a1abfcfcefed
user:        Manuel@work
date:        Mon Jan 14 23:49:44 2013 -0500
summary:     smaller footer

changeset:   23:3cd12b7fb684
user:        Manuel@work
date:        Mon Jan 14 23:20:18 2013 -0500
summary:     test content width

我想在工作时获得基本修订版以制作捆绑包,假设我开始在家中以 rev 24 工作并进行了 4 次更改,然后我在 28 岁,我想获得 24 作为基础 rev 并制作捆绑包,然后在工作中也一样。

编辑:根据下面的@dhunter 评论,脚本的预期输出将是:

24
4

2 回答 2

3

我的理解是你想为你的 hgb() $1 获得 rev No#。

所以让我们举个例子。如果你运行hg log你的工作:

**(some information were omitted)**

changeset: xxx
user:me@work

changeset: xxx
user:someoneelse@work.com

changeset: xxx
user:me@work

changeset: 777:234asdf2342
user:me@work

changeset: xxx-border-xxx
user:me@home

changeset: xxxx
user:me@home

那么你可能想要拥有777. 这意味着从提示中,您检查用户,并发现用户更改的变更集来自me@home->@workme@work -> me@home在上面的示例中,它是changeset xxx-border-xxx. 然后你采取以前的变更集rev。从那个版本开始,你想制作一个捆绑包,然后导入你的家庭/工作仓库。我希望我对你的理解是正确的。但是,您确实应该明确提出您的问题。

无论如何....当然可以通过 awk 完成,以上面的示例为例(省略了分支、日期、摘要)

hg log| awk -vRS="" 'NR==1{p=$0~/me@work/?"me@work":"me@home";l=$2}NR>1 {if($0!~p){print l;exit}else l=$2}'

如果使用上面的示例:

输出是:

777:234asdf2342

如果尝试使用您问题中的示例,我们必须更改电子邮件地址,然后 awk-oneliner 是:

hg log| awk -vRS="" 'NR==1{p=$0~/Manuel@work/?"Manuel@work":"Manuel@home";l=$2}NR>1 {if($0!~p){print l;exit}else l=$2}'

输出是:

25:0c9365b200a8

我经常使用 hg,但不捆绑。如果您真的想获得 24 转。对于你的 --base,然后看看这个:

 awk -vRS="" 'NR==1{p=$0~/Manuel@work/?"Manuel@work":"Manuel@home";}NR>1{if($0!~p){print $2;exit}}'

这给了你:

24:a1abfcfcefed

笔记

如果自上次解包后根本没有变更集 ci,则不要使用 awk 行生成包。它将重复生成最后一个包。你应该知道它是否改变了对吗?

于 2013-01-17T14:45:02.550 回答
2

hg bundle --base REV命令类型的修订版本

使用:revsets,revsets 别名

口头形式的任务:找到最新的变更集,然后提示由另一位作者连续创建的变更集,而不是寻找的变更集

解决方案

迭代 1

max(user('work'))对于带有变更集的捆绑包,旨在转移到工作中(所有在最新的“工作”是家庭作业之后)

max(user('home'))对于带有变更集的捆绑包,旨在转移到家中(在最新的“家”是工作场所之后)

迭代 2

压缩和美化:我懒得打字太多。Bundleable() 函数名称缩短为 ba() 并添加到家庭和工作存储库的 Mercurial 配置文件的“revsetalias”部分

 [revsetalias]
 ba('$1') = max(user('$1'))

('$1' 而不是 $1 用于在参数周围不写'' - 信号字符串 - 手动)

结果

hg bundle --base "ba(home)"或者hg bundle --base "ba(work)"

home|work 定义目的地,必须为其准备捆绑包

于 2013-01-17T19:19:16.657 回答