Как мне получить последний тег Mercurial из Powershell

#powershell #mercurial

#powershell #mercurial

Вопрос:

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

hg parents —template {latesttag}

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

родители hg: опция -я не распознал

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

Ответ №1:

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

 hg parents --template '{latesttag}'
  

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

 hg parents --template '"{latesttag}"'
  

Комментарии:

1. Отлично, спасибо. В этом случае сработал первый пример только с одним набором кавычек.

2. для меня не отображается последний тег .. но более старый тег, проверяет ли он все ветви, поскольку теги являются глобальными?

Ответ №2:

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

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

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

Его можно установить через пакет Nuget.

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

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

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

Комментарии:

1. Интересно. Эта библиотека должна пригодиться мне по крайней мере для нескольких вещей.