我的部分软件构建过程包括将工作目录parent的哈希值转换为C ++字符串以包含在“version”输出中。这是通过使用hg identify -i
获取全局修订ID,并将此输出复制到.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
添加了+
来表示未提交的更改,但它无法识别未跟踪的文件。如果我提交所有更改但忘记添加那些非常重要的“do stuff”类,hg identify
将不会表明这一点。
所以我的问题是:如何获得所需的功能?
如何模拟hg identify
识别新文件和删除的文件?
理想情况下,我不想使用扩展程序,但会将其视为一种选择。
继Oben Sonne建议使用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
的输出中有任何内容,在这种情况下它是+
。我做了一些测试,似乎有效。
是否有另一种解决方案需要在批处理文件中减少麻烦?或者这是我能得到的最好的?
答案 0 :(得分:4)
如何简单地检查hg st
的输出是否为空?如果没有,请自行添加+
版本(如果hg id
尚未提供)。
更新:为了避免双重+
问题,您可以运行hg id -r .
,它永远不会为您提供结尾+
。
答案 1 :(得分:2)
回答我自己的问题是做类似以下的事情,它将执行测试addremove并解析任何输出。我真的不喜欢它,但提供它作为一种可能的解决方案,希望别人有更好的想法:
set ADDREMOVERESULT=
for /F %%a IN ('hg addremove -n') DO set ADDREMOVERESULT=+
if "%ADDREMOVERESULT%"=="+" echo New or Removed Files
此解决方案的问题在于,如果同时存在已修改和已删除的文件,则版本字符串可能最终为++
。这不是一个大问题,但你去了。