[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: pre commit trigger

From: Irfan Sayed <irfu.sayed_at_gmail.com>
Date: Wed, 13 May 2009 20:52:18 +0530

thanks really for reply.
Ok.

Now script is executing but it is giving transaction id instead of
path which is being commited

here is the script
#!/usr/bin/perl

$svnlook = "/usr/bin/svnlook";
chomp($repo = $ARGV[0]);
chomp($txn = $ARGV[1]);

$option = "-t";
print STDERR "$txn\n";

my @cmd = `$svnlook changed $option $txn $repo`;
foreach(@cmd)
{
 if ($_ =~/^A/)
{
 print STDERR "added\n";
 exit 1;
}
else{
 print STDERR "not added\n";
 exit 1;
}
}

and the output which i got in tortoise svn client is

Commit failed (details follow):
Commit blocked by pre-commit hook (exit code 1) with output:
127-4b
not added

i am modifying existing source code file so in foreach loop first
condition will fail. now in this output "127-4b" is the transaction id
but what i am expecting here is the path which is getting commited

now please advice. i think now i am close to solution

regards
irf

On 5/13/09, David Weintraub <qazwart_at_gmail.com> wrote:
> Two things: 1). Use the repository path passed in by the script. It
> might not be the one you're trying to use. 2). For giggles, put a few
> other print statements inside your script that guarantees that your
> script will definitely be printing something out. Note that I added
> four more "print" statements to your hook. This script is guaranteed
> to print out at least three lines to STDERR no matter what the value
> of @cmd is:
>
> #! /usr/bin/env perl
>
> print STDERR qq(DEBUG: Repository = "$1"\n);
> print STDERR qq(DEBUG: Transaction = "$2"\n);
> $svnlook = "/usr/bin/svnlook";
> $repo = "/usr/local/svn/projects";
> my @cmd = qx($svnlook changed -t $2 $repo);
> print STDERR qq(DEBUG: Command = ") . join(":", @cmd) . qq("\n);
> foreach(@cmd)
> {
> print STDERR qq(DEBUG: Now looking at "$_"\n);
> if ($_ =~/^A/)
> {
> print STDERR "added\n";
> exit 1;
> }
> else{
> print STDERR "not added\n";
> exit 1;
> }
> }
>
> If your script is actually being executed, the above version is
> guaranteed to print something, and might help you understand exactly
> what your error could be.
>
> If the script isn't printing anything, then it means that Subversion
> isn't executing your script:
>
> There are several conditions that must be met in order for a
> pre-commit hook script to work:
>
> * It must be called "pre-commit" on Unix, or "pre-commit.*" on Windows
> where the suffix of the hook script is in the PATHEXT environment
> variable. 90% of the time, it will be pre-commit.bat, but I've seen
> places where they add in the "py" or "pl" suffix into the PATHEXT
> environment variable and called the pre-commit hook "pre-commit.pl" or
> "pre-commit.py".
>
> * On Unix, f you are using something other than the standard shell
> script, you must have the "shebang" on the first line pointing to the
> correct interpreter to use.
>
> * The hook script must live in the hooks folder inside the Repository
> folder.
>
> * MOST IMPORTANTLY: On Unix, the hook script must be marked as being
> executable. That is, the permission should be something like 7xx or
> 5xx and should be owned by the user who is executing the Subversion
> server process.
>
>
> The script Subversion runs is called pre-commit on Unix, and
> pre-commit.bat or pre-commit.exe on Windows (your extension must be in
> the list of executable file suffixes in the PATHEXT environment
> variable.)
>
> On Unix systems, not only does the script name must be pre-commit, but
> it must live in the hooks directory inside the repository AND (most
> importantly) be marked as executable (that is, the mode of the file
> should probably be either 5xx or 7xx) and owned by the process that
> runs your Subversion server.
>
> It is normally this last requirement, marking the file as executable,
> that most people forget.
>
> And, since you're using Perl, you must have the "#!" on the first line
> pointing to your Perl interpreter, or use "#! /usr/bin/env perl" on
> the first line and make sure your Perl interpreter is in the PATH.
>
> And, one hint to writing a Perl script: You should use the "open"
> statement to execute a command instead of using the qx(). This way,
> you can check the output of the open comment to verify it actually
> works:
>
> Instead of:
>
> my @cmd = qx($svnlook changed -t $2 $repo);
> print STDERR qq(DEBUG: Command = ") . join(":", @cmd) . qq("\n);
> foreach(@cmd)
> {
> ....
> }
>
> Try this:
>
> my $cmd = qq($svnlook changed -t $2 $repo);
> open (CMD, "$cmd|")
> or die qq(ERROR: Can't execute "$cmd" for reading: $!\n);
> while (<CMD>) {
> ....
> }
>
> This way, if your svnlook command doesn't execute for some reason,
> you'll know it. Using your syntax, you can't say for certain whether
> your svnlook command actually worked.
>
> On Wed, May 13, 2009 at 5:21 AM, Irfan Sayed <irfu.sayed_at_gmail.com> wrote:
>> i tried both the things but still not working. please help
>> here is my small script
>>
>> $svnlook = "/usr/bin/svnlook";
>> $repo = "/usr/local/svn/projects";
>> my @cmd = `$svnlook changed -t $2 $repo`;
>> foreach(@cmd)
>> {
>>  if ($_ =~/^A/)
>> {
>>  print STDERR "added\n";
>>  exit 1;
>> }
>> else{
>>  print STDERR "not added\n";
>>  exit 1;
>> }
>> }
>>
>> this is just the sample simple script which i want to execute before
>> commit.
>> it is not giving any output when i add or midify any file
>>
>> Please advise
>>
>> Regards
>> Irf
>>
>>
>> On Tue, May 12, 2009 at 7:46 PM, Ryan Schmidt
>> <subversion-2009b_at_ryandesign.com> wrote:
>>>
>>> On May 12, 2009, at 09:03, Irfan Sayed wrote:
>>>
>>>> here is the command i am using...
>>>>
>>>> svnlook changed -t $2 $repo
>>>> where $2 is the transaction no as given by pre-commit hook and $repo
>>>> contains the name of the repository.
>>>> isuue is that command is executing but all the print statement which i
>>>> mentioned in perl script i am not able to see
>>>> i am using tortise SVN client
>>>
>>> You will only see the output of your print statements on the client if
>>> you
>>> do 2 things:
>>>
>>> 1. Print to stderr instead of stdout.
>>> 2. Exit from the pre-commit hook script with a status other than 0. Yes,
>>> this will cause your pre-commit hook to fail. You cannot show output to
>>> the
>>> client unless your script fails.
>>>
>>> Are you doing both of those things?
>>>
>>> For example, in bash, you could do this:
>>>
>>>
>>> #!/bin/bash
>>>
>>> echo "This message will be seen by the client" 1>&2
>>> exit 1
>>>
>>>
>>>
>>
>>
>
>
>
> --
> David Weintraub
> qazwart_at_gmail.com
>

------------------------------------------------------
http://subversion.tigris.org/ds/viewMessage.do?dsForumId=1065&dsMessageId=2239295

To unsubscribe from this discussion, e-mail: [users-unsubscribe_at_subversion.tigris.org].
Received on 2009-05-13 17:24:33 CEST

This is an archived mail posted to the Subversion Users mailing list.

This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.