diff options
authorBryce Kwon <bryce@brycekwon.com>
committerBryce Kwon <bryce@brycekwon.com>
commit
parent
tree
download
Let a Lua script write while it loads
A script's top level runs before cgit hooks stdout for it, and the unhook html() began with tripped an assert that aborted cgit.
Diffstat (limited to '')
-rw-r--r--source/filter.c8
-rwxr-xr-xtests/t0201-filters.sh20
2 files changed, 26 insertions, 2 deletions
diff --git a/source/filter.c b/source/filter.c
index ec48007..b36f03e 100644
--- a/source/filter.c
+++ b/source/filter.c
@@ -225,15 +225,19 @@ static inline int emit_unfiltered(lua_State *lua_state, void (*emit)(const char
if (!text)
return 0;
+ // A script that writes while it is still loading runs before cgit has
+ // hooked stdout for it, so there is no hook to take off.
saved_write = filter_write;
saved_filter = current_write_filter;
- unhook_write();
+ if (saved_write)
+ unhook_write();
emit(text);
// emit leaves bytes in the html buffer, so empty it while the hook is
// still off. Re-hooking first would send the page's own bytes back into
// the filter.
html_flush();
- hook_write(saved_filter, saved_write);
+ if (saved_write)
+ hook_write(saved_filter, saved_write);
return 0;
}
diff --git a/tests/t0201-filters.sh b/tests/t0201-filters.sh
index 1dd0910..c2d0ec4 100755
--- a/tests/t0201-filters.sh
+++ b/tests/t0201-filters.sh
@@ -130,4 +130,24 @@ test_expect_success CGIT_LUA 'a failing lua filter still renders an error page'
grep "Lua error in" err
'
+# A script runs its top level before cgit hooks stdout for it, so what it
+# writes there goes straight onto the page instead of tripping the hook.
+test_expect_success CGIT_LUA 'a lua filter that writes while loading still renders' '
+ cat >loud.lua <<-\EOF &&
+ html("written while loading")
+ function filter_open(...) end
+ function filter_write(str) html(str) end
+ function filter_close() return 0 end
+ EOF
+ {
+ echo "cache-size=0" &&
+ echo "repo.url=foo" &&
+ echo "repo.path=$PWD/repos/foo/.git" &&
+ echo "repo.commit-filter=lua:$PWD/loud.lua"
+ } >loudrc &&
+ CGIT_CONFIG="$PWD/loudrc" QUERY_STRING="url=foo/commit" cgit >tmp &&
+ grep "written while loading" tmp &&
+ grep "</html>" tmp
+'
+
test_done