gout

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

repo_writer.c (4249B)


      1 #include "writer/gopher/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/gopher/commit.h"
     16 #include "writer/gopher/fileblob.h"
     17 #include "writer/gopher/files.h"
     18 #include "writer/gopher/log.h"
     19 #include "writer/gopher/refs.h"
     20 
     21 struct GopherRepoWriter {
     22   const GitRepo* repo;
     23   GopherRefs* refs;
     24   GopherLog* log;
     25   Atom* atom;
     26   Atom* tags;
     27   GopherFiles* files;
     28 };
     29 
     30 GopherRepoWriter* gopher_repowriter_create(const GitRepo* repo) {
     31   GopherRepoWriter* writer = ecalloc(1, sizeof(GopherRepoWriter));
     32   writer->repo = repo;
     33   writer->refs = gopher_refs_create(repo);
     34   writer->log = gopher_log_create(repo);
     35   writer->atom = atom_create(repo, kAtomTypeAll);
     36   writer->tags = atom_create(repo, kAtomTypeTags);
     37   writer->files = gopher_files_create(repo);
     38   return writer;
     39 }
     40 
     41 void gopher_repowriter_free(GopherRepoWriter* writer) {
     42   if (!writer) {
     43     return;
     44   }
     45   gopher_refs_free(writer->refs);
     46   writer->refs = NULL;
     47   gopher_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   gopher_files_free(writer->files);
     54   writer->files = NULL;
     55   free(writer);
     56 }
     57 
     58 void gopher_repowriter_set_log_cachefile(GopherRepoWriter* writer,
     59                                            const char* cachefile) {
     60   gopher_log_set_cachefile(writer->log, cachefile);
     61 }
     62 
     63 void gopher_repowriter_set_log_commit_limit(GopherRepoWriter* writer,
     64                                             size_t count) {
     65   gopher_log_set_commit_limit(writer->log, count);
     66 }
     67 
     68 void gopher_repowriter_set_baseurl(GopherRepoWriter* writer,
     69                                    const char* baseurl) {
     70   atom_set_baseurl(writer->atom, baseurl);
     71   atom_set_baseurl(writer->tags, baseurl);
     72 }
     73 
     74 void gopher_repowriter_begin(GopherRepoWriter* writer) {
     75   mkdir("commit", S_IRWXU | S_IRWXG | S_IRWXO);
     76   mkdir("file", S_IRWXU | S_IRWXG | S_IRWXO);
     77 
     78   gopher_refs_begin(writer->refs);
     79   gopher_log_begin(writer->log);
     80   atom_begin(writer->atom);
     81   atom_begin(writer->tags);
     82   gopher_files_begin(writer->files);
     83 }
     84 
     85 void gopher_repowriter_add_commit(GopherRepoWriter* writer,
     86                                   const GitCommit* git_commit) {
     87   char filename[PATH_MAX];
     88   if (snprintf(filename, sizeof(filename), "%s.gph",
     89                gitcommit_oid(git_commit)) < 0) {
     90     err(1, "snprintf");
     91   }
     92   char* path = path_concat("commit", filename);
     93   atom_add_commit(writer->atom, git_commit, path, "", "");
     94   free(path);
     95 
     96   if (gopher_log_can_add_commits(writer->log)) {
     97     gopher_log_add_commit(writer->log, git_commit);
     98     GopherCommit* commit =
     99         gopher_commit_create(writer->repo, gitcommit_oid(git_commit),
    100                              gitcommit_summary(git_commit));
    101     gopher_commit_begin(commit);
    102     gopher_commit_add_commit(commit, git_commit);
    103     gopher_commit_end(commit);
    104     gopher_commit_free(commit);
    105   }
    106 }
    107 
    108 void gopher_repowriter_add_reference(GopherRepoWriter* writer,
    109                                      const GitReference* ref) {
    110   gopher_refs_add_ref(writer->refs, ref);
    111   if (gitreference_type(ref) == kReftypeTag) {
    112     GitCommit* commit = gitreference_commit(ref);
    113     char filename[PATH_MAX];
    114     if (snprintf(filename, sizeof(filename), "%s.gph", gitcommit_oid(commit)) <
    115         0) {
    116       err(1, "snprintf");
    117     }
    118     char* path = path_concat("commit", filename);
    119     atom_add_commit(writer->tags, commit, path, "",
    120                     gitreference_shorthand(ref));
    121     free(path);
    122   }
    123 }
    124 
    125 void gopher_repowriter_add_file(GopherRepoWriter* writer, const GitFile* file) {
    126   gopher_files_add_file(writer->files, file);
    127 
    128   GopherFileBlob* blob =
    129       gopher_fileblob_create(writer->repo, gitfile_repo_path(file));
    130   gopher_fileblob_begin(blob);
    131   gopher_fileblob_add_file(blob, file);
    132   gopher_fileblob_end(blob);
    133   gopher_fileblob_free(blob);
    134 }
    135 
    136 void gopher_repowriter_end(GopherRepoWriter* writer) {
    137   gopher_refs_end(writer->refs);
    138   gopher_log_end(writer->log);
    139   atom_end(writer->atom);
    140   atom_end(writer->tags);
    141   gopher_files_end(writer->files);
    142 }