gout

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

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 }