我已经安装了submin,并且能够创建和配置subversion存储库。
我想在创建存储库时配置submin来复制我的subversion挂钩。
Submin有一个Generic Hook mechanism但是我没能让它运转起来。有几个钩子目录,维基不会告诉我使用哪个钩子目录。
我添加了一个简单的脚本:
的/ var / lib中/超小型/钩/存储库创建/复制钩
&安培;我将所有权设置为www-data。在创建存储库时收到错误:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/submin/hooks/common.py", line 24, in trigger_hook
trigger_user_hook(event, **args)
File "/usr/local/lib/python2.7/dist-packages/submin/hooks/common.py", line 51, in trigger_user_hook
p = Popen([hook], env=env)
File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child
raise child_exception
TypeError: execve() arg 3 contains a non-string value
所以看起来我已经触发/创建了一个用户钩子但是有错误。
编辑: 代码创建了一个字典:
env = dict([(key.upper(), value) for key, value in args.iteritems()
if value])
它传递给popen()。 在哪里' args'是使用:
创建的trigger_hook('repository-create', admin_username=session_user,
repositoryname=name, vcs_type=vcs_type)
研究' arg 3'错误&最可能的原因是'env' dictionary包含非字符串,通常是Unicode字符串。添加' env'的调试就在popen()和之前:
type: <type 'unicode'> value: new
type: <class 'submin.models.user.User'> value: admin
type: <type 'unicode'> value: svn
所以我传递了一个类和Unicode字符串。 我不知道如何将类值和Unicode字符串转换为字符串。我如何在循环中进行字符串化?解决路线原因似乎是更好的选择,但会对黑客感到满意。
编辑2: 我同意,课程的通过是我的想法。 您的代码会引发语法错误但是&amp;我的Python不够好,无法调试,至少快速调试!
fyi调用代码调用两组钩子,工具的钩子函数和用户钩子:
# Then execute all hooks
if event in hooks:
for hook_fn in hooks[event]:
hook_fn(**args)
trigger_user_hook(event, **args)
所以我需要在本地更改。 字典&#39; env&#39;是由#args&#39;构建的。 密钥是&#39; ADMIN_USERNAME&#39;,该类有一个方法_getName(self)。我可以看到要调用什么(?)但我正在努力学习语法.... 请提供代码。
编辑3 谢谢。你的新修复和您的原始转换循环在&quot; trigger-user-hook&#39;将类转换为文本。代码不再抱怨,但我的脚本不运行。 我的脚本在submin之外工作。 PS我不能赞成缺乏代表。
答案 0 :(得分:0)
在第51行之前添加hook
到/usr/local/lib/python2.7/dist-packages/submin/hooks/common.py
的调试打印可以揭示“arg 3”的具体错误。
更新
以下是execve()
的POSIX版本中处理env
并提供错误(Python-2.7.9/Modules/posixmodule.c:3248
;仅显示相关行)的代码:
keys = PyMapping_Keys(env);
vals = PyMapping_Values(env);
<...>
for (pos = 0; pos < i; pos++) {
<...>
key = PyList_GetItem(keys, pos);
val = PyList_GetItem(vals, pos);
<...>
if (!PyArg_Parse(
key,
"s;execve() arg 3 contains a non-string key",
&k) ||
!PyArg_Parse(
val,
"s;execve() arg 3 contains a non-string value",
&v))
{
goto fail_2;
}
正如Parsing arguments and building values - C API docs所述,'s'
表示 str
或unicode
;如果嵌入TypeError
s,则\0
会被提升;如果使用默认编码无法转换unicode
,则会引发UnicodeError
。
所以,它实际上在type: <class 'submin.models.user.User'> value: admin
上窒息。
UPDATE2:
创建违规值并在submin-2.2.1/models/repository.py
中传递。这是解决这个问题的差异:
--- a/submin/models/repository.py
+++ b/submin/models/repository.py
@@ -78,7 +78,7 @@ class Repository(object):
def add(vcs_type, name, session_user):
vcs = models.vcs.get(vcs_type, "repository")
vcs.add(name)
- trigger_hook('repository-create', admin_username=session_user,
+ trigger_hook('repository-create', admin_username=unicode(session_user),
repositoryname=name, vcs_type=vcs_type)
def __init__(self, repositoryname, vcs_type):
我创建了一个拉取请求,将其应用到官方代码库中:https://github.com/mjholtkamp/submin/pull/1