gitweb/lib - Simple output capture by redirecting STDOUT
authorJakub Narebski <jnareb@gmail.com>
Sun, 5 Dec 2010 20:48:50 +0000 (21:48 +0100)
committerJakub Narebski <jnareb@gmail.com>
Sun, 5 Dec 2010 20:48:50 +0000 (21:48 +0100)
commit0f9570775f808a18d834a225d785aeea6bebf10c
tree1aa60b888a8011737100de5d6fc7bf31cfe65eee
parent93464ea4b4f0f573740bed91d0f2a1da9c1fe512
gitweb/lib - Simple output capture by redirecting STDOUT

Add GitwebCache::Capture::Simple package, which captures output by
redirecting STDOUT to in-memory file (saving what is printed to
scalar), earlier saving original STDOUT to restore it when finished
capturing.

GitwebCache::Capture::Simple preserves PerlIO layers, both those set
before started capturing output, and those set during capture.  The
exceptions is the 'scalar' layer, which needs additional parameter,
and which for proper handling needs non-core module PerlIO::Util.

No care was taken to handle the following special cases (prior to
starting capture): closed STDOUT, STDOUT reopened to scalar reference,
tied STDOUT.  You shouldn't modify STDOUT during capture.

Includes separate tests for capturing output in
t9504/test_capture_interface.pl which is run as external test from
t9504-gitweb-capture-interface.sh.  It tests capturing of utf8 data
printed in :utf8 mode, and of binary data (containing invalid utf8) in
:raw mode.

Note that nested capturing doesn't work (and probably couldn't be made
to work when capturing to in-memory file), but this feature wouldn't
be needed for capturing gitweb output (to cache it).

This patch was based on "gitweb: add output buffering and associated
functions" patch by John 'Warthog9' Hawley (J.H.) in "Gitweb caching v7"
series, and on code of Capture::Tiny by David Golden (Apache License 2.0).

Based-on-work-by: John 'Warthog9' Hawley <warthog9@kernel.org>
Signed-off-by: Jakub Narebski <jnareb@gmail.com>
gitweb/lib/GitwebCache/Capture/Simple.pm [new file with mode: 0644]
t/t9504-gitweb-capture-interface.sh [new file with mode: 0755]
t/t9504/test_capture_interface.pl [new file with mode: 0755]