diff options
| author | Junio C Hamano <gitster@pobox.com> | 2022-07-04 13:40:31 -0700 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2022-07-04 13:40:59 -0700 |
| commit | a631e99807f4cd5e98594452992f7343268ac56b (patch) | |
| tree | d24d341ceae6ae1b737394952a952b2fd97a9b70 | |
| parent | Sync with Git 2.36.2 (diff) | |
| parent | add --interactive: allow `update` to stage deleted files (diff) | |
| download | git-a631e99807f4cd5e98594452992f7343268ac56b.tar.gz git-a631e99807f4cd5e98594452992f7343268ac56b.zip | |
Merge 'js/add-i-delete' into maint-2.37
Rewrite of "git add -i" in C that appeared in Git 2.25 didn't
correctly record a removed file to the index, which is an old
regression but has become widely known because the C version
has become the default in the latest release.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
| -rw-r--r-- | add-interactive.c | 12 | ||||
| -rwxr-xr-x | t/t3701-add-interactive.sh | 9 |
2 files changed, 19 insertions, 2 deletions
diff --git a/add-interactive.c b/add-interactive.c index 6047e8f648..22fcd3412c 100644 --- a/add-interactive.c +++ b/add-interactive.c @@ -697,8 +697,16 @@ static int run_update(struct add_i_state *s, const struct pathspec *ps, for (i = 0; i < files->items.nr; i++) { const char *name = files->items.items[i].string; - if (files->selected[i] && - add_file_to_index(s->r->index, name, 0) < 0) { + struct stat st; + + if (!files->selected[i]) + continue; + if (lstat(name, &st) && is_missing_file_error(errno)) { + if (remove_file_from_index(s->r->index, name) < 0) { + res = error(_("could not stage '%s'"), name); + break; + } + } else if (add_file_to_index(s->r->index, name, 0) < 0) { res = error(_("could not stage '%s'"), name); break; } diff --git a/t/t3701-add-interactive.sh b/t/t3701-add-interactive.sh index fc26cb8bae..b354fb39de 100755 --- a/t/t3701-add-interactive.sh +++ b/t/t3701-add-interactive.sh @@ -103,6 +103,15 @@ test_expect_success 'status works (commit)' ' grep "+1/-0 *+2/-0 file" output ' +test_expect_success 'update can stage deletions' ' + >to-delete && + git add to-delete && + rm to-delete && + test_write_lines u t "" | git add -i && + git ls-files to-delete >output && + test_must_be_empty output +' + test_expect_success 'setup expected' ' cat >expected <<-\EOF index 180b47c..b6f2c08 100644 |
