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
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=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.
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).