如何获取工作目录哈希确认所有未提交的更改?

时间:2011-02-23 17:36:16

标签: windows mercurial

我的部分软件构建过程包括将工作目录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 sthg 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 个答案:

答案 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

此解决方案的问题在于,如果同时存在已修改和已删除的文件,则版本字符串可能最终为++。这不是一个大问题,但你去了。