2015-03-25 11 views
0

Comme dans le titre, je fais appel de mon script post-commit hook écrit en Perl qui a commande

$msg = `$svnlook changed -t "$rev" "$repos"`; 

qui doit exécuter et que je ne devrait envoyer $msg à mon service. Mais quand je lance

if (length($msg) == 0) 
{ 
    print STDERR "msg length is 0"; 
    exit(1); 
} 

Je reçois ce message d'erreur sur la console, alors pourquoi est cette commande svnlook pas en cours d'exécution? J'utilise Windows 7 et le serveur VisualSVN.

Sur un autre billet, j'avais autre théorie pour exécuter cette commande en crochet lui-même comme

@echo off 
set repos=%1 
set rev=%2 
set changes=svnlook changed %repos% -r %rev% 
C:\Perl64\bin\perl C:\repositories\myproject\hooks\myhook.pl %1 %2 changes 

, mais je ne sais pas comment passer ce paramètre changes, donc si cela pourrait fonctionner, il pourrait répondre que bien.

Comment passer un paramètre de batch à un script perl?

+0

Je suis confus pourquoi avez-vous besoin de passer * changes * si vous exécutez déjà la commande * svnlook * à l'intérieur de votre script Perl? Il semble que tout ce que vous devez passer à votre script est le numéro de révision et le chemin du référentiel. –

+1

Vous devez également noter qu'il existe deux formes de svnlook, une qui accepte un numéro de transaction et une qui accepte un numéro de révision. Vous semblez utiliser les deux ici pour une raison quelconque. –

+0

il y a une ligne au milieu de la question, la première partie est où j'essaye d'exécuter la commande dans le script perl et il n'est pas exécuté dans la deuxième partie j'essayais d'exécuter la commande dans le lot et ensuite passer le résultat à mon script et aucun ne fonctionne –

Répondre

1

course svnlook changé aider à afficher la liste des options valides pour svnlook changed et leur format attendu:

$ svnlook help changed 
changed: usage: svnlook changed REPOS_PATH 

Print the paths that were changed. 

Valid options: 
    -r [--revision] ARG  : specify revision number ARG 
    -t [--transaction] ARG : specify transaction name ARG 
    --copy-info    : show details for copies 

Normalement, vous devriez spécifier un numéro de transaction avec -t ou un numéro de révision avec -r. Vous semblez passer un numéro de révision avec -t qui conduira à des résultats inattendus: soit aucun résultat ou des résultats qui ne sont pas liés à la révision que vous souhaitez par exemple.

je crois que l'utilisation correcte dans votre cas serait:

my $msg = `$svnlook changed -r "$rev" "$repos"`; 

La commande ci-dessus va vous donner une longue chaîne qui est délimitée par des sauts de ligne. Vous pouvez obtenir c'est un format de tableau plus facile à gérer en utilisant la même commande dans un contexte de liste:

my @changes = `$svnlook changed -r "$rev" "$repos"`; 

En outre, ces lignes auront tous les sauts de ligne de fuite, vous pouvez les éliminer à l'aide du chomp() intégré:

my @changes; 
chomp(@changes = `$svnlook changed -r "$rev" "$repos"`); 

Alternativement, vous pouvez regarder SVN::SVNLook qu'un wrapper Perl autour de la commande svnlook.

+0

y at-il un moyen rapide de transformer cette sortie de tableau en json, je ne suis pas très familliar avec perl? –

+0

Qu'attendriez-vous de la clé pour le JSON? Le nom du fichier qui a été modifié? Si c'est le cas, vous pouvez créer une référence de hachage en utilisant '{filename => \ @changes}' et la passer à ['JSON'] (https://metacpan.org/pod/JSON#PERL---JSON) du module [' to_json'] (https://metacpan.org/pod/JSON#to_json) fonction. –