gout

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

files.c (1725B)


      1 #include "writer/gemini/files.h"
      2 
      3 #include <assert.h>
      4 #include <err.h>
      5 #include <stdio.h>
      6 #include <stdlib.h>
      7 #include <sys/types.h>
      8 
      9 #include "format.h"
     10 #include "utils.h"
     11 #include "writer/gemini/page.h"
     12 
     13 struct GeminiFiles {
     14   const GitRepo* repo;
     15   const FileSystem* fs;
     16   FILE* out;
     17   GeminiPage* page;
     18 };
     19 
     20 GeminiFiles* gemini_files_create(const GitRepo* repo, const FileSystem* fs) {
     21   assert(repo != NULL);
     22   assert(fs != NULL);
     23   GeminiFiles* files = ecalloc(1, sizeof(GeminiFiles));
     24   files->repo = repo;
     25   files->fs = fs;
     26   files->out = fs->fopen("files.gmi", "w");
     27   if (!files->out) {
     28     err(1, "fopen: files.gmi");
     29   }
     30   files->page = gemini_page_create(files->out, repo, fs, "Files", "");
     31   return files;
     32 }
     33 
     34 void gemini_files_free(GeminiFiles* files) {
     35   if (!files) {
     36     return;
     37   }
     38   files->fs->fclose(files->out);
     39   gemini_page_free(files->page);
     40   free(files);
     41 }
     42 
     43 void gemini_files_begin(GeminiFiles* files) {
     44   assert(files != NULL);
     45   gemini_page_begin(files->page);
     46 }
     47 
     48 void gemini_files_add_file(GeminiFiles* files, const GitFile* file) {
     49   assert(files != NULL);
     50   assert(file != NULL);
     51   FILE* out = files->out;
     52   fprintf(out, "=> file/");
     53   print_percent_encoded(out, file->repo_path);
     54   fprintf(out, ".gmi %s %s", file->mode, file->display_path);
     55 
     56   ssize_t size_lines = file->size_lines;
     57   ssize_t size_bytes = file->size_bytes;
     58   if (size_lines >= 0) {
     59     fprintf(out, " (%zdL)", size_lines);
     60   } else if (size_bytes >= 0) {
     61     fprintf(out, " (%zdB)", size_bytes);
     62   }
     63   const char* oid = file->commit_oid;
     64   if (oid[0] != '\0') {
     65     fprintf(out, " @ %s", oid);
     66   }
     67   fprintf(out, "\n");
     68 }
     69 
     70 void gemini_files_end(GeminiFiles* files) {
     71   assert(files != NULL);
     72   gemini_page_end(files->page);
     73 }