]> gitweb.ps.run Git - ps-cgit/blobdiff - cgit.c
Merge branch 'lh/clone-url'
[ps-cgit] / cgit.c
diff --git a/cgit.c b/cgit.c
index 5d6e4886dd2fe2b31df0fc0124f0e53d9115ce9d..51ca78a6cd56cc1f9c338636c70dcb139f8cf47f 100644 (file)
--- a/cgit.c
+++ b/cgit.c
@@ -29,6 +29,7 @@ void add_mimetype(const char *name, const char *value)
 struct cgit_filter *new_filter(const char *cmd, filter_type filtertype)
 {
        struct cgit_filter *f;
+       int args_size = 0;
        int extra_args;
 
        if (!cmd || !cmd[0])
@@ -48,9 +49,10 @@ struct cgit_filter *new_filter(const char *cmd, filter_type filtertype)
 
        f = xmalloc(sizeof(struct cgit_filter));
        f->cmd = xstrdup(cmd);
-       f->argv = xmalloc((2 + extra_args) * sizeof(char *));
+       args_size = (2 + extra_args) * sizeof(char *);
+       f->argv = xmalloc(args_size);
+       memset(f->argv, 0, args_size);
        f->argv[0] = f->cmd;
-       f->argv[1] = NULL;
        return f;
 }
 
@@ -158,6 +160,8 @@ void config_cb(const char *name, const char *value)
                ctx.cfg.enable_filter_overrides = atoi(value);
        else if (!strcmp(name, "enable-gitweb-owner"))
                ctx.cfg.enable_gitweb_owner = atoi(value);
+       else if (!strcmp(name, "enable-http-clone"))
+               ctx.cfg.enable_http_clone = atoi(value);
        else if (!strcmp(name, "enable-index-links"))
                ctx.cfg.enable_index_links = atoi(value);
        else if (!strcmp(name, "enable-commit-graph"))
@@ -240,6 +244,8 @@ void config_cb(const char *name, const char *value)
                ctx.cfg.robots = xstrdup(value);
        else if (!strcmp(name, "clone-prefix"))
                ctx.cfg.clone_prefix = xstrdup(value);
+       else if (!strcmp(name, "clone-url"))
+               ctx.cfg.clone_url = xstrdup(value);
        else if (!strcmp(name, "local-time"))
                ctx.cfg.local_time = atoi(value);
        else if (!prefixcmp(name, "mimetype."))
@@ -323,6 +329,7 @@ static void prepare_context(struct cgit_context *ctx)
        ctx->cfg.logo = "/cgit.png";
        ctx->cfg.local_time = 0;
        ctx->cfg.enable_gitweb_owner = 1;
+       ctx->cfg.enable_http_clone = 1;
        ctx->cfg.enable_tree_linenumbers = 1;
        ctx->cfg.max_repo_count = 50;
        ctx->cfg.max_commit_count = 50;
@@ -450,7 +457,7 @@ static int prepare_repo_cmd(struct cgit_context *ctx)
                tmp = xstrdup(ctx->qry.head);
                ctx->qry.head = ctx->repo->defbranch;
                ctx->page.status = 404;
-               ctx->page.statusmsg = "not found";
+               ctx->page.statusmsg = "Not found";
                cgit_print_http_headers(ctx);
                cgit_print_docstart(ctx);
                cgit_print_pageheader(ctx);
@@ -458,6 +465,7 @@ static int prepare_repo_cmd(struct cgit_context *ctx)
                cgit_print_docend();
                return 1;
        }
+       cgit_prepare_repo_env(ctx->repo);
        return 0;
 }
 
@@ -469,6 +477,8 @@ static void process_request(void *cbdata)
        cmd = cgit_get_cmd(ctx);
        if (!cmd) {
                ctx->page.title = "cgit error";
+               ctx->page.status = 404;
+               ctx->page.statusmsg = "Not found";
                cgit_print_http_headers(ctx);
                cgit_print_docstart(ctx);
                cgit_print_pageheader(ctx);
@@ -477,6 +487,11 @@ static void process_request(void *cbdata)
                return;
        }
 
+       if (!ctx->cfg.enable_http_clone && cmd->is_clone) {
+               html_status(404, "Not found", 0);
+               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).
@@ -768,8 +783,11 @@ int main(int argc, const char **argv)
         * that virtual-root equals SCRIPT_NAME, minus any possibly
         * trailing slashes.
         */
-       if (!ctx.cfg.virtual_root)
+       if (!ctx.cfg.virtual_root && ctx.cfg.script_name) {
                ctx.cfg.virtual_root = trim_end(ctx.cfg.script_name, '/');
+               if (!ctx.cfg.virtual_root)
+                       ctx.cfg.virtual_root = "";
+        }
 
        /* If no url parameter is specified on the querystring, lets
         * use PATH_INFO as url. This allows cgit to work with virtual