Aplique o astyle em arquivos comprometidos usando ganchos do SVN

3

Eu gostaria de aplicar algum estilo ao código sempre que alguém se comprometer com um repositório SVN, por isso eu uso astyle nas mudanças confirmadas com um svn pre-commit hook.

Eu posso pegar os nomes dos arquivos assim, mas quando eu aplico astúcia, parece que o programa não pode obter os dados de dentro dos arquivos:

for FILE in $($SVNLOOK changed -t "$TXN" "$REPOS" | cut -b 5-); do 
        # echo $REPOS/$FILE 1>&2             # prints the files' paths
        astyle --style=gnu -n $FILE
done

# commit the changes from astyle here

Alguma ideia de como posso conseguir isso?

    
por 0xFF 21.02.2012 / 23:22

1 resposta

3

Eu tenho medo, mas eu tenho uma novidade ruim para você: você não pode fazer isso

Como mencionado em SVN-Book no capítulo "Implementando Repository Hooks" , em comentário com Stop-Sign (você sabe, que significa)

While hook scripts can do almost anything, there is one dimension in which hook script authors should show restraint: do not modify a commit transaction using hook scripts. While it might be tempting to use hook scripts to automatically correct errors, shortcomings, or policy violations present in the files being committed, doing so can cause problems. Subversion keeps client-side caches of certain bits of repository data, and if you change a commit transaction in this way, those caches become indetectably stale. This inconsistency can lead to surprising and unexpected behavior. Instead of modifying the transaction, you should simply validate the transaction in the pre-commit hook and reject the commit if it does not meet the desired requirements. As a bonus, your users will learn the value of careful, compliance-minded work habits.

Jack Repenning, diretor de tecnologia da CollabNet, também menção isso

... sadly I must tell you that no, you can't do that. The file content for the files being committed is available to you within the hook script (through svnlook's "changed" and "cat" commands), but what you see is a copy of the data that has already been entered into the database (although not actually committed yet), and you have no facility to modify that, only to allow or refuse the final transaction commit.

Se você ainda for corajoso para tentar, você pode tentar entender o código de um modo tópico antigo (ano 2009), onde o autor afirma" modificar o conteúdo da transação "

    
por 22.02.2012 / 00:50

Tags