*/
#include "cgit.h"
+#include <stdio.h>
struct cgit_repolist cgit_repolist;
struct cgit_context ctx;
return result;
}
+char *cgit_default_repo_desc = "[no description]";
struct cgit_repo *cgit_add_repo(const char *url)
{
struct cgit_repo *ret;
ret->url = trim_end(url, '/');
ret->name = ret->url;
ret->path = NULL;
- ret->desc = "[no description]";
+ ret->desc = cgit_default_repo_desc;
ret->owner = NULL;
ret->section = ctx.cfg.section;
- ret->defbranch = "master";
ret->snapshots = ctx.cfg.snapshots;
+ ret->enable_commit_graph = ctx.cfg.enable_commit_graph;
ret->enable_log_filecount = ctx.cfg.enable_log_filecount;
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->max_stats = ctx.cfg.max_stats;
+ ret->commit_sort = ctx.cfg.commit_sort;
ret->module_link = ctx.cfg.module_link;
- ret->readme = NULL;
+ ret->readme = ctx.cfg.readme;
ret->mtime = -1;
ret->about_filter = ctx.cfg.about_filter;
ret->commit_filter = ctx.cfg.commit_filter;
ret->source_filter = ctx.cfg.source_filter;
+ ret->clone_url = ctx.cfg.clone_url;
+ ret->submodules.strdup_strings = 1;
return ret;
}
char *trim_end(const char *str, char c)
{
int len;
- char *s, *t;
if (str == NULL)
return NULL;
- t = (char *)str;
- len = strlen(t);
- while(len > 0 && t[len - 1] == c)
+ len = strlen(str);
+ while(len > 0 && str[len - 1] == c)
len--;
-
if (len == 0)
return NULL;
-
- c = t[len];
- t[len] = '\0';
- s = xstrdup(t);
- t[len] = c;
- return s;
+ return xstrndup(str, len);
}
char *strlpart(char *txt, int maxlen)
filepair_fn fn, const char *prefix, int ignorews)
{
struct diff_options opt;
- int ret;
- int prefixlen;
+ struct pathspec_item item;
diff_setup(&opt);
opt.output_format = DIFF_FORMAT_CALLBACK;
opt.format_callback = cgit_diff_tree_cb;
opt.format_callback_data = fn;
if (prefix) {
- opt.nr_paths = 1;
- opt.paths = &prefix;
- prefixlen = strlen(prefix);
- opt.pathlens = &prefixlen;
+ item.match = prefix;
+ item.len = strlen(prefix);
+ opt.pathspec.nr = 1;
+ opt.pathspec.items = &item;
}
diff_setup_done(&opt);
if (old_sha1 && !is_null_sha1(old_sha1))
- ret = diff_tree_sha1(old_sha1, new_sha1, "", &opt);
+ diff_tree_sha1(old_sha1, new_sha1, "", &opt);
else
- ret = diff_root_tree_sha1(new_sha1, "", &opt);
+ diff_root_tree_sha1(new_sha1, "", &opt);
diffcore_std(&opt);
diff_flush(&opt);
}
-void cgit_diff_commit(struct commit *commit, filepair_fn fn)
+void cgit_diff_commit(struct commit *commit, filepair_fn fn, const char *prefix)
{
unsigned char *old_sha1 = NULL;
if (commit->parents)
old_sha1 = commit->parents->item->object.sha1;
- cgit_diff_tree(old_sha1, commit->object.sha1, fn, NULL,
+ cgit_diff_tree(old_sha1, commit->object.sha1, fn, prefix,
ctx.qry.ignorews);
}
return rv;
}
+typedef struct {
+ char * name;
+ char * value;
+} cgit_env_var;
+
+void cgit_prepare_repo_env(struct cgit_repo * repo)
+{
+ cgit_env_var env_vars[] = {
+ { .name = "CGIT_REPO_URL", .value = repo->url },
+ { .name = "CGIT_REPO_NAME", .value = repo->name },
+ { .name = "CGIT_REPO_PATH", .value = repo->path },
+ { .name = "CGIT_REPO_OWNER", .value = repo->owner },
+ { .name = "CGIT_REPO_DEFBRANCH", .value = repo->defbranch },
+ { .name = "CGIT_REPO_SECTION", .value = repo->section },
+ { .name = "CGIT_REPO_CLONE_URL", .value = repo->clone_url }
+ };
+ int env_var_count = ARRAY_SIZE(env_vars);
+ cgit_env_var *p, *q;
+ static char *warn = "cgit warning: failed to set env: %s=%s\n";
+
+ p = env_vars;
+ q = p + env_var_count;
+ for (; p < q; p++)
+ if (p->value && setenv(p->name, p->value, 1))
+ fprintf(stderr, warn, p->name, p->value);
+}
+
int cgit_open_filter(struct cgit_filter *filter)
{