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 )