Create Head instances from unparsed git output.
Zachary Stevens [Sun, 27 Jun 2010 17:02:30 +0000 (18:02 +0100)]
lib/Gitalist/Git/Head.pm
lib/Gitalist/Git/Repository.pm
t/02git_head.t

index 0661a69..9301a31 100644 (file)
@@ -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;
index c07605d..5259eb8 100644 (file)
@@ -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;
     }
 
index a9133fd..be92102 100644 (file)
@@ -7,6 +7,10 @@ use Data::Dumper;
 BEGIN { use_ok 'Gitalist::Git::Head' }
 
 
+my $revline="a92fb1c9282f7319099ce7f783c8be7d5360f6e3\0refs/heads/model-cleanup\0Zachary Stevens <zts\@cryptocracy.com> 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'];