summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--IkiWiki/Plugin/git.pm50
-rw-r--r--debian/changelog1
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 <joeyh@debian.org> Fri, 11 Jun 2010 13:39:15 -0400