2011-03-07 3 views
2

J'écris un petit script qui gère plusieurs référentiels SVN. Les utilisateurs passent par l'ID du référentiel qu'ils souhaitent modifier (la racine des dépôts est de la forme https://www.mydomain.com/).PySVN - Déterminer si un référentiel existe

J'ai besoin de vérifier si le repo donné existe réellement. Je l'ai essayé d'utiliser Client.list pour voir si je peux trouver tous les fichiers, comme ceci:

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

Mais si la prise en pension n'existe pas, le script est en attente de la ligne de la liste. En creusant à travers les retraçages, il semblerait que pysvn soit suspendu au rappel des identifiants de connexion (client.callback_get_login - que j'ai implémenté mais omis, il n'échoue pas si le repo existe).

Pouvez-vous suggérer comment je peux déterminer si un dépôt existe ou ne pas utiliser pysvn?

Cheers,

Pete

Répondre

1

je ne pouvais pas reproduire votre suspendu dans les informations d'identification callback problème, il pourrait avoir besoin d'une description plus détaillée du problème. Je cours pysvn 1.7.2 sur Ubuntu 10.04, Python 2.6.6.

Lorsque j'essaie de lister un référentiel distant inexistant avec client.list(), il déclenche une exception. Vous pouvez également utiliser client.info2() pour vérifier l'existence d'un dépôt distant:

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

Peter,

Mon équipe et moi avons connu le même défi. Samplebias, essayez de fournir une fonction callback_get_login mais définissez votre callback_server_ssl_trust_prompt pour renvoyer (True, trust_dict['failures'], True). La subversion IFF n'a pas mis en cache les paramètres de confiance de votre certificat de serveur, alors vous pouvez trouver la commande info2() (ou la commande list() de Peter) (elle n'est pas réellement suspendue, il faut juste beaucoup plus de temps pour retourner). Bizarrement, lorsque vous utilisez CTRL-C comme interprète dans ces scénarios, vous obtenez une indication indiquant qu'il s'est accroché au rappel de connexion, et non à la vérification server_cert. Jouez avec vos paramètres ~/.subversion/auth (en particulier les répertoires svn.simple et svn.ssl.server) et vous verrez des quantités différentes de «temps d'attente». Regardez pysvn.Client.callback_cancel si vous avez besoin de gérer des situations qui ne reviennent jamais vraiment. Considérant: http://pysvn.tigris.org/docs/pysvn_prog_ref.html#pysvn_client_callback_ssl_server_trust_prompt vous devez décider quel est votre comportement désiré.

Voulez-vous UNIQUEMENT autoriser les connexions pour lesquelles vous avez déjà une réponse de confiance mise en cache? Ou, voulez-vous TOUJOURS accepter quelle que soit la vérification du certificat de serveur (ATTENTION: cela pourrait (évidemment) avoir des implications de sécurité négatives). Considérez la suggestion suivante:

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 

En réalité, vous ne voulez probablement pas être aussi chic que j'ai avec les valeurs de retour. I do pense qu'il était important de considérer un potentiel 403 renvoyé par le serveur et le scénario "Hôte non trouvé" séparément.

+0

Si l'appel reste bloqué inexpliqué par le code ci-dessus, vous pouvez implémenter pysvn.Client.callback_cancel et voir quel est l'état d'exécution lorsque vous recevez le rappel. Sinon, je devrais voir plus de détails sur votre configuration de code/serveur. N'hésitez pas à me contacter hors ligne si vous le souhaitez. –

Questions connexes