summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2007-01-24 19:21:10 (GMT)
committerJunio C Hamano <junkio@cox.net>2007-02-05 23:42:36 (GMT)
commit35ce862279f68a4798889adcdd90a1698a2c102f (patch)
treeb9b85dd6e58bcdc188ec820d57ae7f522cd442d1
parentb6f5da1e0f4eeb59798b320f97d27f83d19f89df (diff)
downloadgit-35ce862279f68a4798889adcdd90a1698a2c102f.zip
git-35ce862279f68a4798889adcdd90a1698a2c102f.tar.gz
git-35ce862279f68a4798889adcdd90a1698a2c102f.tar.bz2
pager: Work around window resizing bug in 'less'
If you resize the terminal while less is waiting for input, less will exit entirely without even showing the output. This is very noticeable if you do something like "git diff" on a big and cold-cache tree and git takes a few seconds to think, and then you resize the window while it's preparing. Boom. No output AT ALL. The way to reproduce the problem is to do some pager operation that takes a while in git, and resizing the window while git is thinking about the output. Try git diff --stat v2.6.12.. in the kernel tree to do something where it takes a while for git to start outputting information. Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r--pager.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/pager.c b/pager.c
index 4587fbb..5f280ab 100644
--- a/pager.c
+++ b/pager.c
@@ -1,5 +1,7 @@
#include "cache.h"
+#include <sys/select.h>
+
/*
* This is split up from the rest of git so that we might do
* something different on Windows, for example.
@@ -7,6 +9,16 @@
static void run_pager(const char *pager)
{
+ /*
+ * Work around bug in "less" by not starting it until we
+ * have real input
+ */
+ fd_set in;
+
+ FD_ZERO(&in);
+ FD_SET(0, &in);
+ select(1, &in, NULL, &in, NULL);
+
execlp(pager, pager, NULL);
execl("/bin/sh", "sh", "-c", pager, NULL);
}