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