以编程方式在远程存储库上设置svn:externals

时间:2012-06-07 11:18:59

标签: svn command-line-interface svn-externals

我正在开发一个基于Web的工具,允许项目经理设置新的Subversion存储库和相应的Trac实例。

作为此工具的一部分,我希望能够自动向新存储库添加一些特定的依赖项,例如为其他库设置一些外部。

我知道svn propset不适用于远程存储库,但是svn propedit会这样做。

我的问题是 - 如何在命令行上发出svn propedit并在一个命令中设置svn:externals属性?

换句话说,propedit需要一个编辑器,是否有某种“假”编辑器我可以使用它只接受命令行参数(我可以使用svn的--editor-cmd选项)?这样,我可以以编程方式构建CLI命令并通过系统调用发出它。

我并不担心覆盖现有的属性,因为这只会在早期创建几个CPU周期的全新存储库上工作。

2 个答案:

答案 0 :(得分:6)

您可以编写一个可执行脚本作为您的道具编辑器。它将作为其第一个参数(类似于unix的系统上的$1)获得一个临时文件名,其中包含正在编辑的属性的当前值。您可以在脚本中修改文件的内容 - 这是属性的新值。您将脚本作为svn propedit <pro-name> <item> --editor-cmd <my-custom-editor>传递。

答案 1 :(得分:2)

更具体的答案是使用一个简单的命令行“编辑器”,它使用echo命令设置属性的新文本。在unix上,这很简单:

svn propedit svn:externals \
--editor-cmd "echo '<property_value>' >" \
<target> -m "<commit_message>"

这甚至可以处理多行属性值(比如多个外部属性),因为unix非常乐意接受引用字符串中的新行:

svn propedit svn:externals \
--editor-cmd "echo 'first property value
another property value
yet another one' >" \
<target> -m "<commit_message>"

在Windows上,简单的情况看起来像这样,因为它的echo不需要引号:

svn propedit svn:externals ^
--editor-cmd "echo <property_value> >" ^
<target> -m "<commit_message>"

但是多行版本更棘手:

svn propedit svn:externals ^
--editor-cmd "(echo first property value & echo another property value & echo yet another one) >" ^
<target> -m "<commit_message>"

在大多数脚本语言中构建最后一个实际上非常简单,通过将属性值的行与“& echo”而不是“\n”连接起来,然后将其包含在括号中