Этот ответ сопровождается огромным отказом от ответственности:
- Возможно, есть и другие способы, отличные от этого, использующие только код PowerShell, но я не эксперт по PowerShell
- Я являюсь автором следующей библиотеки классов
Я создал библиотеку классов .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...
^--------^