summary refs log tree commit diff
path: root/parsing.c
diff options
context:
space:
mode:
authorLars Hjemli <hjemli@gmail.com>2007-05-18 03:00:54 +0200
committerLars Hjemli <hjemli@gmail.com>2007-05-18 22:51:01 +0200
commit30ccdcaa74ebc0aab2b7843b0db8251d0ddf56de (patch)
treeefb3eddd091117281d5592c9eab44bc63121edf6 /parsing.c
parent43d40f2b704151d145a1383b2b964210915ecae4 (diff)
Enable url=value querystring parameter
This makes is possible to use repo-urls like '/pub/scm/git/git.git' and
even add path specifications, like '/pub/scm/git/git.git/log/documentation'.

Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (limited to 'parsing.c')
-rw-r--r--parsing.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/parsing.c b/parsing.c
index 36b0f0c..a028625 100644
--- a/parsing.c
+++ b/parsing.c
@@ -132,6 +132,49 @@ int cgit_parse_query(char *txt, configfn fn)
 	return 0;
 }
 
+/*
+ * url syntax: [repo ['/' cmd [ '/' path]]]
+ *   repo: any valid repo url, may contain '/'
+ *   cmd:  log | commit | diff | tree | view | blob | snapshot
+ *   path: any valid path, may contain '/'
+ *
+ */
+void cgit_parse_url(const char *url)
+{
+	char *cmd, *p;
+
+	cgit_repo = NULL;
+	if (!url || url[0] == '\0')
+		return;
+
+	cgit_repo = cgit_get_repoinfo(url);
+	if (cgit_repo) {
+		cgit_query_repo = cgit_repo->url;
+		return;
+	}
+
+	cmd = strchr(url, '/');
+	while (!cgit_repo && cmd) {
+		cmd[0] = '\0';
+		cgit_repo = cgit_get_repoinfo(url);
+		if (cgit_repo == NULL) {
+			cmd[0] = '/';
+			cmd = strchr(cmd + 1, '/');
+			continue;
+		}
+
+		cgit_query_repo = cgit_repo->url;
+		p = strchr(cmd + 1, '/');
+		if (p) {
+			p[0] = '\0';
+			cgit_query_path = xstrdup(p + 1);
+		}
+		cgit_cmd = cgit_get_cmd_index(cmd + 1);
+		cgit_query_page = xstrdup(cmd + 1);
+		return;
+	}
+}
+
 char *substr(const char *head, const char *tail)
 {
 	char *buf;