You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@subversion.apache.org by DePriest Richard 403 <ri...@crackerbarrel.com> on 2008/03/17 21:54:49 UTC

Getting error messages from Tortoise

We are starting to use subversion with tortoise. There is a pre-commit
hook that fires and calls a perl script that checks to see if a file is
locked and if it is not it will error out and not allow the commit. The
error is getting written to STDERR and we cannot see it through
tortoise. Is there anyway to see the error in tortoise?  I am including
the hook and the perl program.
 
hook:
@ECHO OFF
REM Set command line client language to english
set LC_ALL=C
set SVNLOOK="/usr/bin/svnlook"
set REPOS=%1
set TXN=%2
 
cd /u01/svn/repositories/Crackerbarrel/hooks
perl checklock_nopropcheck.pl %SVNLOOK% %REPOS% %TXN%
exit %ERRORLEVEL%
 
perl:
 
$SVNLOOK = $ARGV[0];
$REPOS = $ARGV[1];
$TXN = $ARGV[2];
 
sub main {
 #Get Author
 open(AUTHOR,"\"$SVNLOOK\" author -t $TXN \"$REPOS\" |");
 $Author = (<AUTHOR> =~ /(\w+\b)/)[0];
 close(AUTHOR);
 
 # Get changed files
 open(CHANGED,"\"$SVNLOOK\" changed -t $TXN \"$REPOS\" |");
 @ChangedFiles = <CHANGED>;
 close(CHANGED);
 print @ChangedFiles;
 
 foreach $File (@ChangedFiles){
  if($File =~ /^[UD]/){ #Only updated and deleted
   if($File !~ /(.*)\/\s*$/){ #Is not a directory
    $File = ($File =~ /....(.*)[\n\b]/)[0]; #Get just the file name
    open(LOCKDATA,"\"$SVNLOOK\" lock \"$REPOS\" \"$File\" |");
    $Lockdata = join("",<LOCKDATA>);
    close(LOCKDATA);
    if($Lockdata =~ /Owner: (\w+\b)/){
     return $1
    } else {
     print STDERR "Lock Error: There is a modified file without
lock!($File)\n";
     exit 1
    }
   }
  }
 }
}
 
main();
 
exit 0;
 
Any help will be very much appreciated.
 
Rick DePriest
Project Manager - Retail Systems
Cracker Barrel Old Country Stores, Inc.
Ph. (615) 443-9845
Email: rdepries@crackerbarrel.com
 

Re: Getting error messages from Tortoise

Posted by Phil <pl...@gmail.com>.
This is my hook script to check for file lock. And it does print the error
message to TortoiseSVN



#!/usr/bin/env perl

# ====================================================================
# ensure-needs-lock.pl: check that every added file has the
# svn:needs-lock property. If any file fails this test the user is
# sent a verbose error message suggesting solutions and the commit is
# aborted.
#
# Usage: ensure-needs-lock.pl REPOS TXN-NAME
# ====================================================================
# Most of ensure-needs-lock.pl was taken from
# check-mime-type.pl, Revision 12600, 2005-01-05 11:44:05 -0600.
# ====================================================================
# Copyright (c) 2000-2005 CollabNet.  All rights reserved.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution.  The terms
# are also available at http://subversion.tigris.org/license.html.
# If newer versions of this license are posted there, you may use a
# newer version instead, at your option.
#
# This software consists of voluntary contributions made by many
# individuals.  For exact contribution history, see the revision
# history and logs, available at http://subversion.tigris.org/.
# ====================================================================

# Turn on warnings the best way depending on the Perl version.
BEGIN {
  if ( $] >= 5.006_000)
    { require warnings; import warnings; }
  else
    { $^W = 1; }
}

use strict;
use Carp;


######################################################################
# Configuration section.

# Svnlook path.
my $svnlook = "/usr/local/bin/svnlook";

# Since the path to svnlook depends upon the local installation
# preferences, check that the required program exists to insure that
# the administrator has set up the script properly.
{
  my $ok = 1;
  foreach my $program ($svnlook)
    {
      if (-e $program)
        {
          unless (-x $program)
            {
              warn "$0: required program `$program' is not executable, ",
                   "edit $0.\n";
              $ok = 0;
            }
        }
      else
        {
          warn "$0: required program `$program' does not exist, edit $0.\n";
          $ok = 0;
        }
    }
  exit 1 unless $ok;
}

######################################################################
# Initial setup/command-line handling.

&usage unless @ARGV == 2;

my $repos        = shift;
my $txn          = shift;

unless (-e $repos)
  {
    &usage("$0: repository directory `$repos' does not exist.");
  }
unless (-d $repos)
  {
    &usage("$0: repository directory `$repos' is not a directory.");
  }

# Define two constant subroutines to stand for read-only or read-write
# access to the repository.
sub ACCESS_READ_ONLY  () { 'read-only' }
sub ACCESS_READ_WRITE () { 'read-write' }


######################################################################
# Harvest data using svnlook.

# Change into /tmp so that svnlook diff can create its .svnlook
# directory.
my $tmp_dir = '/tmp';
chdir($tmp_dir)
  or die "$0: cannot chdir `$tmp_dir': $!\n";

# Figure out what files have added using svnlook.
my @files_added;
foreach my $line (&read_from_process($svnlook, 'changed', $repos, '-t',
$txn))
  {
        # Add only files that were added to @files_added
    if ($line =~ /^A.  (.*[^\/])$/)
      {
        push(@files_added, $1);
      }
  }

my @errors;
foreach my $path ( @files_added )
    {
        my $needs_lock;

        # Parse the complete list of property values of the file $path to
extract
        # the needs-lock property
        foreach my $prop (&read_from_process($svnlook, 'proplist', $repos,
'-t',
                          $txn, '--verbose', $path))
            {
                if ($prop =~ /^\s*svn:needs-lock : (\S+)/)
                    {
                        $needs_lock = $1;
                    }
            }

        # Detect error conditions and add them to @errors
        if (not $needs_lock)
            {
                push @errors, "$path : svn:needs-lock is not set";
            }
    }

# If there are any errors list the problem files and give information
# on how to avoid the problem. Hopefully people will set up auto-props
# and will not see this verbose message more than once.
if (@errors)
  {
    warn "$0:\n\n",
         join("\n", @errors), "\n\n",
                 <<EOS;

    Every added file must have the svn:needs-lock property set.

    If you need more help contact Admin.

EOS
    exit 1;
  }
else
  {
    exit 0;
  }

sub usage
{
  warn "@_\n" if @_;
  die "usage: $0 REPOS TXN-NAME\n";
}

sub safe_read_from_pipe
{
  unless (@_)
    {
      croak "$0: safe_read_from_pipe passed no arguments.\n";
    }
  print "Running @_\n";
  my $pid = open(SAFE_READ, '-|');
  unless (defined $pid)
    {
      die "$0: cannot fork: $!\n";
    }
  unless ($pid)
    {
      open(STDERR, ">&STDOUT")
        or die "$0: cannot dup STDOUT: $!\n";
      exec(@_)
        or die "$0: cannot exec `@_': $!\n";
    }
  my @output;
  while (<SAFE_READ>)
    {
      chomp;
      push(@output, $_);
    }
  close(SAFE_READ);
  my $result = $?;
  my $exit   = $result >> 8;
  my $signal = $result & 127;
  my $cd     = $result & 128 ? "with core dump" : "";
  if ($signal or $cd)
    {
      warn "$0: pipe from `@_' failed $cd: exit=$exit signal=$signal\n";
    }
  if (wantarray)
    {
      return ($result, @output);
    }
  else
    {
      return $result;
    }
}

sub read_from_process
  {
  unless (@_)
    {
      croak "$0: read_from_process passed no arguments.\n";
    }
  my ($status, @output) = &safe_read_from_pipe(@_);
  if ($status)
    {
      if (@output)
        {
          die "$0: `@_' failed with this output:\n", join("\n", @output),
"\n";
        }
      else
        {
          die "$0: `@_' failed with no output.\n";
        }
    }
  else
    {
      return @output;
    }
}







On Mon, Mar 17, 2008 at 5:54 PM, DePriest Richard 403 <
richard.depriest@crackerbarrel.com> wrote:

>  We are starting to use subversion with tortoise. There is a pre-commit
> hook that fires and calls a perl script that checks to see if a file is
> locked and if it is not it will error out and not allow the commit. The
> error is getting written to STDERR and we cannot see it through tortoise. Is
> there anyway to see the error in tortoise?  I am including the hook and the
> perl program.
>
> hook:
> @ECHO OFF
> REM Set command line client language to english
> set LC_ALL=C
> set SVNLOOK="/usr/bin/svnlook"
> set REPOS=%1
> set TXN=%2
>
> cd /u01/svn/repositories/Crackerbarrel/hooks
> perl checklock_nopropcheck.pl %SVNLOOK% %REPOS% %TXN%
> exit %ERRORLEVEL%
>
> perl:
>
> $SVNLOOK = $ARGV[0];
> $REPOS = $ARGV[1];
> $TXN = $ARGV[2];
>
> sub main {
>  #Get Author
>  open(AUTHOR,"\"$SVNLOOK\" author -t $TXN \"$REPOS\" |");
>  $Author = (<AUTHOR> =~ /(\w+\b)/)[0];
>  close(AUTHOR);
>
>  # Get changed files
>  open(CHANGED,"\"$SVNLOOK\" changed -t $TXN \"$REPOS\" |");
>  @ChangedFiles = <CHANGED>;
>  close(CHANGED);
>  print @ChangedFiles;
>
>  foreach $File (@ChangedFiles){
>   if($File =~ /^[UD]/){ #Only updated and deleted
>    if($File !~ /(.*)\/\s*$/){ #Is not a directory
>     $File = ($File =~ /....(.*)[\n\b]/)[0]; #Get just the file name
>     open(LOCKDATA,"\"$SVNLOOK\" lock \"$REPOS\" \"$File\" |");
>     $Lockdata = join("",<LOCKDATA>);
>     close(LOCKDATA);
>     if($Lockdata =~ /Owner: (\w+\b)/){
>      return $1
>     } else {
>      print STDERR "Lock Error: There is a modified file without
> lock!($File)\n";
>      exit 1
>     }
>    }
>   }
>  }
> }
>
> main();
>
> exit 0;
>
> Any help will be very much appreciated.
>
> Rick DePriest
> Project Manager - Retail Systems
> Cracker Barrel Old Country Stores, Inc.
> Ph. (615) 443-9845
> Email: rdepries@crackerbarrel.com
>
>

Re: Getting error messages from Tortoise

Posted by KM <in...@yahoo.com>.
I am by no means an expert.  We do also have a pre-commit hook that prints to standard error via a perl script.  It prints fine to the Tortoise commit screen.
   
  The only different I see is that our script uses different printing -
   
  it's like this, but i think it should be the same thing. the select appears at the top and then you just use print.
   
  select(STDERR);   
  print "the string";
   
  Sorry I can't help more.  I am sure someone will be much more helpful than I.
   
  KM
  
DePriest Richard 403 <ri...@crackerbarrel.com> wrote:
      We are starting to use subversion with tortoise. There is a pre-commit hook that fires and calls a perl script that checks to see if a file is locked and if it is not it will error out and not allow the commit. The error is getting written to STDERR and we cannot see it through tortoise. Is there anyway to see the error in tortoise?  I am including the hook and the perl program.
   
  hook:
  @ECHO OFF
REM Set command line client language to english
set LC_ALL=C
set SVNLOOK="/usr/bin/svnlook"
set REPOS=%1
set TXN=%2
   
  cd /u01/svn/repositories/Crackerbarrel/hooks
perl checklock_nopropcheck.pl %SVNLOOK% %REPOS% %TXN%
exit %ERRORLEVEL%
   
  perl:
   
  $SVNLOOK = $ARGV[0];
$REPOS = $ARGV[1];
$TXN = $ARGV[2];
   
  sub main {
 #Get Author
 open(AUTHOR,"\"$SVNLOOK\" author -t $TXN \"$REPOS\" |");
 $Author = (<AUTHOR> =~ /(\w+\b)/)[0];
 close(AUTHOR);
 
 # Get changed files
 open(CHANGED,"\"$SVNLOOK\" changed -t $TXN \"$REPOS\" |");
 @ChangedFiles = <CHANGED>;
 close(CHANGED);
 print @ChangedFiles;
   
   foreach $File (@ChangedFiles){
  if($File =~ /^[UD]/){ #Only updated and deleted
   if($File !~ /(.*)\/\s*$/){ #Is not a directory
    $File = ($File =~ /....(.*)[\n\b]/)[0]; #Get just the file name
    open(LOCKDATA,"\"$SVNLOOK\" lock \"$REPOS\" \"$File\" |");
    $Lockdata = join("",<LOCKDATA>);
    close(LOCKDATA);
    if($Lockdata =~ /Owner: (\w+\b)/){
     return $1
    } else {
     print STDERR "Lock Error: There is a modified file without lock!($File)\n";
     exit 1
    }
   }
  }
 }
}
   
  main();
   
  exit 0;
   
  Any help will be very much appreciated.
   
  Rick DePriest
  Project Manager - Retail Systems
  Cracker Barrel Old Country Stores, Inc.
  Ph. (615) 443-9845
  Email: rdepries@crackerbarrel.com
   


       
---------------------------------
Never miss a thing.   Make Yahoo your homepage.