我们有一个系统在其某些路径名中包含空格。由于它们是核心代码的一部分,因此无法重命名。在调用命令行命令的工具中处理此问题只需添加双引号集。
但是,我还没有找到一种方法来处理Build Forge适配器使用的xml代码。
例如,尝试让适配器执行以下命令时:
cleartool describe "foo bar"@@\main\1
代码如下:
<match pattern="^(.*?)\@\@(.*?)$">
<run command="cc_describe" params="$1 $2"/>
<command name="cc_describe">
<execute>
pushd cleartool desc $1@@$2;
</execute>
</command>
假设$ 1 =“foo bar”和$ 2 =“\ main \ 1”
在执行时,第二个参数 - 当然 - 被忽略,因为第一个参数包含空格:
Preparsing Command Set: [pushd cleartool desc $1@@$2], using Params: 'foo bar main\1'.
Command Set Parsed To: [pushd cleartool desc "foo@@bar"]
我尝试通过在调用命令中添加双引号来解决此问题:
<run command="cc_describe" params=""$1" $2"/>
双引号使它成为命令,但没有区别:
Preparsing Command Set: [pushd cleartool desc $1@@$2], using Params: '"foo bar" \main\1'.
Command Set Parsed To: [pushd cleartool desc "foo@@bar"]
尝试解决方案:将@@移动到调用命令,将其从接收命令中删除并添加其他参数(以便能够处理1个空格):
<run command="cc_describe" params="$1@@$2"/>
<command name="cc_describe">
<execute>
pushd cleartool desc $1$2$3;
</execute>
</command>
执行结果:
Preparsing Command Set: [pushd cleartool desc $1@@$2$3], using Params: 'foo bar \main\1'.
Command Set Parsed To: [pushd cleartool desc "foobar@@\main\1"]
答案 0 :(得分:1)
通常,参数应该在引号之间:
cleartool describe "foo bar@@\main\1"
然后,如果您的脚本需要考虑文件名和 extended pathname ,则将该参数拆分为the @@
部分的两个部分。
在阅读“What is an Adaptor in Build Forge?”(pdf,来自the help page)后,根据perl,检查您是否可以使用所有参数而不是前两个参数。
来电仍然是$1
和$2
(我还会添加@@
):
<run command="cc_describe" params="$1 @@ $2"/>
如您所见,在cc_describe
命令块中,由于空间问题,$1
和$2
只能代表部分文件名。
尝试查看是否连接参数(无论其编号),$*
(bash样式)或join('', @ARGV)
(perl-style)。
一旦连接了参数,就会以文件的完整扩展路径名结束,并包含空格。
答案 1 :(得分:1)
我使用@VonC建议让它工作。这是一种迂回的方式,但确实有效!仍然需要对它进行一些改进(例如不使用相同的临时文件)。
以下是Build Forge ClearCase代码更改适配器的相关部分。
<run command="cc_changes" params="$LAST_RUN $DEV_VIEW $VOB_TAG $DEV_STREAM" server="" dir="/" timeout="720"/>
<command name="cc_changes">
<execute>
cleartool startview $2
cleartool mount $3
<!-- Store the output of the find command in a text file -->
pushd \\view${DirSep}$2 && cleartool find .$3 -all -cview -version "{created_since($1)" -print > %temp%\changes.txt
<!-- Change each space to a = -->
perl -pi~ -e "s/ /=/g" %temp%\changes.txt
type %temp%\changes.txt
</execute>
<!-- Loop through the results and call the cc_describe command for each entry -->
<resultsblock>
<match pattern="^(.*?)\@\@(.*?)$">
<run command="cc_describe" params="${DEV_VIEW} $1 $2" server="" dir="/" timeout="720"/>
</match>
</resultsblock>
</command>
<command name="cc_describe">
<execute>
<!-- Store the cleartool subcommand and the file name in a text file -->
echo desc -fmt "${ExpVar}En:${ExpVar}Vn:${ExpVar}Nd:${ExpVar}u:${ExpVar}c" "$2@@$3" > %temp%\change.txt
<!-- Change the =s back to spaces -->
perl -pi~ -e "s/=/ /g" %temp%\change.txt
<!-- Pipe the text file into the cleartool command -->
pushd \\view${DirSep}$1 && cleartool < %temp%\change.txt
</execute>
<resultsblock>
<!-- For each match in the output, we add information to the BOM -->
<match pattern="^(.*?):(.*?):(.*?):(.*?):(.*?)$">
<bom category="Source" section="changes">
<field name="file" text="$1"/>
<field name="version" text="$2"/>
<field name="date" text="$3"/>
<field name="user" text="$4"/>
<field name="comment" text="$5"/>
</bom>
<adduser group="MyChangers" user="${NOTIFICATION_GROUP}"/>
<setenv name="Changes" value="$4 - $1<br/>" type="temp append"/>
</match>
</resultsblock>
</command>