/* 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(struct cgit_context *ctx)
{
	cgit_clone_head(ctx);
}

static void atom_fn(struct cgit_context *ctx)
{
	cgit_print_atom(ctx->qry.head, ctx->qry.path, ctx->cfg.max_atom_items);
}

static void about_fn(struct cgit_context *ctx)
{
	if (ctx->repo)
		cgit_print_repo_readme(ctx->qry.path);
	else
		cgit_print_site_readme();
}

static void blob_fn(struct cgit_context *ctx)
{
	cgit_print_blob(ctx->qry.sha1, ctx->qry.path, ctx->qry.head, 0);
}

static void commit_fn(struct cgit_context *ctx)
{
	cgit_print_commit(ctx->qry.sha1, ctx->qry.path);
}

static void diff_fn(struct cgit_context *ctx)
{
	cgit_print_diff(ctx->qry.sha1, ctx->qry.sha2, ctx->qry.path, 1, 0);
}

static void rawdiff_fn(struct cgit_context *ctx)
{
	cgit_print_diff(ctx->qry.sha1, ctx->qry.sha2, ctx->qry.path, 1, 1);
}

static void info_fn(struct cgit_context *ctx)
{
	cgit_clone_info(ctx);
}

static void log_fn(struct cgit_context *ctx)
{
	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(struct cgit_context *ctx)
{
	ctx->page.mimetype = "text/plain";
	ctx->page.filename = "ls-cache.txt";
	cgit_print_http_headers(ctx);
	cache_ls(ctx->cfg.cache_root);
}

static void objects_fn(struct cgit_context *ctx)
{
	cgit_clone_objects(ctx);
}

static void repolist_fn(struct cgit_context *ctx)
{
	cgit_print_repolist();
}

static void patch_fn(struct cgit_context *ctx)
{
	cgit_print_patch(ctx->qry.sha1, ctx->qry.sha2, ctx->qry.path);
}

static void plain_fn(struct cgit_context *ctx)
{
	cgit_print_plain(ctx);
}

static void refs_fn(struct cgit_context *ctx)
{
	cgit_print_refs();
}

static void snapshot_fn(struct cgit_context *ctx)
{
	cgit_print_snapshot(ctx->qry.head, ctx->qry.sha1, ctx->qry.path,
			    ctx->repo->snapshots, ctx->qry.nohead);
}

static void stats_fn(struct cgit_context *ctx)
{
	cgit_show_stats(ctx);
}

static void summary_fn(struct cgit_context *ctx)
{
	cgit_print_summary();
}

static void tag_fn(struct cgit_context *ctx)
{
	cgit_print_tag(ctx->qry.sha1);
}

static void tree_fn(struct cgit_context *ctx)
{
	cgit_print_tree(ctx->qry.sha1, ctx->qry.path);
}

#define def_cm<style>pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Co