return @ret;
}
- method get_object (Str $sha1) {
+ method get_object (NonEmptySimpleStr $sha1) {
+ unless ( $self->valid_rev($sha1) ) {
+ $sha1 = $self->head_hash($sha1);
+ }
return Object->new(
project => $self,
sha1 => $sha1,
);
}
-
+
# Should be in ::Object
method get_object_mode_string (Gitalist::Git::Object $object) {
return unless $object && $object->{mode};
# XXX Ideally this would return a wee object instead of ad hoc structures.
method diff ( Gitalist::Git::Object :$commit,
Bool :$patch?,
- NonEmptySimpleStr :$parent?,
+ Maybe[NonEmptySimpleStr] :$parent?,
NonEmptySimpleStr :$file? ) {
# Use parent if specifed, else take the parent from the commit
# if there is only one, otherwise it was a merge commit.
);
my @out = $self->raw_diff(
- ( $patch ? '--patch-with-raw' : () ),
- $parent, $commit->sha1, @etc
+ \(( $patch ? '--patch-with-raw' : () ),
+ $parent, $commit->sha1, @etc )
);
# XXX Yes, there is much wrongness having parse_diff_tree be destructive.
return @ret;
}
+ method reflog (@logargs) {
+ my @entries
+ = $self->run_cmd(qw(log -g), @logargs)
+ =~ /(^commit.+?(?:(?=^commit)|(?=\z)))/msg;
+
+=pod
+ commit 02526fc15beddf2c64798a947fecdd8d11bf993d
+ Reflog: HEAD@{14} (The Git Server <git@git.dev.venda.com>)
+ Reflog message: push
+ Author: Foo Barsby <fbarsby@example.com>
+ Date: Thu Sep 17 12:26:05 2009 +0100
+
+ Merge branch 'abc123'
+
+=cut
+
+ return map {
+ # XXX Stuff like this makes me want to switch to Git::PurePerl
+ my($sha1, $type, $author, $date)
+ = m{
+ ^ commit \s+ ($SHA1RE)$
+ .*?
+ Reflog[ ]message: \s+ (.+?)$ \s+
+ Author: \s+ ([^<]+) <.*?$ \s+
+ Date: \s+ (.+?)$
+ }xms;
+
+ pos($_) = index($_, $date) + length $date;
+
+ # Yeah, I just did that.
+ my($msg) = /\G\s+(\S.*)/sg;
+ {
+ hash => $sha1,
+ type => $type,
+ author => $author,
+
+ # XXX Add DateTime goodness.
+ date => $date,
+ message => $msg,
+ }
+ ;
+ } @entries;
+ }
+
# Compatibility
=head2 info