unpack_trees: group error messages by type

When an error is encountered, it calls add_rejected_file() which either
- directly displays the error message and stops if in plumbing mode
  (i.e. if show_all_errors is not initialized at 1)
- or stores it so that it will be displayed at the end with display_error_msgs(),

Storing the files by error type permits to have a list of files for
which there is the same error instead of having a serie of almost
identical errors.

As each bind_overlap error combines a file and an old file, a list cannot be
done, therefore, theses errors are not stored but directly displayed.

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Matthieu Moy
2010-08-11 10:38:07 +02:00
committed by Junio C Hamano
parent 08402b0409
commit e6c111b4c0
11 changed files with 123 additions and 17 deletions

View File

@ -1,5 +1,6 @@
#include "cache.h"
#include "tree-walk.h"
#include "unpack-trees.h"
#include "tree.h"
static const char *get_mode(const char *str, unsigned int *modep)
@ -310,6 +311,7 @@ static void free_extended_entry(struct tree_desc_x *t)
int traverse_trees(int n, struct tree_desc *t, struct traverse_info *info)
{
int ret = 0;
int error = 0;
struct name_entry *entry = xmalloc(n*sizeof(*entry));
int i;
struct tree_desc_x *tx = xcalloc(n, sizeof(*tx));
@ -377,8 +379,11 @@ int traverse_trees(int n, struct tree_desc *t, struct traverse_info *info)
if (!mask)
break;
ret = info->fn(n, mask, dirmask, entry, info);
if (ret < 0)
break;
if (ret < 0) {
error = ret;
if (!info->show_all_errors)
break;
}
mask &= ret;
ret = 0;
for (i = 0; i < n; i++)
@ -389,7 +394,7 @@ int traverse_trees(int n, struct tree_desc *t, struct traverse_info *info)
for (i = 0; i < n; i++)
free_extended_entry(tx + i);
free(tx);
return ret;
return error;
}
static int find_tree_entry(struct tree_desc *t, const char *name, unsigned char *result, unsigned *mode)