7
votes

Crochet de pré-validation dans SVN: ne pouvait pas être traduit de la locale native à UTF-8

J'ai un problème avec mon crochet de pré-validation.

Ce test de crochet si un fichier est verrouillé lorsque l'utilisateur s'engage. Lorsqu'une mauvaise condition arrive, elle devrait émettre que l'utilisateur d'un autre verrouille ce fichier ou si personne ne verrouille, il devrait indiquer "Vous ne verrouillez pas ce message de fichier (nom de fichier)". L'erreur se produit lorsque le nom du fichier a un caractère latin comme "ç" et tortue me montrer cela dans la sortie. P>

BIGT a échoué (Détails Suivre): Commit bloqué par un crochet de pré-validation (code de sortie 1) avec la sortie: [La sortie erro n'a pas pu être traduite de la locale native en UTF-8.] P>

Savez-vous comment puis-je résoudre ce problème? p>

merci, p>

alexandre p>

mon script shell est ici: p>

#! / bin / sh code> de
repos = "1 $" code>
txn = "$ 2" code>
Export Lang = "EN_US.UTF-8" CODE>
/app/svn/hooks/ensure-has-need-lock.pl "$ repos" "$ txn" code>
si [$? -ne 0]; Puis quittez 1; fi code>
Quitter 0 CODE> P>

ET MON PERL est ici: P>

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


5 commentaires

Je pense qu'il serait également précieux de voir également la source du script Perl. Pourquoi supposez-vous que l'erreur n'est pas là?


Je pense que l'erreur est sur shell ou sur tortue (je ne sais pas) la buse de la bée si la coque ne contient que: echo "TestÇ" 1> & 2 La même erreur se produit. Mais je vais mettre mon code Perl.


Je cherche cette solution pendant 5 jours et je ne peux pas trouver. Peut-être que c'est un bug ou quelque chose. Si quelqu'un a une idée de ce qui se passe, ou s'il s'agit d'un bogue ou si cela s'est passé avec quelqu'un. Merci


Peut-être mettre le code Perl dans un bloc de code afin qu'il soit plus facile de lire?


Comme je l'ai dit, le problème n'est pas mon script Perl. Si je mets Echo "TestÇ" 1> & 2 à l'intérieur de ma coquille, le même problème se produit. Je pense que TortoiseSVN ne comprend pas le caractère "ç" si je le retourne d'un script de crochet.


5 Réponses :


6
votes

Ceci 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'ai utilisé VI et j'ai fait ce qui suit

Je fais habituellement un: Set HLS (Sélectionnez les résultats de la recherche) suivi de / [^ - ~] (Recherchez n'importe quel personnage qui n'est pas entre espace et tilde, c'est-à-dire que n'est pas un caractère imprimable à partir du jeu ASCII.) Vous pouvez ajouter l'onglet caractère (avec onglet Ctrl-V) à l'intérieur des crochets si vous l'utilisez dans vos documents. Il montrera comme / [^ - ~ ^ i] avec un bleu ^ i.

a trouvé un u à Cancun qui avait un accent mais n'était en fait pas un caractère légitime latin-1.


1 commentaires

Sauvé ma vie.Merci mec.



3
votes

J'ai résolu ceci (sur Debian) en édité le / etc / apache2 / envvars et définissez l'apache à exécuter avec la machine locale (la valeur par défaut est c): xxx pré>

^ ---- Définit cette ligne pour régler le système local dans Apache. P>

Si vous n'utilisez pas de paramètres régionaux UTF-8, définissez manuellement une locale UTF-8 Juste pour Apache: P>

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


0 commentaires

2
votes

J'ai également fait face à ce problème et cela se produisait parce que j'utilisais des caractères spéciaux dans mon message de validation. Je viens de supprimer ces personnages et ça a fonctionné comme un charme.

Rechercher spécialement des caractères d'apostrophe (lorsque vous avez copié le texte du document Word ou plus).


0 commentaires

1
votes

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

svnuseutf8 sur

Utilisez-vous Centos? Ceci peut-être une question du système d'exploitation, car il est presque impossible de trouver ce conseil uniquement avec Google.


0 commentaires

0
votes

Dans le script de la publication ou le message de validation, recherchez "ou" et vérifiez-les si elles sont au format UTF-8. Sinon, ne pas les changer et courir cela a fonctionné pour moi.


0 commentaires