Fixed the links in the history view.
[catagits/Gitalist.git] / lib / Gitalist / Controller / Fragment / Ref.pm
1 package Gitalist::Controller::Fragment::Ref;
2 use Moose;
3 use namespace::autoclean;
4
5 BEGIN { extends 'Gitalist::Controller' }
6 with qw/
7     Gitalist::URIStructure::Ref
8     Gitalist::URIStructure::Fragment::WithLog
9 /;
10
11 sub base : Chained('/fragment/repository/find') PathPart('') CaptureArgs(0) {}
12
13 sub _diff {
14     my ($self, $c) = @_;
15     my $commit = $c->stash->{Commit};
16     my %filename = $c->stash->{filename} ? (filename => $c->stash->{filename}) : ();
17     my($tree, $patch) = $c->stash->{Repository}->diff(
18         commit => $commit,
19         parent => $c->stash->{parent},
20         patch  => 1,
21         %filename,
22     );
23     $c->stash(
24       diff_tree => $tree,
25       diff      => $patch,
26       # XXX Hack hack hack, see View::SyntaxHighlight
27       blobs     => [map $_->{diff}, @$patch],
28       language  => 'Diff',
29       %filename,
30     );
31 }
32
33 after diff_fancy => sub {
34     my ($self, $c) = @_;
35     $self->_diff($c);
36     $c->forward('View::SyntaxHighlight');
37 };
38
39 after diff_plain => sub {
40     my ($self, $c) = @_;
41     $self->_diff($c);
42     $c->response->content_type('text/plain; charset=utf-8');
43 };
44
45 after tree => sub {
46     my ( $self, $c ) = @_;
47     my $repository = $c->stash->{Repository};
48     my $commit  = $c->stash->{Commit};
49     my $tree    = $c->stash->{filename}
50       ? $repository->get_object($repository->hash_by_path($commit->sha1, $c->stash->{filename}))
51       : $repository->get_object($commit->tree_sha1)
52     ;
53     $c->stash(
54         tree      => $tree,
55         tree_list => [$repository->list_tree($tree->sha1)],
56         path      => $c->stash->{filename}, # FIXME?
57     );
58 };
59
60 after blame => sub {
61     my($self, $c) = @_;
62
63     my $repository = $c->stash->{Repository};
64                                                       # WTF?
65     my $blame = $c->stash->{Commit}->blame($c->stash->{filename}, $c->stash->{Commit}->sha1);
66     $c->stash(
67         blame    => $blame,
68         # XXX Hack hack hack, see View::SyntaxHighlight
69         language => ($c->stash->{filename} =~ /\.p[lm]$/i ? 'Perl' : ''),
70         blob     => join("\n", map $_->{line}, @$blame),
71     );
72
73     $c->forward('View::SyntaxHighlight')
74         unless $c->stash->{no_wrapper};
75 };
76
77 =head2 blob
78
79 The blob action i.e the contents of a file.
80
81 =cut
82
83 after blob => sub {
84     my ( $self, $c ) = @_;
85     $c->stash(
86         # XXX Hack hack hack, see View::SyntaxHighlight
87         language => ($c->stash->{filename} =~ /\.p[lm]$/i ? 'Perl' : ''),
88     );
89
90     $c->forward('View::SyntaxHighlight')
91         unless $c->stash->{no_wrapper};
92 };
93
94 after history => sub {
95     my ($self, $c) = @_;
96     my $repository  = $c->stash->{Repository};
97     my $filename    = $c->stash->{filename};
98
99     my %logargs = (
100        sha1   => $c->stash->{Commit}->sha1,
101        count  => 25, #Gitalist->config->{paging}{log} || 25,
102        ($filename ? (file => $filename) : ())
103     );
104
105     my $file = $repository->get_object(
106         $repository->hash_by_path(
107             $repository->head_hash,
108             $filename
109         )
110     );
111
112     my $page = $c->req->param('pg') || 0;
113     $logargs{skip} = $c->req->param('pg') * $logargs{count}
114         if $c->req->param('pg');
115
116     $c->stash(
117        log_lines => [$repository->list_revs(%logargs)],
118        refs      => $repository->references,
119        filename  => $filename,
120        filetype  => $file->type,
121     );
122 };
123
124 __PACKAGE__->meta->make_immutable;