visitar todos os diretórios sob controle de versão

1

Existe um find de encantamento que me permitiria visitar todos os diretórios sob o controle de versão do SVN? Eu estou tentando usar a opção execdir para adicionar à propriedade svn:ignore em cada um desses diretórios. Algo como:

find . -type d -execdir svn propset svn:ignore -F <((svn propget svn:ignore; echo "new ignore pattern") | sort -u) .' \;

mas não consigo limitar find apenas aos diretórios SVN.

    
por Marcus Junius Brutus 07.01.2014 / 17:01

2 respostas

2

Com versões mais antigas de svn , onde você tinha um diretório .svn em cada diretório sob controle de revisão, era possível fazer isso:

find . -name .svn -type d -prune -execdir bash -c '
  cd -P .. &&
    propset svn:ignore -F <(
      (svn propget svn:ignore; echo "new ignore pattern") | sort -u) .' bash {} \;

Com os mais recentes, onde você tem apenas um .svn e um sqlite3 db:

find . -path '*/.svn/wc.db' -execdir bash -c '
  cd -P .. &&
    sqlite3 .svn/wc.db "select local_relpath from NODES where kind == \"dir\"" |
      while IFS= read -r dir; do
        [ -d "$dir" ] &&
          propset svn:ignore -F <(
            (svn propget svn:ignore "$dir"; echo "new ignore pattern") | sort -u
          )  "$dir"
      done' bash {} \;
    
por 07.01.2014 / 18:03
1

No final, usei o seguinte script. A pasta .svn deve ser explicitamente excluída, pois svn info .svn tem um código de saída de 0 e confunde o script.

#!/usr/bin/env bash
if [ $# -ne 1 ]
then
    echo "usage is $0 <new ignore pattern>"
else
    PATTERN=$1
    for d in $(find . ! -name ".svn" -type d)
    do
        svn info "$d" &> /dev/null
        if [ $? -eq 0 ]
        then
            svn -q propset svn:ignore -F <((svn propget svn:ignore ; echo "$PATTERN") | sort -u) "$d"
        fi
    done
fi
    
por 07.01.2014 / 17:28