stagit

Personal fork of stagit

git clone git://mccd.space/stagit
commit 045bb7e6a9ca2c33c5cc89043c99d5a8512d4511
parent 46feee82b6b31b87c8d8f88fa8e467b2129200d6
Author: Marc <marc@coquand.email>
Date:   Sun, 19 Jul 2026 10:29:46 +0200

Support raw-html render for README

Diffstat:
Mstagit.c | 23+++++++++++++++++++++--
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);