git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
To: pclouds@gmail.com
Cc: git@vger.kernel.org, "Junio C Hamano" <gitster@pobox.com>,
	"Martin Ågren" <martin.agren@gmail.com>
Subject: [PATCH v2 19/20] diff --no-index: use parse_options() instead of diff_opt_parse()
Date: Sun, 24 Mar 2019 15:20:13 +0700	[thread overview]
Message-ID: <20190324082014.2041-20-pclouds@gmail.com> (raw)
In-Reply-To: <20190324082014.2041-1-pclouds@gmail.com>

While at there, move exit() back to the caller. It's easier to see the
flow that way than burying it in diff-no-index.c

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 builtin/diff.c           | 21 +++--------------
 diff-no-index.c          | 49 ++++++++++++++++++++++++----------------
 diff.h                   |  3 ++-
 t/t4053-diff-no-index.sh |  3 +--
 4 files changed, 35 insertions(+), 41 deletions(-)

diff --git a/builtin/diff.c b/builtin/diff.c
index f0393bba23..52dc3e136f 100644
--- a/builtin/diff.c
+++ b/builtin/diff.c
@@ -320,26 +320,11 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
 
 	repo_init_revisions(the_repository, &rev, prefix);
 
-	if (no_index && argc != i + 2) {
-		if (no_index == DIFF_NO_INDEX_IMPLICIT) {
-			/*
-			 * There was no --no-index and there were not two
-			 * paths. It is possible that the user intended
-			 * to do an inside-repository operation.
-			 */
-			fprintf(stderr, "Not a git repository\n");
-			fprintf(stderr,
-				"To compare two paths outside a working tree:\n");
-		}
-		/* Give the usage message for non-repository usage and exit. */
-		usagef("git diff %s <path> <path>",
-		       no_index == DIFF_NO_INDEX_EXPLICIT ?
-		       "--no-index" : "[--no-index]");
-
-	}
 	if (no_index)
 		/* If this is a no-index diff, just run it and exit there. */
-		diff_no_index(the_repository, &rev, argc, argv);
+		exit(diff_no_index(the_repository, &rev,
+				   no_index == DIFF_NO_INDEX_IMPLICIT,
+				   argc, argv));
 
 	/* Otherwise, we are doing the usual "git" diff */
 	rev.diffopt.skip_stat_unmatch = !!diff_auto_refresh_index;
diff --git a/diff-no-index.c b/diff-no-index.c
index 9414e922d1..a879f45862 100644
--- a/diff-no-index.c
+++ b/diff-no-index.c
@@ -14,6 +14,7 @@
 #include "revision.h"
 #include "log-tree.h"
 #include "builtin.h"
+#include "parse-options.h"
 #include "string-list.h"
 #include "dir.h"
 
@@ -233,35 +234,43 @@ static void fixup_paths(const char **path, struct strbuf *replacement)
 	}
 }
 
-void diff_no_index(struct repository *r,
-		   struct rev_info *revs,
-		   int argc, const char **argv)
+static const char * const diff_no_index_usage[] = {
+	N_("git diff --no-index [<options>] <path> <path>"),
+	NULL
+};
+
+int diff_no_index(struct repository *r,
+		  struct rev_info *revs,
+		  int implicit_no_index,
+		  int argc, const char **argv)
 {
-	int i;
+	int i, no_index;
 	const char *paths[2];
 	struct strbuf replacement = STRBUF_INIT;
 	const char *prefix = revs->prefix;
+	struct option no_index_options[] = {
+		OPT_BOOL_F(0, "no-index", &no_index, "",
+			   PARSE_OPT_NONEG | PARSE_OPT_HIDDEN),
+		OPT_END(),
+	};
+	struct option *options;
 
 	/*
 	 * FIXME: --no-index should not look at index and we should be
 	 * able to pass NULL repo. Maybe later.
 	 */
 	repo_diff_setup(r, &revs->diffopt);
-	for (i = 1; i < argc - 2; ) {
-		int j;
-		if (!strcmp(argv[i], "--no-index"))
-			i++;
-		else if (!strcmp(argv[i], "--"))
-			i++;
-		else {
-			j = diff_opt_parse(&revs->diffopt, argv + i, argc - i,
-					   revs->prefix);
-			if (j <= 0)
-				die("invalid diff option/value: %s", argv[i]);
-			i += j;
-		}
+	options = parse_options_concat(no_index_options,
+				       revs->diffopt.parseopts);
+	argc = parse_options(argc, argv, revs->prefix, options,
+			     diff_no_index_usage, 0);
+	if (argc != 2) {
+		if (implicit_no_index)
+			warning(_("Not a git repository. Use --no-index to "
+				  "compare two paths outside a working tree"));
+		usage_with_options(diff_no_index_usage, options);
 	}
-
+	FREE_AND_NULL(options);
 	for (i = 0; i < 2; i++) {
 		const char *p = argv[argc - 2 + i];
 		if (!strcmp(p, "-"))
@@ -293,7 +302,7 @@ void diff_no_index(struct repository *r,
 	revs->diffopt.flags.exit_with_status = 1;
 
 	if (queue_diff(&revs->diffopt, paths[0], paths[1]))
-		exit(1);
+		return 1;
 	diff_set_mnemonic_prefix(&revs->diffopt, "1/", "2/");
 	diffcore_std(&revs->diffopt);
 	diff_flush(&revs->diffopt);
@@ -304,5 +313,5 @@ void diff_no_index(struct repository *r,
 	 * The return code for --no-index imitates diff(1):
 	 * 0 = no changes, 1 = changes, else error
 	 */
-	exit(diff_result_code(&revs->diffopt, 0));
+	return diff_result_code(&revs->diffopt, 0);
 }
diff --git a/diff.h b/diff.h
index d9ad73f0e1..03c6afda22 100644
--- a/diff.h
+++ b/diff.h
@@ -437,7 +437,8 @@ int diff_flush_patch_id(struct diff_options *, struct object_id *, int);
 
 int diff_result_code(struct diff_options *, int);
 
-void diff_no_index(struct repository *, struct rev_info *, int, const char **);
+int diff_no_index(struct repository *, struct rev_info *,
+		  int implicit_no_index, int, const char **);
 
 int index_differs_from(struct repository *r, const char *def,
 		       const struct diff_flags *flags,
diff --git a/t/t4053-diff-no-index.sh b/t/t4053-diff-no-index.sh
index 6e0dd6f9e5..fb25cdb789 100755
--- a/t/t4053-diff-no-index.sh
+++ b/t/t4053-diff-no-index.sh
@@ -50,8 +50,7 @@ test_expect_success 'git diff --no-index executed outside repo gives correct err
 		export GIT_CEILING_DIRECTORIES &&
 		cd non/git &&
 		test_must_fail git diff --no-index a 2>actual.err &&
-		echo "usage: git diff --no-index <path> <path>" >expect.err &&
-		test_cmp expect.err actual.err
+		test_i18ngrep "usage: git diff --no-index" actual.err
 	)
 '
 
-- 
2.21.0.548.gd3c7d92dc2


  parent reply	other threads:[~2019-03-24  8:22 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-20 11:46 [PATCH 00/20] nd/diff-parseopt the last part Nguyễn Thái Ngọc Duy
2019-03-20 11:46 ` [PATCH 01/20] diff-parseopt: convert --ws-error-highlight Nguyễn Thái Ngọc Duy
2019-03-20 20:19   ` Martin Ågren
2019-03-20 11:46 ` [PATCH 02/20] diff-parseopt: convert --ita-[in]visible-in-index Nguyễn Thái Ngọc Duy
2019-03-20 11:46 ` [PATCH 03/20] diff-parseopt: convert -z Nguyễn Thái Ngọc Duy
2019-03-20 11:46 ` [PATCH 04/20] diff-parseopt: convert -l Nguyễn Thái Ngọc Duy
2019-03-20 11:46 ` [PATCH 05/20] diff-parseopt: convert -S|-G Nguyễn Thái Ngọc Duy
2019-03-20 11:46 ` [PATCH 06/20] diff-parseopt: convert --pickaxe-all|--pickaxe-regex Nguyễn Thái Ngọc Duy
2019-03-20 11:46 ` [PATCH 07/20] diff-parseopt: convert -O Nguyễn Thái Ngọc Duy
2019-03-20 20:26   ` Martin Ågren
2019-03-20 11:46 ` [PATCH 08/20] diff-parseopt: convert --find-object Nguyễn Thái Ngọc Duy
2019-03-20 11:46 ` [PATCH 09/20] diff-parseopt: convert --diff-filter Nguyễn Thái Ngọc Duy
2019-03-20 11:46 ` [PATCH 10/20] diff-parseopt: convert --[no-]abbrev Nguyễn Thái Ngọc Duy
2019-03-20 23:00   ` Ævar Arnfjörð Bjarmason
2019-03-21  0:35     ` Duy Nguyen
2019-03-20 11:46 ` [PATCH 11/20] diff-parseopt: convert --[src|dst]-prefix Nguyễn Thái Ngọc Duy
2019-03-20 11:46 ` [PATCH 12/20] diff-parseopt: convert --line-prefix Nguyễn Thái Ngọc Duy
2019-03-20 11:46 ` [PATCH 13/20] diff-parseopt: convert --no-prefix Nguyễn Thái Ngọc Duy
2019-03-20 20:30   ` Martin Ågren
2019-03-20 11:46 ` [PATCH 14/20] diff-parseopt: convert --inter-hunk-context Nguyễn Thái Ngọc Duy
2019-03-20 11:46 ` [PATCH 15/20] diff-parseopt: convert --[no-]color-moved Nguyễn Thái Ngọc Duy
2019-03-20 11:46 ` [PATCH 16/20] diff-parseopt: convert --color-moved-ws Nguyễn Thái Ngọc Duy
2019-03-20 11:47 ` [PATCH 17/20] diff.c: allow --no-color-moved-ws Nguyễn Thái Ngọc Duy
2019-03-20 11:47 ` [PATCH 18/20] range-diff: use parse_options() instead of diff_opt_parse() Nguyễn Thái Ngọc Duy
2019-03-20 11:47 ` [PATCH 19/20] diff --no-index: " Nguyễn Thái Ngọc Duy
2019-03-20 11:47 ` [PATCH 20/20] am: avoid diff_opt_parse() Nguyễn Thái Ngọc Duy
2019-03-24  8:19 ` [PATCH v2 00/20] nd/diff-parseopt the last part Nguyễn Thái Ngọc Duy
2019-03-24  8:19   ` [PATCH v2 01/20] diff-parseopt: convert --ws-error-highlight Nguyễn Thái Ngọc Duy
2019-03-24  8:19   ` [PATCH v2 02/20] diff-parseopt: convert --ita-[in]visible-in-index Nguyễn Thái Ngọc Duy
2019-03-24  8:19   ` [PATCH v2 03/20] diff-parseopt: convert -z Nguyễn Thái Ngọc Duy
2019-03-24  8:19   ` [PATCH v2 04/20] diff-parseopt: convert -l Nguyễn Thái Ngọc Duy
2019-03-24  8:19   ` [PATCH v2 05/20] diff-parseopt: convert -S|-G Nguyễn Thái Ngọc Duy
2019-03-24  8:20   ` [PATCH v2 06/20] diff-parseopt: convert --pickaxe-all|--pickaxe-regex Nguyễn Thái Ngọc Duy
2019-03-24  8:20   ` [PATCH v2 07/20] diff-parseopt: convert -O Nguyễn Thái Ngọc Duy
2019-03-24  8:20   ` [PATCH v2 08/20] diff-parseopt: convert --find-object Nguyễn Thái Ngọc Duy
2019-03-24  8:20   ` [PATCH v2 09/20] diff-parseopt: convert --diff-filter Nguyễn Thái Ngọc Duy
2019-03-24  8:20   ` [PATCH v2 10/20] diff-parseopt: convert --[no-]abbrev Nguyễn Thái Ngọc Duy
2019-03-24  8:20   ` [PATCH v2 11/20] diff-parseopt: convert --[src|dst]-prefix Nguyễn Thái Ngọc Duy
2019-03-24  8:20   ` [PATCH v2 12/20] diff-parseopt: convert --line-prefix Nguyễn Thái Ngọc Duy
2019-03-24  8:20   ` [PATCH v2 13/20] diff-parseopt: convert --no-prefix Nguyễn Thái Ngọc Duy
2019-03-24  8:20   ` [PATCH v2 14/20] diff-parseopt: convert --inter-hunk-context Nguyễn Thái Ngọc Duy
2019-03-24  8:20   ` [PATCH v2 15/20] diff-parseopt: convert --[no-]color-moved Nguyễn Thái Ngọc Duy
2019-03-24  8:20   ` [PATCH v2 16/20] diff-parseopt: convert --color-moved-ws Nguyễn Thái Ngọc Duy
2019-03-24  8:20   ` [PATCH v2 17/20] diff.c: allow --no-color-moved-ws Nguyễn Thái Ngọc Duy
2019-03-24  8:20   ` [PATCH v2 18/20] range-diff: use parse_options() instead of diff_opt_parse() Nguyễn Thái Ngọc Duy
2019-03-24  8:20   ` Nguyễn Thái Ngọc Duy [this message]
2019-04-30  1:02     ` [PATCH v2 19/20] diff --no-index: " Johannes Schindelin
2019-04-30  4:53       ` Duy Nguyen
2019-04-30 22:12         ` Johannes Schindelin
2019-05-01  9:53           ` Duy Nguyen
2019-05-01 18:46             ` Jeff King
2019-03-24  8:20   ` [PATCH v2 20/20] am: avoid diff_opt_parse() Nguyễn Thái Ngọc Duy

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=20190324082014.2041-20-pclouds@gmail.com \
    --to=pclouds@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=martin.agren@gmail.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).