],
);
+ 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...
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
( $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.
next;
}
- if (/^index (\w+)\.\.(\w+) (\d+)$/) {
+ if (/^index (\w+)\.\.(\w+)(?: (\d+))?$/) {
@{$ret[-1]}{qw(index src dst mode)} = ($_, $1, $2, $3);
next
}
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}) {
=head1 NAME
-Gitalist::Git::Object::Commit
+Gitalist::Git::Object::Commit - Git::Object::Commit module for Gitalist
=head1 SYNOPSIS
=head1 METHODS
+=head2 sha_by_path ($path)
+
+Returns the tree/file sha1 for a given path in a commit.
+
=head2 get_patch
=head2 diff