C#->;Python SVN预提交钩子:如何访问SVN:关键字?
我被要求在预提交钩子中重新添加一个额外的检查,以确保在我们的repo中的某些路径上设置了svn:keywords(例如,需要修改和URL值的脚本)。我们有一个笨重的预提交钩子是用C#编写的,最初使用的是SharpSvn,但我们已经将SVN服务器迁移到Linux,所以我用Python重写了钩子。它有大部分的功能,但我错过了关键字检查 在C#中,使用的代码如下所示:C#->;Python SVN预提交钩子:如何访问SVN:关键字?,c#,python,svn,pre-commit-hook,C#,Python,Svn,Pre Commit Hook,我被要求在预提交钩子中重新添加一个额外的检查,以确保在我们的repo中的某些路径上设置了svn:keywords(例如,需要修改和URL值的脚本)。我们有一个笨重的预提交钩子是用C#编写的,最初使用的是SharpSvn,但我们已经将SVN服务器迁移到Linux,所以我用Python重写了钩子。它有大部分的功能,但我错过了关键字检查 在C#中,使用的代码如下所示: SvnPropertyCollection propCollection; svnLookClient.GetPropertyList
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\u fs\u txn\u proplist
会为我提供以下属性:
- svn:日志
- svn:txn客户端兼容版本
- svn:txn用户代理
- svn:作者
- svn:日期
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了。如蒙协助,将不胜感激