Git-Gitalist
view release on metacpan or search on metacpan
lib/Git/Gitalist/Repository.pm view on Meta::CPAN
my $output = $self->run_cmd(
'rev-list',
'--header',
(defined $count ? "--max-count=$count" : ()),
(defined $skip ? "--skip=$skip" : ()),
@search_opts,
$sha1,
'--',
($file ? $file : ()),
);
return unless $output;
my @revs = $self->_parse_rev_list($output);
return @revs;
}
method snapshot (MooseX::Types::Common::String::NonEmptySimpleStr :$sha1,
MooseX::Types::Common::String::NonEmptySimpleStr :$format
) {
# TODO - only valid formats are 'tar' and 'zip'
my $formats = { tgz => 'tar', zip => 'zip' };
unless (exists $formats->{$format}) {
die("No such format: $format");
}
$format = $formats->{$format};
my $name = $self->name;
$name =~ s,([^/])/*\.git$,$1,;
my $filename = $name;
$filename .= "-$sha1.$format";
$name =~ s/\047/\047\\\047\047/g;
my @cmd = ('archive', "--format=$format", "--prefix=$name/", $sha1);
return ($filename, $self->run_cmd_fh(@cmd));
# TODO - support compressed archives
}
## BUILDERS
method _build_util {
Git::Gitalist::Util->new(
repository => $self,
);
}
method _build_description {
my $description = "";
eval {
$description = $self->path->file('description')->slurp;
utf8::decode($description);
chomp $description;
};
$description = "Unnamed repository, edit the .git/description file to set a description"
if $description eq "Unnamed repository; edit this file 'description' to name the repository.";
return $description;
}
method _build_owner {
return 'system' if $^O =~ 'MSWin32';
my ($gecos, $name) = map { decode(langinfo(CODESET()), $_) } (getpwuid $self->path->stat->uid)[6,0];
$gecos =~ s/,+$//;
return length($gecos) ? $gecos : $name;
}
method _build_last_change {
my $last_change;
my $output = $self->run_cmd(
qw{ for-each-ref --format=%(committer)
--sort=-committerdate --count=1 refs/heads
});
if (my ($epoch, $tz) = $output =~ /\s(\d+)\s+([+-]\d+)$/) {
my $dt = DT->from_epoch(epoch => $epoch);
$dt->set_time_zone($tz);
$last_change = $dt;
}
return $last_change;
}
method _build_heads {
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) {
push @ret, Git::Gitalist::Head->new($line);
}
return \@ret;
}
method _build_tags {
my @revlines = $self->run_cmd_list('for-each-ref',
'--sort=-creatordate',
'--format=%(objectname) %(objecttype) %(refname) %(*objectname) %(*objecttype) %(subject)%00%(creator)',
'refs/tags'
);
return [
map Git::Gitalist::Tag->new($_),
grep Git::Gitalist::Tag::is_valid_tag($_), @revlines
];
}
method _build_references {
# 5dc01c595e6c6ec9ccda4f6f69c131c0dd945f8c refs/tags/v2.6.11
# c39ae07f393806ccf406ef966e9a15afc43cc36a refs/tags/v2.6.11^{}
my @reflist = $self->run_cmd_list(qw(show-ref --dereference))
or return;
my %refs;
for (@reflist) {
push @{$refs{$1}}, $2
if m!^($SHA1RE)\srefs/(.*)$!;
}
return \%refs;
}
## Private methods
method _parse_rev_list ($output) {
return
map $self->get_gpp_object($_),
grep is_SHA1($_),
map split(/\n/, $_, 6), split /\0/, $output;
}
( run in 2.520 seconds using v1.01-cache-2.11-cpan-5a3173703d6 )