Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>
---
 revision.c | 47 ++++++++++++++++++++++++++++++-----------------
 1 file changed, 30 insertions(+), 17 deletions(-)

diff --git a/revision.c b/revision.c
index b02cb4660b..f04eb7f140 100644
--- a/revision.c
+++ b/revision.c
@@ -2464,6 +2464,29 @@ static int rev_opt_glob(const struct option *opt,
        return 0;
 }
 
+static int rev_opt_no_walk(const struct option *opt,
+                          const char *arg, int unset)
+{
+       struct rev_info *revs  = opt->value;
+
+       BUG_ON_OPT_NEG(unset);
+       if (!arg) {
+               revs->no_walk = REVISION_WALK_NO_WALK_SORTED;
+       } else {
+               /*
+                * Detached form ("--no-walk X" as opposed to "--no-walk=X")
+                * not allowed, since the argument is optional.
+                */
+               if (!strcmp(arg, "sorted"))
+                       revs->no_walk = REVISION_WALK_NO_WALK_SORTED;
+               else if (!strcmp(arg, "unsorted"))
+                       revs->no_walk = REVISION_WALK_NO_WALK_UNSORTED;
+               else
+                       return error(_("invalid argument to --no-walk"));
+       }
+       return 0;
+}
+
 static int rev_opt_not(const struct option *opt,
                       const char *arg, int unset)
 {
@@ -2572,6 +2595,12 @@ static void make_pseudo_options(struct rev_info *revs)
                OPT_REV_NOARG(0, "not",
                              N_("reverse the meaning of '^' for all following 
revisions"),
                              rev_opt_not),
+               OPT_REV_OPTARG(0, "no-walk", N_("(sorted|unsorted)"),
+                              N_("only show given commits but do not traverse 
their ancestors"),
+                              rev_opt_no_walk),
+               OPT_SET_INT_F(0, "do-walk", &revs->no_walk,
+                             N_("override a previous --no-walk"),
+                             0, PARSE_OPT_NONEG),
                OPT_END()
        };
        ALLOC_ARRAY(revs->pseudo_options, ARRAY_SIZE(options));
@@ -2583,7 +2612,6 @@ static int handle_revision_pseudo_opt(const char 
*submodule,
                                int argc, const char **argv, int *flags)
 {
        const char *arg = argv[0];
-       const char *optarg;
        struct ref_store *refs;
 
        if (submodule) {
@@ -2611,22 +2639,7 @@ static int handle_revision_pseudo_opt(const char 
*submodule,
        if (argc)
                return argc;
 
-       if (!strcmp(arg, "--no-walk")) {
-               revs->no_walk = REVISION_WALK_NO_WALK_SORTED;
-       } else if (skip_prefix(arg, "--no-walk=", &optarg)) {
-               /*
-                * Detached form ("--no-walk X" as opposed to "--no-walk=X")
-                * not allowed, since the argument is optional.
-                */
-               if (!strcmp(optarg, "sorted"))
-                       revs->no_walk = REVISION_WALK_NO_WALK_SORTED;
-               else if (!strcmp(optarg, "unsorted"))
-                       revs->no_walk = REVISION_WALK_NO_WALK_UNSORTED;
-               else
-                       return error("invalid argument to --no-walk");
-       } else if (!strcmp(arg, "--do-walk")) {
-               revs->no_walk = 0;
-       } else if (!strcmp(arg, "--single-worktree")) {
+       if (!strcmp(arg, "--single-worktree")) {
                revs->single_worktree = 1;
        } else {
                return 0;
-- 
2.21.0.1141.gd54ac2cb17

Reply via email to