Fleshed out the /blame action a bit more.
Dan Brook [Fri, 20 Nov 2009 16:21:38 +0000 (16:21 +0000)]
lib/Gitalist/Controller/Root.pm
lib/Gitalist/Git/Object/Blob.pm
lib/Gitalist/Git/Object/Commit.pm
root/blame.tt2
root/static/css/site.css

index d1c8cf4..db32705 100644 (file)
@@ -145,10 +145,8 @@ sub blame : Local {
        || die "Couldn't discern the corresponding head.";
   my $filename = $c->req->param('f') || '';
 
-  my($metadata, $filedata) = $project->get_object($hb)->blame($filename);
   $c->stash(
-    metadata => $metadata,
-    filedata => $filedata,
+    blame    => $project->get_object($hb)->blame($filename),
     head     => $project->get_object($hb),
     filename => $filename,
   );
index 51be7e3..91e43fb 100644 (file)
@@ -2,7 +2,5 @@ package Gitalist::Git::Object::Blob;
 use MooseX::Declare;
 
 class Gitalist::Git::Object::Blob extends Gitalist::Git::Object {
-  use MooseX::Types::Common::String qw/NonEmptySimpleStr/;
-
   has '+type' => ( default => 'blob' );
 }
index 68b2469..59af17e 100644 (file)
@@ -141,36 +141,46 @@ class Gitalist::Git::Object::Commit
         }
 
 
+  # XXX A prime candidate for caching.
   method blame ( NonEmptySimpleStr $filename ) {
     my @blameout = $self->_run_cmd_list(
       blame => '-p', $self->sha1, '--', $filename
     );
 
-    my(%metadata, @filedata);
+    my(%commitdata, @filedata);
     while(defined(local $_ = shift @blameout)) {
       my ($sha1, $orig_lineno, $lineno, $group_size) =
-       /^([0-9a-f]{40}) (\d+) (\d+)(?: (\d+))?$/;
+        /^([0-9a-f]{40}) (\d+) (\d+)(?: (\d+))?$/;
 
-      my $meta = $metadata{$sha1} ||= {
-       orig_lineno => $orig_lineno,
-       lineno => $lineno,
-       group_size => $group_size,
-      };
+      $commitdata{$sha1} = {}
+        unless exists $commitdata{$sha1};
 
+      my $commit = $commitdata{$sha1};
       my $line;
-      while(defined($line = shift @blameout)) {
-       last
-         if $line =~ s/^\t//;
-       $meta->{$1} = $2
-         if $line =~ /^(\S+) (.*)/;
+      until(($line = shift @blameout) =~ s/^\t//) {
+        $commit->{$1} = $2
+         if $line =~ /^(\S+) (.*)/;
       }
 
-      $meta->{parent} = $self->_run_cmd('rev-parse', "$sha1^")
-        unless exists $meta->{parent};
+      unless(exists $commit->{author_dt}) {
+        for my $t (qw/author committer/) {
+          my $dt = DateTime->from_epoch(epoch => $commit->{"$t-time"});
+          $dt->set_time_zone($commit->{"$t-tz"});
+          $commit->{"$t\_dt"} = $dt;
+        }
+      }
 
-      push @filedata, { line => $line, sha1 => $sha1 };
+      push @filedata, {
+        line => $line,
+        commit => { sha1 => $sha1, %$commit },
+        meta => {
+          orig_lineno => $orig_lineno,
+          lineno => $lineno,
+          ( $group_size ? (group_size => $group_size) : () ),
+        },
+      };
     }
 
-    return \%metadata, \@filedata;
+    return \@filedata;
   }
 }
index 9c3958f..1185953 100644 (file)
@@ -9,8 +9,12 @@
 
 <div class='blame'>
 <table>
-[% FOR info IN filedata %]
-<tr><td>[% info.sha1 %]</td><td><pre>[% info.line | html %]</pre></td></tr>
+[% FOR info IN blame %]
+<tr>
+  <td><a title="[% info.commit.author %] on [% info.commit.author_dt %]" href='[% c.uri_for('commit', {h=info.commit.sha1}) %]'>[% info.commit.sha1.substr(0,6) %]</a></td>
+  <td>[% info.meta.lineno %]</td>
+  <td><pre class='blame-line'>[% info.line | html %]</pre></td>
+</tr>
 [% END %]
 </table>
 </div>
index fbcb637..67c45fc 100644 (file)
@@ -140,6 +140,11 @@ table.heads {
   width: 75%;
 }
 
+/* /blame */
+pre.blame-line {
+  margin: 0;
+}
+
 /* /blob */
 pre.blob {
   background-color: #333;