Migrate search and reflog to new model.
[catagits/Gitalist.git] / lib / Gitalist / Controller / Root.pm
index 1303900..5a75fe7 100644 (file)
@@ -63,7 +63,17 @@ sub _get_commit {
 
   my $h = $haveh || $c->req->param('h') || '';
   my $f = $c->req->param('f');
-  my $m = $c->model();
+
+  # FIXME this can die when everything is migrated
+  my ($m, $pd);
+  if (defined $c->stash->{current_model} &&
+          $c->stash->{current_model} eq 'GitRepos') {
+      $m = $c->stash->{Project};
+      $pd = $m->path;
+  } else {
+      $m = $c->model();
+      ($pd = $m->project_dir( $m->project )) =~ s{/\.git$}();
+  }
 
   # Either use the provided h(ash) parameter, the f(ile) parameter or just use HEAD.
   my $hash = ($h =~ /[^a-f0-9]/ ? $m->head_hash($h) : $h)
@@ -72,8 +82,6 @@ sub _get_commit {
           # XXX This could definitely use more context.
           || Carp::croak("Couldn't find a hash for the commit object!");
 
-
-  (my $pd = $m->project_dir( $m->project )) =~ s{/\.git$}();
   my $commit = $m->get_object($hash)
     or Carp::croak("Couldn't find a commit object for '$hash' in '$pd'!");
 
@@ -87,22 +95,20 @@ Provides the project listing.
 =cut
 
 sub index :Path :Args(0) {
-  my ( $self, $c ) = @_;
-
-  # Leave actions up to gitweb at this point.
-  return $self->run_gitweb($c)
-    if $c->req->param('a');
+    my ( $self, $c ) = @_;
+    $c->detach($c->req->param('a')) if $c->req->param('a');
+    $c->stash(current_model => 'GitRepos');
 
-  my $list = $c->model()->list_projects;
-  unless(@$list) {
-    die "No projects found in ".Gitalist->config->{repodir};
-  }
+    my $list = $c->model()->list_projects;
+    unless(@$list) {
+        die "No projects found in ". $c->model->repo_dir;
+    }
 
-  $c->stash(
-    searchtext => $c->req->param('searchtext') || '',
-    projects   => $list,
-    action     => 'index',
-  );
+    $c->stash(
+        searchtext => $c->req->param('searchtext') || '',
+        projects   => $list,
+        action     => 'index',
+    );
 }
 
 =head2 summary
@@ -113,18 +119,20 @@ A summary of what's happening in the repo.
 
 sub summary : Local {
   my ( $self, $c ) = @_;
-
+  $c->stash(current_model => 'GitRepos');
+  my $project = $c->stash->{Project};
   my $commit = $self->_get_commit($c);
   $c->stash(
     commit    => $commit,
-    info      => $c->model()->project_info($c->model()->project),
-    log_lines => [$c->model()->list_revs(
-      sha1 => $commit->sha1, count => Gitalist->config->{paging}{summary}
+    info      => $project->info,
+    log_lines => [$project->list_revs(
+        sha1 => $commit->sha1,
+        count => Gitalist->config->{paging}{summary} || 10
     )],
-    refs      => $c->model()->references,
-    heads     => [$c->model()->heads],
+    refs      => $project->references,
+    heads     => [$project->heads],
     action    => 'summary',
-  );
+);
 }
 
 =head2 heads
@@ -135,10 +143,11 @@ The current list of heads (aka branches) in the repo.
 
 sub heads : Local {
   my ( $self, $c ) = @_;
-
+  $c->stash( current_model => 'GitRepos' );
+  my $project = $c->stash->{Project};
   $c->stash(
     commit => $self->_get_commit($c),
-    heads  => [$c->model()->heads],
+    heads  => [$project->heads],
     action => 'heads',
   );
 }
@@ -211,12 +220,13 @@ Exposes a given commit.
 
 sub commit : Local {
   my ( $self, $c ) = @_;
-
+  $c->stash(current_model => 'GitRepos');
+  my $project = $c->stash->{Project};
   my $commit = $self->_get_commit($c);
   $c->stash(
       commit      => $commit,
-      diff_tree   => ($c->model()->diff(commit => $commit))[0],
-      branches_on => [$c->model()->refs_for($commit->sha1)],
+      diff_tree   => ($project->diff(commit => $commit))[0],
+      refs      => $project->references,
       action      => 'commit',
   );
 }
@@ -257,11 +267,12 @@ Expose an abbreviated log of a given sha1.
 
 sub shortlog : Local {
   my ( $self, $c ) = @_;
-
+  $c->stash(current_model => 'GitRepos');
+  my $project = $c->stash->{Project};
   my $commit  = $self->_get_commit($c);
   my %logargs = (
       sha1   => $commit->sha1,
-      count  => Gitalist->config->{paging}{log},
+      count  => Gitalist->config->{paging}{log} || 25,
       ($c->req->param('f') ? (file => $c->req->param('f')) : ())
   );
 
@@ -271,8 +282,8 @@ sub shortlog : Local {
 
   $c->stash(
       commit    => $commit,
-      log_lines => [$c->model()->list_revs(%logargs)],
-      refs      => $c->model()->references,
+      log_lines => [$project->list_revs(%logargs)],
+      refs      => $project->references,
       action    => 'shortlog',
       page      => $page,
   );
@@ -296,14 +307,15 @@ The tree of a given commit.
 
 sub tree : Local {
   my ( $self, $c ) = @_;
-
+  $c->stash(current_model => 'GitRepos');
+  my $project = $c->stash->{Project};
   my $commit = $self->_get_commit($c, $c->req->param('hb'));
-  my $tree   = $c->model()->get_object($c->req->param('h') || $commit->tree_sha1);
+  my $tree   = $project->get_object($c->req->param('h') || $commit->tree_sha1);
   $c->stash(
       # XXX Useful defaults needed ...
       commit    => $commit,
       tree      => $tree,
-      tree_list => [$c->model()->list_tree($tree->sha1)],
+      tree_list => [$project->list_tree($tree->sha1)],
          path      => $c->req->param('f') || '',
       action    => 'tree',
   );
@@ -317,8 +329,8 @@ Expose the local reflog. This may go away.
 
 sub reflog : Local {
   my ( $self, $c ) = @_;
-
-  my @log = $c->model()->reflog(
+  $c->stash(current_model => 'GitRepos');
+  my @log = $c->stash->{Project}->reflog(
       '--since=yesterday'
   );
 
@@ -330,7 +342,8 @@ sub reflog : Local {
 
 sub search : Local {
   my($self, $c) = @_;
-
+  $c->stash(current_action => 'GitRepos');
+  my $project = $c->stash->{Project};
   my $commit  = $self->_get_commit($c);
   # Lifted from /shortlog.
   my %logargs = (
@@ -346,7 +359,7 @@ sub search : Local {
 
   $c->stash(
       commit  => $commit,
-      results => [$c->model()->list_revs(%logargs)],
+      results => [$project->list_revs(%logargs)],
       action  => 'search',
          # This could be added - page      => $page,
   );
@@ -363,11 +376,28 @@ Populate the header and footer. Perhaps not the best location.
 =cut
 
 sub auto : Private {
-    my($self, $c) = @_;
+  my($self, $c) = @_;
+
+  # XXX Move these to a plugin!
+  $c->stash(
+    time_since => sub {
+      return 'never' unless $_[0];
+      return age_string(time - $_[0]->epoch);
+    },
+    short_cmt => sub {
+      my $cmt = shift;
+      my($line) = split /\n/, $cmt;
+      $line =~ s/^(.{70,80}\b).*/$1 …/;
+      return $line;
+    },
+    abridged_description => sub {
+        join(' ', grep { defined } (split / /, shift)[0..10]);
+    },
+  );
 
-    # Yes, this is hideous.
-    $self->header($c);
-    $self->footer($c);
+  # Yes, this is hideous.
+  $self->header($c);
+  $self->footer($c);
 }
 
 # XXX This could probably be dropped altogether.
@@ -452,11 +482,13 @@ sub header {
     );
 
   if(defined $project) {
-    $c->stash(
-      search_text => ( $c->req->param('s') || $c->req->param('searchtext') || ''),
-      search_hash => ( $c->req->param('hb') || $c->req->param('hashbase')
-          || $c->req->param('h')  || $c->req->param('hash')
-          || 'HEAD' ),
+      $c->stash(
+          search_text => ( $c->req->param('s') ||
+                               $c->req->param('searchtext') || ''),
+          search_hash => ( $c->req->param('hb') || $c->req->param('hashbase')
+                               || $c->req->param('h')  || $c->req->param('hash')
+                                   || 'HEAD' ),
+          Project => $c->model('GitRepos')->project($project),
       );
   }
 }
@@ -546,6 +578,7 @@ sub feed_info {
 
   return %res;
 }
+
 =head2 end
 
 Attempt to render a view, if needed.
@@ -553,17 +586,27 @@ Attempt to render a view, if needed.
 =cut
 
 sub end : ActionClass('RenderView') {
-  # Give every view the current HEAD.
-  $_[1]->stash->{HEAD} = $_[1]->model()->head_hash;
-  
-  # XXX This should be in a plugin.
-  $_[1]->stash->{time_since} = sub {
-    return age_string(time - $_[0]->epoch);
-  };
+  my ($self, $c) = @_;
+  # Give project views the current HEAD.
+  if ($c->stash->{project}) {
+      if ($c->stash->{current_model} &&
+              $c->stash->{current_model} eq 'GitRepos') {
+          $c->stash->{HEAD} = $c->stash->{Project}->head_hash;
+      } else {
+          $c->stash->{HEAD} = $c->model()->head_hash;
+      }
+  }
+}
+
+sub error_404 :Private {
+    my ($self, $c) = @_;
+    $c->response->status(404);
+    $c->stash(
+        title => 'Page not found',
+        content => 'Page not found',
+    )
 }
 
-# XXX Ripped straight from gitweb.pm
-# convert age in seconds to "nn units ago" string
 sub age_string {
        my $age = shift;
        my $age_str;