问题
I am using windows7 and VisualSVN Server. I have wrote simple SVN post-commit hook which looks like
C:\Perl64\bin\perl C:\repositories\secret-project\hooks\myhook.pl %1 %2
and myhook.pl script looks like
$svnlook = '"C:\Program Files\VisualSVN Server\bin\svnlook.exe"';
$repos = $ARGV[0];
$txn = $ARGV[1];
$msg = `$svnlook changed -t "$txn" "$repos"`;
chomp($msg);
print STDOUT $repos . " " . $txn;
print STDOUT $msg;
exit(0);
so basically I just want for now to print changed files. Commit goes through with no errors, but I am not seeing anything printed when I go through TortoiseSVN or when I commit through cmd. So is it printed at all and if so where is it? I also tried to write it in txt file but with no success, what am I missing here? :(
EDIT:
per ikegami's comment, yes the code is running.
I also wrote other sample of script, where I am trying to write something in txt file and send data to small test service I created.
$svnlook = '"C:\Program Files\VisualSVN Server\bin\svnlook.exe"';
$repos = $ARGV[0];
$txn = $ARGV[1];
#--------------------------------------------
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $server_endpoint = "http://localhost:1337/test";
$msg = `$svnlook changed -t "$txn" "$repos"`;
chomp($msg);
open(my $fh, '>', 'report.txt');
print $fh $msg;
close $fh;
print STDOUT "done\n";
# set custom HTTP request header fields
my $req = HTTP::Request->new(POST => $server_endpoint);
$req->header('content-type' => 'application/json');
# add POST data to HTTP request body
my $post_data = '{"$txn":"' . $txn .'"}';
print STDOUT $post_data;
$req->content($post_data);
my $resp = $ua->request($req);
if ($resp->is_success) {
my $message = $resp->decoded_content;
print STDOUT "Received reply: $message\n";
}
else {
print STDERR "HTTP POST error code: ", $resp->code, "\n";
print STDERR "HTTP POST error message: ", $resp->message, "\n";
}
exit(0);
Now I am sending $txn
to service I made and I can print it, but when I try to send $repos
I get error on my service, Syntax error: unexpected token R
How does $repos
look like? Maybe I need to parse it somehow before printing or sending to my service?
EDIT 2:
$svnlook = '"C:\Program Files\VisualSVN Server\bin\svnlook.exe"';
$repos = $ARGV[0];
$txn = $ARGV[1];
print STDOUT "repos:" . $repos . "rev:" . $txn;
#--------------------------------------------
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $server_endpoint = "http://localhost:1337/test";
$msg = `$svnlook changed -t "$txn" "$repos"`;
chomp($msg);
chomp($reply);
if (length($repos) == 0)
{
print STDERR "my error, repos = 0";
exit(1);
}
if ( length($msg) == 0 )
{
print STDERR "my error, msg = 0";
exit(1);
}
open(my $fh, '>', 'report.txt');
print $fh $msg;
close $fh;
print STDOUT "done\n";
# set custom HTTP request header fields
my $req = HTTP::Request->new(POST => $server_endpoint);
$req->header('content-type' => 'application/json');
# add POST data to HTTP request body
my $post_data = '{"$txn":"' . $txn .'"}';
print $post_data;
$req->content($post_data);
my $resp = $ua->request($req);
if ($resp->is_success) {
my $message = $resp->decoded_content;
print "Received reply: $message\n";
}
else {
print ST "HTTP POST error code: ", $resp->code, "\n";
print "HTTP POST error message: ", $resp->message, "\n";
}
exit(0);
So I added printing of arguments at the begining, checking if length of $repos
equals 0 and if $msg
equals 0
and in console I only get
svnlook: E160007: No such transaction '85'
my error, msg = 0
It is an post-commit hook
回答1:
Subversion displays to user hook output only if post-commit hook returns non-zero result.
Try to replace exit(0);
with exit(1);
Also post-commit
hook accepts revision number
not transaction name
since transaction is already committed at this point. Are you sure that you setting post-commit
hook and not pre-commit
?
回答2:
If you use STDERR instead of STDOUT it outputs:
$ svn commit tull -m "testdir"
Adding tull
svn: E165001: Commit failed (details follow):
svn: E165001: Commit blocked by pre-commit hook (exit code 1) with output:
Debug: repos:'C:\Repositories\BuyPass-LRA' transaction:'7173-5jh'
来源:https://stackoverflow.com/questions/29236308/how-to-print-arguments-in-svn-hook