2010-02-08 9 views
6

J'ai un problème avec mon crochet de pré-validation.crochet de pré-validation dans svn: n'a pas pu être traduit de la locale native à UTF-8

Ce hook test si un fichier est verrouillé lorsque l'utilisateur le valide. Quand une mauvaise condition survient, il doit sortir que l'autre utilisateur verrouille ce fichier ou si personne ne le verrouille, il doit afficher "vous ne verrouillez pas ce message de fichier (nom du fichier)". L'erreur se produit quand le nom du fichier a un caractère latin comme "ç" et que la tortue me le montre dans la sortie.

Engagez échoué (détails ci-après): Commit bloqué par pre-commit hook (code de sortie 1) avec sortie: [. Sortie Erro n'a pas pu être traduit à partir des paramètres régionaux natif UTF-8]

Do tu sais comment puis-je résoudre ça?

Merci,

Alexandre

Mon script shell est ici:

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

Et mon perl est ici:

!/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

Je pense qu'il serait utile de voir aussi la source du script Perl. Pourquoi supposez-vous que l'erreur n'est pas là? – amarillion

+0

Je pense que l'erreur est sur shell ou sur tortue (je ne sais pas) beucause si le shell ne contient que ceci: echo "testç" 1> & 2 la même erreur se produit. Mais je vais mettre mon code perl. –

+0

Je cherche cette solution depuis 5 jours et je ne trouve pas. Peut-être que c'est un bug ou quelque chose. Si quelqu'un a une idée de ce qui se passe, ou si c'est un bug ou si c'est arrivé avec quelqu'un. Merci –

Répondre

5

C'est un bug de subversion connu, je viens de frapper aussi bien. http://subversion.tigris.org/issues/show_bug.cgi?id=2487

Pour résoudre mon problème, j'utilisé vi et fait ce qui suit

Je habituellement un: HLS set (point fort de résultats de recherche), suivi par/[^ - ~] (recherche de tout caractère non entre n'est pas un caractère imprimable de l'ensemble ASCII.) Vous pouvez ajouter l'onglet caractère (avec Ctrl-V Tab) entre les crochets si vous l'utilisez dans vos documents. Il montrera comme/[^ - ~^I] avec un bleu^I.

trouvé à Cancun qui avait un accent, mais n'était en fait pas un caractère juridique latin-1.

+0

Celui-ci a fonctionné pour moi. Merci Toddecus. – Moni

+0

Sauvé ma vie. Merci mec. – RoyHu

2

I résolu cette (sur debian) en modifiant le/etc/apache2/envvars et régler l'Apache pour fonctionner avec les paramètres régionaux de la machine (la valeur par défaut est C):

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

^---- décommentez cette ligne pour définir les paramètres régionaux du système dans Apache.

si vous n'utilisez pas un lieu UTF-8, définissez manuellement un paramètre régional UTF-8 juste pour apache:

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

J'ai aussi fait face à ce problème et ce qui se passait parce que j'utilisais certains caractères spéciaux dans mon message de validation. J'ai juste enlevé ces caractères et cela a fonctionné comme charme.

Recherchez spécialement les caractères d'apostrophe (lorsque vous avez copié du texte à partir d'un document Word, etc.).

1

Vous devez ajouter la ligne suivante dans votre fichier httpd.conf.

SVNUseUTF8 on

utilisent CentOS vous? C'est peut-être un problème de système d'exploitation, car il est presque impossible de trouver cette astuce uniquement avec Google.