diff options
author | Joey Hess <joey@kitenet.net> | 2010-06-15 23:21:55 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2010-06-15 23:21:55 -0400 |
commit | da2be6e85cc6d515e173597f88712386aa2a27f4 (patch) | |
tree | fb65bd0464d7767f621f6427fbb7478c827a5279 /IkiWiki/Plugin/git.pm | |
parent | 5f33532468fbd52b15ab599a3198749efcfc7710 (diff) | |
download | ikiwiki-da2be6e85cc6d515e173597f88712386aa2a27f4.tar ikiwiki-da2be6e85cc6d515e173597f88712386aa2a27f4.tar.gz |
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".
Diffstat (limited to 'IkiWiki/Plugin/git.pm')
-rw-r--r-- | IkiWiki/Plugin/git.pm | 50 |
1 files changed, 34 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 } } } |