X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/aa943bc9a68ccdcc5cbe29f6ac3b5e787d4c22ca..5ccd96525835b314c8615738d533d9d0b54a630c:/shared.c diff --git a/shared.c b/shared.c index 225ce15..c63f1e3 100644 --- a/shared.c +++ b/shared.c @@ -54,6 +54,7 @@ struct cgit_repo *cgit_add_repo(const char *url) ret->path = NULL; ret->desc = cgit_default_repo_desc; ret->owner = NULL; + ret->homepage = NULL; ret->section = ctx.cfg.section; ret->snapshots = ctx.cfg.snapshots; ret->enable_commit_graph = ctx.cfg.enable_commit_graph; @@ -61,6 +62,7 @@ struct cgit_repo *cgit_add_repo(const char *url) ret->enable_log_linecount = ctx.cfg.enable_log_linecount; ret->enable_remote_branches = ctx.cfg.enable_remote_branches; ret->enable_subject_links = ctx.cfg.enable_subject_links; + ret->enable_html_serving = ctx.cfg.enable_html_serving; ret->max_stats = ctx.cfg.max_stats; ret->branch_sort = ctx.cfg.branch_sort; ret->commit_sort = ctx.cfg.commit_sort; @@ -93,7 +95,7 @@ struct cgit_repo *cgit_get_repoinfo(const char *url) return NULL; } -void *cgit_free_commitinfo(struct commitinfo *info) +void cgit_free_commitinfo(struct commitinfo *info) { free(info->author); free(info->author_email); @@ -103,7 +105,6 @@ void *cgit_free_commitinfo(struct commitinfo *info) free(info->msg); free(info->msg_encoding); free(info); - return NULL; } char *trim_end(const char *str, char c) @@ -141,37 +142,6 @@ void strbuf_ensure_end(struct strbuf *sb, char c) strbuf_addch(sb, c); } -char *strlpart(char *txt, int maxlen) -{ - char *result; - - if (!txt) - return txt; - - if (strlen(txt) <= maxlen) - return txt; - result = xmalloc(maxlen + 1); - memcpy(result, txt, maxlen - 3); - result[maxlen-1] = result[maxlen-2] = result[maxlen-3] = '.'; - result[maxlen] = '\0'; - return result; -} - -char *strrpart(char *txt, int maxlen) -{ - char *result; - - if (!txt) - return txt; - - if (strlen(txt) <= maxlen) - return txt; - result = xmalloc(maxlen + 1); - memcpy(result + 3, txt + strlen(txt) - maxlen + 4, maxlen - 3); - result[0] = result[1] = result[2] = '.'; - return result; -} - void cgit_add_ref(struct reflist *list, struct refinfo *ref) { size_t size; @@ -202,7 +172,7 @@ static struct refinfo *cgit_mk_refinfo(const char *refname, const struct object_ return ref; } -static void cgit_free_taginfo(struct taginfo *tag) +void cgit_free_taginfo(struct taginfo *tag) { if (tag->tagger) free(tag->tagger); @@ -261,15 +231,15 @@ void cgit_diff_tree_cb(struct diff_queue_struct *q, } } -static int load_mmfile(mmfile_t *file, const unsigned char *sha1) +static int load_mmfile(mmfile_t *file, const struct object_id *oid) { enum object_type type; - if (is_null_sha1(sha1)) { + if (is_null_oid(oid)) { file->ptr = (char *)""; file->size = 0; } else { - file->ptr = read_sha1_file(sha1, &type, + file->ptr = read_sha1_file(oid->hash, &type, (unsigned long *)&file->size); } return 1; @@ -320,8 +290,8 @@ static int filediff_cb(void *priv, mmbuffer_t *mb, int nbuf) return 0; } -int cgit_diff_files(const unsigned char *old_sha1, - const unsigned char *new_sha1, unsigned long *old_size, +int cgit_diff_files(const struct object_id *old_oid, + const struct object_id *new_oid, unsigned long *old_size, unsigned long *new_size, int *binary, int context, int ignorews, linediff_fn fn) { @@ -330,7 +300,7 @@ int cgit_diff_files(const unsigned char *old_sha1, xdemitconf_t emit_params; xdemitcb_t emit_cb; - if (!load_mmfile(&file1, old_sha1) || !load_mmfile(&file2, new_sha1)) + if (!load_mmfile(&file1, old_oid) || !load_mmfile(&file2, new_oid)) return 1; *old_size = file1.size; @@ -364,8 +334,8 @@ int cgit_diff_files(const unsigned char *old_sha1, return 0; } -void cgit_diff_tree(const unsigned char *old_sha1, - const unsigned char *new_sha1, +void cgit_diff_tree(const struct object_id *old_oid, + const struct object_id *new_oid, filepair_fn fn, const char *prefix, int ignorews) { struct diff_options opt; @@ -389,21 +359,21 @@ void cgit_diff_tree(const unsigned char *old_sha1, } diff_setup_done(&opt); - if (old_sha1 && !is_null_sha1(old_sha1)) - diff_tree_sha1(old_sha1, new_sha1, "", &opt); + if (old_oid && !is_null_oid(old_oid)) + diff_tree_sha1(old_oid->hash, new_oid->hash, "", &opt); else - diff_root_tree_sha1(new_sha1, "", &opt); + diff_root_tree_sha1(new_oid->hash, "", &opt); diffcore_std(&opt); diff_flush(&opt); } void cgit_diff_commit(struct commit *commit, filepair_fn fn, const char *prefix) { - unsigned char *old_sha1 = NULL; + const struct object_id *old_oid = NULL; if (commit->parents) - old_sha1 = commit->parents->item->object.sha1; - cgit_diff_tree(old_sha1, commit->object.sha1, fn, prefix, + old_oid = &commit->parents->item->object.oid; + cgit_diff_tree(old_oid, &commit->object.oid, fn, prefix, ctx.qry.ignorews); } @@ -563,49 +533,39 @@ char *expand_macros(const char *txt) char *get_mimetype_for_filename(const char *filename) { - static const char *delimiters; - char *ext = NULL, *iterate, *mimetype = NULL, *token; - char line[1024]; - FILE *fd; + char *ext, *mimetype, *token, line[1024], *saveptr; + FILE *file; struct string_list_item *mime; - if (filename == NULL) + if (!filename) return NULL; ext = strrchr(filename, '.'); + if (!ext) + return NULL; + ++ext; + if (!ext[0]) + return NULL; + mime = string_list_lookup(&ctx.cfg.mimetypes, ext); + if (mime) + return xstrdup(mime->util); - if (ext && *(++ext)) { - mime = string_list_lookup(&ctx.cfg.mimetypes, ext); - if (mime) { - /* We could just pass the pointer here, but would have to care - * whether or not to free the memory. Instead just dup. */ - mimetype = xstrdup(mime->util); - } else if (ctx.cfg.mimetype_file != NULL) { - fd = fopen(ctx.cfg.mimetype_file, "r"); - if (fd == NULL) - return NULL; - - delimiters = " \t\r\n"; - - /* loop over all lines in the file */ - while (mimetype == NULL && fgets(line, sizeof(line), fd)) { - iterate = strtok(line, delimiters); - - /* skip empty lines and comment lines */ - if (iterate == NULL || (iterate[0] == '#')) - continue; - - /* loop over all extensions of mimetype */ - while ((token = strtok(NULL, delimiters))) { - if (strcasecmp(ext, token) == 0) { - mimetype = xstrdup(iterate); - break; - } - } + if (!ctx.cfg.mimetype_file) + return NULL; + file = fopen(ctx.cfg.mimetype_file, "r"); + if (!file) + return NULL; + while (fgets(line, sizeof(line), file)) { + if (!line[0] || line[0] == '#') + continue; + mimetype = strtok_r(line, " \t\r\n", &saveptr); + while ((token = strtok_r(NULL, " \t\r\n", &saveptr))) { + if (!strcasecmp(ext, token)) { + fclose(file); + return xstrdup(mimetype); } - fclose(fd); } } - - return mimetype; + fclose(file); + return NULL; }