Verifica um arquivo do svn e anexa seu timestamp ao seu nome

1

Suponha que eu tenha um arquivo no SVN em

http://example.com/file.txt

Eu quero verificar isso em file-20131218-2000.txt , onde 18 de dezembro de 2013, às 20h, é quando a confirmação mais recente para esse arquivo aconteceu de acordo com svn log .

O que é uma boa maneira de fazer isso no bash shell?

$ uname -a
Linux my-computer 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64 GNU/Linux

Minha versão do SVN é 1.6.17.

    
por Russell 18.12.2013 / 17:27

3 respostas

1

Ok, então eu tenho uma solução que é um pouco de hackery. Adicione a seguinte função ao seu arquivo ~/.bashrc .

svnco() {
    if [ $# -ne 1 ]; then    # Fixed space here.
        echo "Usage: svnco [URL]"
        return
    fi

    DIRECTORY='dirname "$1"'
    BASENAME='basename "$1"'
    EXTENSION="${BASENAME##*.}"
    FILENAME="${BASENAME%.*}"
    DATE=$(date -d "'svn info "$1" | grep "Last Changed Date" | sed 's/Last Changed Date: //''" +%Y%m%d-%H%M)
    svn co "$DIRECTORY" . --depth empty
    svn up "$BASENAME"
    mv "$BASENAME" "$FILENAME-$DATE.$EXTENSION"
}

Isso lhe dará o efeito desejado. Depois de salvar em seu .bashrc , você precisa executar source ~/.bash_profile

E para invocar, faça o seguinte: svnco http://svn.apache.org/repos/asf/tomcat/trunk/build.xml

Aviso justo, você pode encontrar um problema, pois isso também criará um diretório .svn . Você pode inserir um rm -rf .svn no final da função, se desejar. Eu não vou embora.

    
por 18.12.2013 / 18:21
1

Quando você faz um svn export , svn define a hora da modificação do arquivo exportado para a data da revisão.

Então ( zsh syntax):

zmodload zsh/stat
url=http://example.com/file.txt
svn export $url tmpfile &&
  zstat -F %Y%m%d-%H%M -A t +mtime tmpfile &&
  mv -- tmpfile $url:t:r.$t.$url:e

Esse não tem uma condição de corrida em que uma nova revisão possa ter sido registrada entre um svn info e svn cat .

Se tiver que ser bash , supondo que você tenha o GNU find :

url=http://example.com/file.txt
svn export "$url" tmpfile &&
  t=$(find tmpfile -prune -printf '%TY%Tm%Td-%TH%TM') &&
  b=${URL##*/} &&
  mv -- tmpfile "${b%.*}.$t.${b##*.}"

Se você quiser fazer isso para todos os arquivos lá, então você pode export o diretório inteiro:

svn export http://example.com/ mydir

E faça todas as renomeações de uma só vez:

find mydir ! -type d -printf '%TY%Tm%Td-%TH%TM/%p
zmodload zsh/stat
url=http://example.com/file.txt
svn export $url tmpfile &&
  zstat -F %Y%m%d-%H%M -A t +mtime tmpfile &&
  mv -- tmpfile $url:t:r.$t.$url:e
' | while IFS=/ read -rd '' t f; do b=${f##*/} mv -Tv "$f" "${f%/*}/${b%.*}.$t.${b##*.}" done

(assumindo o GNU find e o GNU mv )

    
por 23.12.2013 / 00:23
0

Você pode usar svn info para obter informações sobre um arquivo em um repositório remoto, isso não requer qualquer verificação. Você pode usar svn cat para recuperar um arquivo remoto saída padrão, isso também não requer qualquer check-out.

date=$(LC_ALL=C svn info "$url" |
       awk 'sub(/^Last Changed Date: /, "") {gsub(/[-:]/, ""); print $1 "-" $2}')
basename=${url##*/}
extension=${filename##*.}; basename=${basename%".$extension"}
svn cat "$url" >"$basename-$date.$extension"
    
por 19.12.2013 / 02:30