" TypeError:execve()arg 3包含一个非字符串值"在运行submin通用钩子

时间:2015-02-21 20:48:19

标签: python svn

我已经安装了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我不能赞成缺乏代表。

1 个答案:

答案 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'表示 strunicode;如果嵌入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