2010-02-08 142 views
6

我的預提交鉤子有問題。svn中的pre-commit鉤子:無法從本地區域轉換爲UTF-8

該鉤子測試是否在用戶提交時鎖定文件。發生不良情況時,應輸出另一用戶正在鎖定此文件,或者如果沒有人鎖定,應顯示「您未鎖定此文件信息(文件名)」。當文件的名稱有一些拉丁字符如「ç」和烏龜在輸出中顯示我時會發生錯誤。

提交失敗(細節如下): 凱明阻止預提交與輸出鉤(退出代碼1):[ERRO輸出不能被從本地位置爲UTF-8翻譯]

待辦事項你知道我該如何解決這個問題?

感謝,

亞歷山大

我的shell腳本是在這裏:

#!/bin/sh
REPOS="$1"
TXN="$2"
export LANG="en_US.UTF-8"
/app/svn/hooks/ensure-has-need-lock.pl "$REPOS" "$TXN"
if [ $? -ne 0 ]; then exit 1; fi
exit 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; 
    } 
} 
+0

我認爲看到perl腳本的來源也是很有價值的。爲什麼你認爲這個錯誤不在那裏? – amarillion 2010-02-08 19:08:32

+0

我認爲錯誤是在殼或烏龜(我不知道)如果殼只包含這個: echo「testç」1>&2 發生同樣的錯誤。 但我會把我的Perl代碼。 – 2010-02-08 19:14:57

+0

我正在尋找這個解決方案5天,我找不到。也許這是一個錯誤或什麼。 如果有人知道發生了什麼,或者如果它是一個錯誤,或者它發生在某人身上。 謝謝 – 2010-02-09 10:30:09

回答

5

這是一個已知的bug顛覆,我只是打爲好。 http://subversion.tigris.org/issues/show_bug.cgi?id=2487

爲了解決我的問題,我用vi和做了以下

我平時一:其次/套HLS(高亮搜索結果)[^ - 〜] (搜索不是任何字符(即 不是ASCII集中的可打印字符)。如果在文檔中使用 字符(使用Ctrl-V Tab鍵),可以在方括號中添加標籤 。它會顯示爲藍色^ I/[^ - 〜^ I]。

發現你在坎昆有一個口音但實際上不是合法的拉丁-1字符。

+0

這一個爲我工作。謝謝Toddecus。 – Moni 2012-06-05 15:14:24

+0

救了我的命。謝謝兄弟。 – RoyHu 2017-05-24 04:01:00

2

我通過編輯/ etc/apache2的/ envvars中 和設置apache到與機器語言環境中運行(默認爲C)解決了這個(在Debian):

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

^----取消註釋此行以在apache中設置系統區域設置。

,如果你不使用UTF-8碼,手動設置UTF-8語言環境 只是阿帕奇:

export LANG=en_US.UTF-8 
export LC_ALL=en_US.UTF-8 
2

我也面臨這個問題,它發生,因爲我是用一些特殊字符在我的提交信息中。 我剛剛刪除這些字符,它的工作就像魅力。

特別尋找撇號字符(當你從word文檔中複製文本等)。

1

您需要在httpd.conf文件中添加以下行。

SVNUseUTF8 on

您使用CentOS的?這可能是一些操作系統問題,因爲幾乎不可能僅通過Google找到此提示。