X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FGitalist%2FGit%2FObject.pm;h=c4e87d4c5b64a9fb81e59146bb2f9a92f7ecdc37;hb=460b079a490cc638ecdd666c63d8edc09b7a8bcc;hp=4dceffaf719bb6a52b2018a242cde8d7b78621c7;hpb=50394a3ecc49d9da9dce312e0fe8753f374b9a40;p=catagits%2FGitalist.git diff --git a/lib/Gitalist/Git/Object.pm b/lib/Gitalist/Git/Object.pm index 4dceffa..c4e87d4 100644 --- a/lib/Gitalist/Git/Object.pm +++ b/lib/Gitalist/Git/Object.pm @@ -1,65 +1,112 @@ use MooseX::Declare; +use Moose::Autobox; -class Gitalist::Git::Object { - use File::Stat::ModeString qw/mode_to_string/; - has project => ( isa => 'Gitalist::Git::Project', +class Gitalist::Git::Object with Gitalist::Git::Serializable is dirty { + use MooseX::Storage::Meta::Attribute::Trait::DoNotSerialize; + + use MooseX::Types::Moose qw/Str Int Bool Maybe ArrayRef/; + use MooseX::Types::Common::String qw/NonEmptySimpleStr/; + use Gitalist::Utils qw/mode_string/; + use overload '""' => '_to_string', fallback => 1; + + # repository and sha1 are required initargs + has repository => ( isa => 'Gitalist::Git::Repository', required => 1, is => 'ro', - handles => [ 'run_cmd' ], + weak_ref => 1, + handles => { + _run_cmd => 'run_cmd', + _run_cmd_fh => 'run_cmd_fh', + _run_cmd_list => 'run_cmd_list', + _get_gpp_object => 'get_gpp_object', + }, ); - has sha1 => ( isa => 'Str', + has sha1 => ( isa => NonEmptySimpleStr, required => 1, is => 'ro' ); - has type => ( isa => 'Str', - required => 1, + + has type => ( isa => NonEmptySimpleStr, is => 'ro', - lazy_build => 1 ); - has file => ( isa => 'Str', - required => 1, + required => 1 ); + + has $_ => ( isa => NonEmptySimpleStr, + required => 1, + is => 'ro', + lazy_build => 1 ) + for qw/modestr size/; + + has _gpp_obj => ( isa => 'Git::PurePerl::Object', + required => 1, + is => 'ro', + lazy_build => 1, + handles => [ 'content' ], + traits => ['DoNotSerialize'] + ); + + # objects can't determine their mode or filename + has file => ( isa => NonEmptySimpleStr, + required => 0, is => 'ro' ); - has mode => ( isa => 'Int', + has mode => ( isa => Int, required => 1, + default => 0, is => 'ro' ); - has modestr => ( isa => 'Str', - is => 'ro', - lazy_build => 1, - ); - has size => ( isa => 'Int', - is => 'ro', - lazy_build => 1); - method _build_type { - my $output = $self->run_cmd(qw/cat-file -t/, $self->{sha1}); - chomp($output); - return $output; + method BUILD { $self->$_() for qw/_gpp_obj size modestr/ } + +## Private methods + method _to_string { + return $self->sha1; + }; + +## Builders + method _build__gpp_obj { + return $self->_get_gpp_object($self->sha1) } - - method _build_modestr { - my $modestr = mode_to_string($self->{mode}); - return $modestr; + + method "_build_size" { + my $v = $self->_cat_file_with_flag('s'); + chomp($v); + return $v; + } + + method _cat_file_with_flag ($flag) { + $self->_run_cmd('cat-file', '-' . $flag, $self->{sha1}) } - method _build_size { - my $output = $self->run_cmd(qw/cat-file -s/, $self->{sha1}); - chomp($output); - return $output; + method _build_modestr { + return mode_string($self->mode); } -=head2 contents +} # end class -Return the contents of a given file. +__END__ -=cut +=head1 NAME - method contents { - if ( $self->type ne 'blob' ) { - die "object $self->sha1 is not a file\n" - } +Gitalist::Git::Object - Model of a git object. - my $output = $self->run_cmd(qw/cat-file -p/, $self->sha1); - return unless $output; +=head1 SYNOPSIS - return $output; - } + my $object = Repository->get_object($sha1); -} # end class +=head1 DESCRIPTION + +Abstract base class for git objects. + + +=head1 ATTRIBUTES + + +=head1 METHODS + + +=head1 AUTHORS + +See L for authors. + +=head1 LICENSE + +See L for the license. + +=cut