summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--cgit.c6
-rw-r--r--cgit.h1
-rw-r--r--cmd.c42
-rw-r--r--cmd.h3
4 files changed, 30 insertions, 22 deletions
diff --git a/cgit.c b/cgit.c
index 9305d0a..2c3ad73 100644
--- a/cgit.c
+++ b/cgit.c
@@ -424,6 +424,12 @@ static void process_request(void *cbdata)
 		return;
 	}
 
+	/* If cmd->want_vpath is set, assume ctx->qry.path contains a "virtual"
+	 * in-project path limit to be made available at ctx->qry.vpath.
+	 * Otherwise, no path limit is in effect (ctx->qry.vpath = NULL).
+	 */
+	ctx->qry.vpath = cmd->want_vpath ? ctx->qry.path : NULL;
+
 	if (cmd->want_repo && !ctx->repo) {
 		cgit_print_http_headers(ctx);
 		cgit_print_docstart(ctx);
diff --git a/cgit.h b/cgit.h
index cd4af72..f990b15 100644
--- a/cgit.h
+++ b/cgit.h
@@ -145,6 +145,7 @@ struct cgit_query {
 	char *sort;
 	int showmsg;
 	int ssdiff;
+	char *vpath;
 };
 
 struct cgit_config {
diff --git a/cmd.c b/cmd.c
index 766f903..a9e426a 100644
--- a/cmd.c
+++ b/cmd.c
@@ -129,31 +129,31 @@ 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}
+#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),
-		def_cmd(atom, 1, 0),
-		def_cmd(about, 0, 1),
-		def_cmd(blob, 1, 0),
-		def_cmd(commit, 1, 1),
-		def_cmd(diff, 1, 1),
-		def_cmd(info, 1, 0),
-		def_cmd(log, 1, 1),
-		def_cmd(ls_cache, 0, 0),
-		def_cmd(objects, 1, 0),
-		def_cmd(patch, 1, 0),
-		def_cmd(plain, 1, 0),
-		def_cmd(refs, 1, 1),
-		def_cmd(repolist, 0, 0),
-		def_cmd(snapshot, 1, 0),
-		def_cmd(stats, 1, 1),
-		def_cmd(summary, 1, 1),
-		def_cmd(tag, 1, 1),
-		def_cmd(tree, 1, 1),
+		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;
 
diff --git a/cmd.h b/cmd.h
index ec9e691..8dc01bd 100644
--- a/cmd.h
+++ b/cmd.h
@@ -7,7 +7,8 @@ struct cgit_cmd {
 	const char *name;
 	cgit_cmd_fn fn;
 	unsigned int want_repo:1,
-		want_layout:1;
+		want_layout:1,
+		want_vpath:1;
 };
 
 extern struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx);