dotfiles

My PC Dotfiles & Website
commit eecf8a942132e5752394dc4850617d707ab970e3
parent cd74933572fadd4fe31ab2284025366f3eaa91db
Author: maydayv7 <maydayv7@gmail.com>
Date:   Wed, 23 Sep 2026 19:48:55 +0530

fix(gitsite): Content limit

Diffstat:

Msite/git/stagit/README.md | 1+
Msite/git/stagit/render.py | 18+++++++++++++++---
Msite/git/stagit/stagit.c | 24++++++++++++++++++++----
3 files changed, 36 insertions(+), 7 deletions(-)

diff --git a/site/git/stagit/README.md b/site/git/stagit/README.md @@ -14,6 +14,7 @@ This is my personal fork of [stagit](https://git.codemadness.org/stagit/). - Code syntax highlighting with [Pygments](https://pygments.org/) - Markdown rendering with [Python-Markdown](https://github.com/Python-Markdown/markdown) - Tables, task lists, GitHub callouts and math markup +- File and diff previews limited to 2 MiB - Modified markup and shared elements through the website's [build](../default.nix) and [assembly](../assemble.py) ## Usage diff --git a/site/git/stagit/render.py b/site/git/stagit/render.py @@ -10,8 +10,9 @@ from pygments.formatters import HtmlFormatter from pygments.lexers import get_lexer_for_filename, TextLexer from pygments.util import ClassNotFound -# Highlighting Limit +# Preview Limits MAX_HIGHLIGHT = 512 * 1024 +MAX_OUTPUT = 8 * 1024 * 1024 FORMAT = HtmlFormatter( cssclass="highlight", linenos="inline", @@ -83,6 +84,8 @@ def safe_attribute(tag, attr, value): def render(filename, contents): + lexer = TextLexer() if len(contents) > MAX_HIGHLIGHT else lexer_for(filename) + print(f"Filename: {filename!r}; Lexer: {lexer.name}.", file=sys.stderr, flush=True) rendered = "" if len(contents) <= MAX_HIGHLIGHT and filename.lower().endswith( (".md", ".markdown", ".mdown") @@ -104,6 +107,7 @@ def render(filename, contents): + markup + "</article><h3>Code</h3>" ) + print("Markdown was rendered in addition.", file=sys.stderr, flush=True) if len(contents) > MAX_HIGHLIGHT: # Plain Text code = ( @@ -115,8 +119,16 @@ def render(filename, contents): + "</pre>" ) else: - code = highlight(contents, lexer_for(filename), FORMAT) - return rendered + '<div id="blob">' + code + "</div>" + code = highlight(contents, lexer, FORMAT) + result = rendered + '<div id="blob">' + code + "</div>" + if len(result.encode("utf-8")) > MAX_OUTPUT: + print( + f"Skipping {filename!r}: rendered HTML exceeds 8 MiB.", + file=sys.stderr, + flush=True, + ) + return "<p>File is too large to display.</p>" + return result if __name__ == "__main__": diff --git a/site/git/stagit/stagit.c b/site/git/stagit/stagit.c @@ -18,6 +18,7 @@ #include "compat.h" #define CMD_BUFSIZE 255 +#define MAX_CONTENT_SIZE (2 * 1024 * 1024) #define LEN(s) (sizeof(s) / sizeof(*s)) @@ -651,6 +652,7 @@ void printshowfile(FILE *fp, struct commitinfo *ci) { const git_diff_line *line; git_patch *patch; size_t nhunks, nhunklines, changed, add, del, total, i, j, k; + size_t diffsize = 0; char linestr[80]; int c; @@ -659,9 +661,15 @@ void printshowfile(FILE *fp, struct commitinfo *ci) { if (!ci->deltas) return; + for (i = 0; i < ci->ndeltas; i++) { + diffsize += git_patch_size(ci->deltas[i]->patch, 1, 1, 1); + if (diffsize > MAX_CONTENT_SIZE) + break; + } if (ci->filecount > 1000 || ci->ndeltas > 1000 || ci->addcount > 100000 || - ci->delcount > 100000) { + ci->delcount > 100000 || diffsize > MAX_CONTENT_SIZE) { fputs("Diff is too large, output suppressed.\n", fp); + fprintf(stderr, "Skipping diff %s: preview limit exceeded.\n", ci->oid); return; } @@ -1006,10 +1014,18 @@ size_t writeblob(git_object *obj, const char *fpath, const char *filename, fprintf(fp, " (%zuB)", filesize); fputs("</p><hr/>", fp); - if (git_blob_is_binary((git_blob *)obj)) + if (filesize > MAX_CONTENT_SIZE) { + fprintf(fp, "<p>File is too large to display (limit: %d MiB).</p>\n", + MAX_CONTENT_SIZE / (1024 * 1024)); + fprintf(stderr, "Skipping %s (%zu bytes): preview limit exceeded.\n", + filename, filesize); + } else if (filesize && git_blob_data_is_binary( + git_blob_rawcontent((git_blob *)obj), filesize)) { fputs("<p>Binary file.</p>\n", fp); - else + fprintf(stderr, "Skipping %s: binary file.\n", filename); + } else { lc = writeblobhtml(filename, fp, (git_blob *)obj); + } writefooter(fp); checkfileerror(fp, fpath, 'w'); @@ -1108,7 +1124,7 @@ int writefilestree(FILE *fp, git_tree *tree, const char *path) { } filesize = git_blob_rawsize((git_blob *)obj); - lc = writeblob(obj, filepath, entryname, filesize); + lc = writeblob(obj, filepath, entrypath, filesize); fputs("<tr><td>", fp); fputs(filemode(git_tree_entry_filemode(entry)), fp);