]> gitweb.ps.run Git - ps-cgit/commitdiff
Merge branch 'stable'
authorLars Hjemli <hjemli@gmail.com>
Mon, 17 Aug 2009 08:17:23 +0000 (10:17 +0200)
committerLars Hjemli <hjemli@gmail.com>
Mon, 17 Aug 2009 08:17:23 +0000 (10:17 +0200)
1  2 
cgit.c
ui-tag.c

diff --combined cgit.c
index 66dd1402c23185154f67f55e41506e16a3152682,530184010844a42f1275864bf9b12168ca111288..5816f3d8afef84ba7ed14580a0682342f206b50e
--- 1/cgit.c
--- 2/cgit.c
+++ b/cgit.c
  
  const char *cgit_version = CGIT_VERSION;
  
 +void add_mimetype(const char *name, const char *value)
 +{
 +      struct string_list_item *item;
 +
 +      item = string_list_insert(xstrdup(name), &ctx.cfg.mimetypes);
 +      item->util = xstrdup(value);
 +}
 +
 +struct cgit_filter *new_filter(const char *cmd, int extra_args)
 +{
 +      struct cgit_filter *f;
 +
 +      if (!cmd || !cmd[0])
 +              return NULL;
 +
 +      f = xmalloc(sizeof(struct cgit_filter));
 +      f->cmd = xstrdup(cmd);
 +      f->argv = xmalloc((2 + extra_args) * sizeof(char *));
 +      f->argv[0] = f->cmd;
 +      f->argv[1] = NULL;
 +      return f;
 +}
 +
  void config_cb(const char *name, const char *value)
  {
        if (!strcmp(name, "root-title"))
@@@ -54,8 -31,6 +54,8 @@@
                ctx.cfg.favicon = xstrdup(value);
        else if (!strcmp(name, "footer"))
                ctx.cfg.footer = xstrdup(value);
 +      else if (!strcmp(name, "head-include"))
 +              ctx.cfg.head_include = xstrdup(value);
        else if (!strcmp(name, "header"))
                ctx.cfg.header = xstrdup(value);
        else if (!strcmp(name, "logo"))
                        ctx.cfg.virtual_root = "";
        } else if (!strcmp(name, "nocache"))
                ctx.cfg.nocache = atoi(value);
 +      else if (!strcmp(name, "noplainemail"))
 +              ctx.cfg.noplainemail = atoi(value);
 +      else if (!strcmp(name, "noheader"))
 +              ctx.cfg.noheader = atoi(value);
        else if (!strcmp(name, "snapshots"))
                ctx.cfg.snapshots = cgit_parse_snapshots_mask(value);
        else if (!strcmp(name, "enable-index-links"))
                ctx.cfg.cache_static_ttl = atoi(value);
        else if (!strcmp(name, "cache-dynamic-ttl"))
                ctx.cfg.cache_dynamic_ttl = atoi(value);
 +      else if (!strcmp(name, "about-filter"))
 +              ctx.cfg.about_filter = new_filter(value, 0);
 +      else if (!strcmp(name, "commit-filter"))
 +              ctx.cfg.commit_filter = new_filter(value, 0);
 +      else if (!strcmp(name, "embedded"))
 +              ctx.cfg.embedded = atoi(value);
        else if (!strcmp(name, "max-message-length"))
                ctx.cfg.max_msg_len = atoi(value);
        else if (!strcmp(name, "max-repodesc-length"))
                ctx.cfg.max_repo_count = atoi(value);
        else if (!strcmp(name, "max-commit-count"))
                ctx.cfg.max_commit_count = atoi(value);
 +      else if (!strcmp(name, "source-filter"))
 +              ctx.cfg.source_filter = new_filter(value, 1);
        else if (!strcmp(name, "summary-log"))
                ctx.cfg.summary_log = atoi(value);
        else if (!strcmp(name, "summary-branches"))
                ctx.cfg.clone_prefix = xstrdup(value);
        else if (!strcmp(name, "local-time"))
                ctx.cfg.local_time = atoi(value);
 +      else if (!prefixcmp(name, "mimetype."))
 +              add_mimetype(name + 9, value);
        else if (!strcmp(name, "repo.group"))
                ctx.cfg.repo_group = xstrdup(value);
        else if (!strcmp(name, "repo.url"))
                ctx.repo->max_stats = cgit_find_stats_period(value, NULL);
        else if (ctx.repo && !strcmp(name, "repo.module-link"))
                ctx.repo->module_link= xstrdup(value);
 +      else if (ctx.repo && !strcmp(name, "repo.about-filter"))
 +              ctx.repo->about_filter = new_filter(value, 0);
 +      else if (ctx.repo && !strcmp(name, "repo.commit-filter"))
 +              ctx.repo->commit_filter = new_filter(value, 0);
 +      else if (ctx.repo && !strcmp(name, "repo.source-filter"))
 +              ctx.repo->source_filter = new_filter(value, 1);
        else if (ctx.repo && !strcmp(name, "repo.readme") && value != NULL) {
                if (*value == '/')
                        ctx.repo->readme = xstrdup(value);
  
  static void querystring_cb(const char *name, const char *value)
  {
+       if (!value)
+               value = "";
        if (!strcmp(name,"r")) {
                ctx.qry.repo = xstrdup(value);
                ctx.repo = cgit_get_repoinfo(value);
        }
  }
  
 +char *xstrdupn(const char *str)
 +{
 +      return (str ? xstrdup(str) : NULL);
 +}
 +
  static void prepare_context(struct cgit_context *ctx)
  {
        memset(ctx, 0, sizeof(ctx));
        ctx->cfg.cache_root_ttl = 5;
        ctx->cfg.cache_static_ttl = -1;
        ctx->cfg.css = "/cgit.css";
 -      ctx->cfg.logo = "/git-logo.png";
 +      ctx->cfg.logo = "/cgit.png";
        ctx->cfg.local_time = 0;
        ctx->cfg.max_repo_count = 50;
        ctx->cfg.max_commit_count = 50;
        ctx->cfg.summary_branches = 10;
        ctx->cfg.summary_log = 10;
        ctx->cfg.summary_tags = 10;
 +      ctx->env.cgit_config = xstrdupn(getenv("CGIT_CONFIG"));
 +      ctx->env.http_host = xstrdupn(getenv("HTTP_HOST"));
 +      ctx->env.https = xstrdupn(getenv("HTTPS"));
 +      ctx->env.no_http = xstrdupn(getenv("NO_HTTP"));
 +      ctx->env.path_info = xstrdupn(getenv("PATH_INFO"));
 +      ctx->env.query_string = xstrdupn(getenv("QUERY_STRING"));
 +      ctx->env.request_method = xstrdupn(getenv("REQUEST_METHOD"));
 +      ctx->env.script_name = xstrdupn(getenv("SCRIPT_NAME"));
 +      ctx->env.server_name = xstrdupn(getenv("SERVER_NAME"));
 +      ctx->env.server_port = xstrdupn(getenv("SERVER_PORT"));
        ctx->page.mimetype = "text/html";
        ctx->page.charset = PAGE_ENCODING;
        ctx->page.filename = NULL;
        ctx->page.size = 0;
        ctx->page.modified = time(NULL);
        ctx->page.expires = ctx->page.modified;
 +      ctx->page.etag = NULL;
 +      memset(&ctx->cfg.mimetypes, 0, sizeof(struct string_list));
 +      if (ctx->env.script_name)
 +              ctx->cfg.script_name = ctx->env.script_name;
 +      if (ctx->env.query_string)
 +              ctx->qry.raw = ctx->env.query_string;
 +      if (!ctx->env.cgit_config)
 +              ctx->env.cgit_config = CGIT_CONFIG;
  }
  
  struct refmatch {
@@@ -353,8 -288,6 +356,8 @@@ static int prepare_repo_cmd(struct cgit
        if (get_sha1(ctx->qry.head, sha1)) {
                tmp = xstrdup(ctx->qry.head);
                ctx->qry.head = ctx->repo->defbranch;
 +              ctx->page.status = 404;
 +              ctx->page.statusmsg = "not found";
                cgit_print_http_headers(ctx);
                cgit_print_docstart(ctx);
                cgit_print_pageheader(ctx);
@@@ -446,9 -379,6 +449,9 @@@ static void cgit_parse_args(int argc, c
                if (!strcmp(argv[i], "--nocache")) {
                        ctx.cfg.nocache = 1;
                }
 +              if (!strcmp(argv[i], "--nohttp")) {
 +                      ctx.env.no_http = "1";
 +              }
                if (!strncmp(argv[i], "--query=", 8)) {
                        ctx.qry.raw = xstrdup(argv[i]+8);
                }
@@@ -501,6 -431,7 +504,6 @@@ static int calc_ttl(
  
  int main(int argc, const char **argv)
  {
 -      const char *cgit_config_env = getenv("CGIT_CONFIG");
        const char *path;
        char *qry;
        int err, ttl;
        cgit_repolist.count = 0;
        cgit_repolist.repos = NULL;
  
 -      if (getenv("SCRIPT_NAME"))
 -              ctx.cfg.script_name = xstrdup(getenv("SCRIPT_NAME"));
 -      if (getenv("QUERY_STRING"))
 -              ctx.qry.raw = xstrdup(getenv("QUERY_STRING"));
        cgit_parse_args(argc, argv);
 -      parse_configfile(cgit_config_env ? cgit_config_env : CGIT_CONFIG,
 -                       config_cb);
 +      parse_configfile(ctx.env.cgit_config, config_cb);
        ctx.repo = NULL;
        http_parse_querystring(ctx.qry.raw, querystring_cb);
  
         * urls without the need for rewriterules in the webserver (as
         * long as PATH_INFO is included in the cache lookup key).
         */
 -      path = getenv("PATH_INFO");
 +      path = ctx.env.path_info;
        if (!ctx.qry.url && path) {
                if (path[0] == '/')
                        path++;
  
        ttl = calc_ttl();
        ctx.page.expires += ttl*60;
 +      if (ctx.env.request_method && !strcmp(ctx.env.request_method, "HEAD"))
 +              ctx.cfg.nocache = 1;
        if (ctx.cfg.nocache)
                ctx.cfg.cache_size = 0;
        err = cache_process(ctx.cfg.cache_size, ctx.cfg.cache_root,
diff --combined ui-tag.c
index a9c867070f9c71a042a99ae7c3a4ddc85dbd5ae5,8c263abea70bce9fedf5fe816cba78b44eb37d8b..c2d72aff613d6536cce975984ce55f718060d4ca
+++ b/ui-tag.c
@@@ -37,7 -37,10 +37,10 @@@ void cgit_print_tag(char *revname
        struct tag *tag;
        struct taginfo *info;
  
-       if (get_sha1(revname, sha1)) {
+       if (!revname)
+               revname = ctx.qry.head;
+       if (get_sha1(fmt("refs/tags/%s", revname), sha1)) {
                cgit_print_error(fmt("Bad tag reference: %s", revname));
                return;
        }
@@@ -64,7 -67,7 +67,7 @@@
                if (info->tagger) {
                        html("<tr><td>Tagged by</td><td>");
                        html_txt(info->tagger);
 -                      if (info->tagger_email) {
 +                      if (info->tagger_email && !ctx.cfg.noplainemail) {
                                html(" ");
                                html_txt(info->tagger_email);
                        }