我被要求重新添加一个额外的检查到我们的预提交钩子,以确保在我们的repos中的某些路径上设置svn:keywords(例如需要Revision和URL值注入的脚本)。我们用C#使用SharpSvn编写了一个笨重的预提交钩子,但是我们已经将SVN服务器迁移到了Linux,所以我重写了Python中的钩子。它具有大部分功能,但我错过了关键字检查。
在C#中,使用的代码如下:
SvnPropertyCollection propCollection;
svnLookClient.GetPropertyList(svnHookArgs.LookOrigin, item.Path, out propCollection);
....
if (item.Path.Contains("some path") && !propCollection.Contains("svn:keywords"))
{ /*Fail the commit here*/ }
我发现事务属性不包含svn:keywords的困难方式,即使我做了一个提交,我所做的就是设置它们;在事务上调用svn.fs.svn_fs_txn_proplist
会给我以下属性:
我的Python代码如下所示:
def check_keywords_are_set(transaction, repos_name):
commit_has_source_files = False
source_extensions = ('.sql', '.hlr') #Only care about source files
transaction_root = svn.fs.svn_fs_txn_root(transaction)
changed_paths = svn.fs.paths_changed(transaction_root)
for path, change in changed_paths.iteritems():
if repos_name == 'repo1' or (repos_name == 'repo2' and ('some path' in path): #These are the paths I want to enforce keywords being set on
if path.endswith(source_extensions):
commit_has_source_files = True
if not commit_has_source_files:
return True
#debugging code here:
transaction_props = svn.fs.svn_fs_txn_proplist(transaction)
sys.stdout.write('Transaction prop list:\n{0}\n'.format(transaction_props))
#end debugging
keywords = svn.fs.svn_fs_txn_prop(transaction, 'svn:keywords')
#keywords is always None
回顾C#代码,我可以看到对svnlook的引用,所以我想我必须使用它。但是,我对'版本属性'和所有其他'属性'感到困惑。我也不确定如何写这个,以便如果开发人员将缺少的关键字添加到应该拥有它们的文件夹中的文件,或者我们正在创建一个新的文件夹,稍后将强制执行,它将不会抛出假阴性。在Python中执行此操作的文档非常糟糕,通常需要阅读C API源代码,遗憾的是我无法理解(我不是C开发人员),更不用说转换为Python了。非常感谢任何帮助。