repo_writer.c (4100B)
1 #include "writer/html/repo_writer.h" 2 3 #include <err.h> 4 #include <limits.h> 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <sys/stat.h> 8 #include <sys/types.h> 9 10 #include "git/commit.h" 11 #include "git/file.h" 12 #include "git/reference.h" 13 #include "utils.h" 14 #include "writer/atom/atom.h" 15 #include "writer/html/commit.h" 16 #include "writer/html/fileblob.h" 17 #include "writer/html/files.h" 18 #include "writer/html/log.h" 19 #include "writer/html/refs.h" 20 21 struct HtmlRepoWriter { 22 const GitRepo* repo; 23 HtmlRefs* refs; 24 HtmlLog* log; 25 Atom* atom; 26 Atom* tags; 27 HtmlFiles* files; 28 }; 29 30 HtmlRepoWriter* html_repowriter_create(const GitRepo* repo) { 31 HtmlRepoWriter* writer = ecalloc(1, sizeof(HtmlRepoWriter)); 32 writer->repo = repo; 33 writer->refs = html_refs_create(repo); 34 writer->log = html_log_create(repo); 35 writer->atom = atom_create(repo, kAtomTypeAll); 36 writer->tags = atom_create(repo, kAtomTypeTags); 37 writer->files = html_files_create(repo); 38 return writer; 39 } 40 41 void html_repowriter_free(HtmlRepoWriter* writer) { 42 if (!writer) { 43 return; 44 } 45 html_refs_free(writer->refs); 46 writer->refs = NULL; 47 html_log_free(writer->log); 48 writer->log = NULL; 49 atom_free(writer->atom); 50 writer->atom = NULL; 51 atom_free(writer->tags); 52 writer->tags = NULL; 53 html_files_free(writer->files); 54 writer->files = NULL; 55 free(writer); 56 } 57 58 void html_repowriter_set_log_cachefile(HtmlRepoWriter* writer, 59 const char* cachefile) { 60 html_log_set_cachefile(writer->log, cachefile); 61 } 62 63 void html_repowriter_set_log_commit_limit(HtmlRepoWriter* writer, 64 size_t count) { 65 html_log_set_commit_limit(writer->log, count); 66 } 67 68 void html_repowriter_set_baseurl(HtmlRepoWriter* writer, const char* baseurl) { 69 atom_set_baseurl(writer->atom, baseurl); 70 atom_set_baseurl(writer->tags, baseurl); 71 } 72 73 void html_repowriter_begin(HtmlRepoWriter* writer) { 74 mkdir("commit", S_IRWXU | S_IRWXG | S_IRWXO); 75 mkdir("file", S_IRWXU | S_IRWXG | S_IRWXO); 76 77 html_refs_begin(writer->refs); 78 html_log_begin(writer->log); 79 atom_begin(writer->atom); 80 atom_begin(writer->tags); 81 html_files_begin(writer->files); 82 } 83 84 void html_repowriter_add_commit(HtmlRepoWriter* writer, 85 const GitCommit* git_commit) { 86 char filename[PATH_MAX]; 87 if (snprintf(filename, sizeof(filename), "%s.html", 88 gitcommit_oid(git_commit)) < 0) { 89 err(1, "snprintf"); 90 } 91 char* path = path_concat("commit", filename); 92 atom_add_commit(writer->atom, git_commit, path, "text/html", ""); 93 free(path); 94 95 if (html_log_can_add_commits(writer->log)) { 96 html_log_add_commit(writer->log, git_commit); 97 HtmlCommit* commit = 98 html_commit_create(writer->repo, gitcommit_oid(git_commit), 99 gitcommit_summary(git_commit)); 100 html_commit_begin(commit); 101 html_commit_add_commit(commit, git_commit); 102 html_commit_end(commit); 103 html_commit_free(commit); 104 } 105 } 106 107 void html_repowriter_add_reference(HtmlRepoWriter* writer, 108 const GitReference* ref) { 109 html_refs_add_ref(writer->refs, ref); 110 if (gitreference_type(ref) == kReftypeTag) { 111 GitCommit* commit = gitreference_commit(ref); 112 char filename[PATH_MAX]; 113 if (snprintf(filename, sizeof(filename), "%s.html", gitcommit_oid(commit)) < 114 0) { 115 err(1, "snprintf"); 116 } 117 char* path = path_concat("commit", filename); 118 atom_add_commit(writer->tags, commit, path, "text/html", 119 gitreference_shorthand(ref)); 120 free(path); 121 } 122 } 123 124 void html_repowriter_add_file(HtmlRepoWriter* writer, const GitFile* file) { 125 html_files_add_file(writer->files, file); 126 127 HtmlFileBlob* blob = 128 html_fileblob_create(writer->repo, gitfile_repo_path(file)); 129 html_fileblob_begin(blob); 130 html_fileblob_add_file(blob, file); 131 html_fileblob_end(blob); 132 html_fileblob_free(blob); 133 } 134 135 void html_repowriter_end(HtmlRepoWriter* writer) { 136 html_refs_end(writer->refs); 137 html_log_end(writer->log); 138 atom_end(writer->atom); 139 atom_end(writer->tags); 140 html_files_end(writer->files); 141 }