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