2011-03-07 91 views
2

我正在编写一个管理多个SVN存储库的小脚本。用户通过他们想要更改的存储库的ID(回收站的根目录为https://www.mydomain.com/)。PySVN - 确定是否存在存储库

我需要检查给定的回购实际上是否存在。我已经使用Client.list,看看我能找到的任何文件,像这样尝试:

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

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

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

干杯,

皮特

回答

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

彼得,

我和我的团队都经历着同样的挑战。 Samplebias,请尝试提供callback_get_login函数,但将您的callback_server_ssl_trust_prompt设置为返回(True, trust_dict['failures'], True)。 IFF subversion没有缓存您的服务器证书信任设置,那么您可能会发现info2()(或Peter的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和单独的“找不到主机”方案。

+0

如果上述代码未能说明呼叫仍然存在,则可能需要实施pysvn.Client.callback_cancel,并查看获取回调时的执行状态。否则,我需要查看关于代码/服务器配置的更多细节。如果您愿意,请随时与我联系。 – 2011-03-14 02:18:20