summaryrefslogtreecommitdiff
path: root/add-interactive.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2022-07-04 20:40:31 (GMT)
committerJunio C Hamano <gitster@pobox.com>2022-07-04 20:40:59 (GMT)
commita631e99807f4cd5e98594452992f7343268ac56b (patch)
treed24d341ceae6ae1b737394952a952b2fd97a9b70 /add-interactive.c
parent69ab3309e96279b3f323ceb1b8c2ebf670788c8e (diff)
parent4788e8b25692a8ae1a005554d3ad12f8ee4ee29e (diff)
downloadgit-a631e99807f4cd5e98594452992f7343268ac56b.zip
git-a631e99807f4cd5e98594452992f7343268ac56b.tar.gz
git-a631e99807f4cd5e98594452992f7343268ac56b.tar.bz2
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>
Diffstat (limited to 'add-interactive.c')
-rw-r--r--add-interactive.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/add-interactive.c b/add-interactive.c
index 6047e8f..22fcd34 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;
}