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