From: Nazri Ramliy Date: Wed, 05 Aug 2009 09:51:46 GMT Subject: [PATCH 6/6] Teach --id to "git reset" Message-ID: <1249465906-3940-7-git-send-email-ayiehere@gmail.com> In-Reply-To: <1249465906-3940-6-git-send-email-ayiehere@gmail.com> --- builtin-reset.c | 32 ++++++++++++++++++++------------ 1 files changed, 20 insertions(+), 12 deletions(-) diff --git a/builtin-reset.c b/builtin-reset.c index 5fa1789..cad5cf5 100644 --- a/builtin-reset.c +++ b/builtin-reset.c @@ -183,6 +183,8 @@ static void prepend_reflog_action(const char *action, char *buf, size_t size) int cmd_reset(int argc, const char **argv, const char *prefix) { int i = 0, reset_type = NONE, update_ref_status = 0, quiet = 0; + char *file_id; + char **new_argv; const char *rev = "HEAD"; unsigned char sha1[20], *orig = NULL, sha1_orig[20], *old_orig = NULL, sha1_old_orig[20]; @@ -198,6 +200,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix) "reset HEAD, index and working tree", MERGE), OPT_BOOLEAN('q', NULL, &quiet, "disable showing new HEAD in hard reset and progress message"), + OPT_STRING('d', "id", &file_id, "FILE_ID", "file id"), OPT_END() }; @@ -205,7 +208,12 @@ 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); - reflog_action = args_to_str(argv); + if (file_id) + new_argv = (char **) expand_file_ids(file_id, &argc, (char **) argv); + else + new_argv = (char **) argv; + + reflog_action = args_to_str((const char **) new_argv); setenv("GIT_REFLOG_ACTION", reflog_action, 0); /* @@ -216,30 +224,30 @@ int cmd_reset(int argc, const char **argv, const char *prefix) * git reset [-opts] -- ... * git reset [-opts] ... * - * At this point, argv[i] points immediately after [-opts]. + * At this point, new_argv[i] points immediately after [-opts]. */ if (i < argc) { - if (!strcmp(argv[i], "--")) { + if (!strcmp(new_argv[i], "--")) { i++; /* reset to HEAD, possibly with paths */ - } else if (i + 1 < argc && !strcmp(argv[i+1], "--")) { - rev = argv[i]; + } else if (i + 1 < argc && !strcmp(new_argv[i+1], "--")) { + rev = new_argv[i]; i += 2; } /* - * Otherwise, argv[i] could be either or and + * Otherwise, new_argv[i] could be either or and * has to be unambiguous. */ - else if (!get_sha1(argv[i], sha1)) { + else if (!get_sha1(new_argv[i], sha1)) { /* - * Ok, argv[i] looks like a rev; it should not + * Ok, new_argv[i] looks like a rev; it should not * be a filename. */ - verify_non_filename(prefix, argv[i]); - rev = argv[i++]; + verify_non_filename(prefix, new_argv[i]); + rev = new_argv[i++]; } else { /* Otherwise we treat this as a filename */ - verify_filename(prefix, argv[i]); + verify_filename(prefix, new_argv[i]); } } @@ -260,7 +268,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix) else if (reset_type != NONE) die("Cannot do %s reset with paths.", reset_type_names[reset_type]); - return read_from_tree(prefix, argv + i, sha1, + return read_from_tree(prefix, (const char **) argv + i, sha1, quiet ? REFRESH_QUIET : REFRESH_SAY_CHANGED); } if (reset_type == NONE) -- 1.6.4.13.ge6580