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 }