reset.c: extract function for parsing arguments
[gitweb.git] / builtin / reset.c
index 664fad9fc586cf0276e4bf8e1315d2eae8ceb911..58f0f6116beb3704433896411a9cb363702c7d19 100644 (file)
@@ -198,36 +198,11 @@ static void die_if_unmerged_cache(int reset_type)
 
 }
 
-int cmd_reset(int argc, const char **argv, const char *prefix)
+static const char **parse_args(int argc, const char **argv, const char *prefix, const char **rev_ret)
 {
-       int i = 0, reset_type = NONE, update_ref_status = 0, quiet = 0;
-       int patch_mode = 0;
+       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 +225,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 +237,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 +286,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}"));