Skip to content

Commit

Permalink
reset: reinstate support for the deprecated --stdin option
Browse files Browse the repository at this point in the history
The `--stdin` option was a well-established paradigm in other commands,
therefore we implemented it in `git reset` for use by Visual Studio.

Unfortunately, upstream Git decided that it is time to introduce
`--pathspec-from-file` instead.

To keep backwards-compatibility for some grace period, we therefore
reinstate the `--stdin` option on top of the `--pathspec-from-file`
option, but mark it firmly as deprecated.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
  • Loading branch information
dscho committed Sep 22, 2022
1 parent 0f63eac commit 901f599
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 0 deletions.
11 changes: 11 additions & 0 deletions Documentation/git-reset.txt
Expand Up @@ -12,6 +12,7 @@ SYNOPSIS
'git reset' [-q] [--pathspec-from-file=<file> [--pathspec-file-nul]] [<tree-ish>]
'git reset' (--patch | -p) [<tree-ish>] [--] [<pathspec>...]
'git reset' [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]
DEPRECATED: 'git reset' [-q] [--stdin [-z]] [<tree-ish>]

DESCRIPTION
-----------
Expand Down Expand Up @@ -132,6 +133,16 @@ OPTIONS
+
For more details, see the 'pathspec' entry in linkgit:gitglossary[7].

--stdin::
DEPRECATED (use `--pathspec-from-file=-` instead): Instead of taking
list of paths from the command line, read list of paths from the
standard input. Paths are separated by LF (i.e. one path per line) by
default.

-z::
DEPRECATED (use `--pathspec-file-nul` instead): Only meaningful with
`--stdin`; paths are separated with NUL character instead of LF.

EXAMPLES
--------

Expand Down
14 changes: 14 additions & 0 deletions builtin/reset.c
Expand Up @@ -26,6 +26,8 @@
#include "submodule.h"
#include "submodule-config.h"
#include "dir.h"
#include "strbuf.h"
#include "quote.h"

#define REFRESH_INDEX_DELAY_WARNING_IN_MS (2 * 1000)

Expand All @@ -34,6 +36,7 @@ static const char * const git_reset_usage[] = {
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>...]"),
N_("DEPRECATED: git reset [-q] [--stdin [-z]] [<tree-ish>]"),
NULL
};

Expand Down Expand Up @@ -316,6 +319,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
struct object_id oid;
struct pathspec pathspec;
int intent_to_add = 0;
int nul_term_line = 0, read_from_stdin = 0;
const struct option options[] = {
OPT__QUIET(&quiet, N_("be quiet, only report errors")),
OPT_BOOL(0, "no-refresh", &no_refresh,
Expand All @@ -337,6 +341,10 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
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_BOOL('z', NULL, &nul_term_line,
N_("DEPRECATED (use --pathspec-file-nul instead): paths are separated with NUL character")),
OPT_BOOL(0, "stdin", &read_from_stdin,
N_("DEPRECATED (use --pathspec-from-file=- instead): read paths from <stdin>")),
OPT_END()
};

Expand All @@ -346,6 +354,12 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
PARSE_OPT_KEEP_DASHDASH);
parse_args(&pathspec, argv, prefix, patch_mode, &rev);

if (read_from_stdin) {
pathspec_from_file = "-";
if (nul_term_line)
pathspec_file_nul = 1;
}

if (pathspec_from_file) {
if (patch_mode)
die(_("options '%s' and '%s' cannot be used together"), "--pathspec-from-file", "--patch");
Expand Down
32 changes: 32 additions & 0 deletions t/t7108-reset-stdin.sh
@@ -0,0 +1,32 @@
#!/bin/sh

test_description='reset --stdin'

. ./test-lib.sh

test_expect_success 'reset --stdin' '
test_commit hello &&
git rm hello.t &&
test -z "$(git ls-files hello.t)" &&
echo hello.t | git reset --stdin &&
test hello.t = "$(git ls-files hello.t)"
'

test_expect_success 'reset --stdin -z' '
test_commit world &&
git rm hello.t world.t &&
test -z "$(git ls-files hello.t world.t)" &&
printf world.tQworld.tQhello.tQ | q_to_nul | git reset --stdin -z &&
printf "hello.t\nworld.t\n" >expect &&
git ls-files >actual &&
test_cmp expect actual
'

test_expect_success '--stdin requires --mixed' '
echo hello.t >list &&
test_must_fail git reset --soft --stdin <list &&
test_must_fail git reset --hard --stdin <list &&
git reset --mixed --stdin <list
'

test_done

0 comments on commit 901f599

Please sign in to comment.