2009-09-10 7 views
7

J'ai une configuration de déploiement plutôt compliquée pour notre site Drupal qui est une combinaison de CVS et SVN. Nous utilisons CVS pour obtenir les dernières versions de modules, et nous déployons avec SVN. Malheureusement, lorsque les mises à jour de CVS suppriment des fichiers, Subversions se plaint parce qu'elles n'ont pas été supprimées dans SVN. J'essaie de faire des scripts shell et Perl pour exécuter une commande svn rm sur tous ces fichiers qui ont déjà été supprimés du système de fichiers, mais je ne suis pas allé loin. Ce que j'ai à ce jour est le suivant:Sortie de shell de tuyau à svn del commande?

svn st | grep ! 

Ceci produit une liste de tous les fichiers supprimés du système de fichiers comme ceci:

!  panels_views/panels_views.info 
!  panels_views/panels_views.admin.inc 
!  contexts/term.inc 
!  contexts/vocabulary.inc 
!  contexts/terms.inc 
!  contexts/node_edit_form.inc 
!  contexts/user.inc 
!  contexts/node_add_form.inc 
!  contexts/node.inc 
etc. . . 

Cependant, je veux courir en quelque sorte un svn del sur chacun de ces lignes. Comment puis-je obtenir cette sortie dans mon script Perl, ou comment puis-je exécuter svn del sur chacune de ces lignes?

Edit: La commande exacte je, avec l'aide de tous, était

svn st | grep ^! | cut -c 9- | xargs svn del 

Répondre

10

Essayez d'utiliser xargs, comme ceci:

svn st | grep ^! | cut -f2 | xargs svn rm 

La commande xargs prend des lignes sur la norme entrée, et les retourne et utilise ces lignes comme paramètres de ligne de commande sur le svn rm. Par défaut, xargs utilise plusieurs lignes à chaque invocation de sa commande, ce qui est correct dans le cas de svm rm.

Vous devrez peut-être également expérimenter avec la commande cut pour l'obtenir juste. Par défaut, cut utilise une tabulation comme délimiteur et Subversion peut y afficher des espaces. Dans ce cas, vous devrez peut-être utiliser cut -d' ' -f6 ou quelque chose.

Comme toujours lors de la construction d'un tel pipeline de commande, exécutez des portions à la fois pour vous assurer que les choses semblent correctes. Donc, exécutez tout jusqu'à la commande cut pour vous assurer que vous avez la liste des noms de fichiers que vous attendez, avant en cours d'exécution avec "| xargs svn rm" à la fin.

+2

Je remplacerais 'grep!' Par 'grep ^!' Pour éviter de tuer accidentellement des fichiers contenant des points d'exclamation dans leur chemin. –

+0

C'est une bonne idée. –

+0

Merveilleux, je n'avais aucune idée sur cut ou xargs. Je savais que Perl n'était pas le moyen le plus simple, mais j'ai un peu de familiarité avec. – jergason

1
svn st | egrep ^! | cut -b 9- | xargs svn del 
0

Tout comme une alternative à ceux ci-dessus, j'utiliser quelque chose comme:

svn st | awk '$1=="!"{print $2}' | xargs svn del 

Je trouve la langue motif correspondant awk très pratique pour des tâches comme celui-ci.

Questions connexes