Re: Encoding problems using git-svn

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Eric,

Don't worry about not seeing the patch and thanks for the answer :)

Your patch works great.

Messages appear without problems on "svn log" and "git log", I haven't
found any gotcha that I know of.

The weird thing is that this problem was not found by anyone before, I
guessed there should be some people with a setup similar to mine.

Thanks again.

On Thu, Oct 30, 2008 at 8:41 AM, Eric Wong <normalperson@xxxxxxxx> wrote:
> Hi James,
>
> I saw your other patch too late, I had already started working on my
> patch earlier today but got distracted by other things (being at
> GitTogether :) and lacked a stable Internet connection afterwards.
>
> Anyways, here's my version, it handles the case where the user specifies
> the --edit option to interactively edit the commit message before
> committing; and also reencodes the messages when fetching from SVN.
>
> Can you let me know if it works for you?
>
> Note: I'll be in transit tomorrow and may not have time to follow
> up on this until Saturday.
>
> From 84f003e0c39414ebf27a98de167643e95bed6abb Mon Sep 17 00:00:00 2001
> From: Eric Wong <normalperson@xxxxxxxx>
> Date: Wed, 29 Oct 2008 23:49:26 -0700
> Subject: [PATCH] git-svn: respect i18n.commitencoding config
>
> SVN itself always stores log messages in the repository as
> UTF-8.  git always stores/retrieves everything as raw binary
> data with no transformations whatsoever.
>
> To interact with SVN, we need to encode log messages as UTF-8
> before sending them to SVN, as SVN cannot do it for us.  When
> retrieving log messages from SVN, we also need to (attempt to)
> reencode the UTF-8 log message back to the user-specified commit
> encoding.
>
> Note, handling i18n.logoutputencoding for "git svn log" also
> needs to be done in a future change.
>
> Also, this change only deals with the encoding of commit
> messages and nothing else (path names, blob content, ...).
>
> In-Reply-To: <8b168cfb0810282014r789ac01dnec51824de1078f0@xxxxxxxxxxxxxx>
> James North <tocapicha@xxxxxxxxx> wrote:
>> Hi,
>>
>> I'm using git-svn on a system with ISO-8859-1 encoding. The problem is
>> when I try to use "git svn dcommit" to send changes to a remote svn
>> (also ISO-8859-1).
>>
>> Seems like git-svn is sending commit messages with utf-8 (just a
>> guessing...) and they look bad on the remote svn log. E.g. "Ca?\241a
>> de cami?\243n"
>>
>> I have tried using i18n.commitencoding=ISO-8859-1 as suggested by the
>> warning when doing "git svn dcommit" but messages still are sent with
>> wrong encoding.
>
> Signed-off-by: Eric Wong <normalperson@xxxxxxxx>
> ---
>  git-svn.perl                           |   24 ++++++++-
>  t/t9129-git-svn-i18n-commitencoding.sh |   80 ++++++++++++++++++++++++++++++++
>  2 files changed, 101 insertions(+), 3 deletions(-)
>  create mode 100755 t/t9129-git-svn-i18n-commitencoding.sh
>
> diff --git a/git-svn.perl b/git-svn.perl
> index f90ddac..f24559c 100755
> --- a/git-svn.perl
> +++ b/git-svn.perl
> @@ -1136,9 +1136,19 @@ sub get_commit_entry {
>                system($editor, $commit_editmsg);
>        }
>        rename $commit_editmsg, $commit_msg or croak $!;
> -       open $log_fh, '<', $commit_msg or croak $!;
> -       { local $/; chomp($log_entry{log} = <$log_fh>); }
> -       close $log_fh or croak $!;
> +       {
> +               # SVN requires messages to be UTF-8 when entering the repo
> +               local $/;
> +               open $log_fh, '<', $commit_msg or croak $!;
> +               binmode $log_fh;
> +               chomp($log_entry{log} = <$log_fh>);
> +
> +               if (my $enc = Git::config('i18n.commitencoding')) {
> +                       require Encode;
> +                       Encode::from_to($log_entry{log}, $enc, 'UTF-8');
> +               }
> +               close $log_fh or croak $!;
> +       }
>        unlink $commit_msg;
>        \%log_entry;
>  }
> @@ -2273,6 +2283,14 @@ sub do_git_commit {
>        }
>        defined(my $pid = open3(my $msg_fh, my $out_fh, '>&STDERR', @exec))
>                                                                   or croak $!;
> +       binmode $msg_fh;
> +
> +       # we always get UTF-8 from SVN, but we may want our commits in
> +       # a different encoding.
> +       if (my $enc = Git::config('i18n.commitencoding')) {
> +               require Encode;
> +               Encode::from_to($log_entry->{log}, 'UTF-8', $enc);
> +       }
>        print $msg_fh $log_entry->{log} or croak $!;
>        restore_commit_header_env($old_env);
>        unless ($self->no_metadata) {
> diff --git a/t/t9129-git-svn-i18n-commitencoding.sh b/t/t9129-git-svn-i18n-commitencoding.sh
> new file mode 100755
> index 0000000..2848e46
> --- /dev/null
> +++ b/t/t9129-git-svn-i18n-commitencoding.sh
> @@ -0,0 +1,80 @@
> +#!/bin/sh
> +#
> +# Copyright (c) 2008 Eric Wong
> +
> +test_description='git svn honors i18n.commitEncoding in config'
> +
> +. ./lib-git-svn.sh
> +
> +compare_git_head_with () {
> +       nr=`wc -l < "$1"`
> +       a=7
> +       b=$(($a + $nr - 1))
> +       git cat-file commit HEAD | sed -ne "$a,${b}p" >current &&
> +       test_cmp current "$1"
> +}
> +
> +compare_svn_head_with () {
> +       LC_ALL=en_US.UTF-8 svn log --limit 1 `git svn info --url` | \
> +               sed -e 1,3d -e "/^-\+\$/d" >current &&
> +       test_cmp current "$1"
> +}
> +
> +for H in ISO-8859-1 EUCJP ISO-2022-JP
> +do
> +       test_expect_success "$H setup" '
> +               mkdir $H &&
> +               svn import -m "$H test" $H "$svnrepo"/$H &&
> +               git svn clone "$svnrepo"/$H $H
> +       '
> +done
> +
> +for H in ISO-8859-1 EUCJP ISO-2022-JP
> +do
> +       test_expect_success "$H commit on git side" '
> +       (
> +               cd $H &&
> +               git config i18n.commitencoding $H &&
> +               git checkout -b t refs/remotes/git-svn &&
> +               echo $H >F &&
> +               git add F &&
> +               git commit -a -F "$TEST_DIRECTORY"/t3900/$H.txt &&
> +               E=$(git cat-file commit HEAD | sed -ne "s/^encoding //p") &&
> +               test "z$E" = "z$H"
> +               compare_git_head_with "$TEST_DIRECTORY"/t3900/$H.txt
> +       )
> +       '
> +done
> +
> +for H in ISO-8859-1 EUCJP ISO-2022-JP
> +do
> +       test_expect_success "$H dcommit to svn" '
> +       (
> +               cd $H &&
> +               git svn dcommit &&
> +               git cat-file commit HEAD | grep git-svn-id: &&
> +               E=$(git cat-file commit HEAD | sed -ne "s/^encoding //p") &&
> +               test "z$E" = "z$H" &&
> +               compare_git_head_with "$TEST_DIRECTORY"/t3900/$H.txt
> +       )
> +       '
> +done
> +
> +test_expect_success 'ISO-8859-1 should match UTF-8 in svn' '
> +(
> +       cd ISO-8859-1 &&
> +       compare_svn_head_with "$TEST_DIRECTORY"/t3900/1-UTF-8.txt
> +)
> +'
> +
> +for H in EUCJP ISO-2022-JP
> +do
> +       test_expect_success '$H should match UTF-8 in svn' '
> +       (
> +               cd $H &&
> +               compare_svn_head_with "$TEST_DIRECTORY"/t3900/2-UTF-8.txt
> +       )
> +       '
> +done
> +
> +test_done
> --
> Eric Wong
>
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux