Declutter cmd_reset() a bit by moving out the argument parsing to its
own function.
---
 builtin/reset.c | 71 ++++++++++++++++++++++++++++++---------------------------
 1 file changed, 38 insertions(+), 33 deletions(-)

diff --git a/builtin/reset.c b/builtin/reset.c
index 664fad9..9473725 100644
--- a/builtin/reset.c
+++ b/builtin/reset.c
@@ -198,36 +198,10 @@ static void die_if_unmerged_cache(int reset_type)
 
 }
 
-int cmd_reset(int argc, const char **argv, const char *prefix)
-{
-       int i = 0, reset_type = NONE, update_ref_status = 0, quiet = 0;
-       int patch_mode = 0;
+const char **parse_args(int argc, const char **argv, const char *prefix, const 
char **rev_ret) {
+       int i = 0;
        const char *rev = "HEAD";
-       unsigned char sha1[20], *orig = NULL, sha1_orig[20],
-                               *old_orig = NULL, sha1_old_orig[20];
-       const char **pathspec = NULL;
-       struct commit *commit;
-       struct strbuf msg = STRBUF_INIT;
-       const struct option options[] = {
-               OPT__QUIET(&quiet, N_("be quiet, only report errors")),
-               OPT_SET_INT(0, "mixed", &reset_type,
-                                               N_("reset HEAD and index"), 
MIXED),
-               OPT_SET_INT(0, "soft", &reset_type, N_("reset only HEAD"), 
SOFT),
-               OPT_SET_INT(0, "hard", &reset_type,
-                               N_("reset HEAD, index and working tree"), HARD),
-               OPT_SET_INT(0, "merge", &reset_type,
-                               N_("reset HEAD, index and working tree"), 
MERGE),
-               OPT_SET_INT(0, "keep", &reset_type,
-                               N_("reset HEAD but keep local changes"), KEEP),
-               OPT_BOOLEAN('p', "patch", &patch_mode, N_("select hunks 
interactively")),
-               OPT_END()
-       };
-
-       git_config(git_default_config, NULL);
-
-       argc = parse_options(argc, argv, prefix, options, git_reset_usage,
-                                               PARSE_OPT_KEEP_DASHDASH);
-
+       unsigned char unused[20];
        /*
         * Possible arguments are:
         *
@@ -250,7 +224,7 @@ int cmd_reset(int argc, const char **argv, const char 
*prefix)
                 * Otherwise, argv[i] could be either <rev> or <paths> and
                 * has to be unambiguous.
                 */
-               else if (!get_sha1_committish(argv[i], sha1)) {
+               else if (!get_sha1_committish(argv[i], unused)) {
                        /*
                         * Ok, argv[i] looks like a rev; it should not
                         * be a filename.
@@ -262,6 +236,40 @@ int cmd_reset(int argc, const char **argv, const char 
*prefix)
                        verify_filename(prefix, argv[i], 1);
                }
        }
+       *rev_ret = rev;
+       return i < argc ? get_pathspec(prefix, argv + i) : NULL;
+}
+
+int cmd_reset(int argc, const char **argv, const char *prefix)
+{
+       int reset_type = NONE, update_ref_status = 0, quiet = 0;
+       int patch_mode = 0;
+       const char *rev;
+       unsigned char sha1[20], *orig = NULL, sha1_orig[20],
+                               *old_orig = NULL, sha1_old_orig[20];
+       const char **pathspec = NULL;
+       struct commit *commit;
+       struct strbuf msg = STRBUF_INIT;
+       const struct option options[] = {
+               OPT__QUIET(&quiet, N_("be quiet, only report errors")),
+               OPT_SET_INT(0, "mixed", &reset_type,
+                                               N_("reset HEAD and index"), 
MIXED),
+               OPT_SET_INT(0, "soft", &reset_type, N_("reset only HEAD"), 
SOFT),
+               OPT_SET_INT(0, "hard", &reset_type,
+                               N_("reset HEAD, index and working tree"), HARD),
+               OPT_SET_INT(0, "merge", &reset_type,
+                               N_("reset HEAD, index and working tree"), 
MERGE),
+               OPT_SET_INT(0, "keep", &reset_type,
+                               N_("reset HEAD but keep local changes"), KEEP),
+               OPT_BOOLEAN('p', "patch", &patch_mode, N_("select hunks 
interactively")),
+               OPT_END()
+       };
+
+       git_config(git_default_config, NULL);
+
+       argc = parse_options(argc, argv, prefix, options, git_reset_usage,
+                                               PARSE_OPT_KEEP_DASHDASH);
+       pathspec = parse_args(argc, argv, prefix, &rev);
 
        if (get_sha1_committish(rev, sha1))
                die(_("Failed to resolve '%s' as a valid ref."), rev);
@@ -277,9 +285,6 @@ int cmd_reset(int argc, const char **argv, const char 
*prefix)
                die(_("Could not parse object '%s'."), rev);
        hashcpy(sha1, commit->object.sha1);
 
-       if (i < argc)
-               pathspec = get_pathspec(prefix, argv + i);
-
        if (patch_mode) {
                if (reset_type != NONE)
                        die(_("--patch is incompatible with 
--{hard,mixed,soft}"));
-- 
1.8.1.rc3.331.g1ef2165

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to