Depois de muito penar para conseguir fazer um checkout em um servidor subversion com autenticação usando pysvn, hoje finalmente consegui. É um bocado difícil de entender como funciona esse negócio, deveria ser um pouco mais intuitivo. Pra facilitar a vida de quem venha utilizar o pysvn e não queira perder muito tempo pra entender tudo, aqui vai um codigo que fiz. Melhorias são bem vindas.
import os
import sys
import pysvn
class DownloadSubversion(object):
def __init__(self, source, dest, username, password):
self.source = source
self.dest = dest
self.username = username
self.password = password
def callback_ssl_server_trust_prompt(self, trust_data):
'''
trust_data: essa e' uma variavel, um dicionario, passado pelo pysvn
contendo informacoes sobre o certificado ssl do servidor.
Por exemplo: data de expiracao do certificado, empresa
certificadora, nome do responsavel, fingerprint e etc.
'''
#for key,value in trust_data.items():
# print '%s: %s' % (key, value)
#print
answer = 't'
#while answer.lower() not in ['p','t','r']:
# sys.stdout.write( '(P)ermanent accept, (T)emporary accept or (R)eject: ' )
# answer = sys.stdin.readline().strip()
if answer.lower() == 'p':
return True, trust_data['failures'], True
if answer.lower() == 't':
return True, trust_data['failures'], False
return False, 0, False
def callback_getLogin(self, realm, username, password, may_save):
'''
realm: essa variavel eh utilizado pelo pysvn pra informar o endereco do
servidor e o nome do servico, deixe ela ai'. Por exemplo:
"Subversion Repository" at http://111.222.333.444
username: usuario do subversion
password: senha do subversion
may_save: salvar ou nao o usuario e senha
'''
if len(username) == 0:
return False, '', '', False
return True, username, password, may_save
def downloadRepos(self):
client = pysvn.Client()
client.exception_style = 1
client.set_default_username(self.username)
client.set_default_password(self.password)
client.callback_get_login = self.callback_getLogin
client.callback_ssl_server_trust_prompt = self.callback_ssl_server_trust_prompt
if os.access(self.dest + '/.svn', os.F_OK):
client.update(self.dest)
else:
client.checkout(self.source, self.dest)
if __name__ == '__main__':
subversion = DownloadSubversion('https://www.com.br/svnroot/', '.', 'usuario', 'senha')
subversion.downloadRepos()