Сравнить Mercurial Repos - PullRequest
       4

Сравнить Mercurial Repos

2 голосов
/ 17 июня 2011

У меня на рабочей станции Windows куча репозиториев Mercurial. Мы небольшой магазин, и в некоторые дни (обычно плохие) я могу вносить изменения / исправлять ошибки в полдюжины или более моих проектов. Некоторые из этих проектов находятся в режиме обслуживания, они затрагиваются только раз в месяц или около того. Конечно, иногда меня прерывают, прежде чем я отправляюсь на наш центральный сервер Hg.

Есть ли простой способ регулярно сравнивать кучу моих репозиториев с центральным сервером? Он должен предупредить меня, если у меня есть изменения, которые не были переданы. В идеале это то, что находится в системном трее и предупреждает по линии «Локальное изменение старше 48 часов без удаленного репо».

Полагаю, мне нужно просто настроить скрипт, чтобы просмотреть мои репозитории и сравнить их. Я мог бы привыкнуть запускать сценарий ежедневно.

Мысли

1 Ответ

3 голосов
/ 17 июня 2011

Я использую вспомогательные функции в своем профиле 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

Для входящих / исходящих я сохраняю [paths] в каждом хранилище hgrc согласованным, так что default - это всегда хранилище на нашем сервере, bb - это хранилище в битовой корзине и т. Д. Я перебираю один и тот же список путей, выполняя $results = hg -R $path $type $alias --template '{rev} {node|short} {desc|firstline}\n' for each. $ type is either in or out depending on which I've called and $ alias is the path alias that should be in each repo's hgrc (empty string for default , bb , backup , etc.). I do a little processing of $ results , 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 и его репозиторием.Реестр, чтобы помочь мне сделать их по одному после того, как я использую скрипт, чтобы сказать мне, какие из них мне нужно сделатьНо также не было бы очень сложно циклически проходить по путям и hg -R $path pull -u или hg -R $path push массово, или использовать биты скрипта, чтобы выборочно извлекать / выдвигать только то, что необходимо без изменений в рабочем каталоге.Это просто не то, что мне было нужно.

Edit : Я потратил немного времени, чтобы немного почистить код.Функции 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 ' ' $_}
    }
}
...