USB Key中的智能Mercurial捆绑包从工作到家庭和反之亦然

时间:2013-01-17 13:35:11

标签: bash mercurial sed awk

这是我所知道的一个常见问题,但我想把它提升到一个新的水平,我知道如何使用捆绑包,但是有点无聊,不得不通过“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之前就已经问过了,这几乎是我的goto工具。

更新

对于mercurial不可知的人来说,这就是hg log的样子:

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

我想在工作中获得基本修订版本,让我说我开始在家里工作24并进行了4次更改,然后我在28岁,我希望得到24作为基础版本和制作捆绑,然后在工作中相同。

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

24

2 个答案:

答案 0 :(得分:3)

我的理解是你希望获得你的hgb()$ 1的rev##。

让我们举个例子吧。如果您在工作中运行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,它是{{1} }。然后你采取之前的变更集转速。从那个版本开始,你想制作一个包,并导入你的家/工作回购。我希望我理解你。但是你真的应该明白你的问题。

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

changeset xxx-border-xxx

如果使用上面的示例:

输出是:

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}'

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

777:234asdf2342

输出是:

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}'

我使用hg很多,但不捆绑。如果你真的想要获得24转。对于你的--base,请看看:

25:0c9365b200a8

这会给你:

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

注意

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

答案 1 :(得分:2)

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

已使用:revsets,revsets别名

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

<强>解决方案

迭代1

max(user('work'))适用于包含变更集的捆绑包,旨在将转移到工作(所有在最新“工作”之后都是作业)

max(user('home'))包含变更集的捆绑包,打算将转移到主页(所有在最新的“主页”之后都是工作单位)

迭代2

压缩和美化:我太懒了打字太多了。 Bundleable()函数名缩短为ba()并添加到Mercurial配置文件的“revsetalias”部分,用于home和work repos

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

('$ 1'而不是$ 1用于不写''围绕参数 - 信号字符串 - 手工制作)

<强>结果

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

home | work define 目的地,必须为其准备包