Как получить хэш рабочего каталога, подтверждающий все незафиксированные изменения? - PullRequest
4 голосов
/ 23 февраля 2011

Часть моего процесса сборки программного обеспечения включает получение хэша родительского рабочего каталога в строку C ++ для включения в вывод "version". Это делается с помощью hg identify -i, чтобы получить глобальный идентификатор ревизии, и копированием этого вывода в файл .h для включения. Я делаю это в пакетном файле Windows:

setlocal enabledelayedexpansion
for /f "tokens=1 delims=;=" %%a in ('hg identify -i') do (
  echo const std::string revision^(_T^("%%a"^)^); > rev.h
)

Что выведет что-то вроде этого в файл:

const std::string revision(_T("3b746fd492c6"));

Если в рабочем каталоге есть незафиксированные изменения, к хешу добавляется +, что делает строку "3b746fd492c6+". Это позволяет мне легко проверить, является ли контролируемая мной версия программного обеспечения управляемой или нет - если строка содержит +, то программное обеспечение не воспроизводится из репозитория.

Однако hg identify добавляет + для обозначения незафиксированных изменений, но не распознает неотслеживаемые файлы. Если я зафиксирую все изменения, но забуду добавить этот важный класс «делать вещи», hg identify не будет указывать на это.

Итак, мой вопрос: как я могу получить необходимую функциональность?
Как я могу имитировать hg identify распознавание новых и удаленных файлов?

В идеале я бы не хотел использовать расширения, но рассмотрю их как опцию.


Обновление

Исходя из предложения Обена Сонна об использовании комбинации hg st и hg id -r ., я пришел к следующему пакетному файлу, который дает довольно хороший результат:

@echo off
set REPOMODS=
for /F %%a IN ('hg st -n') DO set REPOMODS=+

for /f "tokens=1 delims=;=" %%a in ('hg identify -i -r .') do (
  echo const std::string revision^(_T^("%%a%REPOMODS%"^)^); > rev.h
)

%REPOMODS% пусто, если на выходе hg st ничего нет, в этом случае это +. Я сделал несколько тестов, и это похоже на работу.

Есть ли другое решение, которое требует меньше ошибок в пакетных файлах? Или это лучшее, что я получу?

Ответы [ 2 ]

4 голосов
/ 23 февраля 2011

Как насчет простой проверки, если вывод hg st пуст? Если нет, добавьте + в версию (если она еще не указана hg id).

ОБНОВЛЕНИЕ: Чтобы предотвратить двойную проблему +, вы можете запустить hg id -r ., которая никогда не даст вам трейлинг +.

2 голосов
/ 23 февраля 2011

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

set ADDREMOVERESULT=
for /F %%a IN ('hg addremove -n') DO set ADDREMOVERESULT=+
if "%ADDREMOVERESULT%"=="+" echo New or Removed Files

Проблема, связанная с этим решением, заключается в том, что при наличии как измененных, так и новых / удаленных файлов строка версии может заканчиваться на ++. Не большая проблема, но вы идете.

...