The 'restore' command already rejects the --merge, --conflict, --ours and --theirs options when combined with --staged, but accepts them when --worktree is added as well. Unfortunately that doesn't appear to do anything useful. The --ours and --theirs options seem to be ignored when both --staged and --worktree are given, whereas with --merge or --conflict, the command has the same effect as if the --staged option wasn't present. So reject those options with '--staged --worktree' as well, using opts->accept_ref to distinguish restore from checkout. Add tests for both --staged and '--staged --worktree'. Signed-off-by: Andy Koppe <andy.koppe@xxxxxxxxx> --- CI run: https://github.com/ak2/git/actions/runs/4210823089 Some more explanation: when finding that 'restore --staged --worktree' with --ours or --theirs was accepted, I assumed that it would do the equivalent of 'restore --ours/--theirs <paths> && add --update <paths>'. As it doesn't do that, I think it's better to raise the same error as without --worktree. builtin/checkout.c | 6 ++---- t/t2070-restore.sh | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/builtin/checkout.c b/builtin/checkout.c index a5155cf55c..b09322f7c8 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -489,13 +489,11 @@ static int checkout_paths(const struct checkout_opts *opts, die(_("'%s' must be used when '%s' is not specified"), "--worktree", "--source"); - if (opts->checkout_index && !opts->checkout_worktree && - opts->writeout_stage) + if (!opts->accept_ref && opts->checkout_index && opts->writeout_stage) die(_("'%s' or '%s' cannot be used with %s"), "--ours", "--theirs", "--staged"); - if (opts->checkout_index && !opts->checkout_worktree && - opts->merge) + if (!opts->accept_ref && opts->checkout_index && opts->merge) die(_("'%s' or '%s' cannot be used with %s"), "--merge", "--conflict", "--staged"); diff --git a/t/t2070-restore.sh b/t/t2070-restore.sh index 7c43ddf1d9..373dc1657e 100755 --- a/t/t2070-restore.sh +++ b/t/t2070-restore.sh @@ -137,4 +137,26 @@ test_expect_success 'restore --staged invalidates cache tree for deletions' ' test_must_fail git rev-parse HEAD:new1 ' +test_expect_success 'restore with merge options rejects --staged' ' + test_must_fail git restore --staged --merge . -- 2>err1 && + test_i18ngrep "cannot be used with" err1 && + test_must_fail git restore --staged --conflict=diff3 . -- 2>err2 && + test_i18ngrep "cannot be used with" err2 && + test_must_fail git restore --staged --ours . -- 2>err3 && + test_i18ngrep "cannot be used with" err3 && + test_must_fail git restore --staged --theirs . -- 2>err4 && + test_i18ngrep "cannot be used with" err4 +' + +test_expect_success 'restore with merge options rejects --staged --worktree' ' + test_must_fail git restore --staged --worktree --merge . -- 2>err1 && + test_i18ngrep "cannot be used with" err1 && + test_must_fail git restore --staged --worktree --conflict=diff3 . -- 2>err2 && + test_i18ngrep "cannot be used with" err2 && + test_must_fail git restore --staged --worktree --ours . -- 2>err3 && + test_i18ngrep "cannot be used with" err3 && + test_must_fail git restore --staged --worktree --theirs . -- 2>err4 && + test_i18ngrep "cannot be used with" err4 +' + test_done -- 2.39.0