X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/1b49de3c2c52e29c78f870826b6334abdadc0295..a2ddc10479ec463708e422ca5ce7ec02c22a7d02:/shared.c diff --git a/shared.c b/shared.c index f8a17b6..a1e1acd 100644 --- a/shared.c +++ b/shared.c @@ -17,7 +17,7 @@ char *cgit_logo = "/git-logo.png"; char *cgit_logo_link = "http://www.kernel.org/pub/software/scm/git/docs/"; char *cgit_module_link = "./?repo=%s&page=commit&id=%s"; char *cgit_virtual_root = NULL; - +char *cgit_script_name = CGIT_SCRIPT_NAME; char *cgit_cache_root = "/var/cache/cgit"; int cgit_nocache = 0; @@ -30,10 +30,7 @@ int cgit_cache_static_ttl = -1; int cgit_cache_max_create_time = 5; int cgit_max_msg_len = 60; - -char *cgit_repo_name = NULL; -char *cgit_repo_desc = NULL; -char *cgit_repo_owner = NULL; +int cgit_max_commit_count = 50; int cgit_query_has_symref = 0; int cgit_query_has_sha1 = 0; @@ -85,6 +82,7 @@ struct repoinfo *add_repo(const char *url) ret->path = NULL; ret->desc = NULL; ret->owner = NULL; + ret->defbranch = "master"; ret->snapshots = cgit_snapshots; ret->module_link = cgit_module_link; return ret; @@ -120,6 +118,8 @@ void cgit_global_config_cb(const char *name, const char *value) cgit_cache_dynamic_ttl = atoi(value); else if (!strcmp(name, "max-message-length")) cgit_max_msg_len = atoi(value); + else if (!strcmp(name, "max-commit-count")) + cgit_max_commit_count = atoi(value); else if (!strcmp(name, "repo.url")) cgit_repo = add_repo(value); else if (!strcmp(name, "repo.name")) @@ -130,20 +130,14 @@ void cgit_global_config_cb(const char *name, const char *value) cgit_repo->desc = xstrdup(value); else if (cgit_repo && !strcmp(name, "repo.owner")) cgit_repo->owner = xstrdup(value); + else if (cgit_repo && !strcmp(name, "repo.defbranch")) + cgit_repo->defbranch = xstrdup(value); else if (cgit_repo && !strcmp(name, "repo.snapshots")) cgit_repo->snapshots = atoi(value); else if (cgit_repo && !strcmp(name, "repo.module-link")) cgit_repo->module_link= xstrdup(value); -} - -void cgit_repo_config_cb(const char *name, const char *value) -{ - if (!strcmp(name, "name")) - cgit_repo_name = xstrdup(value); - else if (!strcmp(name, "desc")) - cgit_repo_desc = xstrdup(value); - else if (!strcmp(name, "owner")) - cgit_repo_owner = xstrdup(value); + else if (!strcmp(name, "include")) + cgit_read_config(value, cgit_global_config_cb); } void cgit_querystring_cb(const char *name, const char *value) @@ -207,6 +201,85 @@ void cgit_diff_tree_cb(struct diff_queue_struct *q, } } +static int load_mmfile(mmfile_t *file, const unsigned char *sha1) +{ + enum object_type type; + + if (is_null_sha1(sha1)) { + file->ptr = (char *)""; + file->size = 0; + } else { + file->ptr = read_sha1_file(sha1, &type, &file->size); + } + return 1; +} + +/* + * Receive diff-buffers from xdiff and concatenate them as + * needed across multiple callbacks. + * + * This is basically a copy of xdiff-interface.c/xdiff_outf(), + * ripped from git and modified to use globals instead of + * a special callback-struct. + */ +char *diffbuf = NULL; +int buflen = 0; + +int filediff_cb(void *priv, mmbuffer_t *mb, int nbuf) +{ + int i; + + for (i = 0; i < nbuf; i++) { + if (mb[i].ptr[mb[i].size-1] != '\n') { + /* Incomplete line */ + diffbuf = xrealloc(diffbuf, buflen + mb[i].size); + memcpy(diffbuf + buflen, mb[i].ptr, mb[i].size); + buflen += mb[i].size; + continue; + } + + /* we have a complete line */ + if (!diffbuf) { + ((linediff_fn)priv)(mb[i].ptr, mb[i].size); + continue; + } + diffbuf = xrealloc(diffbuf, buflen + mb[i].size); + memcpy(diffbuf + buflen, mb[i].ptr, mb[i].size); + ((linediff_fn)priv)(diffbuf, buflen + mb[i].size); + free(diffbuf); + diffbuf = NULL; + buflen = 0; + } + if (diffbuf) { + ((linediff_fn)priv)(diffbuf, buflen); + free(diffbuf); + diffbuf = NULL; + buflen = 0; + } + return 0; +} + +int cgit_diff_files(const unsigned char *old_sha1, + const unsigned char *new_sha1, + linediff_fn fn) +{ + mmfile_t file1, file2; + xpparam_t diff_params; + xdemitconf_t emit_params; + xdemitcb_t emit_cb; + + if (!load_mmfile(&file1, old_sha1) || !load_mmfile(&file2, new_sha1)) + return 1; + + diff_params.flags = XDF_NEED_MINIMAL; + emit_params.ctxlen = 3; + emit_params.flags = XDL_EMIT_FUNCNAMES; + emit_cb.outf = filediff_cb; + emit_cb.priv = fn; + xdl_diff(&file1, &file2, &diff_params, &emit_params, &emit_cb); + return 0; +} + void cgit_diff_tree(const unsigned char *old_sha1, const unsigned char *new_sha1, filepair_fn fn)