Handle merges in the diff view.
[catagits/Gitalist.git] / lib / Gitalist / Git / Object / Commit.pm
index a6261fa..5f0c7de 100644 (file)
@@ -5,7 +5,7 @@ class Gitalist::Git::Object::Commit
     extends Gitalist::Git::Object
     with Gitalist::Git::Object::HasTree {
         use MooseX::Types::Moose qw/Str Int Bool Maybe ArrayRef/;
-        use MooseX::Types::Common::String qw/NonEmptySimpleStr/;
+        use MooseX::Types::Common::String qw/NonEmptySimpleStr SimpleStr/;
         use Moose::Autobox;
         use List::MoreUtils qw/any zip/;
         our $SHA1RE = qr/[0-9a-fA-F]{40}/;
@@ -47,23 +47,29 @@ class Gitalist::Git::Object::Commit
             return $self->_run_cmd_fh( @cmd );
         }
 
-        method diff ( Maybe[Bool] :$patch?,
-                       Maybe[NonEmptySimpleStr] :$parent?,
-                       Maybe[NonEmptySimpleStr] :$file?
-                   ) {
+        method diff ( Bool              :$patch?,
+                      NonEmptySimpleStr :$parent?,
+                      NonEmptySimpleStr :$filename?
+                    ) {
             $parent = $parent
                 ? $parent
                     : $self->parents <= 1
                         ? $self->parent_sha1
                             : '-c';
             my @etc = (
-                ( $file  ? ('--', $file) : () ),
+                ( $filename  ? ('--', $filename) : () ),
             );
 
+           # If we're not comparing against something and we have multiple
+           # parents then it's a merge commit so show what was merged.
+           my $sha1 = $parent eq '-c' && @{[$self->parents]} > 1
+                ? sprintf("%s^1..%s^2", ($self->sha1) x 2)
+                     : $self->sha1;
+
             my @out = $self->_raw_diff(
                 ( $patch ? '--patch-with-raw' : () ),
                 ( $parent ? $parent : () ),
-                $self->sha1, @etc,
+                $sha1, @etc,
             );
 
             # XXX Yes, there is much wrongness having _parse_diff_tree be destructive.
@@ -105,7 +111,7 @@ class Gitalist::Git::Object::Commit
                 $line{sha1}   = $line{sha1dst};
                 $line{is_new} = $line{sha1src} =~ /^0+$/
                     if $line{sha1src};
-                @line{qw/status sim/} = $line{status} =~ /(R)(\d+)/
+                @line{qw/status sim/} = $line{status} =~ /(R)0*(\d+)/
                     if $line{status} =~ /^R/;
                 push @ret, \%line;
             }
@@ -128,7 +134,7 @@ class Gitalist::Git::Object::Commit
                     next;
                 }
 
-                if (/^index (\w+)\.\.(\w+) (\d+)$/) {
+                if (/^index (\w+)\.\.(\w+)(?: (\d+))?$/) {
                     @{$ret[-1]}{qw(index src dst mode)} = ($_, $1, $2, $3);
                     next
                 }
@@ -142,9 +148,9 @@ class Gitalist::Git::Object::Commit
 
 
   # XXX A prime candidate for caching.
-  method blame ( NonEmptySimpleStr $filename ) {
+  method blame ( NonEmptySimpleStr $filename, SimpleStr $sha1 ) {
     my @blameout = $self->_run_cmd_list(
-      blame => '-p', $self->sha1, '--', $filename
+      blame => '-p', $sha1 ? $sha1 : $self->sha1, '--', $filename
     );
 
     my(%commitdata, @filedata);
@@ -196,7 +202,7 @@ Gitalist::Git::Object::Commit
 
 =head1 SYNOPSIS
 
-    my $commit = Project->get_object($commit_sha1);
+    my $commit = Repository->get_object($commit_sha1);
 
 =head1 DESCRIPTION