0ff143df70
For many commands/pages (e.g. 'tree', 'diff', 'plain', etc.), the ctx.qry.path argument is interpreted as a path within the "virtual" project directory structure. However, for some other commands (notably 'refs', and the clone-related commands) ctx.qry.path is used in a different context (as a more or less "real" path within the '.git' directory). This patch differentiates between these two usages of ctx.qry.path, by introducing a new variable - ctx.qry.vpath - which is equal to ctx.qry.path in the former case, and NULL in the latter. This will become useful in future patches when we want various pages and the links between them to preserve existing in-project paths. Signed-off-by: Johan Herland <johan@herland.net> Signed-off-by: Lars Hjemli <hjemli@gmail.com>
172 Zeilen
3.5 KiB
C
172 Zeilen
3.5 KiB
C
/* cmd.c: the cgit command dispatcher
|
|
*
|
|
* Copyright (C) 2008 Lars Hjemli
|
|
*
|
|
* 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, 10);
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
static void commit_fn(struct cgit_context *ctx)
|
|
{
|
|
cgit_print_commit(ctx->qry.sha1);
|
|
}
|
|
|
|
static void diff_fn(struct cgit_context *ctx)
|
|
{
|
|
cgit_print_diff(ctx->qry.sha1, ctx->qry.sha2, ctx->qry.path);
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
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_cmd(name, want_repo, want_layout, want_vpath) \
|
|
{#name, name##_fn, want_repo, want_layout, want_vpath}
|
|
|
|
struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx)
|
|
{
|
|
static struct cgit_cmd cmds[] = {
|
|
def_cmd(HEAD, 1, 0, 0),
|
|
def_cmd(atom, 1, 0, 0),
|
|
def_cmd(about, 0, 1, 0),
|
|
def_cmd(blob, 1, 0, 0),
|
|
def_cmd(commit, 1, 1, 1),
|
|
def_cmd(diff, 1, 1, 1),
|
|
def_cmd(info, 1, 0, 0),
|
|
def_cmd(log, 1, 1, 1),
|
|
def_cmd(ls_cache, 0, 0, 0),
|
|
def_cmd(objects, 1, 0, 0),
|
|
def_cmd(patch, 1, 0, 1),
|
|
def_cmd(plain, 1, 0, 0),
|
|
def_cmd(refs, 1, 1, 0),
|
|
def_cmd(repolist, 0, 0, 0),
|
|
def_cmd(snapshot, 1, 0, 0),
|
|
def_cmd(stats, 1, 1, 1),
|
|
def_cmd(summary, 1, 1, 0),
|
|
def_cmd(tag, 1, 1, 0),
|
|
def_cmd(tree, 1, 1, 1),
|
|
};
|
|
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;
|
|
}
|