Hi, On Fri, 2 Mar 2007, Linus Torvalds wrote: > Doing the pager internally would obviously solve that issue, Ooooooh! A builtin! (Seriously, I thought about that already, but dismissed it for the reasons you said, and more...) > So we're in the situation where: > > - the pager process *will* wait until actual data is starting to appear, > so we *can* have some side-band channel to tell it "oh, btw, if there > is a pager, this is going to be image data, so start up an external > image viewer instead". > > - but I don't have a good clue what side-band to use. We could use > a special "FILE *pagerdata", of course (which would just be fd#3 in > the pager). Then, "git show" could just do something like > > if (pager_in_use) > fprintf(pagerdata, "'%s'\n", type); > > and we could change pager.c to do something like the appended patch. > > but I have to say, it looks a bit strange. The obvious thing, of course, is a git-show specific solution (this is no patch, it only illustrates my idea): builtin-log.c | 11 +++++++++++ git.c | 2 +- 2 files changed, 12 insertions(+), 1 deletions(-) diff --git a/builtin-log.c b/builtin-log.c index 1c9f7d0..83e6cea 100644 --- a/builtin-log.c +++ b/builtin-log.c @@ -123,6 +123,7 @@ int cmd_show(int argc, const char **argv, const char *prefix) struct rev_info rev; struct object_array_entry *objects; int i, count, ret = 0; + enum { NO_PAGER, TEXT_PAGER, OTHER_PAGER } pager_mode = NO_PAGER; git_config(git_log_config); init_revisions(&rev, prefix); @@ -140,6 +141,16 @@ int cmd_show(int argc, const char **argv, const char *prefix) for (i = 0; i < count && !ret; i++) { struct object *o = objects[i].item; const char *name = objects[i].name; + if (o->type == OBJ_BLOB) { + /* determine if name falls into some special class */ + if (pager_mode == NO_PAGER && + setup_special_pager(name)) + pager_mode = OTHER_PAGER; + } + if (pager_mode == NO_PAGER) { + setup_pager(); + pager_mode = TEXT_PAGER; + } switch (o->type) { case OBJ_BLOB: ret = show_object(o->sha1, 0); diff --git a/git.c b/git.c index 909adf2..a3811e6 100644 --- a/git.c +++ b/git.c @@ -291,7 +291,7 @@ static void handle_internal_command(int argc, const char **argv, char **envp) { "runstatus", cmd_runstatus, RUN_SETUP | DISALLOW_IN_GIT_DIR }, { "shortlog", cmd_shortlog, RUN_SETUP | USE_PAGER }, { "show-branch", cmd_show_branch, RUN_SETUP }, - { "show", cmd_show, RUN_SETUP | USE_PAGER }, + { "show", cmd_show, RUN_SETUP }, { "stripspace", cmd_stripspace }, { "symbolic-ref", cmd_symbolic_ref, RUN_SETUP }, { "tar-tree", cmd_tar_tree }, - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html