X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FGitalist%2FGit%2FObject%2FCommit.pm;h=1fd472c3274e4eda86096cfc661ef6b5eb429bd2;hb=09717a40ef5a5d43158701e91ead9ac7934880db;hp=0445999ab9fe6b8bec2163b6f614328393aab8f7;hpb=3a58f004e86fccfa384065e6da7d268917afb1b8;p=catagits%2FGitalist.git diff --git a/lib/Gitalist/Git/Object/Commit.pm b/lib/Gitalist/Git/Object/Commit.pm index 0445999..1fd472c 100644 --- a/lib/Gitalist/Git/Object/Commit.pm +++ b/lib/Gitalist/Git/Object/Commit.pm @@ -23,6 +23,23 @@ class Gitalist::Git::Object::Commit ], ); + method _build_tree { + return [$self->repository->get_object($self->tree_sha1)]; + } + + method sha_by_path ($path) { + $path =~ s{/+$}(); + # FIXME should this really just take the first result? + my @paths = $self->repository->run_cmd('ls-tree', $self->sha1, '--', $path) + or return; + my $line = $paths[0]; + + #'100644 blob 0fa3f3a66fb6a137f6ec2c19351ed4d807070ffa panic.c' + $line =~ m/^([0-9]+) (.+) ($SHA1RE)\t/; + my $sha1 = $3; + return $self->repository->get_object($sha1); + } + method get_patch ( Maybe[NonEmptySimpleStr] $parent_hash?, Int $patch_count?) { # assembling the git command to execute... @@ -47,10 +64,10 @@ class Gitalist::Git::Object::Commit return $self->_run_cmd_fh( @cmd ); } - method diff ( Maybe[Bool] :$patch?, - Maybe[NonEmptySimpleStr] :$parent?, - Maybe[NonEmptySimpleStr] :$filename? - ) { + method diff ( Bool :$patch?, + NonEmptySimpleStr :$parent?, + NonEmptySimpleStr :$filename? + ) { $parent = $parent ? $parent : $self->parents <= 1 @@ -60,10 +77,16 @@ class Gitalist::Git::Object::Commit ( $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 && $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. @@ -157,9 +180,9 @@ class Gitalist::Git::Object::Commit my $commit = $commitdata{$sha1}; my $line; - until(($line = shift @blameout) =~ s/^\t//) { - $commit->{$1} = $2 - if $line =~ /^(\S+) (.*)/; + + until(@blameout == 0 || ($line = shift @blameout) =~ s/^\t//) { + $commit->{$1} = $2 if $line =~ /^(\S+) (.*)/; } unless(exists $commit->{author_dt}) { @@ -227,6 +250,10 @@ Subclass of C. =head1 METHODS +=head2 sha_by_path ($path) + +Returns the tree/file sha1 for a given path in a commit. + =head2 get_patch =head2 diff