Re: [PATCH 1/2] rm: better error message on failure for multiple files
Once again, thanks a lot your feedback, we appreciate it a lot! Le 2013-06-08 15:51, Ramkumar Ramachandra a écrit : Mathieu Lienard--Mayor wrote: @@ -170,30 +175,47 @@ static int check_local_mod(unsigned char *head, int index_only) * intent to add entry. */ if (local_changes staged_changes) { - if (!index_only || !(ce-ce_flags CE_INTENT_TO_ADD)) - errs = error(_('%s' has staged content different -from both the file and the HEAD\n -(use -f to force removal)), name); + if (!index_only || !(ce-ce_flags CE_INTENT_TO_ADD)) { + strbuf_addstr(files_staged, \n ); Ouch. Wouldn't a string-list be more appropriate for this kind of thing? Matthieu Moy told me string-list would be better aswell, so we're gonna change it. -- Mathieu Liénard--Mayor, 2nd year at Grenoble INP - ENSIMAG (+33)6 80 56 30 02 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 1/2] rm: better error message on failure for multiple files
Le 08/06/2013 10:33, Mathieu Lienard--Mayor a écrit : + if (files_staged.len) + errs = error(_(the following files have staged content +different from both the\nfileand the HEAD:%s\n +(use -f to force removal)), files_staged.buf); Typo here: fileand - file and -- Célestin Matte -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 1/2] rm: better error message on failure for multiple files
When 'git rm' fails, it now displays a single message with the list of files involved, instead of displaying a list of messages with one file each. As an example, the old message: error: 'foo.txt' has changes staged in the index (use --cached to keep the file, or -f to force removal) error: 'bar.txt' has changes staged in the index (use --cached to keep the file, or -f to force removal) would now be displayed as: error: the following files have changes staged in the index: foo.txt bar.txt (use --cached to keep the file, or -f to force removal) Signed-off-by: Mathieu Lienard--Mayor mathieu.lienard--ma...@ensimag.imag.fr Signed-off-by: Jorge Juan Garcia Garcia jorge-juan.garcia-gar...@ensimag.imag.fr Signed-off-by: Matthieu Moy matthieu@grenoble-inp.fr --- builtin/rm.c | 93 +- 1 files changed, 79 insertions(+), 14 deletions(-) diff --git a/builtin/rm.c b/builtin/rm.c index 7b91d52..1bff656 100644 --- a/builtin/rm.c +++ b/builtin/rm.c @@ -82,6 +82,11 @@ static int check_local_mod(unsigned char *head, int index_only) int i, no_head; int errs = 0; + struct string_list files_staged = STRING_LIST_INIT_NODUP; + struct string_list files_cached = STRING_LIST_INIT_NODUP; + struct string_list files_submodule = STRING_LIST_INIT_NODUP; + struct string_list files_local = STRING_LIST_INIT_NODUP; + no_head = is_null_sha1(head); for (i = 0; i list.nr; i++) { struct stat st; @@ -171,29 +176,89 @@ static int check_local_mod(unsigned char *head, int index_only) */ if (local_changes staged_changes) { if (!index_only || !(ce-ce_flags CE_INTENT_TO_ADD)) - errs = error(_('%s' has staged content different -from both the file and the HEAD\n -(use -f to force removal)), name); + string_list_append(files_staged, name); } else if (!index_only) { if (staged_changes) - errs = error(_('%s' has changes staged in the index\n -(use --cached to keep the file, -or -f to force removal)), name); + string_list_append(files_cached, name); if (local_changes) { if (S_ISGITLINK(ce-ce_mode) !submodule_uses_gitfile(name)) { - errs = error(_(submodule '%s' (or one of its nested -submodules) uses a .git directory\n -(use 'rm -rf' if you really want to remove -it including all of its history)), name); - } else - errs = error(_('%s' has local modifications\n -(use --cached to keep the file, -or -f to force removal)), name); + string_list_append(files_submodule, + name); + } else { + string_list_append(files_local, name); + } } } } + if (files_staged.nr) { + struct strbuf msg_staged = STRBUF_INIT; + int j; + strbuf_addstr( + msg_staged, + the following files have staged content different + from both the\nfile and the HEAD:); + for (j = 0; j files_staged.nr; j++) { + strbuf_addf(msg_staged, + \n %s, + files_staged.items[j].string); + } + strbuf_addstr(msg_staged, + \n(use -f to force removal)); + errs = error(_(%s), msg_staged.buf); + } + if (files_cached.nr) { + struct strbuf msg_cached = STRBUF_INIT; + int j; + strbuf_addstr( + msg_cached, + the following files have changes staged + in the index:); + for (j = 0; j files_cached.nr; j++) { + strbuf_addf(msg_cached, + \n %s, + files_cached.items[j].string); + } +
Re: [PATCH 1/2] rm: better error message on failure for multiple files
Please ignore this, manipulation error while in the git send-email command line. Le 2013-06-10 14:51, Mathieu Lienard--Mayor a écrit : When 'git rm' fails, it now displays a single message with the list of files involved, instead of displaying a list of messages with one file each. As an example, the old message: error: 'foo.txt' has changes staged in the index (use --cached to keep the file, or -f to force removal) error: 'bar.txt' has changes staged in the index (use --cached to keep the file, or -f to force removal) would now be displayed as: error: the following files have changes staged in the index: foo.txt bar.txt (use --cached to keep the file, or -f to force removal) Signed-off-by: Mathieu Lienard--Mayor mathieu.lienard--ma...@ensimag.imag.fr Signed-off-by: Jorge Juan Garcia Garcia jorge-juan.garcia-gar...@ensimag.imag.fr Signed-off-by: Matthieu Moy matthieu@grenoble-inp.fr --- builtin/rm.c | 93 +- 1 files changed, 79 insertions(+), 14 deletions(-) diff --git a/builtin/rm.c b/builtin/rm.c index 7b91d52..1bff656 100644 --- a/builtin/rm.c +++ b/builtin/rm.c @@ -82,6 +82,11 @@ static int check_local_mod(unsigned char *head, int index_only) int i, no_head; int errs = 0; + struct string_list files_staged = STRING_LIST_INIT_NODUP; + struct string_list files_cached = STRING_LIST_INIT_NODUP; + struct string_list files_submodule = STRING_LIST_INIT_NODUP; + struct string_list files_local = STRING_LIST_INIT_NODUP; + no_head = is_null_sha1(head); for (i = 0; i list.nr; i++) { struct stat st; @@ -171,29 +176,89 @@ static int check_local_mod(unsigned char *head, int index_only) */ if (local_changes staged_changes) { if (!index_only || !(ce-ce_flags CE_INTENT_TO_ADD)) - errs = error(_('%s' has staged content different -from both the file and the HEAD\n -(use -f to force removal)), name); + string_list_append(files_staged, name); } else if (!index_only) { if (staged_changes) - errs = error(_('%s' has changes staged in the index\n -(use --cached to keep the file, -or -f to force removal)), name); + string_list_append(files_cached, name); if (local_changes) { if (S_ISGITLINK(ce-ce_mode) !submodule_uses_gitfile(name)) { - errs = error(_(submodule '%s' (or one of its nested -submodules) uses a .git directory\n -(use 'rm -rf' if you really want to remove -it including all of its history)), name); - } else - errs = error(_('%s' has local modifications\n -(use --cached to keep the file, -or -f to force removal)), name); + string_list_append(files_submodule, + name); + } else { + string_list_append(files_local, name); + } } } } + if (files_staged.nr) { + struct strbuf msg_staged = STRBUF_INIT; + int j; + strbuf_addstr( + msg_staged, + the following files have staged content different + from both the\nfile and the HEAD:); + for (j = 0; j files_staged.nr; j++) { + strbuf_addf(msg_staged, + \n%s, + files_staged.items[j].string); + } + strbuf_addstr(msg_staged, + \n(use -f to force removal)); + errs = error(_(%s), msg_staged.buf); + } + if (files_cached.nr) { + struct strbuf msg_cached = STRBUF_INIT; + int j; + strbuf_addstr( + msg_cached, + the following files have changes staged + in the index:); + for (j = 0; j files_cached.nr; j++) { +
[PATCH 1/2] rm: better error message on failure for multiple files
From: Mathieu Liénard--Mayor mathieu.lienard--ma...@ensimag.imag.fr When 'git rm' fails, it now displays a single message with the list of files involved, instead of displaying a list of messages with one file each. As an example, the old message: error: 'foo.txt' has changes staged in the index (use --cached to keep the file, or -f to force removal) error: 'bar.txt' has changes staged in the index (use --cached to keep the file, or -f to force removal) would now be displayed as: error: the following files have changes staged in the index: foo.txt bar.txt (use --cached to keep the file, or -f to force removal) Signed-off-by: Mathieu Lienard--Mayor mathieu.lienard--ma...@ensimag.imag.fr Signed-off-by: Jorge Juan Garcia Garcia jorge-juan.garcia-gar...@ensimag.imag.fr Signed-off-by: Matthieu Moy matthieu@grenoble-inp.fr --- builtin/rm.c | 54 ++ t/t3600-rm.sh | 45 + 2 files changed, 83 insertions(+), 16 deletions(-) diff --git a/builtin/rm.c b/builtin/rm.c index 7b91d52..5b2abd2 100644 --- a/builtin/rm.c +++ b/builtin/rm.c @@ -82,6 +82,11 @@ static int check_local_mod(unsigned char *head, int index_only) int i, no_head; int errs = 0; + struct strbuf files_staged = STRBUF_INIT; + struct strbuf files_cached = STRBUF_INIT; + struct strbuf files_submodule = STRBUF_INIT; + struct strbuf files_local = STRBUF_INIT; + no_head = is_null_sha1(head); for (i = 0; i list.nr; i++) { struct stat st; @@ -170,30 +175,47 @@ static int check_local_mod(unsigned char *head, int index_only) * intent to add entry. */ if (local_changes staged_changes) { - if (!index_only || !(ce-ce_flags CE_INTENT_TO_ADD)) - errs = error(_('%s' has staged content different -from both the file and the HEAD\n -(use -f to force removal)), name); + if (!index_only || !(ce-ce_flags CE_INTENT_TO_ADD)) { + strbuf_addstr(files_staged, \n); + strbuf_addstr(files_staged, name); + } } else if (!index_only) { - if (staged_changes) - errs = error(_('%s' has changes staged in the index\n -(use --cached to keep the file, -or -f to force removal)), name); + if (staged_changes) { + strbuf_addstr(files_cached, \n); + strbuf_addstr(files_cached, name); + } if (local_changes) { if (S_ISGITLINK(ce-ce_mode) !submodule_uses_gitfile(name)) { - errs = error(_(submodule '%s' (or one of its nested -submodules) uses a .git directory\n -(use 'rm -rf' if you really want to remove -it including all of its history)), name); - } else - errs = error(_('%s' has local modifications\n -(use --cached to keep the file, -or -f to force removal)), name); + strbuf_addstr(files_submodule, \n ); + strbuf_addstr(files_submodule, name); + } else { + strbuf_addstr(files_local, \n ); + strbuf_addstr(files_local, name); + } } } } + + if (files_staged.len) + errs = error(_(the following files have staged content + different from both the\nfileand the HEAD:%s\n + (use -f to force removal)), files_staged.buf); + if (files_cached.len) + errs = error(_(the following files have changes staged + in the index:%s\n(use --cached to keep the file, + or -f to force removal)), files_cached.buf); + if (files_submodule.len) + errs = error(_(the following submodules (or one of its nested + submodule) use a .git directory:%s\n +
Re: [PATCH 1/2] rm: better error message on failure for multiple files
Mathieu Lienard--Mayor wrote: @@ -170,30 +175,47 @@ static int check_local_mod(unsigned char *head, int index_only) * intent to add entry. */ if (local_changes staged_changes) { - if (!index_only || !(ce-ce_flags CE_INTENT_TO_ADD)) - errs = error(_('%s' has staged content different -from both the file and the HEAD\n -(use -f to force removal)), name); + if (!index_only || !(ce-ce_flags CE_INTENT_TO_ADD)) { + strbuf_addstr(files_staged, \n); Ouch. Wouldn't a string-list be more appropriate for this kind of thing? -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html