ловушка pre-commit в svn: не может быть переведена из родной локали в UTF-8 - PullRequest
6 голосов
/ 08 февраля 2010

У меня проблема с хуком предварительной фиксации.

Этот хук-тест, если файл заблокирован, когда пользователь фиксирует.Когда происходит плохое состояние, он должен вывести, что другой пользователь блокирует этот файл, или, если никто не блокирует, он должен показать «вы не блокируете это сообщение файла (имя файла)».Ошибка происходит, когда имя файла имеет какой-то латинский символ, такой как «ç», и черепаха показывает мне это в выводе.

Не удалось выполнить фиксацию (подробности приведены ниже): фиксация заблокирована ловушкой предварительной фиксации (код выхода 1) с выводом: [Не удалось преобразовать вывод Erro из собственной локали в UTF-8.]

Вы знаете, как я могу решить это?

Спасибо,

Александр

Мой сценарий оболочки здесь:

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

Ответы [ 4 ]

5 голосов
/ 14 января 2011

Это известная ошибка подрывной деятельности, я только что ударил. http://subversion.tigris.org/issues/show_bug.cgi?id=2487

Чтобы решить мою проблему, я использовал vi и сделал следующее

Я обычно делаю: set hls (выделение результатов поиска) и затем / [^ - ~] (ищите любой символ, который не находится между пробелом и тильдой, т.е. не является печатным символом из набора ASCII.) Вы можете добавить вкладку символ (с Ctrl-V Tab) внутри квадратных скобок, если вы используете его в ваши документы. Он будет отображаться как / [^ - ~ ^ I] с синим ^ I.

нашел вас в Канкуне, у которого был акцент, но на самом деле он не был легальным латинским символом-1.

2 голосов
/ 05 марта 2013

Я также столкнулся с этой проблемой, и это происходило потому, что я использовал некоторые специальные символы в своем сообщении о коммите. Я просто удалил этих персонажей, и это сработало как шарм.

Специально ищите символы апострофа (если текст скопирован из документа word или около того).

2 голосов
/ 15 декабря 2011

Я решил это (в Debian), отредактировав / etc / apache2 / envvars и установите apache для запуска с языковым стандартом компьютера (по умолчанию 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  

^ ---- раскомментируйте эту строку, чтобы установить системный языковой стандарт в apache.

если вы не используете локаль UTF-8, вручную установите локаль UTF-8 только для apache:

export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
1 голос
/ 17 ноября 2014

Вам необходимо добавить следующую строку в ваш файл httpd.conf.

SVNUseUTF8 on

вы используете CentOS? возможно, это проблема ОС, поскольку найти этот совет практически невозможно только в Google.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...