Introduce ::Object::Commit.
Zachary Stevens [Sun, 15 Nov 2009 23:49:12 +0000 (23:49 +0000)]
lib/Gitalist/Git/Object.pm
lib/Gitalist/Git/Object/Commit.pm [new file with mode: 0644]
lib/Gitalist/Git/Project.pm
t/02git_project.t

index 8142c64..9802ea1 100644 (file)
@@ -35,17 +35,14 @@ class Gitalist::Git::Object {
                       is => 'ro',
                       lazy_build => 1,
                       handles => [ 'parents',
-                                   'parent_sha1',
                                    'author',
-                                   'authored_time',
                                    'committer',
-                                   'committed_time',
                                ],
                   );
 
     # This feels wrong, but current templates assume
     # these attributes are present on every object.
-    foreach my $key (qw/tree_sha1 comment content/) {
+    foreach my $key (qw/content/) {
         has $key => ( isa => Str,
                       required => 1,
                       is => 'ro',
diff --git a/lib/Gitalist/Git/Object/Commit.pm b/lib/Gitalist/Git/Object/Commit.pm
new file mode 100644 (file)
index 0000000..b8e6c82
--- /dev/null
@@ -0,0 +1,14 @@
+package Gitalist::Git::Object::Commit;
+use MooseX::Declare;
+
+class Gitalist::Git::Object::Commit extends Gitalist::Git::Object {
+    has '+_gpp_obj' => ( handles => [ 'comment',
+                                      'tree_sha1',
+                                      'committed_time',
+                                      'authored_time',
+                                      'parent_sha1',
+                                      'parent_sha1s',
+                                  ],
+                         );
+
+}
index c7b092d..36615f0 100644 (file)
@@ -26,6 +26,7 @@ class Gitalist::Git::Project with Gitalist::Git::HasUtils {
     use MooseX::Types::Moose qw/Str Maybe Bool HashRef ArrayRef/;
     use List::MoreUtils qw/any zip/;
     use DateTime;
+    use Gitalist::Git::Object::Commit;
     use aliased 'Gitalist::Git::Object';
 
     our $SHA1RE = qr/[0-9a-fA-F]{40}/;
@@ -164,7 +165,13 @@ Return a L<Gitalist::Git::Object> for the given sha1.
         unless ( $self->_is_valid_rev($sha1) ) {
             $sha1 = $self->head_hash($sha1);
         }
-        return Object->new(
+        my $type = $self->run_cmd('cat-file', '-t', $sha1);
+        chomp($type);
+        my $class = 'Gitalist::Git::Object';
+        if ($type eq 'commit') {
+            $class .= '::' . ucfirst($type);
+        };
+        return $class->new(
             project => $self,
             sha1 => $sha1,
         );
index 4c03933..540c80e 100644 (file)
@@ -40,13 +40,17 @@ isa_ok(($proj->list_tree)[1], 'Gitalist::Git::Object');
 
 # Return an ::Object from a sha1
 my $obj1 = $proj->get_object('5716ca5987cbf97d6bb54920bea6adde242d87e6');
-isa_ok($obj1, 'Gitalist::Git::Object');
+isa_ok($obj1, 'Gitalist::Git::Object::Tree');
 
 my $hbp_sha1 = $proj->hash_by_path('36c6c6708b8360d7023e8a1649c45bcf9b3bd818', 'dir1/file2');
 my $obj2 = $proj->get_object($hbp_sha1);
+isa_ok($obj2, 'Gitalist::Git::Object::Blob');
 is($obj2->type, 'blob', 'hash_by_path obj is a file');
 is($obj2->content, "foo\n", 'hash_by_path obj is a file');
 
+my $obj3 = $proj->get_object($proj->head_hash);
+isa_ok($obj3, 'Gitalist::Git::Object::Commit');
+
 like($proj->head_hash('HEAD'), qr/^([0-9a-fA-F]{40})$/, 'head_hash');
 
 {