repo_writer.c (7221B)
1 #include "writer/repo_writer.h" 2 3 #include <assert.h> 4 #include <err.h> 5 #include <stdlib.h> 6 7 #include "utils.h" 8 #include "writer/gemini/repo_writer.h" 9 #include "writer/gopher/repo_writer.h" 10 #include "writer/html/repo_writer.h" 11 12 typedef struct RepoWriterOps { 13 void (*set_log_cachefile)(void* writer, const char* cachefile); 14 void (*set_log_commit_limit)(void* writer, size_t count); 15 void (*set_baseurl)(void* writer, const char* baseurl); 16 void (*begin)(void* writer); 17 void (*add_commit)(void* writer, const GitCommit* commit); 18 void (*add_reference)(void* writer, const GitReference* ref); 19 void (*add_file)(void* writer, const GitFile* file); 20 void (*end)(void* writer); 21 void (*free)(void* writer); 22 } RepoWriterOps; 23 24 struct RepoWriter { 25 const RepoWriterOps* ops; 26 void* impl; 27 }; 28 29 static void html_repo_set_log_cachefile(void* impl, const char* cachefile) { 30 html_repowriter_set_log_cachefile(impl, cachefile); 31 } 32 33 static void html_repo_set_log_commit_limit(void* impl, size_t count) { 34 html_repowriter_set_log_commit_limit(impl, count); 35 } 36 37 static void html_repo_set_baseurl(void* impl, const char* baseurl) { 38 html_repowriter_set_baseurl(impl, baseurl); 39 } 40 41 static void html_repo_begin(void* impl) { 42 html_repowriter_begin(impl); 43 } 44 45 static void html_repo_add_commit(void* impl, const GitCommit* commit) { 46 html_repowriter_add_commit(impl, commit); 47 } 48 49 static void html_repo_add_reference(void* impl, const GitReference* ref) { 50 html_repowriter_add_reference(impl, ref); 51 } 52 53 static void html_repo_add_file(void* impl, const GitFile* file) { 54 html_repowriter_add_file(impl, file); 55 } 56 57 static void html_repo_end(void* impl) { 58 html_repowriter_end(impl); 59 } 60 61 static void html_repo_free(void* impl) { 62 html_repowriter_free(impl); 63 } 64 65 static const RepoWriterOps kHtmlRepoWriterOps = { 66 .set_log_cachefile = html_repo_set_log_cachefile, 67 .set_log_commit_limit = html_repo_set_log_commit_limit, 68 .set_baseurl = html_repo_set_baseurl, 69 .begin = html_repo_begin, 70 .add_commit = html_repo_add_commit, 71 .add_reference = html_repo_add_reference, 72 .add_file = html_repo_add_file, 73 .end = html_repo_end, 74 .free = html_repo_free, 75 }; 76 77 static void gopher_repo_set_log_cachefile(void* impl, const char* cachefile) { 78 gopher_repowriter_set_log_cachefile(impl, cachefile); 79 } 80 81 static void gopher_repo_set_log_commit_limit(void* impl, size_t count) { 82 gopher_repowriter_set_log_commit_limit(impl, count); 83 } 84 85 static void gopher_repo_set_baseurl(void* impl, const char* baseurl) { 86 gopher_repowriter_set_baseurl(impl, baseurl); 87 } 88 89 static void gopher_repo_begin(void* impl) { 90 gopher_repowriter_begin(impl); 91 } 92 93 static void gopher_repo_add_commit(void* impl, const GitCommit* commit) { 94 gopher_repowriter_add_commit(impl, commit); 95 } 96 97 static void gopher_repo_add_reference(void* impl, const GitReference* ref) { 98 gopher_repowriter_add_reference(impl, ref); 99 } 100 101 static void gopher_repo_add_file(void* impl, const GitFile* file) { 102 gopher_repowriter_add_file(impl, file); 103 } 104 105 static void gopher_repo_end(void* impl) { 106 gopher_repowriter_end(impl); 107 } 108 109 static void gopher_repo_free(void* impl) { 110 gopher_repowriter_free(impl); 111 } 112 113 static const RepoWriterOps kGopherRepoWriterOps = { 114 .set_log_cachefile = gopher_repo_set_log_cachefile, 115 .set_log_commit_limit = gopher_repo_set_log_commit_limit, 116 .set_baseurl = gopher_repo_set_baseurl, 117 .begin = gopher_repo_begin, 118 .add_commit = gopher_repo_add_commit, 119 .add_reference = gopher_repo_add_reference, 120 .add_file = gopher_repo_add_file, 121 .end = gopher_repo_end, 122 .free = gopher_repo_free, 123 }; 124 125 static void gemini_repo_set_log_cachefile(void* impl, const char* cachefile) { 126 gemini_repowriter_set_log_cachefile(impl, cachefile); 127 } 128 129 static void gemini_repo_set_log_commit_limit(void* impl, size_t count) { 130 gemini_repowriter_set_log_commit_limit(impl, count); 131 } 132 133 static void gemini_repo_set_baseurl(void* impl, const char* baseurl) { 134 gemini_repowriter_set_baseurl(impl, baseurl); 135 } 136 137 static void gemini_repo_begin(void* impl) { 138 gemini_repowriter_begin(impl); 139 } 140 141 static void gemini_repo_add_commit(void* impl, const GitCommit* commit) { 142 gemini_repowriter_add_commit(impl, commit); 143 } 144 145 static void gemini_repo_add_reference(void* impl, const GitReference* ref) { 146 gemini_repowriter_add_reference(impl, ref); 147 } 148 149 static void gemini_repo_add_file(void* impl, const GitFile* file) { 150 gemini_repowriter_add_file(impl, file); 151 } 152 153 static void gemini_repo_end(void* impl) { 154 gemini_repowriter_end(impl); 155 } 156 157 static void gemini_repo_free(void* impl) { 158 gemini_repowriter_free(impl); 159 } 160 161 static const RepoWriterOps kGeminiRepoWriterOps = { 162 .set_log_cachefile = gemini_repo_set_log_cachefile, 163 .set_log_commit_limit = gemini_repo_set_log_commit_limit, 164 .set_baseurl = gemini_repo_set_baseurl, 165 .begin = gemini_repo_begin, 166 .add_commit = gemini_repo_add_commit, 167 .add_reference = gemini_repo_add_reference, 168 .add_file = gemini_repo_add_file, 169 .end = gemini_repo_end, 170 .free = gemini_repo_free, 171 }; 172 173 RepoWriter* repowriter_create(RepoWriterType type, 174 GitRepo* repo, 175 const FileSystem* fs) { 176 assert(repo != NULL); 177 assert(fs != NULL); 178 RepoWriter* writer = ecalloc(1, sizeof(RepoWriter)); 179 switch (type) { 180 case kRepoWriterTypeHtml: 181 writer->ops = &kHtmlRepoWriterOps; 182 writer->impl = html_repowriter_create(repo, fs); 183 return writer; 184 case kRepoWriterTypeGopher: 185 writer->ops = &kGopherRepoWriterOps; 186 writer->impl = gopher_repowriter_create(repo, fs); 187 return writer; 188 case kRepoWriterTypeGemini: 189 writer->ops = &kGeminiRepoWriterOps; 190 writer->impl = gemini_repowriter_create(repo, fs); 191 return writer; 192 } 193 free(writer); 194 errx(1, "unknown RepoWriterType %d", type); 195 } 196 197 void repowriter_free(RepoWriter* writer) { 198 if (!writer) { 199 return; 200 } 201 writer->ops->free(writer->impl); 202 writer->impl = NULL; 203 free(writer); 204 } 205 206 void repowriter_set_log_cachefile(RepoWriter* writer, const char* cachefile) { 207 assert(writer != NULL); 208 assert(cachefile != NULL); 209 writer->ops->set_log_cachefile(writer->impl, cachefile); 210 } 211 212 void repowriter_set_log_commit_limit(RepoWriter* writer, size_t count) { 213 assert(writer != NULL); 214 writer->ops->set_log_commit_limit(writer->impl, count); 215 } 216 217 void repowriter_set_baseurl(RepoWriter* writer, const char* baseurl) { 218 assert(writer != NULL); 219 assert(baseurl != NULL); 220 writer->ops->set_baseurl(writer->impl, baseurl); 221 } 222 223 void repowriter_begin(RepoWriter* writer) { 224 assert(writer != NULL); 225 writer->ops->begin(writer->impl); 226 } 227 228 void repowriter_add_commit(RepoWriter* writer, const GitCommit* commit) { 229 assert(writer != NULL); 230 assert(commit != NULL); 231 writer->ops->add_commit(writer->impl, commit); 232 } 233 234 void repowriter_add_reference(RepoWriter* writer, const GitReference* ref) { 235 assert(writer != NULL); 236 assert(ref != NULL); 237 writer->ops->add_reference(writer->impl, ref); 238 } 239 240 void repowriter_add_file(RepoWriter* writer, const GitFile* file) { 241 assert(writer != NULL); 242 assert(file != NULL); 243 writer->ops->add_file(writer->impl, file); 244 } 245 246 void repowriter_end(RepoWriter* writer) { 247 assert(writer != NULL); 248 writer->ops->end(writer->impl); 249 }