xml 接口参数传递中处理空格
Handle spaces in xml interface parameter passing
我们有一个系统,其某些路径名中包含 spaces。由于它们是核心代码的一部分,因此不能重命名。在调用命令行命令的工具中处理这个问题只是添加双引号集的问题。
但是,我还没有在 Build Forge 适配器使用的 xml 代码中找到处理这个问题的方法。
例如,当试图让适配器执行以下命令时:
cleartool describe "foo bar"@@\main
代码如下:
<match pattern="^(.*?)\@\@(.*?)$">
<run command="cc_describe" params=" "/>
<command name="cc_describe">
<execute>
pushd cleartool desc @@;
</execute>
</command>
假设 $1 = "foo bar" 和 $2 = "\main"
在执行时,第二个参数当然会被忽略,因为第一个参数包含 space:
Preparsing Command Set: [pushd cleartool desc @@], using Params: 'foo bar main'.
Command Set Parsed To: [pushd cleartool desc "foo@@bar"]
我尝试通过在调用命令中添加双引号来修复此问题:
<run command="cc_describe" params=""" "/>
双引号进入命令,但没有区别:
Preparsing Command Set: [pushd cleartool desc @@], using Params: '"foo bar" \main'.
Command Set Parsed To: [pushd cleartool desc "foo@@bar"]
尝试的解决方案:将@@移动到调用命令,将其从接收命令中删除并添加附加参数(以便能够处理 1 space):
<run command="cc_describe" params="@@"/>
<command name="cc_describe">
<execute>
pushd cleartool desc ;
</execute>
</command>
执行结果:
Preparsing Command Set: [pushd cleartool desc @@], using Params: 'foo bar \main'.
Command Set Parsed To: [pushd cleartool desc "foobar@@\main"]
正常情况下,参数应该完整地放在引号之间:
cleartool describe "foo bar@@\main"
然后,如果您的脚本需要考虑文件名和 ,它的作用是围绕 the @@
将该参数一分为二部分。
阅读“What is an Adaptor in Build Forge?" (pdf, from the help page”后,基于perl,检查是否可以使用所有参数而不是前两个。
调用仍然是 </code> 和 <code>
(我也会添加 @@
):
<run command="cc_describe" params=" @@ "/>
如您所见,在cc_describe
命令块中,由于space 问题,</code> 和<code>
只能代表部分文件名。
尝试查看是否连接参数(无论它们的数量),使用 $*
(bash 样式)或 join('', @ARGV)
(perl 样式)。
连接参数后,您将返回文件的完整扩展路径名,其中包含 spaces。
我使用@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
cleartool mount
<!-- Store the output of the find command in a text file -->
pushd \view${DirSep} && cleartool find . -all -cview -version "{created_since()" -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} " 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" "@@" > %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} && 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=""/>
<field name="version" text=""/>
<field name="date" text=""/>
<field name="user" text=""/>
<field name="comment" text=""/>
</bom>
<adduser group="MyChangers" user="${NOTIFICATION_GROUP}"/>
<setenv name="Changes" value=" - <br/>" type="temp append"/>
</match>
</resultsblock>
</command>
我们有一个系统,其某些路径名中包含 spaces。由于它们是核心代码的一部分,因此不能重命名。在调用命令行命令的工具中处理这个问题只是添加双引号集的问题。
但是,我还没有在 Build Forge 适配器使用的 xml 代码中找到处理这个问题的方法。
例如,当试图让适配器执行以下命令时:
cleartool describe "foo bar"@@\main
代码如下:
<match pattern="^(.*?)\@\@(.*?)$">
<run command="cc_describe" params=" "/>
<command name="cc_describe">
<execute>
pushd cleartool desc @@;
</execute>
</command>
假设 $1 = "foo bar" 和 $2 = "\main"
在执行时,第二个参数当然会被忽略,因为第一个参数包含 space:
Preparsing Command Set: [pushd cleartool desc @@], using Params: 'foo bar main'.
Command Set Parsed To: [pushd cleartool desc "foo@@bar"]
我尝试通过在调用命令中添加双引号来修复此问题:
<run command="cc_describe" params=""" "/>
双引号进入命令,但没有区别:
Preparsing Command Set: [pushd cleartool desc @@], using Params: '"foo bar" \main'.
Command Set Parsed To: [pushd cleartool desc "foo@@bar"]
尝试的解决方案:将@@移动到调用命令,将其从接收命令中删除并添加附加参数(以便能够处理 1 space):
<run command="cc_describe" params="@@"/>
<command name="cc_describe">
<execute>
pushd cleartool desc ;
</execute>
</command>
执行结果:
Preparsing Command Set: [pushd cleartool desc @@], using Params: 'foo bar \main'.
Command Set Parsed To: [pushd cleartool desc "foobar@@\main"]
正常情况下,参数应该完整地放在引号之间:
cleartool describe "foo bar@@\main"
然后,如果您的脚本需要考虑文件名和 the @@
将该参数一分为二部分。
阅读“What is an Adaptor in Build Forge?" (pdf, from the help page”后,基于perl,检查是否可以使用所有参数而不是前两个。
调用仍然是 </code> 和 <code>
(我也会添加 @@
):
<run command="cc_describe" params=" @@ "/>
如您所见,在cc_describe
命令块中,由于space 问题,</code> 和<code>
只能代表部分文件名。
尝试查看是否连接参数(无论它们的数量),使用 $*
(bash 样式)或 join('', @ARGV)
(perl 样式)。
连接参数后,您将返回文件的完整扩展路径名,其中包含 spaces。
我使用@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
cleartool mount
<!-- Store the output of the find command in a text file -->
pushd \view${DirSep} && cleartool find . -all -cview -version "{created_since()" -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} " 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" "@@" > %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} && 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=""/>
<field name="version" text=""/>
<field name="date" text=""/>
<field name="user" text=""/>
<field name="comment" text=""/>
</bom>
<adduser group="MyChangers" user="${NOTIFICATION_GROUP}"/>
<setenv name="Changes" value=" - <br/>" type="temp append"/>
</match>
</resultsblock>
</command>