Сравнить Mercurial Repos

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

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

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

Мысли?


person Jamie F    schedule 17.06.2011    source источник
comment
Вы, наверное, знаете, что hg outgoing перечислит все исходящие изменения. Но это не то, что вам нужно - вам нужен существующий инструмент, который будет отслеживать репозитории и сообщать вам, когда у вас есть исходящие изменения, которые могут устареть.   -  person Tom Anderson    schedule 17.06.2011
comment
@Tom Anderson, да, ищу что-нибудь для автоматизации hg outgoing по сути. Добавьте немного умов, чтобы он не предупреждал об изменениях, произошедших менее 24 часов назад. Это поможет мне убедиться, что изменения не будут жить только на моей машине в течение нескольких недель. Мой низко висящий фруктовый ответ будет заключаться в том, чтобы собрать сценарий, работающий во всех моих репозиториях, который я могу запускать время от времени, но я подумал, что, возможно, уже есть что-то, чтобы справиться с этим.   -  person Jamie F    schedule 17.06.2011


Ответы (1)


Я использую вспомогательные функции в моем профиле Powershell. Они достаточно просты для других языков сценариев, хотя я бы не осмелился сделать это в файлах .bat или .cmd.

Я храню файл D:\repos.config со списком абсолютных путей всех локальных репозиториев, на которые я хочу быстро взглянуть, по трем вещам: сводка состояния, входящие изменения, исходящие изменения. В следующих примерах предполагается наличие файла с таким содержимым:

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. $ typeis eitherinoroutdepending on which I've called and $ aliasis the path alias that should be in each repo'shgrc,bb_default $ 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 в массовом порядке или использовать фрагменты скрипта для выборочного извлечения / проталкивания только того, что необходимо, что не имеет изменений в рабочем каталоге. Просто мне это еще не нужно.

Изменить: мне потребовалось немного времени, чтобы немного почистить код. Функции 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 ' ' $_}
    }
}
person Joel B Fant    schedule 17.06.2011
comment
Спасибо, Джоэл. На следующей неделе попробую собрать похожий сценарий PS. - person Jamie F; 18.06.2011
comment
Поскольку Powershell полезен для вас (неопределенность была единственной причиной, по которой я еще не включил код), я добавил то немногое, что использую. Надеюсь, это будет полезно. - person Joel B Fant; 18.06.2011
comment
Здорово! Я еще не закончил настраивать его в соответствии со своими предпочтениями, но у меня все получилось без проблем. Еще раз спасибо... - person Jamie F; 21.06.2011