比较Mercurial Repos

时间:2011-06-17 15:27:15

标签: mercurial tortoisehg

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

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

我想我应该设置一个脚本来完成我的回购并比较它们。我可以养成每天运行脚本的习惯。

思想?

1 个答案:

答案 0 :(得分:3)

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

我保留一个文件D:\repos.config,其中列出了我想快速浏览三件事的所有本地存储库的绝对路径:状态摘要,传入更改,传出更改。以下示例假设包含以下内容的文件:

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

为了检查状态,脚本执行$results = hg -R $path st以获取状态列表,然后我只计算第一个字符,为repo路径打印1行,为每个存储库路径打印1行状态摘要(如果有的话)要展示的任何东西):

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

对于传入/传出,我将[paths]保留在每个存储库的hgrc中,以便default始终是我们服务器上的存储库,bb是bitbucket等。我循环遍历相同的路径列表,在$results = hg -R $path $type $alias --template '{rev} {node|short} {desc|firstline}\n' for each. is either $ alias or hgrc {{1} depending on which I've called and中执行is the path alias that should be in each repo's $ type (empty string for如果您要过滤,请在模板中默认, bb ,备份, etc.). I do a little processing of $结果, since the first 2 lines are not actual changesets. You'd probably want {date | age} or {date | 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及其Repository Registry足够满意,在我使用脚本告诉我需要做哪些事情之后,帮助我一次完成它们。但是,循环遍历路径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 ' ' $_}
    }
}