X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/3de63b264c36888dfd42dfdf3fc0aad4ce0c2b5c..776200b1c10536174f68fc6599fc709ae620db54:/parsing.c diff --git a/parsing.c b/parsing.c index 4420e58..5093b8b 100644 --- a/parsing.c +++ b/parsing.c @@ -168,7 +168,7 @@ void cgit_parse_url(const char *url) if (p) { p[0] = '\0'; if (p[1]) - cgit_query_path = xstrdup(p + 1); + cgit_query_path = trim_end(p + 1, '/'); } cgit_cmd = cgit_get_cmd_index(cmd + 1); cgit_query_page = xstrdup(cmd + 1); @@ -199,6 +199,10 @@ struct commitinfo *cgit_parse_commit(struct commit *commit) ret->committer_email = NULL; ret->subject = NULL; ret->msg = NULL; + ret->msg_encoding = NULL; + + if (p == NULL) + return ret; if (strncmp(p, "tree ", 5)) die("Bad commit: %s", sha1_to_hex(commit->object.sha1)); @@ -215,7 +219,7 @@ struct commitinfo *cgit_parse_commit(struct commit *commit) p = t; t = strchr(t, '>') + 1; ret->author_email = substr(p, t); - ret->author_date = atol(++t); + ret->author_date = atol(t+1); p = strchr(t, '\n') + 1; } @@ -226,22 +230,54 @@ struct commitinfo *cgit_parse_commit(struct commit *commit) p = t; t = strchr(t, '>') + 1; ret->committer_email = substr(p, t); - ret->committer_date = atol(++t); + ret->committer_date = atol(t+1); p = strchr(t, '\n') + 1; } + if (!strncmp(p, "encoding ", 9)) { + p += 9; + t = strchr(p, '\n') + 1; + ret->msg_encoding = substr(p, t); + p = t; + } else + ret->msg_encoding = xstrdup(PAGE_ENCODING); + + while (*p && (*p != '\n')) + p = strchr(p, '\n') + 1; // skip unknown header fields + while (*p == '\n') p = strchr(p, '\n') + 1; t = strchr(p, '\n'); - if (t && *t) { - ret->subject = substr(p, t); + if (t) { + if (*t == '\0') + ret->subject = "** empty **"; + else + ret->subject = substr(p, t); p = t + 1; while (*p == '\n') p = strchr(p, '\n') + 1; - ret->msg = p; + ret->msg = xstrdup(p); + } else + ret->subject = substr(p, p+strlen(p)); + + if(strcmp(ret->msg_encoding, PAGE_ENCODING)) { + t = reencode_string(ret->subject, PAGE_ENCODING, + ret->msg_encoding); + if(t) { + free(ret->subject); + ret->subject = t; + } + + t = reencode_string(ret->msg, PAGE_ENCODING, + ret->msg_encoding); + if(t) { + free(ret->msg); + ret->msg = t; + } } + return ret; } @@ -279,11 +315,14 @@ struct taginfo *cgit_parse_tag(struct tag *tag) p = t; t = strchr(t, '>') + 1; ret->tagger_email = substr(p, t); - ret->tagger_date = atol(++t); + ret->tagger_date = atol(t+1); } p = strchr(p, '\n') + 1; } + while (p && *p && (*p != '\n')) + p = strchr(p, '\n') + 1; // skip unknown tag fields + while (p && (*p == '\n')) p = strchr(p, '\n') + 1; if (p && *p)