From 39ea722d829ddc5bb253fbe12333d768965f4fe7 Mon Sep 17 00:00:00 2001 From: Martin von Zweigbergk Date: Mon, 14 Jan 2013 21:47:37 -0800 Subject: [PATCH] reset.c: extract function for parsing arguments Declutter cmd_reset() a bit by moving out the argument parsing to its own function. Signed-off-by: Martin von Zweigbergk Signed-off-by: Junio C Hamano --- builtin/reset.c | 86 ++++++++++++++++++++++++++----------------------- 1 file changed, 46 insertions(+), 40 deletions(-) diff --git a/builtin/reset.c b/builtin/reset.c index 664fad9fc5..58f0f6116b 100644 --- a/builtin/reset.c +++ b/builtin/reset.c @@ -198,11 +198,54 @@ static void die_if_unmerged_cache(int reset_type) } +static 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 unused[20]; + /* + * Possible arguments are: + * + * git reset [-opts] ... + * git reset [-opts] -- ... + * git reset [-opts] -- ... + * git reset [-opts] ... + * + * At this point, argv[i] points immediately after [-opts]. + */ + + if (i < argc) { + if (!strcmp(argv[i], "--")) { + i++; /* reset to HEAD, possibly with paths */ + } else if (i + 1 < argc && !strcmp(argv[i+1], "--")) { + rev = argv[i]; + i += 2; + } + /* + * Otherwise, argv[i] could be either or and + * has to be unambiguous. + */ + else if (!get_sha1_committish(argv[i], unused)) { + /* + * Ok, argv[i] looks like a rev; it should not + * be a filename. + */ + verify_non_filename(prefix, argv[i]); + rev = argv[i++]; + } else { + /* Otherwise we treat this as a filename */ + 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 i = 0, reset_type = NONE, update_ref_status = 0, quiet = 0; + int reset_type = NONE, update_ref_status = 0, quiet = 0; int patch_mode = 0; - const char *rev = "HEAD"; + const char *rev; unsigned char sha1[20], *orig = NULL, sha1_orig[20], *old_orig = NULL, sha1_old_orig[20]; const char **pathspec = NULL; @@ -227,41 +270,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix) argc = parse_options(argc, argv, prefix, options, git_reset_usage, PARSE_OPT_KEEP_DASHDASH); - - /* - * Possible arguments are: - * - * git reset [-opts] ... - * git reset [-opts] -- ... - * git reset [-opts] -- ... - * git reset [-opts] ... - * - * At this point, argv[i] points immediately after [-opts]. - */ - - if (i < argc) { - if (!strcmp(argv[i], "--")) { - i++; /* reset to HEAD, possibly with paths */ - } else if (i + 1 < argc && !strcmp(argv[i+1], "--")) { - rev = argv[i]; - i += 2; - } - /* - * Otherwise, argv[i] could be either or and - * has to be unambiguous. - */ - else if (!get_sha1_committish(argv[i], sha1)) { - /* - * Ok, argv[i] looks like a rev; it should not - * be a filename. - */ - verify_non_filename(prefix, argv[i]); - rev = argv[i++]; - } else { - /* Otherwise we treat this as a filename */ - verify_filename(prefix, argv[i], 1); - } - } + 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}"));