From: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
To: git@vger.kernel.org
Cc: "Jeff King" <peff@peff.net>,
jacob.keller@gmail.com,
"Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: [PATCH 2/5] revision.c: group ref selection options together
Date: Wed, 25 Jan 2017 19:50:51 +0700 [thread overview]
Message-ID: <20170125125054.7422-3-pclouds@gmail.com> (raw)
In-Reply-To: <20170125125054.7422-1-pclouds@gmail.com>
These options have on thing in common: when specified right after
--exclude, they will de-select refs instead of selecting them by
default.
This change makes it possible to introduce new options that use these
options in the same way as --exclude. Such an option would just
implement something like handle_refs_pseudo_opt().
parse_ref_selector_option() is taken out of handle_refs_pseudo_opt() so
that similar functions like handle_refs_pseudo_opt() are forced to
handle all ref selector options, not skipping some by mistake, which may
revert the option back to default behavior (rev selection).
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
revision.c | 134 +++++++++++++++++++++++++++++++++++++++++++++----------------
1 file changed, 100 insertions(+), 34 deletions(-)
diff --git a/revision.c b/revision.c
index b37dbec378..6ebd38d1c8 100644
--- a/revision.c
+++ b/revision.c
@@ -2059,6 +2059,103 @@ static int for_each_good_bisect_ref(const char *submodule, each_ref_fn fn, void
return for_each_bisect_ref(submodule, fn, cb_data, term_good);
}
+enum ref_selector {
+ REF_SELECT_NONE,
+ REF_SELECT_ALL,
+ REF_SELECT_BRANCHES,
+ REF_SELECT_TAGS,
+ REF_SELECT_REMOTES,
+ REF_SELECT_BY_GLOB
+};
+
+static enum ref_selector parse_ref_selector_option(int argc, const char **argv,
+ const char **optarg,
+ int *argcount)
+{
+ const char *arg = argv[0];
+
+ *optarg = NULL;
+
+ if (!strcmp(arg, "--all"))
+ return REF_SELECT_ALL;
+ else if (!strcmp(arg, "--branches") ||
+ skip_prefix(arg, "--branches=", optarg))
+ return REF_SELECT_BRANCHES;
+ else if (!strcmp(arg, "--tags") ||
+ skip_prefix(arg, "--tags=", optarg))
+ return REF_SELECT_TAGS;
+ else if (!strcmp(arg, "--remotes") ||
+ skip_prefix(arg, "--remotes=", optarg))
+ return REF_SELECT_REMOTES;
+ else if ((*argcount = parse_long_opt("glob", argv, optarg)))
+ return REF_SELECT_BY_GLOB;
+
+ return REF_SELECT_NONE;
+}
+
+static int handle_refs_pseudo_opt(const char *submodule,
+ struct rev_info *revs,
+ int argc, const char **argv,
+ int *flags, int *ret)
+{
+ struct all_refs_cb cb;
+ const char *optarg = NULL;
+ int argcount;
+ enum ref_selector selector;
+
+ selector = parse_ref_selector_option(argc, argv, &optarg, &argcount);
+
+ if (optarg)
+ init_all_refs_cb(&cb, revs, *flags);
+ *ret = 1;
+
+ switch (selector) {
+ case REF_SELECT_ALL:
+ handle_refs(submodule, revs, *flags, for_each_ref_submodule);
+ handle_refs(submodule, revs, *flags, head_ref_submodule);
+ break;
+
+ case REF_SELECT_BRANCHES:
+ if (optarg)
+ for_each_glob_ref_in(handle_one_ref, optarg,
+ "refs/heads/", &cb);
+ else
+ handle_refs(submodule, revs, *flags,
+ for_each_branch_ref_submodule);
+ break;
+
+ case REF_SELECT_TAGS:
+ if (optarg)
+ for_each_glob_ref_in(handle_one_ref, optarg,
+ "refs/tags/", &cb);
+ else
+ handle_refs(submodule, revs, *flags,
+ for_each_tag_ref_submodule);
+ break;
+
+ case REF_SELECT_REMOTES:
+ if (optarg)
+ for_each_glob_ref_in(handle_one_ref, optarg,
+ "refs/remotes/", &cb);
+ else
+ handle_refs(submodule, revs, *flags,
+ for_each_remote_ref_submodule);
+ break;
+
+ case REF_SELECT_BY_GLOB:
+ init_all_refs_cb(&cb, revs, *flags);
+ for_each_glob_ref(handle_one_ref, optarg, &cb);
+ *ret = argcount;
+ break;
+
+ case REF_SELECT_NONE:
+ return 0;
+ }
+
+ clear_ref_exclusion(&revs->ref_excludes);
+ return 1;
+}
+
static int handle_revision_pseudo_opt(const char *submodule,
struct rev_info *revs,
int argc, const char **argv, int *flags)
@@ -2066,6 +2163,7 @@ static int handle_revision_pseudo_opt(const char *submodule,
const char *arg = argv[0];
const char *optarg;
int argcount;
+ int ret;
/*
* NOTE!
@@ -2077,48 +2175,16 @@ static int handle_revision_pseudo_opt(const char *submodule,
* When implementing your new pseudo-option, remember to
* register it in the list at the top of handle_revision_opt.
*/
- if (!strcmp(arg, "--all")) {
- handle_refs(submodule, revs, *flags, for_each_ref_submodule);
- handle_refs(submodule, revs, *flags, head_ref_submodule);
- clear_ref_exclusion(&revs->ref_excludes);
- } else if (!strcmp(arg, "--branches")) {
- handle_refs(submodule, revs, *flags, for_each_branch_ref_submodule);
- clear_ref_exclusion(&revs->ref_excludes);
+ if (handle_refs_pseudo_opt(submodule, revs, argc, argv, flags, &ret)) {
+ return ret;
} else if (!strcmp(arg, "--bisect")) {
read_bisect_terms(&term_bad, &term_good);
handle_refs(submodule, revs, *flags, for_each_bad_bisect_ref);
handle_refs(submodule, revs, *flags ^ (UNINTERESTING | BOTTOM), for_each_good_bisect_ref);
revs->bisect = 1;
- } else if (!strcmp(arg, "--tags")) {
- handle_refs(submodule, revs, *flags, for_each_tag_ref_submodule);
- clear_ref_exclusion(&revs->ref_excludes);
- } else if (!strcmp(arg, "--remotes")) {
- handle_refs(submodule, revs, *flags, for_each_remote_ref_submodule);
- clear_ref_exclusion(&revs->ref_excludes);
- } else if ((argcount = parse_long_opt("glob", argv, &optarg))) {
- struct all_refs_cb cb;
- init_all_refs_cb(&cb, revs, *flags);
- for_each_glob_ref(handle_one_ref, optarg, &cb);
- clear_ref_exclusion(&revs->ref_excludes);
- return argcount;
} else if ((argcount = parse_long_opt("exclude", argv, &optarg))) {
add_ref_exclusion(&revs->ref_excludes, optarg);
return argcount;
- } else if (starts_with(arg, "--branches=")) {
- struct all_refs_cb cb;
- init_all_refs_cb(&cb, revs, *flags);
- for_each_glob_ref_in(handle_one_ref, arg + 11, "refs/heads/", &cb);
- clear_ref_exclusion(&revs->ref_excludes);
- } else if (starts_with(arg, "--tags=")) {
- struct all_refs_cb cb;
- init_all_refs_cb(&cb, revs, *flags);
- for_each_glob_ref_in(handle_one_ref, arg + 7, "refs/tags/", &cb);
- clear_ref_exclusion(&revs->ref_excludes);
- } else if (starts_with(arg, "--remotes=")) {
- struct all_refs_cb cb;
- init_all_refs_cb(&cb, revs, *flags);
- for_each_glob_ref_in(handle_one_ref, arg + 10, "refs/remotes/", &cb);
- clear_ref_exclusion(&revs->ref_excludes);
} else if (!strcmp(arg, "--reflog")) {
add_reflogs_to_pending(revs, *flags);
} else if (!strcmp(arg, "--indexed-objects")) {
--
2.11.0.157.gd943d85
next prev parent reply other threads:[~2017-01-25 12:51 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-19 12:26 [PATCH] log: new option decorate reflog of remote refs Nguyễn Thái Ngọc Duy
2017-01-19 17:23 ` Jeff King
2017-01-20 10:55 ` Duy Nguyen
2017-01-20 14:30 ` Jeff King
2017-01-20 22:00 ` Jacob Keller
2017-01-21 12:48 ` Duy Nguyen
2017-01-21 14:08 ` Jeff King
2017-01-25 12:50 ` [PATCH 0/5] Prep steps for --decorate-reflog Nguyễn Thái Ngọc Duy
2017-01-25 12:50 ` [PATCH 1/5] rev-list-options.txt: delete an empty line Nguyễn Thái Ngọc Duy
2017-01-25 12:50 ` Nguyễn Thái Ngọc Duy [this message]
2017-01-25 20:50 ` [PATCH 2/5] revision.c: group ref selection options together Jeff King
2017-01-26 9:18 ` Duy Nguyen
2017-01-26 14:19 ` Jeff King
2017-01-25 21:11 ` Junio C Hamano
2017-01-26 9:12 ` Duy Nguyen
2017-01-25 12:50 ` [PATCH 3/5] revision.c: allow to change pseudo opt parsing function Nguyễn Thái Ngọc Duy
2017-01-25 12:50 ` [PATCH 4/5] revision.c: refactor ref selection handler after --exclude Nguyễn Thái Ngọc Duy
2017-01-25 17:41 ` Jacob Keller
2017-01-25 20:57 ` Jeff King
2017-01-25 21:27 ` Jeff King
2017-01-25 21:30 ` Jacob Keller
2017-01-25 23:25 ` Junio C Hamano
2017-01-26 9:28 ` Duy Nguyen
2017-01-26 14:24 ` Jeff King
2017-01-26 18:43 ` Junio C Hamano
2017-01-25 21:15 ` Junio C Hamano
2017-01-25 12:50 ` [PATCH 5/5] revision.c: add --decorate-reflog 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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170125125054.7422-3-pclouds@gmail.com \
--to=pclouds@gmail.com \
--cc=git@vger.kernel.org \
--cc=jacob.keller@gmail.com \
--cc=peff@peff.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.