]> git.cameronkatri.com Git - cgit.git/blobdiff - shared.c
Merge branch 'sn/subject-link'
[cgit.git] / shared.c
index 911a55a9a4476482b6333bd82d9abb515787021c..8b3a0457748a3f3ef30b48c8d1aecffa4a2c6b66 100644 (file)
--- a/shared.c
+++ b/shared.c
@@ -48,16 +48,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;
@@ -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;
        }
 
@@ -289,6 +296,10 @@ int cgit_diff_files(const unsigned char *old_sha1,
        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);
+}