PySVN - 确定存储库是否存在

时间:2011-03-07 10:57:10

标签: python svn repository exists

我正在编写一个管理多个SVN存储库的小脚本。用户传递他们想要更改的存储库的ID(存储库的根目录为https://www.mydomain.com/)。

我需要检查给定的回购是否确实存在。我尝试使用Client.list查看是否可以找到任何文件,如下所示:

client = pysvn.Client()
client.list("https://.../<username>/")

但是如果repo不存在则脚本会挂起列表行。从挖掘回溯看起来pysvn实际上挂在登录凭证回调上(client.callback_get_login - 我已经实现但省略了,如果存在repo则不会失败)。

您能否建议我如何使用pysvn确定是否存在回购?

干杯,

皮特

2 个答案:

答案 0 :(得分:1)

我无法重现挂在凭据回调问题中,因此可能需要对问题进行扩展描述。我在Ubuntu 10.04,Python 2.6.6上运行pysvn 1.7.2。

当我尝试使用client.list()列出不存在的远程存储库时,会引发异常。您还可以使用client.info2()检查是否存在远程存储库:

head_rev = pysvn.Revision(pysvn.opt_revision_kind.head)
bad_repo = 'https://.../xyz_i_dont_exist'
good_repo = 'https://.../real_project'
for url in (bad_repo, good_repo):
    try:
        info = client.info2(url, revision=head_rev, recurse=False)
        print url, 'exists.'
    except pysvn._pysvn_2_6.ClientError, ex:
        if 'non-existent' in ex.args[0]:
            print url, 'does not exist'
        else:
            print url, 'error:', ex.args[0]

答案 1 :(得分:1)

彼得,

我的团队和我经历过同样的挑战。 Samplebias,尝试提供callback_get_login功能,但将callback_server_ssl_trust_prompt设置为返回(True, trust_dict['failures'], True)。 IFF subversion没有缓存你的服务器证书信任设置,那么你可能会发现info2()(或彼得的list()命令)挂起(它实际上并没有挂起,只是间歇性地需要更长的时间才能返回)。奇怪的是,当你在这些场景中CTRL-C解释器时,你会得到它挂在登录回调上的指示,而不是server_cert验证。使用~/.subversion/auth设置(特别是svn.simplesvn.ssl.server目录),您将看到不同的“挂起时间”。如果您需要处理真正永不返回的情况,请查看pysvn.Client.callback_cancel

考虑:http://pysvn.tigris.org/docs/pysvn_prog_ref.html#pysvn_client_callback_ssl_server_trust_prompt你需要决定你想要的行为。您是否只想允许已经拥有缓存信任答案的连接?或者,无论服务器证书验证如何,您都希望始终接受(警告:这可能(显然)具有负面的安全隐患)。请考虑以下建议:

import pysvn

URL1 = "https://exists.your.org/svn/repos/dev/trunk/current"
URL2 = "https://doesntexit.your.org/svn/repos/dev/trunk/current"
URL3 = "https://exists.your.org/svn/repos/dev/trunk/youDontHavePermissionsBranch"

ALWAYS = "ALWAYS"
NEVER = "NEVER"

DESIRED_BEHAVIOR = ALWAYS

def ssl_server_certificate_trust_prompt(trust_dict):

if DESIRED_BEHAVIOR == NEVER:
    return (False, 0, False)
elif DESIRED_BEHAVIOR == ALWAYS:
    return (True, trust_dict['failures'], True)
raise Exception, "Unsupported behavior"

def testURL(url):
    try:
        c.info2(url)
        return True
    except pysvn.ClientError, ce:
        if ('non-existant' in ce.args[0]) or ('Host not found' in ce.args[0]):
            return False
        else:
            raise ce

c = pysvn.Client()
c.callback_ssl_server_trust_prompt = lambda t: (False, t['failures'], True)
c.callback_get_login = lambda x, y, z: (True, "uname", "pw", False)

if not testURL(URL1): print "Test1 failed."

if testURL(URL2): print "Test2 failed."
try:
    testURL(URL3)
    print "Test3 failed."
except: pass

实际上,您可能不希望得到与返回值一样的幻想。我认为考虑服务器返回的潜在403和“未找到主机”方案是很重要的。