@matheusbsbs / matheus-bagliano / commits / 2e4083198d
Fork 0

built-in add -p: show helpful hint when nothing can be staged

This patch will make `git add -p` show "No changes." or "Only binary files changed." in that case. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Johannes Schindelin committed Dec 13, 2019 at 08:08 UTC 2e4083198d1508206488af4c82093ceb6cf20f4e
1 file changed +13 -4
add-patch.c
+13 -4
@@ -44,7 +44,7 @@ struct add_p_state {
44 struct hunk head;
45 struct hunk *hunk;
46 size_t hunk_nr, hunk_alloc;
47 - unsigned deleted:1, mode_change:1;
47 + unsigned deleted:1, mode_change:1,binary:1;
48 } *file_diff;
49 size_t file_diff_nr;
50 };
@@ -294,7 +294,9 @@ static int parse_diff(struct add_p_state *s, const struct pathspec *ps)
294 BUG("'new mode' does not immediately follow "
295 "'old mode'?\n\n%.*s",
296 (int)(eol - plain->buf), plain->buf);
297 - }
297 + } else if (hunk == &file_diff->head &&
298 + starts_with(p, "Binary files "))
299 + file_diff->binary = 1;
300
301 if (file_diff->deleted && file_diff->mode_change)
302 BUG("diff contains delete *and* a mode change?!?\n%.*s",
@@ -1304,7 +1306,7 @@ int run_add_p(struct repository *r, const struct pathspec *ps)
1306 struct add_p_state s = {
1307 { r }, STRBUF_INIT, STRBUF_INIT, STRBUF_INIT, STRBUF_INIT
1308 };
1307 - size_t i;
1309 + size_t i, binary_count = 0;
1310
1311 init_add_i_state(&s.s, r);
1312
@@ -1318,9 +1320,16 @@ int run_add_p(struct repository *r, const struct pathspec *ps)
1320 }
1321
1322 for (i = 0; i < s.file_diff_nr; i++)
1321 - if (patch_update_file(&s, s.file_diff + i))
1323 + if (s.file_diff[i].binary && !s.file_diff[i].hunk_nr)
1324 + binary_count++;
1325 + else if (patch_update_file(&s, s.file_diff + i))
1326 break;
1327
1328 + if (s.file_diff_nr == 0)
1329 + fprintf(stderr, _("No changes.\n"));
1330 + else if (binary_count == s.file_diff_nr)
1331 + fprintf(stderr, _("Only binary files changed.\n"));
1332 +
1333 strbuf_release(&s.answer);
1334 strbuf_release(&s.buf);
1335 strbuf_release(&s.plain);