aboutsummaryrefslogtreecommitdiff
diff refs
from: back
to: back
| flip
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--cgit.c128
-rw-r--r--cgit.h14
-rw-r--r--cmd.c101
-rw-r--r--cmd.h15
-rw-r--r--parsing.c4
-rw-r--r--shared.c13
7 files changed, 109 insertions, 168 deletions
diff --git a/Makefile b/Makefile
index d9ff7d8..7102908 100644
--- a/Makefile
+++ b/Makefile
@@ -16,7 +16,7 @@ GIT_URL = http://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.bz2
EXTLIBS = git/libgit.a git/xdiff/lib.a -lz -lcrypto
OBJECTS = shared.o cache.o parsing.o html.o ui-shared.o ui-repolist.o \
ui-summary.o ui-log.o ui-tree.o ui-commit.o ui-diff.o \
- ui-snapshot.o ui-blob.o ui-tag.o ui-refs.o ui-patch.o cmd.o
+ ui-snapshot.o ui-blob.o ui-tag.o ui-refs.o ui-patch.o
ifdef NEEDS_LIBICONV
diff --git a/cgit.c b/cgit.c
index 79e0e43..a83f0be 100644
--- a/cgit.c
+++ b/cgit.c
@@ -81,84 +81,111 @@ char *find_default_branch(struct cgit_repo *repo)
return info.first_ref;
}
-static int prepare_repo_cmd(struct cgit_context *ctx)
+static void cgit_print_repo_page()
{
char *tmp;
+ int show_search;
unsigned char sha1[20];
int nongit = 0;
- setenv("GIT_DIR", ctx->repo->path, 1);
+ setenv("GIT_DIR", ctx.repo->path, 1);
setup_git_directory_gently(&nongit);
if (nongit) {
- ctx->page.title = fmt("%s - %s", ctx->cfg.root_title,
- "config error");
- tmp = fmt("Not a git repository: '%s'", ctx->repo->path);
- ctx->repo = NULL;
- cgit_print_http_headers(ctx);
- cgit_print_docstart(ctx);
- cgit_print_pageheader(ctx);
+ ctx.page.title = fmt("%s - %s", ctx.cfg.root_title,
+ "config error");
+ tmp = fmt("Not a git repository: '%s'", ctx.repo->path);
+ ctx.repo = NULL;
+ cgit_print_http_headers(&ctx);
+ cgit_print_docstart(&ctx);
+ cgit_print_pageheader(&ctx);
cgit_print_error(tmp);
cgit_print_docend();
- return 1;
+ return;
}
- ctx->page.title = fmt("%s - %s", ctx->repo->name, ctx->repo->desc);
- if (!ctx->qry.head) {
- ctx->qry.head = xstrdup(find_default_branch(ctx->repo));
- ctx->repo->defbranch = ctx->qry.head;
+ ctx.page.title = fmt("%s - %s", ctx.repo->name, ctx.repo->desc);
+ show_search = 0;
+
+ if (!ctx.qry.head) {
+ ctx.qry.head = xstrdup(find_default_branch(ctx.repo));
+ ctx.repo->defbranch = ctx.qry.head;
}
- if (!ctx->qry.head) {
- cgit_print_http_headers(ctx);
- cgit_print_docstart(ctx);
- cgit_print_pageheader(ctx);
+ if (!ctx.qry.head) {
+ cgit_print_http_headers(&ctx);
+ cgit_print_docstart(&ctx);
+ cgit_print_pageheader(&ctx);
cgit_print_error("Repository seems to be empty");
cgit_print_docend();
- return 1;
+ return;
}
- if (get_sha1(ctx->qry.head, sha1)) {
- tmp = xstrdup(ctx->qry.head);
- ctx->qry.head = ctx->repo->defbranch;
- cgit_print_http_headers(ctx);
- cgit_print_docstart(ctx);
- cgit_print_pageheader(ctx);
+ if (get_sha1(ctx.qry.head, sha1)) {
+ tmp = xstrdup(ctx.qry.head);
+ ctx.qry.head = ctx.repo->defbranch;
+ cgit_print_http_headers(&ctx);
+ cgit_print_docstart(&ctx);
+ cgit_print_pageheader(&ctx);
cgit_print_error(fmt("Invalid branch: %s", tmp));
cgit_print_docend();
- return 1;
+ return;
}
- return 0;
-}
-static void process_request(struct cgit_context *ctx)
-{
- struct cgit_cmd *cmd;
+ if ((cgit_cmd == CMD_SNAPSHOT) && ctx.repo->snapshots) {
+ cgit_print_snapshot(ctx.qry.head, ctx.qry.sha1,
+ cgit_repobasename(ctx.repo->url),
+ ctx.qry.path,
+ ctx.repo->snapshots );
+ return;
+ }
- cmd = cgit_get_cmd(ctx);
- if (!cmd) {
- ctx->page.title = "cgit error";
- ctx->repo = NULL;
- cgit_print_http_headers(ctx);
- cgit_print_docstart(ctx);
- cgit_print_pageheader(ctx);
- cgit_print_error("Invalid request");
- cgit_print_docend();
+ if (cgit_cmd == CMD_PATCH) {
+ cgit_print_patch(ctx.qry.sha1);
return;
}
- if (cmd->want_repo && prepare_repo_cmd(ctx))
+ if (cgit_cmd == CMD_BLOB) {
+ cgit_print_blob(ctx.qry.sha1, ctx.qry.path);
return;
+ }
- if (cmd->want_layout) {
- cgit_print_http_headers(ctx);
- cgit_print_docstart(ctx);
- cgit_print_pageheader(ctx);
+ show_search = (cgit_cmd == CMD_LOG);
+ cgit_print_http_headers(&ctx);
+ cgit_print_docstart(&ctx);
+ if (!cgit_cmd) {
+ cgit_print_pageheader(&ctx);
+ cgit_print_summary();
+ cgit_print_docend();
+ return;
}
- cmd->fn(ctx);
+ cgit_print_pageheader(&ctx);
- if (cmd->want_layout)
- cgit_print_docend();
+ switch(cgit_cmd) {
+ case CMD_LOG:
+ cgit_print_log(ctx.qry.sha1, ctx.qry.ofs,
+ ctx.cfg.max_commit_count, ctx.qry.grep, ctx.qry.search,
+ ctx.qry.path, 1);
+ break;
+ case CMD_TREE:
+ cgit_print_tree(ctx.qry.sha1, ctx.qry.path);
+ break;
+ case CMD_COMMIT:
+ cgit_print_commit(ctx.qry.sha1);
+ break;
+ case CMD_REFS:
+ cgit_print_refs();
+ break;
+ case CMD_TAG:
+ cgit_print_tag(ctx.qry.sha1);
+ break;
+ case CMD_DIFF:
+ cgit_print_diff(ctx.qry.sha1, ctx.qry.sha2, ctx.qry.path);
+ break;
+ default:
+ cgit_print_error("Invalid request");
+ }
+ cgit_print_docend();
}
static long ttl_seconds(long ttl)
@@ -182,7 +209,10 @@ static void cgit_fill_cache(struct cacheitem *item, int use_cache)
ctx.page.modified = time(NULL);
ctx.page.expires = ctx.page.modified + ttl_seconds(item->ttl);
- process_request(&ctx);
+ if (ctx.repo)
+ cgit_print_repo_page();
+ else
+ cgit_print_repolist();
if (use_cache) {
chk_zero(close(STDOUT_FILENO), "Close redirected STDOUT");
diff --git a/cgit.h b/cgit.h
index 295441b..40e2d40 100644
--- a/cgit.h
+++ b/cgit.h
@@ -20,6 +20,19 @@
/*
+ * The valid cgit repo-commands
+ */
+#define CMD_LOG 1
+#define CMD_COMMIT 2
+#define CMD_DIFF 3
+#define CMD_TREE 4
+#define CMD_BLOB 5
+#define CMD_SNAPSHOT 6
+#define CMD_TAG 7
+#define CMD_REFS 8
+#define CMD_PATCH 9
+
+/*
* Dateformats used on misc. pages
*/
#define FMT_LONGDATE "%Y-%m-%d %H:%M:%S"
@@ -184,6 +197,7 @@ extern struct cgit_context ctx;
extern int cgit_cmd;
extern void cgit_prepare_context(struct cgit_context *ctx);
+extern int cgit_get_cmd_index(const char *cmd);
extern struct cgit_repo *cgit_get_repoinfo(const char *url);
extern void cgit_global_config_cb(const char *name, const char *value);
extern void cgit_repo_config_cb(const char *name, const char *value);
diff --git a/cmd.c b/cmd.c
deleted file mode 100644
index 489a11c..0000000
--- a/cmd.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/* 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"
-
-static void blob_fn(struct cgit_context *ctx)
-{
- cgit_print_blob(ctx->qry.sha1, ctx->qry.path);
-}
-
-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 repolist_fn(struct cgit_context *ctx)
-{
- cgit_print_repolist();
-}
-
-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 patch_fn(struct cgit_context *ctx)
-{
- cgit_print_patch(ctx->qry.sha1);
-}
-
-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,
- cgit_repobasename(ctx->repo->url), ctx->qry.path,
- ctx->repo->snapshots);
-}
-
-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) \
- {#name, name##_fn, want_repo, want_layout}
-
-struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx)
-{
- static struct cgit_cmd cmds[] = {
- def_cmd(blob, 1, 0),
- def_cmd(commit, 1, 1),
- def_cmd(diff, 1, 1),
- def_cmd(log, 1, 1),
- def_cmd(patch, 1, 0),
- def_cmd(refs, 1, 1),
- def_cmd(repolist, 0, 0),
- def_cmd(snapshot, 1, 0),
- def_cmd(summary, 1, 1),
- def_cmd(tag, 1, 1),
- def_cmd(tree, 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;
-}
diff --git a/cmd.h b/cmd.h
deleted file mode 100644
index ec9e691..0000000
--- a/cmd.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef CMD_H
-#define CMD_H
-
-typedef void (*cgit_cmd_fn)(struct cgit_context *ctx);
-
-struct cgit_cmd {
- const char *name;
- cgit_cmd_fn fn;
- unsigned int want_repo:1,
- want_layout:1;
-};
-
-extern struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx);
-
-#endif /* CMD_H */
diff --git a/parsing.c b/parsing.c
index 8dce488..027f06b 100644
--- a/parsing.c
+++ b/parsing.c
@@ -170,8 +170,8 @@ void cgit_parse_url(const char *url)
if (p[1])
ctx.qry.path = trim_end(p + 1, '/');
}
- if (cmd[1])
- ctx.qry.page = xstrdup(cmd + 1);
+ cgit_cmd = cgit_get_cmd_index(cmd + 1);
+ ctx.qry.page = xstrdup(cmd + 1);
return;
}
}
diff --git a/shared.c b/shared.c
index 67eb67b..539d533 100644
--- a/shared.c
+++ b/shared.c
@@ -40,6 +40,18 @@ void cgit_prepare_context(struct cgit_context *ctx)
ctx->page.filename = NULL;
}
+int cgit_get_cmd_index(const char *cmd)
+{
+ static char *cmds[] = {"log", "commit", "diff", "tree", "blob",
+ "snapshot", "tag", "refs", "patch", NULL};
+ int i;
+
+ for(i = 0; cmds[i]; i++)
+ if (!strcmp(cmd, cmds[i]))
+ return i + 1;
+ return 0;
+}
+
int chk_zero(int result, char *msg)
{
if (result != 0)
@@ -204,6 +216,7 @@ void cgit_querystring_cb(const char *name, const char *value)
ctx.repo = cgit_get_repoinfo(value);
} else if (!strcmp(name, "p")) {
ctx.qry.page = xstrdup(value);
+ cgit_cmd = cgit_get_cmd_index(value);
} else if (!strcmp(name, "url")) {
cgit_parse_url(value);
} else if (!strcmp(name, "qt")) {