From: Zachary Stevens Date: Sun, 27 Jun 2010 17:02:30 +0000 (+0100) Subject: Create Head instances from unparsed git output. X-Git-Tag: 0.002007~20 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FGitalist.git;a=commitdiff_plain;h=72fbbef7d694cd33a18ee384938a2d5944f34c8e Create Head instances from unparsed git output. --- diff --git a/lib/Gitalist/Git/Head.pm b/lib/Gitalist/Git/Head.pm index 0661a69..9301a31 100644 --- a/lib/Gitalist/Git/Head.pm +++ b/lib/Gitalist/Git/Head.pm @@ -1,26 +1,57 @@ package Gitalist::Git::Head; -use MooseX::Declare; +use Moose; +use namespace::autoclean; -class Gitalist::Git::Head { - use Gitalist::Git::Types qw/SHA1/; - use MooseX::Types::Common::String qw/NonEmptySimpleStr/; - use MooseX::Types::DateTime qw/DateTime/; +use Gitalist::Git::Types qw/SHA1/; +use MooseX::Types::Common::String qw/NonEmptySimpleStr/; +use MooseX::Types::DateTime; +use DateTime; - has sha1 => ( isa => SHA1, - is => 'ro', - required => 1, - ); - has name => ( isa => NonEmptySimpleStr, - is => 'ro', - required => 1, - ); - has committer => ( isa => NonEmptySimpleStr, - is => 'ro', - required => 1, - ); - has last_change => ( isa => DateTime, - is => 'ro', - required => 1, - coerce => 1, - ); -} +has sha1 => ( isa => SHA1, + is => 'ro', + required => 1, + ); +has name => ( isa => NonEmptySimpleStr, + is => 'ro', + required => 1, + ); +has committer => ( isa => NonEmptySimpleStr, + is => 'ro', + required => 1, + ); +has last_change => ( isa => 'DateTime', + is => 'ro', + required => 1, + coerce => 1, +); + +around BUILDARGS => sub { + my $orig = shift; + my $class = shift; + + if ( @_ == 1 && ! ref $_[0] ) { + my $line = $_[0]; + # expects $line to match the output from + # for-each-ref --format=%(objectname)%00%(refname)%00%(committer) + my ($sha1, $name, $commitinfo) = split /\0/, $line, 3; + $name =~ s!^refs/heads/!!; + + my ($committer, $epoch, $tz) = + $commitinfo =~ /(.*)\s(\d+)\s+([+-]\d+)$/; + my $dt = DateTime->from_epoch( + epoch => $epoch, + time_zone => $tz, + ); + + return $class->$orig( + sha1 => $sha1, + name => $name, + committer => $committer, + last_change => $dt, + ); + } else { + return $class->$orig(@_); + } +}; + +1; diff --git a/lib/Gitalist/Git/Repository.pm b/lib/Gitalist/Git/Repository.pm index c07605d..5259eb8 100644 --- a/lib/Gitalist/Git/Repository.pm +++ b/lib/Gitalist/Git/Repository.pm @@ -238,24 +238,8 @@ class Gitalist::Git::Repository with Gitalist::Git::HasUtils { my @revlines = $self->run_cmd_list(qw/for-each-ref --sort=-committerdate /, '--format=%(objectname)%00%(refname)%00%(committer)', 'refs/heads'); my @ret; for my $line (@revlines) { - my ($sha1, $name, $commitinfo) = split /\0/, $line, 3; - $name =~ s!^refs/heads/!!; - - my ($committer, $epoch, $tz) = - $commitinfo =~ /(.*)\s(\d+)\s+([+-]\d+)$/; - my $dt = DateTime->from_epoch( - epoch => $epoch, - time_zone => $tz, - ); - my $head = Gitalist::Git::Head->new( - sha1 => $sha1, - name => $name, - committer => $committer, - last_change => $dt, - ); - push @ret, $head; + push @ret, Gitalist::Git::Head->new($line); } - return \@ret; } diff --git a/t/02git_head.t b/t/02git_head.t index a9133fd..be92102 100644 --- a/t/02git_head.t +++ b/t/02git_head.t @@ -7,6 +7,10 @@ use Data::Dumper; BEGIN { use_ok 'Gitalist::Git::Head' } +my $revline="a92fb1c9282f7319099ce7f783c8be7d5360f6e3\0refs/heads/model-cleanup\0Zachary Stevens 1277601094 +0100"; +my $instance = Gitalist::Git::Head->new($revline); +isa_ok($instance, 'Gitalist::Git::Head'); + # Create an instance, passing last_change as a DateTime use DateTime; my $timespec = [1277578462, '+0100'];