All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Shawn O. Pearce" <spearce@spearce.org>
To: Junio C Hamano <junkio@cox.net>
Cc: git@vger.kernel.org
Subject: [PATCH 3/4] Enable output buffering in merge-recursive.
Date: Sun, 14 Jan 2007 00:28:53 -0500	[thread overview]
Message-ID: <20070114052853.GC19113@spearce.org> (raw)
In-Reply-To: <d352c8adb1ec1c4e74b33d51d397d5756b82ceac.1168752482.git.spearce@spearce.org>

Buffering all message output until a merge invocation is complete is
necessary to prevent intereferring with a progress meter that would
indicate the number of files completely merged, and how many remain.
This change does not introduce a progress meter, but merely lays
the groundwork to buffer the output.

To aid debugging output buffering is only enabled if verbosity
is lower than 5.  When using verbosity levels above 5 the user is
probably debugging the merge program itself and does not want to
see the output delayed, especially if they are stepping through
portions of the code in a debugger.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 merge-recursive.c |   40 +++++++++++++++++++++++++++++++++++++++-
 1 files changed, 39 insertions(+), 1 deletions(-)

diff --git a/merge-recursive.c b/merge-recursive.c
index 05f9311..c16062b 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -67,11 +67,19 @@ struct stage_data
 	unsigned processed:1;
 };
 
+struct output_buffer
+{
+	struct output_buffer *next;
+	char *str;
+};
+
 static struct path_list current_file_set = {NULL, 0, 0, 1};
 static struct path_list current_directory_set = {NULL, 0, 0, 1};
 
 static int call_depth = 0;
 static int verbosity = 2;
+static int buffer_output = 1;
+static struct output_buffer *output_list, *output_end;
 
 static int show (int v)
 {
@@ -82,7 +90,16 @@ static void output(int v, const char *fmt, ...)
 {
 	va_list args;
 	va_start(args, fmt);
-	if (show(v)) {
+	if (buffer_output && show(v)) {
+		struct output_buffer *b = xmalloc(sizeof(*b));
+		nfvasprintf(&b->str, fmt, args);
+		b->next = NULL;
+		if (output_end)
+			output_end->next = b;
+		else
+			output_list = b;
+		output_end = b;
+	} else if (show(v)) {
 		int i;
 		for (i = call_depth; i--;)
 			fputs("  ", stdout);
@@ -92,9 +109,27 @@ static void output(int v, const char *fmt, ...)
 	va_end(args);
 }
 
+static void flush_output()
+{
+	struct output_buffer *b, *n;
+	for (b = output_list; b; b = n) {
+		int i;
+		for (i = call_depth; i--;)
+			fputs("  ", stdout);
+		fputs(b->str, stdout);
+		fputc('\n', stdout);
+		n = b->next;
+		free(b->str);
+		free(b);
+	}
+	output_list = NULL;
+	output_end = NULL;
+}
+
 static void output_commit_title(struct commit *commit)
 {
 	int i;
+	flush_output();
 	for (i = call_depth; i--;)
 		fputs("  ", stdout);
 	if (commit->util)
@@ -1175,6 +1210,7 @@ static int merge(struct commit *h1,
 		commit_list_insert(h1, &(*result)->parents);
 		commit_list_insert(h2, &(*result)->parents->next);
 	}
+	flush_output();
 	return clean;
 }
 
@@ -1252,6 +1288,8 @@ int main(int argc, char *argv[])
 
 	branch1 = better_branch_name(branch1);
 	branch2 = better_branch_name(branch2);
+	if (verbosity >= 5)
+		buffer_output = 0;
 	if (show(3))
 		printf("Merging %s with %s\n", branch1, branch2);
 
-- 
1.5.0.rc1.g4494

  parent reply	other threads:[~2007-01-14  5:29 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <d352c8adb1ec1c4e74b33d51d397d5756b82ceac.1168752482.git.spearce@spearce.org>
2007-01-14  5:28 ` [PATCH 2/4] Allow the user to control the verbosity of merge-recursive Shawn O. Pearce
2007-01-14  5:28 ` Shawn O. Pearce [this message]
2007-01-14  5:28 ` [PATCH 4/4] Display a progress meter during merge-recursive Shawn O. Pearce
2007-01-14 13:04   ` Johannes Schindelin
2007-01-14 19:11     ` Junio C Hamano
2007-01-14 22:50       ` Shawn O. Pearce

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20070114052853.GC19113@spearce.org \
    --to=spearce@spearce.org \
    --cc=git@vger.kernel.org \
    --cc=junkio@cox.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.