]> git.ipfire.org Git - thirdparty/git.git/blobdiff - builtin/reset.c
Merge branch 'km/submodule-doc-use-sm-path' into maint
[thirdparty/git.git] / builtin / reset.c
index fdd572168b51cc388a098008c3636ffa60856233..18228c312ea009e79b1ae179f4a40ad3b4a35574 100644 (file)
@@ -30,8 +30,9 @@
 
 static const char * const git_reset_usage[] = {
        N_("git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"),
-       N_("git reset [-q] [<tree-ish>] [--] <paths>..."),
-       N_("git reset --patch [<tree-ish>] [--] [<paths>...]"),
+       N_("git reset [-q] [<tree-ish>] [--] <pathspec>..."),
+       N_("git reset [-q] [--pathspec-from-file [--pathspec-file-nul]] [<tree-ish>]"),
+       N_("git reset --patch [<tree-ish>] [--] [<pathspec>...]"),
        NULL
 };
 
@@ -284,8 +285,8 @@ static int git_reset_config(const char *var, const char *value, void *cb)
 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, unborn;
-       const char *rev;
+       int patch_mode = 0, pathspec_file_nul = 0, unborn;
+       const char *rev, *pathspec_from_file = NULL;
        struct object_id oid;
        struct pathspec pathspec;
        int intent_to_add = 0;
@@ -306,6 +307,8 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
                OPT_BOOL('p', "patch", &patch_mode, N_("select hunks interactively")),
                OPT_BOOL('N', "intent-to-add", &intent_to_add,
                                N_("record only the fact that removed paths will be added later")),
+               OPT_PATHSPEC_FROM_FILE(&pathspec_from_file),
+               OPT_PATHSPEC_FILE_NUL(&pathspec_file_nul),
                OPT_END()
        };
 
@@ -316,11 +319,25 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
                                                PARSE_OPT_KEEP_DASHDASH);
        parse_args(&pathspec, argv, prefix, patch_mode, &rev);
 
+       if (pathspec_from_file) {
+               if (patch_mode)
+                       die(_("--pathspec-from-file is incompatible with --patch"));
+
+               if (pathspec.nr)
+                       die(_("--pathspec-from-file is incompatible with pathspec arguments"));
+
+               parse_pathspec_file(&pathspec, 0,
+                                   PATHSPEC_PREFER_FULL,
+                                   prefix, pathspec_from_file, pathspec_file_nul);
+       } else if (pathspec_file_nul) {
+               die(_("--pathspec-file-nul requires --pathspec-from-file"));
+       }
+
        unborn = !strcmp(rev, "HEAD") && get_oid("HEAD", &oid);
        if (unborn) {
                /* reset on unborn branch: treat as reset to empty tree */
                oidcpy(&oid, the_hash_algo->empty_tree);
-       } else if (!pathspec.nr) {
+       } else if (!pathspec.nr && !patch_mode) {
                struct commit *commit;
                if (get_oid_committish(rev, &oid))
                        die(_("Failed to resolve '%s' as a valid revision."), rev);