2011-06-17 58 views
2

我的Windows工作站上有一堆Mercurial存储库。我们是一家小商店,并且在某些日子里(通常是坏的),我可能会在六个或更多的项目中进行更改/错误修复。其中一些项目处于维护模式,每个月只触摸一次。当然,在我推送到我们的中央Hg服务器之前,我有时会被打断。比较Mercurial回购

有没有简单的方法来定期比较我的回购协议与中央服务器?它应该警告我,如果我有没有被推动的变化。理想情况下,位于系统托盘中的某些内容会按照“本地更改超过48小时而不是远程回购”进行警报。

我想我应该建立一个脚本来通过我的回购和比较它们。我可以养成每天运行脚本的习惯。

想法?

+0

您可能知道“hg outgoing”会列出所有传出的更改。但这并不是你想要的 - 你在使用现有的工具来监视存储库并告诉你什么时候有即将发生变化的传出更改。 –

+0

@汤姆安德森,是的,我正在寻找一些东西来自动化hg传出。添加一点智慧,以便它不会提醒小于24小时的更改。这将帮助我确保一次只能在我的机器上生活数周。我的“低挂果实”的答案是将我可以在一段时间内运行的所有回购库中的脚本放在一起,但我认为可能已经有些东西可以解决这个问题。 –

回答

3

我在我的Powershell配置文件中使用了辅助函数。在其他脚本语言中它们很容易,但我不敢在.bat或.cmd文件中执行它。

我保留一个文件D:\repos.config带有所有本地存储库的绝对路径列表我想快速浏览3件事情:状态摘要,传入更改,传出更改。下面的示例假设这些内容的文件:

D:\repository1 
D:\repository2 
#D:\ignoredrepo 
D:\repository3 
D:\repository4 

对于检查状态,脚本$results = hg -R $path st以获取状态列表,然后我只算第一个字符,打印1行的回购路径和1号线对于每个库路径状态摘要(如果有什么可以炫耀):

----- D:\repository1 
    M 1 - A 1 
----- D:\repository4 
    ? 3 

对于呼入/呼出,我把每一个仓库的hgrc concistent我[paths]使得default始终是我们的服务器上的存储库,bb是关于bitbuc的一个KET,通过路径相同的列表等等。我环路,在ordepending on which I've called and $别名is the path alias that should be in each repo's hgrc (empty string for默认, BB ,备份, etc.). I do a little processing of $结果, since the first 2 lines are not actual changesets. You'd probably want执行$results = hg -R $path $type $alias --template '{rev} {node|short} {desc|firstline}\n' for each. $型is either {日期|年龄} or |`{中日shortdate}您模板,如果你想过滤出不到24小时的东西。

这样我就可以在提示符下简单地编写hgouts bb并查看简明输出。一些存储库根本没有特定的别名,因此2>$null有助于防止某些abort: repository bb not found!消息。

----- D:\repository2 
    150 f7364a6f78d2 integrate FooBar 
    151 7a3d3d9fb0d0 fixes #1214; thingamajig wasn't getting closed 
----- D:\repository4 
    4 dd88f00d93ff more changes to the doojiflopper 

至于同步多个存储库,我足以与TortoiseHg 2.0及库登记满意帮我做他们1在经过一段时间我使用脚本来告诉我,我需要做哪些。但是,循环遍历路径和hg -R $path pull -uhg -R $path push也不会太复杂,或者使用脚本的某些部分来选择性地拉/推只需要在工作目录中没有更改的内容。这只是我不需要的东西。

编辑:我花了一点时间来清理一下代码。该功能hghg是状态摘要以及功能hgins[alias]hgouts[alias]是什么其实我从提示来电。

function hghg(){ 
    $repos = [io.file]::readalllines('D:\repos.config') 
    $repos | % { 
     if (!$_.startswith('#') -and (test-path $_)){ 
      hg-st $_ 
     } 
    } 
} 

function hg-st($path){ 
    $x = hg -R $path st 
    if ($x.length -gt 0){ 
     write-host "----- $_" 
     $d = @{} 
     $x | % { 
      $c = $_[0] 
      if (!$d.containskey($c)){ 
       $d[$c] = 0 
      } 
      $d[$c] += 1 
     } 

     $p = @() 
     $d.keys | % { 
      $cnt = $d[$_] 
      $p += "$_ $cnt" 
     } 
     write-host ' ' ([string]::join(' - ', $p)) 
    } 
} 

function hgins($pathalias){ 
    hg-inouts 'in' $pathalias 
} 

function hgouts($pathalias){ 
    hg-inouts 'out' $pathalias 
} 

function hg-inouts($type, $pathalias){ 
    $repos = [io.file]::readalllines('D:\repos.config') 
    $repos | % { 
     if (!$_.startswith('#') -and (test-path $_)){ 
      hg-inout $type $_ $pathalias 
     } 
    } 
} 

function hg-inout($type, $source, $target){ 
    $x = hg -R $source $type $target --template '{rev} {node|short} {desc|firstline}\n' 2>$null 
    if ($x.count -gt 2 -and $x[2] -ne 'no changes found'){ 
     write-host "----- $source" 
     $y = $x[2..($x.length - 1)] 
     $y | % {write-host ' ' $_} 
    } 
} 
+0

谢谢乔尔。我会在下周尝试放置一个类似的PS脚本。 –

+0

因为Powershell对你有用(不确定性是我还没有包含代码的唯一原因),所以我添加了我使用的很少的东西。希望它会有用。 –

+0

太棒了!我还没有完成对我的偏好的定制,但我没有遇到任何问题。再次感谢... –