Project->list_tree implementation becomes an access to Object->tree.
Zachary Stevens [Sat, 14 Nov 2009 02:32:24 +0000 (02:32 +0000)]
lib/Gitalist/Git/Object.pm
lib/Gitalist/Git/Project.pm

index e42f673..8142c64 100644 (file)
@@ -2,7 +2,7 @@ use MooseX::Declare;
 use Moose::Autobox;
 
 class Gitalist::Git::Object {
-    use MooseX::Types::Moose qw/Str Int Bool Maybe/;
+    use MooseX::Types::Moose qw/Str Int Bool Maybe ArrayRef/;
     use MooseX::Types::Common::String qw/NonEmptySimpleStr/;
     use File::Stat::ModeString qw/mode_to_string/;
     use List::MoreUtils qw/any zip/;
@@ -66,8 +66,31 @@ class Gitalist::Git::Object {
                   default => 0,
                   is => 'ro' );
 
+    has tree => ( isa => 'ArrayRef[Gitalist::Git::Object]',
+                  required => 0,
+                  is => 'ro',
+                  lazy_build => 1 );
+
     method BUILD { $self->$_() for qw/_gpp_obj type size modestr/ }
 
+    method _build_tree {
+        confess("Can't list_tree on a blob object.")
+            if $self->type eq 'blob';
+        my $output = $self->_run_cmd(qw/ls-tree -z/, $self->sha1);
+        return unless defined $output;
+
+        my @ret;
+        for my $line (split /\0/, $output) {
+            my ($mode, $type, $object, $file) = split /\s+/, $line, 4;
+            push @ret, Gitalist::Git::Object->new( mode => oct $mode,
+                                    type => $type,
+                                    sha1 => $object,
+                                    file => $file,
+                                    project => $self->project,
+                                  );
+        }
+        return \@ret;
+    }
 
     method diff ( Maybe[Bool] :$patch?,
                   Maybe[NonEmptySimpleStr] :$parent?,
index 36f1cca..c7b092d 100644 (file)
@@ -151,21 +151,8 @@ Each item is a L<Gitalist::Git::Object>.
 =cut
     method list_tree (Str $sha1?) {
         $sha1 ||= $self->head_hash;
-
-        my $output = $self->run_cmd(qw/ls-tree -z/, $sha1);
-        return unless defined $output;
-
-        my @ret;
-        for my $line (split /\0/, $output) {
-            my ($mode, $type, $object, $file) = split /\s+/, $line, 4;
-            push @ret, Object->new( mode => oct $mode,
-                                    type => $type,
-                                    sha1 => $object,
-                                    file => $file,
-                                    project => $self,
-                                  );
-        }
-        return @ret;
+        my $object = $self->get_object($sha1);
+        return @{$object->tree};
     }
 
 =head2 get_object ($sha1)