Provided support for blobdiff_plain legacy URIs.
[catagits/Gitalist.git] / lib / Gitalist / Controller / LegacyURI.pm
1 package Gitalist::Controller::LegacyURI;
2 use Moose;
3 use Moose::Autobox;
4 use namespace::autoclean;
5
6 BEGIN { extends 'Gitalist::Controller' }
7
8 my %LEGACY_DISPATCH = (
9     opml                     => sub { '/opml/opml' },
10     project_index            => sub { '/legacyuri/project_index' },
11     '(?:summary|heads|tags)' => sub {
12         my($c, $action, $repos) = @_;
13         return "/repository/$action", [$repos];
14     },
15     blob => sub {
16         my($c, $action, $repos) = @_;
17         my $ref = $c->req->param('hb') || $c->req->param('h');
18         return '/ref/blob', [$repos, $ref], $c->req->param('f');
19     },
20     blob_plain               => sub {
21         my($c, $action, $repos) =  @_;
22         my $ref = $c->req->param('hb') || $c->req->param('h');
23         return '/ref/raw', [$repos, $ref], $c->req->param('f');
24     },
25     blobdiff                 => sub {
26         my($c, $action, $repos) =  @_;
27         my $ref     = $c->req->param('hb')  || $c->req->param('h');
28         my $compare = $c->req->param('hbp') || $c->req->param('hp');
29         return '/ref/diff', [$repos, $ref], $compare, $c->req->param('f');
30     },
31     blobdiff_plain           => sub {
32         my($c, $action, $repos) =  @_;
33         my $ref     = $c->req->param('hb')  || $c->req->param('h');
34         my $compare = $c->req->param('hbp') || $c->req->param('hp');
35         return '/ref/diff_plain', [$repos, $ref], $compare, $c->req->param('f');
36     },
37 );
38
39 sub _legacy_uri {
40     my($self, $c, $repos, $action) = @_;
41
42     return
43         unless $action;
44
45     my @result  = grep { $action =~ /^$_$/ } keys %LEGACY_DISPATCH;
46     die "Matched too many actions for '$a' - @result"
47         if @result > 1;
48
49     return $LEGACY_DISPATCH{$result[0]}->($c, $action, $repos)
50         if $result[0];
51 }
52
53 sub handler : Chained('/base') PathPart('legacy') Args() {
54     my ( $self, $c, $repos ) = @_;
55
56     my ($action, $captures, @args) = $self->_legacy_uri($c, $repos, $c->req->param('a'));
57
58     die("Not supported")
59         unless $action;
60
61     $c->res->redirect($c->uri_for_action($action, $captures || [], @args));
62     $c->res->status(301);
63 }
64
65 sub project_index : Chained('/base') Args(0) {
66       my ( $self, $c ) = @_;
67
68       $c->response->content_type('text/plain');
69       $c->response->body(
70           join "\n", map $_->name, $c->model()->repositories->flatten
71       ) or die 'No repositories found in '. $c->model->repo_dir;
72 }
73
74 __PACKAGE__->meta->make_immutable;