Customizando Subversion parte 2

Em um post anterior escrevi sobre a possibilidade de customizar o comportamento do sistema de controle de versão open source chamado Subversion ou popularmente chamado de SVN.

Neste post vou mostrar através de um Script Python como é possível modificar o comportamento do Subversion de forma que não deixe o usuário realizar um commit sem um comentário.

A Importância dos Comentários nos Commits

Além de uma ótima prática de gerencia de configurações, utilizar comentários no commit do svn nos ajuda na hora de realizar merges, na hora de acompanhar mudanças e também quando você está procurando um versão antiga de um artefato.

Você irá precisar de um Binding

A API do Subversion é para alguma linguagem como Java, Python, PHP, etc é chamada de Binding. Então precisamos de um binding para Python. Vamos utilizar o binding do próprio site do subversion chamado de pysvn.



Você precisa instalar o Python e o Subversion e bem como o pysvn. Uma vez tudo isso instalando vamos ao script, esse script é construindo utilizando os recursos de expressões regulares do Python. Sinta-se livre a vontade para modifica-lo para as suas necessidades.

Vamos utilizar o hook de pre-commit logo se esse script retornar 1 o svn não irá fazer o commit, nesse caso é justamente o que queremos pois não queremos commitar sem comentários.

#
#  pre-commit.py
#
#  @Autor Diego Pacheco
#  @since 26/04/2009
#  @Version 1.0
# 
#  Codigo Python que utiliza o pysvn para manipular o controle de versão afim de
#  nao deixar passar commit sem comentários apropriados.  Sinta-se a vontade para modifica-lo.
#

import os
import os.path
import sys
from datetime import date
import re

import svn
import svn.fs
import svn.repos
import svn.core

#
#  Método que loga as exception em arquivo de log de erros.
# @Parameter e eh a exception que foi levantada
#
def _handleException(e):   
try:
f = open('C:/log.pysvn..commits.txt', 'w+')  
now = date.today()
dataFormated = now.strftime("%m-%d-%Y")
f.write("[" + dataFormated + "] " + str(e))
f.close()       
_trace(str(e),"FATAL")
except:
print sys.exc_info()

#
# Método que valida se a mensagem de commit eh apropriada.
#
# @Parameter commitMessage eh a mensagem do commit
# @Return 0 para mensagem OK. 1 Para mensagem impróprias
#
def _validateCommitComment(commitMessage=None):
mat = None   
if     commitMessage:
try:
mat  = re.search('[\w]{5}[_0-9]?', commitMessage)
print str(mat.group(0))
except AttributeError:
_handleException("Você não digitou um comentário valido. Digite um comentário apropriado!")
return 1
else:           
_handleException("Você não pode commitar um arquivo em branco. Digite um comentário apropriado!")
return 1   

#
# Metodo Main
#
def main(argv):
try:
txn_name     = None
repos_path   = None
log_message = None
txn                  = None
fs                     = None

# Obtem a messagem de commit que o usuario digitou
repos_path = svn.core.svn_path_canonicalize(argv[1])
fs = svn.repos.svn_repos_fs(svn.repos.svn_repos_open(repos_path))
txn_name = argv[2]
txn = svn.fs.svn_fs_open_txn(fs, txn_name)
log_message = svn.fs.svn_fs_txn_prop(txn, "svn:log")

return _validateCommitComment(log_message)

except:        
_handleException(sys.exc_info())
return 1

#
# Execucao do metodo Main.
#
if __name__ == '__main__':
sys.exit(main(sys.argv))


OBS: Se você for usar esse script hook no windows, você precisa criar um script .bat para chamar o seu script python, isso é necessário por que o svn do windows só executa hooks com as extensões bat e exe.

Você precisa colocar esse script na pasta hooks do repositório do seu SVN, para maiores detalhes consulte o post anterior sobre o assunto. Espero que tenham gostado, na seqüencia pretendo postar mais scripts.

Abraços.

Popular posts from this blog

C Unit Testing with Check

Having fun with Zig Language

HMAC in Java