use 5.008007; package Gitprep; our $VERSION = '1.00'; use Mojo::Base 'Mojolicious'; use Gitprep::Git; has 'git'; sub startup { my $self = shift; # Config my $conf_file = $ENV{GITPUB_CONFIG_FILE} || $self->home->rel_file('gitpub.conf'); $self->plugin('JSONConfigLoose', {file => $conf_file}) if -f $conf_file; my $conf = $self->config; $conf->{search_dirs} ||= ['/git/pub', '/home']; $conf->{search_max_depth} ||= 10; $conf->{logo_link} ||= "https://github.com/yuki-kimoto/gitpub"; $conf->{hypnotoad} ||= {listen => ["http://*:10010"]}; $conf->{prevent_xss} ||= 0; $conf->{encoding} ||= 'UTF-8'; $conf->{text_exts} ||= ['txt']; # Git my $git = Gitprep::Git->new; my $git_bin = $conf->{git_bin} ? $conf->{git_bin} : $git->search_bin; die qq/Can't detect git command. set "git_bin" in gitpub.conf/ unless $git_bin; $git->bin($git_bin); $git->search_dirs($conf->{search_dirs}); $git->search_max_depth($conf->{search_max_depth}); $git->encoding($conf->{encoding}); $git->text_exts($conf->{text_exts}); $self->git($git); # Helper { # Remove top slash $self->helper('gitpub_rel' => sub { my ($self, $path) = @_; $path =~ s/^\///; return $path; }); # Get head commit id $self->helper('gitpub_get_head_id' => sub { my ($self, $project) = @_; my $head_commit = $self->app->git->parse_commit($project, "HEAD"); my $head_id = $head_commit->{id}; return $head_id; }); } # Added user public and templates path unshift @{$self->static->paths}, $self->home->rel_file('user/public'); unshift @{$self->renderer->paths}, $self->home->rel_file('user/templates'); # Reverse proxy support $ENV{MOJO_REVERSE_PROXY} = 1; $self->hook('before_dispatch' => sub { my $self = shift; if ( $self->req->headers->header('X-Forwarded-Host')) { my $prefix = shift @{$self->req->url->path->parts}; push @{$self->req->url->base->path->parts}, $prefix; } }); # Route my $r = $self->routes->route->to('main#'); # Home $r->get('/')->to('#home'); # Repositories $r->get('/:user')->to('#repositories'); # Repository $r->get('/:user/:repository')->to('#repository'); =pod # Projects $r->get('/(*home)/projects')->to('#projects')->name('projects'); # Project { my $r = $r->route('/(*project)', project => qr/.+?\.git/); # Summary $r->get('/summary')->to('#summary')->name('summary'); # Short log $r->get('/shortlog/(*id)', {id => 'HEAD'}) ->to('#log', short => 1)->name('shortlog'); # Log $r->get('/log/(*id)', {id => 'HEAD'})->to('#log')->name('log'); # Commit $r->get('/commit/(*id)')->to('#commit')->name('commit'); # Commit diff $r->get('/commitdiff/(*diff)')->to('#commitdiff')->name('commitdiff'); # Commit diff plain $r->get('/commitdiff-plain/(*diff)') ->to('#commitdiff', plain => 1)->name('commitdiff_plain'); # Tags $r->get('/tags')->to('#tags')->name('tags'); # Tag $r->get('/tag/(*id)')->to('#tag')->name('tag'); # Heads $r->get('/heads')->to('#heads')->name('heads'); # Tree $r->get('/tree/(*id_dir)', {id_dir => 'HEAD'}) ->to('#tree')->name('tree'); # Blob $r->get('/blob/(*id_file)')->to('#blob')->name('blob'); # Blob plain $r->get('/blob-plain/(*id_file)') ->to('#blob', plain => 1)->name('blob_plain'); # Blob diff $r->get('/blobdiff/(#diff)/(*file)') ->to('#blobdiff')->name('blobdiff'); # Blob diff plain $r->get('/blobdiff-plain/(#diff)/(*file)') ->to('#blobdiff', plain => 1)->name('blobdiff_plain'); # Snapshot $r->get('/snapshot/(:id)', {id => 'HEAD'}) ->to('#snapshot')->name('snapshot'); } =cut # File cache $git->search_projects; } 1;