Merge branch 'action-patches' into patches-intg
Zachary Stevens [Thu, 19 Nov 2009 01:09:26 +0000 (01:09 +0000)]
1  2 
gitalist.conf
lib/Gitalist/Controller/Root.pm
t/03legacy_uri.t

diff --combined gitalist.conf
@@@ -8,7 -8,7 +8,7 @@@ name Gitalis
  sitename "Gitalist presently"
  
  # URI and label (title) of GIT logo link
 -logo_url   git-scm.org
 +logo_url   http://git-scm.org
  logo_label "git homepage"
  logo_img   /git-logo.png
  
@@@ -31,9 -31,9 +31,9 @@@ favicon /git-favicon.pn
  
  # $feature{'blame'}{'default'} = [1];
  <feature>
 -      <blame>
 -              default = 1
 -      </blame>
 +  <blame>
 +    default = 1
 +  </blame>
  </feature>
  
  # fs traversing limit for getting project list
@@@ -42,5 -42,9 +42,9 @@@ project_maxdepth 200
  
  <paging>
    log = 50
 -  summary = 16
 +  summary = 17
  </paging>
+ <patches>
+   max = 16
+ </patches>
@@@ -10,11 -10,6 +10,11 @@@ BEGIN { extends 'Catalyst::Controller' 
  #
  __PACKAGE__->config->{namespace} = '';
  
 +use IO::Capture::Stdout;
 +use XML::Atom::Feed;
 +use XML::Atom::Entry;
 +use Sys::Hostname ();
 +
  =head1 NAME
  
  Gitalist::Controller::Root - Root Controller for Gitalist
@@@ -31,6 -26,8 +31,6 @@@
  
  =cut
  
 -use IO::Capture::Stdout;
 -
  =head2 run_gitweb
  
  The C<gitweb> shim. It should now only be explicitly accessible by
@@@ -129,6 -126,7 +129,6 @@@ sub summary : Local 
    my $maxitems = Gitalist->config->{paging}{summary} || 10;
    $c->stash(
      commit    => $commit,
 -#    info      => $project->info,
      log_lines => [$project->list_revs(
          sha1 => $commit->sha1,
          count => $maxitems,
@@@ -182,27 -180,7 +182,27 @@@ sub blob : Local 
      action   => 'blob',
    );
  
 -  $c->forward('View::SyntaxHighlight');
 +  $c->forward('View::SyntaxHighlight')
 +    unless $c->stash->{no_wrapper};
 +}
 +
 +sub blob_plain : Local {
 +  my($self, $c) = @_;
 +
 +  $c->stash(no_wrapper => 1);
 +  $c->response->content_type('text/plain; charset=utf-8');
 +
 +  $c->forward('blob');
 +}
 +
 +sub blobdiff_plain : Local {
 +  my($self, $c) = @_;
 +
 +  $c->stash(no_wrapper => 1);
 +  $c->response->content_type('text/plain; charset=utf-8');
 +
 +  $c->forward('blobdiff');
 +
  }
  
  =head2 blobdiff
@@@ -218,9 -196,9 +218,9 @@@ sub blobdiff : Local 
                || croak("No file specified!");
    my($tree, $patch) = $c->stash->{Project}->diff(
      commit => $commit,
 -    parent => $c->req->param('hpb') || '',
 -    file   => $filename,
      patch  => 1,
 +    parent => $c->req->param('hpb') || undef,
 +    file   => $filename,
    );
    $c->stash(
      commit    => $commit,
      action    => 'blobdiff',
    );
  
 -  $c->forward('View::SyntaxHighlight');
 +  $c->forward('View::SyntaxHighlight')
 +    unless $c->stash->{no_wrapper};
  }
  
  =head2 commit
@@@ -277,17 -254,7 +277,17 @@@ sub commitdiff : Local 
      action    => 'commitdiff',
    );
  
 -  $c->forward('View::SyntaxHighlight');
 +  $c->forward('View::SyntaxHighlight')
 +    unless $c->stash->{no_wrapper};
 +}
 +
 +sub commitdiff_plain : Local {
 +  my($self, $c) = @_;
 +
 +  $c->stash(no_wrapper => 1);
 +  $c->response->content_type('text/plain; charset=utf-8');
 +
 +  $c->forward('commitdiff');
  }
  
  =head2 shortlog
@@@ -329,11 -296,6 +329,11 @@@ sub log : Local 
      $_[1]->stash->{action} = 'log';
  }
  
 +# For legacy support.
 +sub history : Local {
 +  $_[0]->shortlog(@_[1 .. $#_]);
 +}
 +
  =head2 tree
  
  The tree of a given commit.
@@@ -382,11 -344,11 +382,11 @@@ sub search : Local 
      sha1   => $commit->sha1,
      count  => Gitalist->config->{paging}{log},
      ($c->req->param('f') ? (file => $c->req->param('f')) : ()),
 -      search => {
 -        type   => $c->req->param('type'),
 -        text   => $c->req->param('text'),
 -        regexp => $c->req->param('regexp') || 0,
 -    }
 +    search => {
 +      type   => $c->req->param('type'),
 +      text   => $c->req->param('text'),
 +      regexp => $c->req->param('regexp') || 0,
 +    },
    );
  
    $c->stash(
@@@ -403,57 -365,39 +403,57 @@@ sub search_help : Local 
  }
  
  sub atom : Local {
 -    # FIXME - implement atom
 -    Carp::croak "Not implemented.";
 -}
 +  my($self, $c) = @_;
  
 -sub rss : Local {
 -    # FIXME - implement rss
 -    Carp::croak "Not implemented.";
 -}
 +  my $feed = XML::Atom::Feed->new;
  
 -sub blobdiff_plain : Local {
 -    # FIXME - implement blobdiff_plain
 -    Carp::croak "Not implemented.";
 +  my $host = lc Sys::Hostname::hostname();
 +  $feed->title($host . ' - ' . Gitalist->config->{name});
 +  $feed->updated(~~DateTime->now);
 +
 +  my $project = $c->stash->{Project};
 +  my %logargs = (
 +      sha1   => $project->head_hash,
 +      count  => Gitalist->config->{paging}{log} || 25,
 +      ($c->req->param('f') ? (file => $c->req->param('f')) : ())
 +  );
 +
 +  my $mk_title = $c->stash->{short_cmt};
 +  for my $commit ($project->list_revs(%logargs)) {
 +    my $entry = XML::Atom::Entry->new;
 +    $entry->title( $mk_title->($commit->comment) );
 +    $entry->id($c->uri_for('commit', {h=>$commit->sha1}));
 +    # XXX Needs work ...
 +    $entry->content($commit->comment);
 +    $feed->add_entry($entry);
 +  }
 +
 +  $c->stash(
 +    feed       => $feed->as_xml,
 +    no_wrapper => 1,
 +  );
 +  $c->response->content_type('application/atom+xml')
  }
  
 -sub blob_plain : Local {
 -    # FIXME - implement blobdiff_plain
 +sub rss : Local {
 +    # FIXME - implement rss
      Carp::croak "Not implemented.";
  }
  
  sub patch : Local {
      my ($self, $c) = @_;
+     $c->detach('patches', [1]);
+ }
+ sub patches : Local {
+     my ($self, $c, $count) = @_;
+     $count ||= Gitalist->config->{patches}{max};
      my $commit = $self->_get_object($c);
      my $parent = $c->req->param('hp') || undef;
-     my $patch = $commit->patch( $parent );
+     my $patch = $commit->get_patch( $parent, $count );
      $c->response->body($patch);
      $c->response->content_type('text/plain');
      $c->response->status(200);
- }
- sub patches : Local {
-     # FIXME - implement patches
-     Carp::croak "Not implemented.";
  }
  
  sub snapshot : Local {
      Carp::croak "Not implemented.";
  }
  
 -sub commitdiff_plain : Local {
 -    # FIXME - implement commitdiff_plain
 -    Carp::croak "Not implemented.";
 -}
 -
  =head2 auto
  
  Populate the header and footer. Perhaps not the best location.
diff --combined t/03legacy_uri.t
@@@ -34,17 -34,19 +34,17 @@@ test('/', 'a=blob;f=file1;h=5716ca5987c
  test('/', 'a=blob;f=file1;hb=3bc0634310b9c62222bb0e724c11ffdfb297b4ac');
  test('/', 'a=blob;f=file1;hb=3f7567c7bdf7e7ebf410926493b92d398333116e');
  
 -TODO: {
 -    local $TODO = "Action: blob_plain is not yet implemented.";
 -    test('/', 'a=blob_plain;f=dir1/file2;hb=36c6c6708b8360d7023e8a1649c45bcf9b3bd818');
 -    test('/', 'a=blob_plain;f=dir1/file2;hb=HEAD');
 -    test('/', 'a=blob_plain;f=dir1/file2;hb=master');
 -    test('/', 'a=blob_plain;f=dir1/file2;hb=refs/heads/master');
 -    test('/', 'a=blob_plain;f=file1;hb=36c6c6708b8360d7023e8a1649c45bcf9b3bd818');
 -    test('/', 'a=blob_plain;f=file1;hb=3bc0634310b9c62222bb0e724c11ffdfb297b4ac');
 -    test('/', 'a=blob_plain;f=file1;hb=3f7567c7bdf7e7ebf410926493b92d398333116e');
 -    test('/', 'a=blob_plain;f=file1;hb=HEAD');
 -    test('/', 'a=blob_plain;f=file1;hb=master');
 -    test('/', 'a=blob_plain;f=file1;hb=refs/heads/master');
 -}
 +
 +test('/', 'a=blob_plain;f=dir1/file2;hb=36c6c6708b8360d7023e8a1649c45bcf9b3bd818');
 +test('/', 'a=blob_plain;f=dir1/file2;hb=HEAD');
 +test('/', 'a=blob_plain;f=dir1/file2;hb=master');
 +test('/', 'a=blob_plain;f=dir1/file2;hb=refs/heads/master');
 +test('/', 'a=blob_plain;f=file1;hb=36c6c6708b8360d7023e8a1649c45bcf9b3bd818');
 +test('/', 'a=blob_plain;f=file1;hb=3bc0634310b9c62222bb0e724c11ffdfb297b4ac');
 +test('/', 'a=blob_plain;f=file1;hb=3f7567c7bdf7e7ebf410926493b92d398333116e');
 +test('/', 'a=blob_plain;f=file1;hb=HEAD');
 +test('/', 'a=blob_plain;f=file1;hb=master');
 +test('/', 'a=blob_plain;f=file1;hb=refs/heads/master');
  
  test('/', 'a=blobdiff;f=file1;h=5716ca5987cbf97d6bb54920bea6adde242d87e6;hp=257cc5642cb1a054f08cc83f2d943e56fd3ebe99;hb=36c6c6708b8360d7023e8a1649c45bcf9b3bd818;hpb=3bc0634310b9c62222bb0e724c11ffdfb297b4ac');
  test('/', 'a=blobdiff;f=file1;h=5716ca5987cbf97d6bb54920bea6adde242d87e6;hp=257cc5642cb1a054f08cc83f2d943e56fd3ebe99;hb=3f7567c7bdf7e7ebf410926493b92d398333116e;hpb=3bc0634310b9c62222bb0e724c11ffdfb297b4ac');
@@@ -52,10 -54,13 +52,10 @@@ test('/', 'a=blobdiff;f=file1;h=5716ca5
  test('/', 'a=blobdiff;f=file1;h=5716ca5987cbf97d6bb54920bea6adde242d87e6;hp=257cc5642cb1a054f08cc83f2d943e56fd3ebe99;hb=master;hpb=3bc0634310b9c62222bb0e724c11ffdfb297b4ac');
  test('/', 'a=blobdiff;f=file1;h=5716ca5987cbf97d6bb54920bea6adde242d87e6;hp=257cc5642cb1a054f08cc83f2d943e56fd3ebe99;hb=refs/heads/master;hpb=3bc0634310b9c62222bb0e724c11ffdfb297b4ac');
  
 -TODO: {
 -    local $TODO = "Action: blobdiff_plain is not yet implemented.";
 -    test('/', 'a=blobdiff_plain;f=file1;h=5716ca5987cbf97d6bb54920bea6adde242d87e6;hp=257cc5642cb1a054f08cc83f2d943e56fd3ebe99;hb=36c6c6708b8360d7023e8a1649c45bcf9b3bd818;hpb=3bc0634310b9c62222bb0e724c11ffdfb297b4ac');
 -    test('/', 'a=blobdiff_plain;f=file1;h=5716ca5987cbf97d6bb54920bea6adde242d87e6;hp=257cc5642cb1a054f08cc83f2d943e56fd3ebe99;hb=3f7567c7bdf7e7ebf410926493b92d398333116e;hpb=3bc0634310b9c62222bb0e724c11ffdfb297b4ac');
 -    test('/', 'a=blobdiff_plain;f=file1;h=5716ca5987cbf97d6bb54920bea6adde242d87e6;hp=257cc5642cb1a054f08cc83f2d943e56fd3ebe99;hb=HEAD;hpb=3bc0634310b9c62222bb0e724c11ffdfb297b4ac');
 -    test('/', 'a=blobdiff_plain;f=file1;h=5716ca5987cbf97d6bb54920bea6adde242d87e6;hp=257cc5642cb1a054f08cc83f2d943e56fd3ebe99;hb=master;hpb=3bc0634310b9c62222bb0e724c11ffdfb297b4ac');
 -}
 +test('/', 'a=blobdiff_plain;f=file1;h=5716ca5987cbf97d6bb54920bea6adde242d87e6;hp=257cc5642cb1a054f08cc83f2d943e56fd3ebe99;hb=36c6c6708b8360d7023e8a1649c45bcf9b3bd818;hpb=3bc0634310b9c62222bb0e724c11ffdfb297b4ac');
 +test('/', 'a=blobdiff_plain;f=file1;h=5716ca5987cbf97d6bb54920bea6adde242d87e6;hp=257cc5642cb1a054f08cc83f2d943e56fd3ebe99;hb=3f7567c7bdf7e7ebf410926493b92d398333116e;hpb=3bc0634310b9c62222bb0e724c11ffdfb297b4ac');
 +test('/', 'a=blobdiff_plain;f=file1;h=5716ca5987cbf97d6bb54920bea6adde242d87e6;hp=257cc5642cb1a054f08cc83f2d943e56fd3ebe99;hb=HEAD;hpb=3bc0634310b9c62222bb0e724c11ffdfb297b4ac');
 +test('/', 'a=blobdiff_plain;f=file1;h=5716ca5987cbf97d6bb54920bea6adde242d87e6;hp=257cc5642cb1a054f08cc83f2d943e56fd3ebe99;hb=master;hpb=3bc0634310b9c62222bb0e724c11ffdfb297b4ac');
  
  test('/', 'a=commit');
  test('/', 'a=commit;h=36c6c6708b8360d7023e8a1649c45bcf9b3bd818');
@@@ -81,40 -86,45 +81,40 @@@ test('/', 'a=commitdiff;h=master;hp=3f7
  test('/', 'a=commitdiff;h=refs/heads/master');
  test('/', 'a=commitdiff;h=refs/heads/master;hp=3f7567c7bdf7e7ebf410926493b92d398333116e');
  
 -TODO: {
 -    local $TODO = "Action: commitdiff_plain is not yet implemented.";
 -    test('/', 'a=commitdiff_plain');
 -    test('/', 'a=commitdiff_plain;h=36c6c6708b8360d7023e8a1649c45bcf9b3bd818');
 -    test('/', 'a=commitdiff_plain;h=36c6c6708b8360d7023e8a1649c45bcf9b3bd818;hp=3f7567c7bdf7e7ebf410926493b92d398333116e');
 -    test('/', 'a=commitdiff_plain;h=3bc0634310b9c62222bb0e724c11ffdfb297b4ac');
 -    test('/', 'a=commitdiff_plain;h=3f7567c7bdf7e7ebf410926493b92d398333116e');
 -    test('/', 'a=commitdiff_plain;h=3f7567c7bdf7e7ebf410926493b92d398333116e;hp=3bc0634310b9c62222bb0e724c11ffdfb297b4ac');
 -    test('/', 'a=commitdiff_plain;h=HEAD');
 -    test('/', 'a=commitdiff_plain;h=HEAD;hp=3f7567c7bdf7e7ebf410926493b92d398333116e');
 -    test('/', 'a=commitdiff_plain;h=master');
 -    test('/', 'a=commitdiff_plain;h=master;hp=3f7567c7bdf7e7ebf410926493b92d398333116e');
 -    test('/', 'a=commitdiff_plain;h=refs/heads/master');
 -    test('/', 'a=commitdiff_plain;h=refs/heads/master;hp=3f7567c7bdf7e7ebf410926493b92d398333116e');
 -}
 -
 -TODO: {
 -    local $TODO = "Action: history is not yet implemented.";
 -    test('/', 'a=history;f=dir1/file2;h=257cc5642cb1a054f08cc83f2d943e56fd3ebe99;hb=36c6c6708b8360d7023e8a1649c45bcf9b3bd818');
 -    test('/', 'a=history;f=dir1/file2;h=257cc5642cb1a054f08cc83f2d943e56fd3ebe99;hb=HEAD');
 -    test('/', 'a=history;f=dir1/file2;h=257cc5642cb1a054f08cc83f2d943e56fd3ebe99;hb=master');
 -    test('/', 'a=history;f=dir1/file2;h=257cc5642cb1a054f08cc83f2d943e56fd3ebe99;hb=refs/heads/master');
 -    test('/', 'a=history;f=dir1;h=729a7c3f6ba5453b42d16a43692205f67fb23bc1;hb=36c6c6708b8360d7023e8a1649c45bcf9b3bd818');
 -    test('/', 'a=history;f=dir1;h=729a7c3f6ba5453b42d16a43692205f67fb23bc1;hb=HEAD');
 -    test('/', 'a=history;f=dir1;h=729a7c3f6ba5453b42d16a43692205f67fb23bc1;hb=master');
 -    test('/', 'a=history;f=dir1;h=729a7c3f6ba5453b42d16a43692205f67fb23bc1;hb=refs/heads/master');
 -    test('/', 'a=history;f=dir1;hb=36c6c6708b8360d7023e8a1649c45bcf9b3bd818');
 -    test('/', 'a=history;f=dir1;hb=HEAD');
 -    test('/', 'a=history;f=dir1;hb=master');
 -    test('/', 'a=history;f=dir1;hb=refs/heads/master');
 -    test('/', 'a=history;f=file1;h=257cc5642cb1a054f08cc83f2d943e56fd3ebe99;hb=3bc0634310b9c62222bb0e724c11ffdfb297b4ac');
 -    test('/', 'a=history;f=file1;h=5716ca5987cbf97d6bb54920bea6adde242d87e6;hb=36c6c6708b8360d7023e8a1649c45bcf9b3bd818');
 -    test('/', 'a=history;f=file1;h=5716ca5987cbf97d6bb54920bea6adde242d87e6;hb=3f7567c7bdf7e7ebf410926493b92d398333116e');
 -    test('/', 'a=history;f=file1;h=5716ca5987cbf97d6bb54920bea6adde242d87e6;hb=HEAD');
 -    test('/', 'a=history;f=file1;h=5716ca5987cbf97d6bb54920bea6adde242d87e6;hb=master');
 -    test('/', 'a=history;f=file1;h=5716ca5987cbf97d6bb54920bea6adde242d87e6;hb=refs/heads/master');
 -    test('/', 'a=history;f=file1;hb=3f7567c7bdf7e7ebf410926493b92d398333116e');
 -    test('/', 'a=history;h=refs/heads/master');
 -}
 +test('/', 'a=commitdiff_plain');
 +test('/', 'a=commitdiff_plain;h=36c6c6708b8360d7023e8a1649c45bcf9b3bd818');
 +test('/', 'a=commitdiff_plain;h=36c6c6708b8360d7023e8a1649c45bcf9b3bd818;hp=3f7567c7bdf7e7ebf410926493b92d398333116e');
 +test('/', 'a=commitdiff_plain;h=3bc0634310b9c62222bb0e724c11ffdfb297b4ac');
 +test('/', 'a=commitdiff_plain;h=3f7567c7bdf7e7ebf410926493b92d398333116e');
 +test('/', 'a=commitdiff_plain;h=3f7567c7bdf7e7ebf410926493b92d398333116e;hp=3bc0634310b9c62222bb0e724c11ffdfb297b4ac');
 +test('/', 'a=commitdiff_plain;h=HEAD');
 +test('/', 'a=commitdiff_plain;h=HEAD;hp=3f7567c7bdf7e7ebf410926493b92d398333116e');
 +test('/', 'a=commitdiff_plain;h=master');
 +test('/', 'a=commitdiff_plain;h=master;hp=3f7567c7bdf7e7ebf410926493b92d398333116e');
 +test('/', 'a=commitdiff_plain;h=refs/heads/master');
 +test('/', 'a=commitdiff_plain;h=refs/heads/master;hp=3f7567c7bdf7e7ebf410926493b92d398333116e');
 +
 +
 +test('/', 'a=history;f=dir1/file2;h=257cc5642cb1a054f08cc83f2d943e56fd3ebe99;hb=36c6c6708b8360d7023e8a1649c45bcf9b3bd818');
 +test('/', 'a=history;f=dir1/file2;h=257cc5642cb1a054f08cc83f2d943e56fd3ebe99;hb=HEAD');
 +test('/', 'a=history;f=dir1/file2;h=257cc5642cb1a054f08cc83f2d943e56fd3ebe99;hb=master');
 +test('/', 'a=history;f=dir1/file2;h=257cc5642cb1a054f08cc83f2d943e56fd3ebe99;hb=refs/heads/master');
 +test('/', 'a=history;f=dir1;h=729a7c3f6ba5453b42d16a43692205f67fb23bc1;hb=36c6c6708b8360d7023e8a1649c45bcf9b3bd818');
 +test('/', 'a=history;f=dir1;h=729a7c3f6ba5453b42d16a43692205f67fb23bc1;hb=HEAD');
 +test('/', 'a=history;f=dir1;h=729a7c3f6ba5453b42d16a43692205f67fb23bc1;hb=master');
 +test('/', 'a=history;f=dir1;h=729a7c3f6ba5453b42d16a43692205f67fb23bc1;hb=refs/heads/master');
 +test('/', 'a=history;f=dir1;hb=36c6c6708b8360d7023e8a1649c45bcf9b3bd818');
 +test('/', 'a=history;f=dir1;hb=HEAD');
 +test('/', 'a=history;f=dir1;hb=master');
 +test('/', 'a=history;f=dir1;hb=refs/heads/master');
 +test('/', 'a=history;f=file1;h=257cc5642cb1a054f08cc83f2d943e56fd3ebe99;hb=3bc0634310b9c62222bb0e724c11ffdfb297b4ac');
 +test('/', 'a=history;f=file1;h=5716ca5987cbf97d6bb54920bea6adde242d87e6;hb=36c6c6708b8360d7023e8a1649c45bcf9b3bd818');
 +test('/', 'a=history;f=file1;h=5716ca5987cbf97d6bb54920bea6adde242d87e6;hb=3f7567c7bdf7e7ebf410926493b92d398333116e');
 +test('/', 'a=history;f=file1;h=5716ca5987cbf97d6bb54920bea6adde242d87e6;hb=HEAD');
 +test('/', 'a=history;f=file1;h=5716ca5987cbf97d6bb54920bea6adde242d87e6;hb=master');
 +test('/', 'a=history;f=file1;h=5716ca5987cbf97d6bb54920bea6adde242d87e6;hb=refs/heads/master');
 +test('/', 'a=history;f=file1;hb=3f7567c7bdf7e7ebf410926493b92d398333116e');
 +test('/', 'a=history;h=refs/heads/master');
  
  test('/', 'a=log');
  test('/', 'a=log;h=36c6c6708b8360d7023e8a1649c45bcf9b3bd818');
@@@ -140,16 -150,13 +140,13 @@@ test('/', 'a=patch;hb=36c6c6708b8360d70
  test('/', 'a=patch;hb=3bc0634310b9c62222bb0e724c11ffdfb297b4ac');
  test('/', 'a=patch;hb=3f7567c7bdf7e7ebf410926493b92d398333116e');
  
- TODO: {
-     local $TODO = "Action: patches is not yet implemented.";
-     test('/', 'a=patches');
-     test('/', 'a=patches;h=36c6c6708b8360d7023e8a1649c45bcf9b3bd818');
-     test('/', 'a=patches;h=3bc0634310b9c62222bb0e724c11ffdfb297b4ac');
-     test('/', 'a=patches;h=3f7567c7bdf7e7ebf410926493b92d398333116e');
-     test('/', 'a=patches;h=HEAD');
-     test('/', 'a=patches;h=master');
-     test('/', 'a=patches;h=refs/heads/master');
- }
+ test('/', 'a=patches');
+ test('/', 'a=patches;h=36c6c6708b8360d7023e8a1649c45bcf9b3bd818');
+ test('/', 'a=patches;h=3bc0634310b9c62222bb0e724c11ffdfb297b4ac');
+ test('/', 'a=patches;h=3f7567c7bdf7e7ebf410926493b92d398333116e');
+ test('/', 'a=patches;h=HEAD');
+ test('/', 'a=patches;h=master');
+ test('/', 'a=patches;h=refs/heads/master');
  
  test('/', 'a=search_help');
  
@@@ -204,22 -211,23 +201,22 @@@ test('/', 'a=tree;hb=HEAD')
  test('/', 'a=tree;hb=master');
  test('/', 'a=tree;hb=refs/heads/master');
  
 -TODO: {
 -    local $TODO = "Action: atom is not yet implemented.";
 -    test('/', 'a=atom');
 -    test('/', 'a=atom;f=dir1');
 -    test('/', 'a=atom;f=dir1/file2');
 -    test('/', 'a=atom;f=dir1/file2;opt=--no-merges');
 -    test('/', 'a=atom;f=dir1;h=refs/heads/master');
 -    test('/', 'a=atom;f=dir1;h=refs/heads/master;opt=--no-merges');
 -    test('/', 'a=atom;f=dir1;opt=--no-merges');
 -    test('/', 'a=atom;f=file1');
 -    test('/', 'a=atom;f=file1;h=refs/heads/master');
 -    test('/', 'a=atom;f=file1;h=refs/heads/master;opt=--no-merges');
 -    test('/', 'a=atom;f=file1;opt=--no-merges');
 -    test('/', 'a=atom;h=refs/heads/master');
 -    test('/', 'a=atom;h=refs/heads/master;opt=--no-merges');
 -    test('/', 'a=atom;opt=--no-merges');
 -}
 +
 +local $TODO = "Action: atom is not yet implemented.";
 +test('/', 'a=atom');
 +test('/', 'a=atom;f=dir1');
 +test('/', 'a=atom;f=dir1/file2');
 +test('/', 'a=atom;f=dir1/file2;opt=--no-merges');
 +test('/', 'a=atom;f=dir1;h=refs/heads/master');
 +test('/', 'a=atom;f=dir1;h=refs/heads/master;opt=--no-merges');
 +test('/', 'a=atom;f=dir1;opt=--no-merges');
 +test('/', 'a=atom;f=file1');
 +test('/', 'a=atom;f=file1;h=refs/heads/master');
 +test('/', 'a=atom;f=file1;h=refs/heads/master;opt=--no-merges');
 +test('/', 'a=atom;f=file1;opt=--no-merges');
 +test('/', 'a=atom;h=refs/heads/master');
 +test('/', 'a=atom;h=refs/heads/master;opt=--no-merges');
 +test('/', 'a=atom;opt=--no-merges');
  
  TODO: {
      local $TODO = "Action: rss is not yet implemented.";