Как получить последний тег Mercurial из Powershell? - PullRequest
5 голосов
/ 31 мая 2011

Если я запускаю следующую команду из командной строки DOS:

hg parent --template {latesttag}

, тогда я получаю последнее значение тега, возвращаемое, как и ожидалось.Однако, если я запускаю ту же команду из консоли powershell, я получаю следующую ошибку:

hg parent: опция -i не распознана

Мне нужна команда для запуска в powershell, чтобы я мог получитьэто результаты в качестве переменной для использования.Любая идея, что мне нужно сделать, чтобы запустить команду?

Ответы [ 2 ]

4 голосов
/ 31 мая 2011

Вам просто нужно заключить аргумент в --template в кавычки, чтобы Powershell знал, что это строка:

hg parents --template '{latesttag}'

Иногда, однако, с помощью способа, которым Powershell анализирует вещи, вы должны вдвойне убедиться, что двойные кавычки выживают (например, передача аргумента, который содержит пробелы, но должен быть 1 аргумент вместо многих, например пути или более длинный шаблон):

hg parents --template '"{latesttag}"'
1 голос
/ 31 мая 2011

Этот ответ сопровождается огромным отказом от ответственности:

  1. Возможно, есть и другие способы, отличные от этого, использующие только код PowerShell, но я не эксперт по PowerShell
  2. Я являюсь автором следующей библиотеки классов

Я создал библиотеку классов .NET, Mercurial.Net , которая позволяет программе .NET оборачиваться вокруг клиента командной строки hg без необходимости разбираться со всеми тонкостями выполнения всего этого , ожидание завершения программы и т. д. Примечание. Для работы библиотеки классов вам понадобится установить Mercurial и сделать его доступным через PATH.

Может быть установлен через Nuget пакет .

Поскольку я не эксперт по PowerShell, я покажу, как это сделать с помощью кода C # и моей библиотеки.

Учитывая, что в библиотеке не реализованы опции all (пока), к сожалению, родительская команда не может использоваться моей библиотекой, но команда log может, хотя, вероятно, будет иметь дополнительные издержки. Вы должны будете судить, приемлемо ли это.

Причина, по которой родительскую команду нельзя использовать, состоит в том, что я решил пока не реализовывать поддержку шаблонного синтаксиса в Mercurial, потому что тогда я знаю, какой вывод ожидать, и могу проанализировать его обратно в надлежащий .NET экземпляры.

Вот код .NET, который найдет самый верхний тег:

var repo = new Repository(".");
var tags = repo.Log(new LogCommand().WithRevision("tag()")).First().Tags.ToArray();

Это заполнит tags массивом имен тегов. Команда log возвращает журнал в обратном порядке, сначала самые новые наборы изменений, поэтому .First() найдет самый новый набор изменений.

Если вам нужен ближайший тег, который также является предком текущей рабочей папки, вот измененный код:

repo.Log(new LogCommand().WithRevision("tag() and ancestors(.)")).First().Tags...
                                             ^---------------^

Сюда входит ревизия рабочей папки, если в ней есть тег. Если вам нужен предок, не считая ревизии рабочей папки:

repo.Log(new LogCommand().WithRevision("tag() and ancestors(.) and not .")).First().Tags...
                                                              ^--------^
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...