stagit
Personal fork of stagit
git clone git://mccd.space/stagitcommit 045bb7e6a9ca2c33c5cc89043c99d5a8512d4511
parent 46feee82b6b31b87c8d8f88fa8e467b2129200d6
Author: Marc <marc@coquand.email>
Date: Sun, 19 Jul 2026 10:29:46 +0200
Support raw-html render for README
Diffstat:
1 file changed, 21 insertions(+), 2 deletions(-)
diff --git a/stagit.c b/stagit.c
@@ -70,7 +70,7 @@ static char cloneurl[1024];
static char *submodules;
static char *licensefiles[] = { "HEAD:LICENSE", "HEAD:LICENSE.md", "HEAD:LICENSE.txt", "HEAD:COPYING" };
static char *license;
-static char *readmefiles[] = { "HEAD:README", "HEAD:README.md" };
+static char *readmefiles[] = { "HEAD:README", "HEAD:README.md", "HEAD:README.html" };
static char *readme;
static long long nlogcommits = -1; /* -1 indicates not used */
@@ -957,14 +957,30 @@ writeatom(FILE *fp, int all)
return 0;
}
+int
+hassuffix(const char *str, const char *suffix)
+{
+ size_t len = strlen(str), suffixlen = strlen(suffix);
+
+ return len >= suffixlen && !strcmp(str + len - suffixlen, suffix);
+}
+
size_t
writeblob(git_object *obj, const char *fpath, const char *filename, size_t filesize)
{
char tmp[PATH_MAX] = "", *d;
const char *p;
+ int r, rawhtml = 0;
size_t lc = 0;
FILE *fp;
+ /* an HTML README is rendered as-is instead of shown as source */
+ if (readme && hassuffix(readme, ".html")) {
+ r = snprintf(tmp, sizeof(tmp), "file/%s.html", readme);
+ if (r >= 0 && (size_t)r < sizeof(tmp))
+ rawhtml = !strcmp(fpath, tmp);
+ }
+
if (strlcpy(tmp, fpath, sizeof(tmp)) >= sizeof(tmp))
errx(1, "path truncated: '%s'", fpath);
if (!(d = dirname(tmp)))
@@ -985,7 +1001,10 @@ writeblob(git_object *obj, const char *fpath, const char *filename, size_t files
fprintf(fp, " (%zuB)", filesize);
fputs("</p>", fp);
- if (git_blob_is_binary((git_blob *)obj))
+ if (rawhtml)
+ fwrite(git_blob_rawcontent((git_blob *)obj), 1,
+ git_blob_rawsize((git_blob *)obj), fp);
+ else if (git_blob_is_binary((git_blob *)obj))
fputs("<p>Binary file.</p>\n", fp);
else
lc = writeblobhtml(fp, (git_blob *)obj);