svn中的预提交挂钩:无法从本地语言环境转换为UTF-8

svn中的预提交挂钩:无法从本地语言环境转换为UTF-8,svn,utf-8,hook,Svn,Utf 8,Hook,我的预提交挂钩有问题 此钩子测试用户提交文件时是否锁定了文件。当坏情况发生时,它应该输出另一个用户正在锁定此文件,或者如果没有人锁定,它应该显示“您没有锁定此文件消息(文件名)”。当文件名包含一些拉丁字符(如“ç”)时会发生错误,并且在输出中显示这一点 提交失败(详细信息如下): 提交被预提交挂钩(退出代码1)阻止,输出: [Erro输出无法从本机语言环境转换为UTF-8。] 你知道我怎么解决这个问题吗 谢谢 亚历山大 我的shell脚本如下: #/bin/sh REPOS=“$1” TXN=“

我的预提交挂钩有问题

此钩子测试用户提交文件时是否锁定了文件。当坏情况发生时,它应该输出另一个用户正在锁定此文件,或者如果没有人锁定,它应该显示“您没有锁定此文件消息(文件名)”。当文件名包含一些拉丁字符(如“ç”)时会发生错误,并且在输出中显示这一点

提交失败(详细信息如下): 提交被预提交挂钩(退出代码1)阻止,输出: [Erro输出无法从本机语言环境转换为UTF-8。]

你知道我怎么解决这个问题吗

谢谢

亚历山大

我的shell脚本如下:

#/bin/sh

REPOS=“$1”

TXN=“$2”

export LANG=“en_US.UTF-8”

/app/svn/hooks/sure-has-need-lock.pl“$REPOS”“$TXN”

if[$?-ne 0];然后退出1;fi

退出0

我的perl在这里:

!/usr/bin/env perl  

#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;   

&usage unless @ARGV == 2;   

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

my $svnlook = "/usr/local/bin/svnlook";   
my $user;   

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;   

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

  foreach my $user_tmp (&read_from_process($svnlook, 'author', $repos, '-t', $txn))   
  {   
      $user = $user_tmp;   
  }   
  my @errors;           

  foreach my $transaction (&read_from_process($svnlook, 'changed', $repos, '-t', $txn)){  
    if ($transaction =~ /^U.  (.*[^\/])$/){   
      my $file = $1;   
      my $err = 0;   
      foreach my $locks (&read_from_process($svnlook, 'lock', $repos, $file)){   
        $err = 1;   
        if($locks=~ /Owner: (.*)/){   
          if($1 != $user){   
           push @errors, "$file : You are not locking this file!";    
          }   
        }   
      }   
      if($err==0){   
        push @errors, "$file : You are not locking this file!";   
      }   
    }   
    elsif($transaction =~ /^D.  (.*[^\/])$/){   
      my $file = $1;   
      my $tchan = &read_from_process($svnlook, 'lock', $repos, $file);   
      foreach my $locks (&read_from_process($svnlook, 'lock', $repos, $file)){   
        push @errors, "$1 : cannot delete locked Files";   
      }   
    }   
    elsif($transaction =~ /^A.  (.*[^\/])$/){   
      my $needs_lock;   
      my $path = $1;   
      foreach my $prop (&read_from_process($svnlook, 'proplist', $repos, '-t', $txn, '--verbose', $path)){   
          if ($prop =~ /^\s*svn:needs-lock : (\S+)/){   
            $needs_lock = $1;   
          }   
      }   
      if (not $needs_lock){   
        push @errors, "$path : svn:needs-lock is not set. Pleas ask TCC for support.";   
      }   
    }   
  }   
if (@errors)   
  {   
    warn "$0:\n\n",   
         join("\n", @errors), "\n\n";   
    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;   
    }   
}
/usr/bin/env perl
#根据Perl版本,以最佳方式打开警告。
开始{
如果($]>=5.006_000)
{需要警告;导入警告;}
其他的
{$^W=1;}
}              
严格使用;
使用鲤鱼;
&用法,除非@ARGV==2;
我的$repos=shift;
我的$txn=班次;
my$svnlook=“/usr/local/bin/svnlook”;
我的$user;
我的$ok=1;
foreach my$计划($svnlook)
{   
如果(-e$计划)
{   
除非(-x$program)
{   
警告“$0:所需程序$program”不可执行,”,
“编辑$0。\n”;
$ok=0;
}   
}   
其他的
{   
警告“$0:所需程序$program”不存在,请编辑$0。\n”;
$ok=0;
}   
}   
退出1,除非$ok;
除非(-e$回购){
&用法(“$0:存储库目录$repos”不存在。”);
}   
除非(-d$repos){
&用法(“$0:repository目录$repos”不是目录。”);
}   
foreach my$user_tmp(&read_from_进程($svnlook,'author',$repos,'t',$txn))
{   
$user=$user\U tmp;
}   
我的错误;
foreach my$transaction(&read_from_process($svnlook,'changed',$repos,'t',$txn)){
如果($transaction=~/^U.(.*[^\/])$/){
my$file=$1;
我的$err=0;
foreach my$locks(&read_from_进程($svnlook,'lock',$repos,$file)){
$err=1;
如果($locks=~/Owner:(.*)/){
如果($1!=$user){
推送@errors,“$file:您没有锁定此文件!”;
}   
}   
}   
如果($err==0){
推送@errors,“$file:您没有锁定此文件!”;
}   
}   
elsif($transaction=~/^D.(.*[^\/])$/){
my$file=$1;
my$tchan=&从进程读取进程($svnlook,$lock',$repos,$file);
foreach my$locks(&read_from_进程($svnlook,'lock',$repos,$file)){
推送@errors,“$1:无法删除锁定的文件”;
}   
}   
elsif($transaction=~/^A.(.*[^\/])$/){
我的美元需要锁;
我的$path=$1;
foreach my$prop(&read_from_process($svnlook,$proplist',$repos,'-t',$txn,'-verbose',$path)){
如果($prop=~/^\s*svn:需要锁:(\s+/){
$needs_lock=$1;
}   
}   
如果(不是$需要锁){
推送@errors,“$path:svn:needs lock未设置。请向TCC寻求支持。”;
}   
}   
}   
如果(@错误)
{   
警告“$0:\n\n”,
加入(“\n”,@errors),“\n\n”;
出口1;
}   
其他的
{   
出口0;
}   
次级用途
{   
警告“@\un”如果@;
die“用法:$0 REPOS TXN-NAME\n”;
}   
从管道读取子安全
{   
除非
{   
croak“$0:safe\u read\u from\u管道未传递任何参数。\n”;
}   
打印“正在运行”\un;
我的$pid=打开(安全读数为“-”);
除非(定义为$pid)
{   
死“$0:无法分叉:$!\n”;
}   
除非($pid)
{   
打开(STDERR“>”和STDOUT“)
或死亡“$0:无法复制标准输出:$!\n”;
行政长官(行政长官)
或死亡“$0:无法执行@':$!\n”;
}   
我的@output;
而()
{   
咀嚼;
推送(@output,$));
}   
关闭(安全读取);
我的$result=$?;
my$exit=$result>>8;
my$signal=$result&127;
my$cd=$result&128?“带核心转储”:“”;
如果($signal或$cd)
{   
警告“$0:pipe from@u200;失败$cd:exit=$exit signal=$signal\n”;
}   
如果(wantarray)
{   
返回($result,@output);
}   
其他的
{   
返回$result;
}   
}   
从进程中读取子进程
{   
除非
{   
croak“$0:read\u from\u进程未传递任何参数。\n”;
}   
my($status,@output)=&safe_read_from_pipe(@);
如果($状态)
{   
if(@output)
{   
骰子“$0:@389;”失败,此输出为:\n”,join(“\n”,@output),“\n”;
}   
其他的
{   
骰子“$0:@_”失败,没有输出。\n”;
}   
}   
其他的
{   
返回@输出;
}   
}

这是一个已知的subversion bug,我也遇到了。

为了解决我的问题,我使用vi并执行了以下操作

我通常做一个:设置hls(突出显示搜索结果),后跟/[^-~] (搜索任何不在空格和波浪之间的字符,即 不是ASCII集合中的可打印字符。)您可以添加选项卡 如果在中使用,则方括号内的字符(带Ctrl-V制表符) 你的文件。它将显示为带有蓝色^I的/[^-~^I]

在坎昆发现一个有口音但实际上不是合法拉丁字母1的u
## The locale used by some modules like mod_dav
export LANG=C
## Uncomment the following line to use the system default locale instead:
#. /etc/default/locale  
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8