X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/47a81c77fdd017227632c4df9a0b7b135b8a738d..0df096f6e146187e55e2203ea1c017442cc2c8c6:/parsing.c diff --git a/parsing.c b/parsing.c index 36b0f0c..2c05c09 100644 --- a/parsing.c +++ b/parsing.c @@ -132,6 +132,50 @@ 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'; + if (p[1]) + cgit_query_path = trim_end(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; @@ -156,6 +200,9 @@ struct commitinfo *cgit_parse_commit(struct commit *commit) ret->subject = NULL; ret->msg = NULL; + if (p == NULL) + return ret; + if (strncmp(p, "tree ", 5)) die("Bad commit: %s", sha1_to_hex(commit->object.sha1)); else @@ -190,14 +237,19 @@ struct commitinfo *cgit_parse_commit(struct commit *commit) p = strchr(p, '\n') + 1; t = strchr(p, '\n'); - if (t && *t) { - ret->subject = substr(p, t); + if (t) { + if (*t == '\0') + ret->subject = strdup("** empty **"); + else + ret->subject = substr(p, t); p = t + 1; while (*p == '\n') p = strchr(p, '\n') + 1; ret->msg = p; - } + } else + ret->subject = substr(p, p+strlen(p)); + return ret; }