From da2be6e85cc6d515e173597f88712386aa2a27f4 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 15 Jun 2010 23:21:55 -0400 Subject: [PATCH] git: Gix --gettime to properly support utf8 filenames. In passing, fixed a bug where the srcdir was in a subdir of a repository named "0". --- IkiWiki/Plugin/git.pm | 50 +++++++++++++++++++++++++++++-------------- debian/changelog | 1 + 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/IkiWiki/Plugin/git.pm b/IkiWiki/Plugin/git.pm index aa402c04f..bb3f89a82 100644 --- a/IkiWiki/Plugin/git.pm +++ b/IkiWiki/Plugin/git.pm @@ -280,11 +280,35 @@ sub merge_past ($$$) { return $conflict; } -sub parse_diff_tree ($@) { +{ +my $prefix; +sub decode_git_file ($) { + my $file=shift; + + # git does not output utf-8 filenames, but instead + # double-quotes them with the utf-8 characters + # escaped as \nnn\nnn. + if ($file =~ m/^"(.*)"$/) { + ($file=$1) =~ s/\\([0-7]{1,3})/chr(oct($1))/eg; + } + + # strip prefix if in a subdir + if (! defined $prefix) { + $prefix = run_or_die('git', 'rev-parse', '--show-prefix'); + if (! defined $prefix) { + $prefix=""; + } + } + $file =~ s/^\Q$prefix\E//; + + return decode("utf8", $file); +} +} + +sub parse_diff_tree ($) { # Parse the raw diff tree chunk and return the info hash. # See git-diff-tree(1) for the syntax. - - my ($prefix, $dt_ref) = @_; + my $dt_ref = shift; # End of stream? return if !defined @{ $dt_ref } || @@ -367,16 +391,9 @@ sub parse_diff_tree ($@) { my $sha1_to = shift(@tmp); my $status = shift(@tmp); - # git does not output utf-8 filenames, but instead - # double-quotes them with the utf-8 characters - # escaped as \nnn\nnn. - if ($file =~ m/^"(.*)"$/) { - ($file=$1) =~ s/\\([0-7]{1,3})/chr(oct($1))/eg; - } - $file =~ s/^\Q$prefix\E//; if (length $file) { push @{ $ci{'details'} }, { - 'file' => decode("utf8", $file), + 'file' => decode_git_file($file), 'sha1_from' => $sha1_from[0], 'sha1_to' => $sha1_to, 'mode_from' => $mode_from[0], @@ -403,10 +420,9 @@ sub git_commit_info ($;$) { my @raw_lines = run_or_die('git', 'log', @opts, '--pretty=raw', '--raw', '--abbrev=40', '--always', '-c', '-r', $sha1, '--', '.'); - my ($prefix) = run_or_die('git', 'rev-parse', '--show-prefix'); my @ci; - while (my $parsed = parse_diff_tree(($prefix or ""), \@raw_lines)) { + while (my $parsed = parse_diff_tree(\@raw_lines)) { push @ci, $parsed; } @@ -638,10 +654,12 @@ sub findtimes ($$) { $date=undef; } else { - if (! $time_cache{$line}) { - $time_cache{$line}[0]=$date; # mtime + my $f=decode_git_file($line); + + if (! $time_cache{$f}) { + $time_cache{$f}[0]=$date; # mtime } - $time_cache{$line}[1]=$date; # ctime + $time_cache{$f}[1]=$date; # ctime } } } diff --git a/debian/changelog b/debian/changelog index cc128c46f..aeb9dc0eb 100644 --- a/debian/changelog +++ b/debian/changelog @@ -19,6 +19,7 @@ ikiwiki (3.20100611) UNRELEASED; urgency=low * Fix issues with combining unicode srcdirs and source files. (Workaround bug #586045) * Make --gettime be honored after initial setup. + * git: Gix --gettime to properly support utf8 filenames. -- Joey Hess Fri, 11 Jun 2010 13:39:15 -0400