cgitsb/cmd.c
John Keeping 9c70c0bfdb tree: move layout into page function
This also allows us to return proper HTTP error codes when the requested
tree is not found and display an error message in one case (invalid path
inside valid commit) where we previously just displayed an empty page.

Signed-off-by: John Keeping <john@keeping.me.uk>
2015-08-14 15:46:51 +02:00

191 lines
3.8 KiB
C

/* cmd.c: the cgit command dispatcher
*
* Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
*
* Licensed under GNU General Public License v2
* (see COPYING for full license text)
*/
#include "cgit.h"
#include "cmd.h"
#include "cache.h"
#include "ui-shared.h"
#include "ui-atom.h"
#include "ui-blob.h"
#include "ui-clone.h"
#include "ui-commit.h"
#include "ui-diff.h"
#include "ui-log.h"
#include "ui-patch.h"
#include "ui-plain.h"
#include "ui-refs.h"
#include "ui-repolist.h"
#include "ui-snapshot.h"
#include "ui-stats.h"
#include "ui-summary.h"
#include "ui-tag.h"
#include "ui-tree.h"
static void HEAD_fn(void)
{
cgit_clone_head();
}
static void atom_fn(void)
{
cgit_print_atom(ctx.qry.head, ctx.qry.path, ctx.cfg.max_atom_items);
}
static void about_fn(void)
{
if (ctx.repo)
cgit_print_repo_readme(ctx.qry.path);
else
cgit_print_site_readme();
}
static void about_pre(void)
{
if (ctx.repo &&
!ctx.qry.path &&
ctx.qry.url[strlen(ctx.qry.url) - 1] != '/' &&
ctx.env.path_info[strlen(ctx.env.path_info) - 1] != '/')
cgit_redirect(fmtalloc("%s/", cgit_currenturl()), true);
}
static void blob_fn(void)
{
cgit_print_blob(ctx.qry.sha1, ctx.qry.path, ctx.qry.head, 0);
}
static void commit_fn(void)
{
cgit_print_commit(ctx.qry.sha1, ctx.qry.path);
}
static void diff_fn(void)
{
cgit_print_diff(ctx.qry.sha1, ctx.qry.sha2, ctx.qry.path, 1, 0);
}
static void rawdiff_fn(void)
{
cgit_print_diff(ctx.qry.sha1, ctx.qry.sha2, ctx.qry.path, 1, 1);
}
static void info_fn(void)
{
cgit_clone_info();
}
static void log_fn(void)
{
cgit_print_log(ctx.qry.sha1, ctx.qry.ofs, ctx.cfg.max_commit_count,
ctx.qry.grep, ctx.qry.search, ctx.qry.path, 1,
ctx.repo->enable_commit_graph,
ctx.repo->commit_sort);
}
static void ls_cache_fn(void)
{
ctx.page.mimetype = "text/plain";
ctx.page.filename = "ls-cache.txt";
cgit_print_http_headers();
cache_ls(ctx.cfg.cache_root);
}
static void objects_fn(void)
{
cgit_clone_objects();
}
static void repolist_fn(void)
{
cgit_print_repolist();
}
static void patch_fn(void)
{
cgit_print_patch(ctx.qry.sha1, ctx.qry.sha2, ctx.qry.path);
}
static void plain_fn(void)
{
cgit_print_plain();
}
static void refs_fn(void)
{
cgit_print_refs();
}
static void snapshot_fn(void)
{
cgit_print_snapshot(ctx.qry.head, ctx.qry.sha1, ctx.qry.path,
ctx.qry.nohead);
}
static void stats_fn(void)
{
cgit_show_stats();
}
static void summary_fn(void)
{
cgit_print_summary();
}
static void tag_fn(void)
{
cgit_print_tag(ctx.qry.sha1);
}
static void tree_fn(void)
{
cgit_print_tree(ctx.qry.sha1, ctx.qry.path);
}
#define def_cmp(name, want_repo, want_layout, want_vpath, is_clone) \
{#name, name##_fn, name##_pre, want_repo, want_layout, want_vpath, is_clone}
#define def_cmd(name, want_repo, want_layout, want_vpath, is_clone) \
{#name, name##_fn, NULL, want_repo, want_layout, want_vpath, is_clone}
struct cgit_cmd *cgit_get_cmd(void)
{
static struct cgit_cmd cmds[] = {
def_cmd(HEAD, 1, 0, 0, 1),
def_cmd(atom, 1, 0, 0, 0),
def_cmp(about, 0, 0, 0, 0),
def_cmd(blob, 1, 0, 0, 0),
def_cmd(commit, 1, 0, 1, 0),
def_cmd(diff, 1, 0, 1, 0),
def_cmd(info, 1, 0, 0, 1),
def_cmd(log, 1, 0, 1, 0),
def_cmd(ls_cache, 0, 0, 0, 0),
def_cmd(objects, 1, 0, 0, 1),
def_cmd(patch, 1, 0, 1, 0),
def_cmd(plain, 1, 0, 0, 0),
def_cmd(rawdiff, 1, 0, 1, 0),
def_cmd(refs, 1, 0, 0, 0),
def_cmd(repolist, 0, 0, 0, 0),
def_cmd(snapshot, 1, 0, 0, 0),
def_cmd(stats, 1, 0, 1, 0),
def_cmd(summary, 1, 0, 0, 0),
def_cmd(tag, 1, 0, 0, 0),
def_cmd(tree, 1, 0, 1, 0),
};
int i;
if (ctx.qry.page == NULL) {
if (ctx.repo)
ctx.qry.page = "summary";
else
ctx.qry.page = "repolist";
}
for (i = 0; i < sizeof(cmds)/sizeof(*cmds); i++)
if (!strcmp(ctx.qry.page, cmds[i].name))
return &cmds[i];
return NULL;
}