git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Christian Couder <christian.couder@gmail.com>
To: git@vger.kernel.org
Cc: "Junio C Hamano" <gitster@pobox.com>, "Jeff King" <peff@peff.net>,
	"Ævar Arnfjörð Bjarmason" <avarab@gmail.com>,
	"Karsten Blees" <karsten.blees@gmail.com>,
	"Nguyen Thai Ngoc Duy" <pclouds@gmail.com>,
	"Stefan Beller" <sbeller@google.com>,
	"Eric Sunshine" <sunshine@sunshineco.com>,
	"Ramsay Jones" <ramsay@ramsayjones.plus.com>,
	"Johannes Sixt" <j6t@kdbg.org>, "René Scharfe" <l.s.r@web.de>,
	"Stefan Naewe" <stefan.naewe@atlas-elektronik.com>,
	"Christian Couder" <chriscool@tuxfamily.org>
Subject: [PATCH v14 33/41] apply: make it possible to silently apply
Date: Sun,  4 Sep 2016 22:18:25 +0200	[thread overview]
Message-ID: <20160904201833.21676-34-chriscool@tuxfamily.org> (raw)
In-Reply-To: <20160904201833.21676-1-chriscool@tuxfamily.org>

This changes 'int apply_verbosely' into 'enum apply_verbosity', and
changes the possible values of the variable from a bool to
a tristate.

The previous 'false' state is changed into 'verbosity_normal'.
The previous 'true' state is changed into 'verbosity_verbose'.

The new added state is 'verbosity_silent'. It should prevent
anything to be printed on both stderr and stdout.

This is needed because `git am` wants to first call apply
functionality silently, if it can then fall back on 3-way merge
in case of error.

Printing on stdout, and calls to warning() or error() are not
taken care of in this patch, as that will be done in following
patches.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 apply.c         | 62 +++++++++++++++++++++++++++++++++++++--------------------
 apply.h         |  8 +++++++-
 builtin/apply.c |  2 +-
 3 files changed, 48 insertions(+), 24 deletions(-)

diff --git a/apply.c b/apply.c
index 41a33d3..df85cbc 100644
--- a/apply.c
+++ b/apply.c
@@ -125,8 +125,11 @@ int check_apply_state(struct apply_state *state, int force_apply)
 			return error(_("--3way outside a repository"));
 		state->check_index = 1;
 	}
-	if (state->apply_with_reject)
-		state->apply = state->apply_verbosely = 1;
+	if (state->apply_with_reject) {
+		state->apply = 1;
+		if (state->apply_verbosity == verbosity_normal)
+			state->apply_verbosity = verbosity_verbose;
+	}
 	if (!force_apply && (state->diffstat || state->numstat || state->summary || state->check || state->fake_ancestor))
 		state->apply = 0;
 	if (state->check_index && is_not_gitdir)
@@ -1620,8 +1623,9 @@ static void record_ws_error(struct apply_state *state,
 		return;
 
 	err = whitespace_error_string(result);
-	fprintf(stderr, "%s:%d: %s.\n%.*s\n",
-		state->patch_input_file, linenr, err, len, line);
+	if (state->apply_verbosity > verbosity_silent)
+		fprintf(stderr, "%s:%d: %s.\n%.*s\n",
+			state->patch_input_file, linenr, err, len, line);
 	free(err);
 }
 
@@ -1816,7 +1820,7 @@ static int parse_single_patch(struct apply_state *state,
 		return error(_("new file %s depends on old contents"), patch->new_name);
 	if (0 < patch->is_delete && newlines)
 		return error(_("deleted file %s still has contents"), patch->old_name);
-	if (!patch->is_delete && !newlines && context)
+	if (!patch->is_delete && !newlines && context && state->apply_verbosity > verbosity_silent)
 		fprintf_ln(stderr,
 			   _("** warning: "
 			     "file %s becomes empty but is not deleted"),
@@ -2911,7 +2915,7 @@ static int apply_one_fragment(struct apply_state *state,
 			/* Ignore it, we already handled it */
 			break;
 		default:
-			if (state->apply_verbosely)
+			if (state->apply_verbosity > verbosity_normal)
 				error(_("invalid start of line: '%c'"), first);
 			applied_pos = -1;
 			goto out;
@@ -3026,7 +3030,7 @@ static int apply_one_fragment(struct apply_state *state,
 				state->apply = 0;
 		}
 
-		if (state->apply_verbosely && applied_pos != pos) {
+		if (state->apply_verbosity > verbosity_normal && applied_pos != pos) {
 			int offset = applied_pos - pos;
 			if (state->apply_in_reverse)
 				offset = 0 - offset;
@@ -3041,14 +3045,14 @@ static int apply_one_fragment(struct apply_state *state,
 		 * Warn if it was necessary to reduce the number
 		 * of context lines.
 		 */
-		if ((leading != frag->leading) ||
-		    (trailing != frag->trailing))
+		if ((leading != frag->leading ||
+		     trailing != frag->trailing) && state->apply_verbosity > verbosity_silent)
 			fprintf_ln(stderr, _("Context reduced to (%ld/%ld)"
 					     " to apply fragment at %d"),
 				   leading, trailing, applied_pos+1);
 		update_image(state, img, applied_pos, &preimage, &postimage);
 	} else {
-		if (state->apply_verbosely)
+		if (state->apply_verbosity > verbosity_normal)
 			error(_("while searching for:\n%.*s"),
 			      (int)(old - oldlines), oldlines);
 	}
@@ -3539,7 +3543,8 @@ static int try_threeway(struct apply_state *state,
 		 read_blob_object(&buf, pre_sha1, patch->old_mode))
 		return error("repository lacks the necessary blob to fall back on 3-way merge.");
 
-	fprintf(stderr, "Falling back to three-way merge...\n");
+	if (state->apply_verbosity > verbosity_silent)
+		fprintf(stderr, "Falling back to three-way merge...\n");
 
 	img = strbuf_detach(&buf, &len);
 	prepare_image(&tmp_image, img, len, 1);
@@ -3569,7 +3574,9 @@ static int try_threeway(struct apply_state *state,
 	status = three_way_merge(image, patch->new_name,
 				 pre_sha1, our_sha1, post_sha1);
 	if (status < 0) {
-		fprintf(stderr, "Failed to fall back on three-way merge...\n");
+		if (state->apply_verbosity > verbosity_silent)
+			fprintf(stderr,
+				"Failed to fall back on three-way merge...\n");
 		return status;
 	}
 
@@ -3581,9 +3588,15 @@ static int try_threeway(struct apply_state *state,
 			hashcpy(patch->threeway_stage[0].hash, pre_sha1);
 		hashcpy(patch->threeway_stage[1].hash, our_sha1);
 		hashcpy(patch->threeway_stage[2].hash, post_sha1);
-		fprintf(stderr, "Applied patch to '%s' with conflicts.\n", patch->new_name);
+		if (state->apply_verbosity > verbosity_silent)
+			fprintf(stderr,
+				"Applied patch to '%s' with conflicts.\n",
+				patch->new_name);
 	} else {
-		fprintf(stderr, "Applied patch to '%s' cleanly.\n", patch->new_name);
+		if (state->apply_verbosity > verbosity_silent)
+			fprintf(stderr,
+				"Applied patch to '%s' cleanly.\n",
+				patch->new_name);
 	}
 	return 0;
 }
@@ -3956,7 +3969,7 @@ static int check_patch_list(struct apply_state *state, struct patch *patch)
 	prepare_fn_table(state, patch);
 	while (patch) {
 		int res;
-		if (state->apply_verbosely)
+		if (state->apply_verbosity > verbosity_normal)
 			say_patch_name(stderr,
 				       _("Checking patch %s..."), patch);
 		res = check_patch(state, patch);
@@ -4472,7 +4485,7 @@ static int write_out_one_reject(struct apply_state *state, struct patch *patch)
 	}
 
 	if (!cnt) {
-		if (state->apply_verbosely)
+		if (state->apply_verbosity > verbosity_normal)
 			say_patch_name(stderr,
 				       _("Applied patch %s cleanly."), patch);
 		return 0;
@@ -4489,7 +4502,8 @@ static int write_out_one_reject(struct apply_state *state, struct patch *patch)
 			    "Applying patch %%s with %d rejects...",
 			    cnt),
 		    cnt);
-	say_patch_name(stderr, sb.buf, patch);
+	if (state->apply_verbosity > verbosity_silent)
+		say_patch_name(stderr, sb.buf, patch);
 	strbuf_release(&sb);
 
 	cnt = strlen(patch->new_name);
@@ -4516,10 +4530,12 @@ static int write_out_one_reject(struct apply_state *state, struct patch *patch)
 	     frag;
 	     cnt++, frag = frag->next) {
 		if (!frag->rejected) {
-			fprintf_ln(stderr, _("Hunk #%d applied cleanly."), cnt);
+			if (state->apply_verbosity > verbosity_silent)
+				fprintf_ln(stderr, _("Hunk #%d applied cleanly."), cnt);
 			continue;
 		}
-		fprintf_ln(stderr, _("Rejected hunk #%d."), cnt);
+		if (state->apply_verbosity > verbosity_silent)
+			fprintf_ln(stderr, _("Rejected hunk #%d."), cnt);
 		fprintf(rej, "%.*s", frag->size, frag->patch);
 		if (frag->patch[frag->size-1] != '\n')
 			fputc('\n', rej);
@@ -4568,8 +4584,10 @@ static int write_out_results(struct apply_state *state, struct patch *list)
 		struct string_list_item *item;
 
 		string_list_sort(&cpath);
-		for_each_string_list_item(item, &cpath)
-			fprintf(stderr, "U %s\n", item->string);
+		if (state->apply_verbosity > verbosity_silent) {
+			for_each_string_list_item(item, &cpath)
+				fprintf(stderr, "U %s\n", item->string);
+		}
 		string_list_clear(&cpath, 0);
 
 		rerere(0);
@@ -4626,7 +4644,7 @@ static int apply_patch(struct apply_state *state,
 			listp = &patch->next;
 		}
 		else {
-			if (state->apply_verbosely)
+			if (state->apply_verbosity > verbosity_normal)
 				say_patch_name(stderr, _("Skipped patch '%s'."), patch);
 			free_patch(patch);
 			skipped_patch++;
diff --git a/apply.h b/apply.h
index 51b983b..f015403 100644
--- a/apply.h
+++ b/apply.h
@@ -13,6 +13,12 @@ enum apply_ws_ignore {
 	ignore_ws_change
 };
 
+enum apply_verbosity {
+	verbosity_silent = -1,
+	verbosity_normal = 0,
+	verbosity_verbose = 1
+};
+
 /*
  * We need to keep track of how symlinks in the preimage are
  * manipulated by the patches.  A patch to add a/b/c where a/b
@@ -51,13 +57,13 @@ struct apply_state {
 	int allow_overlap;
 	int apply_in_reverse;
 	int apply_with_reject;
-	int apply_verbosely;
 	int no_add;
 	int threeway;
 	int unidiff_zero;
 	int unsafe_paths;
 
 	/* Other non boolean parameters */
+	enum apply_verbosity apply_verbosity;
 	const char *fake_ancestor;
 	const char *patch_input_file;
 	int line_termination;
diff --git a/builtin/apply.c b/builtin/apply.c
index 9c66474..7338701 100644
--- a/builtin/apply.c
+++ b/builtin/apply.c
@@ -74,7 +74,7 @@ int cmd_apply(int argc, const char **argv, const char *prefix)
 			N_("leave the rejected hunks in corresponding *.rej files")),
 		OPT_BOOL(0, "allow-overlap", &state.allow_overlap,
 			N_("allow overlapping hunks")),
-		OPT__VERBOSE(&state.apply_verbosely, N_("be verbose")),
+		OPT__VERBOSE(&state.apply_verbosity, N_("be verbose")),
 		OPT_BIT(0, "inaccurate-eof", &options,
 			N_("tolerate incorrectly detected missing new-line at the end of file"),
 			APPLY_OPT_INACCURATE_EOF),
-- 
2.10.0.41.g9df52c3


  parent reply	other threads:[~2016-09-04 20:20 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-09-04 20:17 [PATCH v14 00/41] libify apply and use lib in am, part 2 Christian Couder
2016-09-04 20:17 ` [PATCH v14 01/41] apply: make some names more specific Christian Couder
2016-09-04 20:17 ` [PATCH v14 02/41] apply: move 'struct apply_state' to apply.h Christian Couder
2016-09-04 20:17 ` [PATCH v14 03/41] builtin/apply: make apply_patch() return -1 or -128 instead of die()ing Christian Couder
2016-09-04 20:17 ` [PATCH v14 04/41] builtin/apply: read_patch_file() return -1 " Christian Couder
2016-09-04 20:17 ` [PATCH v14 05/41] builtin/apply: make find_header() return -128 " Christian Couder
2016-09-04 20:17 ` [PATCH v14 06/41] builtin/apply: make parse_chunk() return a negative integer on error Christian Couder
2016-09-04 20:17 ` [PATCH v14 07/41] builtin/apply: make parse_single_patch() return -1 " Christian Couder
2016-09-04 20:18 ` [PATCH v14 08/41] builtin/apply: make parse_whitespace_option() return -1 instead of die()ing Christian Couder
2016-09-04 20:18 ` [PATCH v14 09/41] builtin/apply: make parse_ignorewhitespace_option() " Christian Couder
2016-09-04 20:18 ` [PATCH v14 10/41] builtin/apply: move init_apply_state() to apply.c Christian Couder
2016-09-04 20:18 ` [PATCH v14 11/41] apply: make init_apply_state() return -1 instead of exit()ing Christian Couder
2016-09-04 20:18 ` [PATCH v14 12/41] builtin/apply: make check_apply_state() return -1 instead of die()ing Christian Couder
2016-09-04 20:18 ` [PATCH v14 13/41] builtin/apply: move check_apply_state() to apply.c Christian Couder
2016-09-04 20:18 ` [PATCH v14 14/41] builtin/apply: make apply_all_patches() return 128 or 1 on error Christian Couder
2016-09-04 20:18 ` [PATCH v14 15/41] builtin/apply: make parse_traditional_patch() return -1 " Christian Couder
2016-09-04 20:18 ` [PATCH v14 16/41] builtin/apply: make gitdiff_*() return 1 at end of header Christian Couder
2016-09-04 20:18 ` [PATCH v14 17/41] builtin/apply: make gitdiff_*() return -1 on error Christian Couder
2016-09-04 20:18 ` [PATCH v14 18/41] builtin/apply: change die_on_unsafe_path() to check_unsafe_path() Christian Couder
2016-09-04 20:18 ` [PATCH v14 19/41] builtin/apply: make build_fake_ancestor() return -1 on error Christian Couder
2016-09-04 20:18 ` [PATCH v14 20/41] builtin/apply: make remove_file() " Christian Couder
2016-09-04 20:18 ` [PATCH v14 21/41] builtin/apply: make add_conflicted_stages_file() " Christian Couder
2016-09-04 20:18 ` [PATCH v14 22/41] builtin/apply: make add_index_file() " Christian Couder
2016-09-04 20:18 ` [PATCH v14 23/41] builtin/apply: make create_file() " Christian Couder
2016-09-04 20:18 ` [PATCH v14 24/41] builtin/apply: make write_out_one_result() " Christian Couder
2016-09-04 20:18 ` [PATCH v14 25/41] builtin/apply: make write_out_results() " Christian Couder
2016-09-04 20:18 ` [PATCH v14 26/41] builtin/apply: make try_create_file() " Christian Couder
2016-09-04 20:18 ` [PATCH v14 27/41] builtin/apply: make create_one_file() " Christian Couder
2016-09-04 20:18 ` [PATCH v14 28/41] builtin/apply: rename option parsing functions Christian Couder
2016-09-04 20:18 ` [PATCH v14 29/41] apply: rename and move opt constants to apply.h Christian Couder
2016-09-04 20:18 ` [PATCH v14 31/41] apply: make some parsing functions static again Christian Couder
2016-09-04 20:18 ` [PATCH v14 32/41] apply: use error_errno() where possible Christian Couder
2016-09-04 20:18 ` Christian Couder [this message]
2016-09-04 20:18 ` [PATCH v14 34/41] apply: don't print on stdout in verbosity_silent mode Christian Couder
2016-09-04 20:18 ` [PATCH v14 35/41] usage: add set_warn_routine() Christian Couder
2016-09-04 20:18 ` [PATCH v14 36/41] usage: add get_error_routine() and get_warn_routine() Christian Couder
2016-09-04 20:18 ` [PATCH v14 37/41] apply: change error_routine when silent Christian Couder
2016-09-04 20:18 ` [PATCH v14 38/41] apply: refactor `git apply` option parsing Christian Couder
2016-09-04 20:18 ` [PATCH v14 39/41] apply: pass apply state to build_fake_ancestor() Christian Couder
2016-09-04 20:18 ` [PATCH v14 40/41] apply: learn to use a different index file Christian Couder
2016-09-04 20:18 ` [PATCH v14 41/41] builtin/am: use apply API in run_apply() Christian Couder
     [not found] ` <20160904201833.21676-31-chriscool@tuxfamily.org>
2016-09-06 18:29   ` [PATCH v14 30/41] Move libified code from builtin/apply.c to apply.{c,h} Stefan Beller
2016-09-06 18:54 ` [PATCH v14 00/41] libify apply and use lib in am, part 2 Stefan Beller
2016-09-07 19:51 ` Junio C Hamano

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

  List information: http://vger.kernel.org/majordomo-info.html

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

  git send-email \
    --in-reply-to=20160904201833.21676-34-chriscool@tuxfamily.org \
    --to=christian.couder@gmail.com \
    --cc=avarab@gmail.com \
    --cc=chriscool@tuxfamily.org \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=j6t@kdbg.org \
    --cc=karsten.blees@gmail.com \
    --cc=l.s.r@web.de \
    --cc=pclouds@gmail.com \
    --cc=peff@peff.net \
    --cc=ramsay@ramsayjones.plus.com \
    --cc=sbeller@google.com \
    --cc=stefan.naewe@atlas-elektronik.com \
    --cc=sunshine@sunshineco.com \
    /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.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).