]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki/Plugin/git.pm
Merge commit '5971a731e98b9b6543d78572c181ffc1bb7e1dd1' into sipb
[ikiwiki.git] / IkiWiki / Plugin / git.pm
index 86d80186f3f8671140dc01a00706e2d265545779..79162d14105f58c19a2490f88feba84a12fc56f0 100644 (file)
@@ -4,6 +4,7 @@ package IkiWiki::Plugin::git;
 use warnings;
 use strict;
 use IkiWiki;
+use IkiWiki::UserInfo;
 use Encode;
 use open qw{:utf8 :std};
 
@@ -477,8 +478,9 @@ sub rcs_commit_staged ($$$) {
        my %env=%ENV;
        if (defined $user || defined $ipaddr) {
                my $u=encode_utf8(defined $user ? $user : $ipaddr);
-               $ENV{GIT_AUTHOR_NAME}=$u;
-               $ENV{GIT_AUTHOR_EMAIL}="$u\@web";
+               # MITLOGIN This algorithm could be improved
+               $ENV{GIT_AUTHOR_NAME}=IkiWiki::userinfo_get($u, "realname");
+               $ENV{GIT_AUTHOR_EMAIL}="$u\@mit.edu";
        }
 
        $message = IkiWiki::possibly_foolish_untaint($message);
@@ -616,27 +618,51 @@ sub rcs_diff ($) {
        }
 }
 
-sub rcs_getctime ($) {
+{
+my %time_cache;
+
+sub findtimes ($$) {
        my $file=shift;
+       my $id=shift; # 0 = mtime ; 1 = ctime
+
        # Remove srcdir prefix
        $file =~ s/^\Q$config{srcdir}\E\/?//;
 
-       my @raw_lines = run_or_die('git', 'log', 
-               '--follow', '--no-merges',
-               '--pretty=raw', '--raw', '--abbrev=40', '--always', '-c',
-               '-r', '--', $file);
-       my @ci;
-       while (my $parsed = parse_diff_tree("", \@raw_lines)) {
-               push @ci, $parsed;
+       if (! keys %time_cache) {
+               my $date;
+               foreach my $line (run_or_die('git', 'log',
+                               '--pretty=format:%ct',
+                               '--name-only', '--relative')) {
+                       if (! defined $date && $line =~ /^(\d+)$/) {
+                               $date=$line;
+                       }
+                       elsif (! length $line) {
+                               $date=undef;
+                       }
+                       else {
+                               if (! $time_cache{$line}) {
+                                       $time_cache{$line}[0]=$date; # mtime
+                               }
+                               $time_cache{$line}[1]=$date; # ctime
+                       }
+               }
        }
-       my $ctime = $ci[$#ci]->{'author_epoch'};
-       debug("ctime for '$file': ". localtime($ctime));
 
-       return $ctime;
+       return exists $time_cache{$file} ? $time_cache{$file}[$id] : 0;
+}
+
+}
+
+sub rcs_getctime ($) {
+       my $file=shift;
+
+       return findtimes($file, 1);
 }
 
 sub rcs_getmtime ($) {
-       error "rcs_getmtime is not implemented for git\n"; # TODO
+       my $file=shift;
+
+       return findtimes($file, 0);
 }
 
 sub rcs_receive () {