2011-03-07 110 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