]> git.cameronkatri.com Git - cgit.git/blobdiff - shared.c
Merge branch 'stable'
[cgit.git] / shared.c
index 911a55a9a4476482b6333bd82d9abb515787021c..06f70bb141587c25565664ef42cbdd9b1addec09 100644 (file)
--- a/shared.c
+++ b/shared.c
@@ -10,7 +10,6 @@
 
 struct cgit_repolist cgit_repolist;
 struct cgit_context ctx;
-int cgit_cmd;
 
 int chk_zero(int result, char *msg)
 {
@@ -48,16 +47,19 @@ struct cgit_repo *cgit_add_repo(const char *url)
        }
 
        ret = &cgit_repolist.repos[cgit_repolist.count-1];
+       memset(ret, 0, sizeof(struct cgit_repo));
        ret->url = trim_end(url, '/');
        ret->name = ret->url;
        ret->path = NULL;
        ret->desc = "[no description]";
        ret->owner = NULL;
-       ret->group = ctx.cfg.repo_group;
+       ret->section = ctx.cfg.section;
        ret->defbranch = "master";
        ret->snapshots = ctx.cfg.snapshots;
        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->module_link = ctx.cfg.module_link;
        ret->readme = NULL;
@@ -261,7 +263,8 @@ int filediff_cb(void *priv, mmbuffer_t *mb, int nbuf)
 
 int cgit_diff_files(const unsigned char *old_sha1,
                    const unsigned char *new_sha1, unsigned long *old_size,
-                   unsigned long *new_size, int *binary, linediff_fn fn)
+                   unsigned long *new_size, int *binary, int context,
+                   linediff_fn fn)
 {
        mmfile_t file1, file2;
        xpparam_t diff_params;
@@ -277,6 +280,10 @@ int cgit_diff_files(const unsigned char *old_sha1,
        if ((file1.ptr && buffer_is_binary(file1.ptr, file1.size)) ||
            (file2.ptr && buffer_is_binary(file2.ptr, file2.size))) {
                *binary = 1;
+               if (file1.size)
+                       free(file1.ptr);
+               if (file2.size)
+                       free(file2.ptr);
                return 0;
        }
 
@@ -284,11 +291,15 @@ int cgit_diff_files(const unsigned char *old_sha1,
        memset(&emit_params, 0, sizeof(emit_params));
        memset(&emit_cb, 0, sizeof(emit_cb));
        diff_params.flags = XDF_NEED_MINIMAL;
-       emit_params.ctxlen = 3;
+       emit_params.ctxlen = context > 0 ? context : 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);
+       if (file1.size)
+               free(file1.ptr);
+       if (file2.size)
+               free(file2.ptr);
        return 0;
 }
 
@@ -393,3 +404,31 @@ int cgit_close_filter(struct cgit_filter *filter)
                return 0;
        die("Subprocess %s exited abnormally", filter->cmd);
 }
+
+/* Read the content of the specified file into a newly allocated buffer,
+ * zeroterminate the buffer and return 0 on success, errno otherwise.
+ */
+int readfile(const char *path, char **buf, size_t *size)
+{
+       int fd, e;
+       struct stat st;
+
+       fd = open(path, O_RDONLY);
+       if (fd == -1)
+               return errno;
+       if (fstat(fd, &st)) {
+               e = errno;
+               close(fd);
+               return e;
+       }
+       if (!S_ISREG(st.st_mode)) {
+               close(fd);
+               return EISDIR;
+       }
+       *buf = xmalloc(st.st_size + 1);
+       *size = read_in_full(fd, *buf, st.st_size);
+       e = errno;
+       (*buf)[*size] = '\0';
+       close(fd);
+       return (*size == st.st_size ? 0 : e);
+}