gout

A static git page generator
git clone https://git.bracken.jp/gout.git
Log | Files | Refs | README | LICENSE

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 }