);
}
+sub blame : Local {
+ my($self, $c) = @_;
+
+ my $project = $c->stash->{Project};
+ my $h = $c->req->param('h')
+ || $project->hash_by_path($c->req->param('hb'), $c->req->param('f'))
+ || die "No file or sha1 provided.";
+ my $hb = $c->req->param('hb')
+ || $project->head_hash
+ || 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,
+ head => $project->get_object($hb),
+ filename => $filename,
+ );
+
+}
+
=head2 blob
The blob action i.e the contents of a file.
# FIXME - implement snapshot
Carp::croak "Not implemented.";
}
-sub blame : Local {
- # FIXME - implement snapshot
- Carp::croak "Not implemented.";
-}
=head2 end
use MooseX::Declare;
class Gitalist::Git::Object::Blob extends Gitalist::Git::Object {
- has '+type' => ( default => 'blob' );
+ use MooseX::Types::Common::String qw/NonEmptySimpleStr/;
+
+ has '+type' => ( default => 'blob' );
}
return @ret;
}
+
+ method blame ( NonEmptySimpleStr $filename ) {
+ my @blameout = $self->_run_cmd_list(
+ blame => '-p', $self->sha1, '--', $filename
+ );
+
+ my(%metadata, @filedata);
+ while(defined(local $_ = shift @blameout)) {
+ my ($sha1, $orig_lineno, $lineno, $group_size) =
+ /^([0-9a-f]{40}) (\d+) (\d+)(?: (\d+))?$/;
+
+ my $meta = $metadata{$sha1} ||= {
+ orig_lineno => $orig_lineno,
+ lineno => $lineno,
+ group_size => $group_size,
+ };
+
+ my $line;
+ while(defined($line = shift @blameout)) {
+ last
+ if $line =~ s/^\t//;
+ $meta->{$1} = $2
+ if $line =~ /^(\S+) (.*)/;
+ }
+
+ $meta->{parent} = $self->_run_cmd('rev-parse', "$sha1^")
+ unless exists $meta->{parent};
+
+ push @filedata, { line => $line, sha1 => $sha1 };
}
+
+ return \%metadata, \@filedata;
+ }
+}
--- /dev/null
+[% PROCESS 'nav/actions.tt2' object = head %]
+[% IF object.type == 'commit' %]
+<div class='commit-message'>
+[% head.comment.substr(0, 85) %] ...
+</div>
+[% END %]
+
+<h3>BLOB PATH</h3>
+
+<div class='blame'>
+<table>
+[% FOR info IN filedata %]
+<tr><td>[% info.sha1 %]</td><td><pre>[% info.line | html %]</pre></td></tr>
+[% END %]
+</table>
+</div>