diff options
-rw-r--r-- | merge-tree.c | 2 | ||||
-rw-r--r-- | tree-walk.c | 8 | ||||
-rw-r--r-- | tree-walk.h | 3 |
3 files changed, 9 insertions, 4 deletions
diff --git a/merge-tree.c b/merge-tree.c index 8be0b9f910..02fc10f7e6 100644 --- a/merge-tree.c +++ b/merge-tree.c @@ -287,7 +287,7 @@ static void unresolved(const struct traverse_info *info, struct name_entry n[3]) * The successful merge rules are the same as for the three-way merge * in git-read-tree. */ -static int threeway_callback(int n, unsigned long mask, struct name_entry *entry, struct traverse_info *info) +static int threeway_callback(int n, unsigned long mask, unsigned long dirmask, struct name_entry *entry, struct traverse_info *info) { /* Same in both? */ if (same_entry(entry+1, entry+2)) { diff --git a/tree-walk.c b/tree-walk.c index 7170e375b3..842cb6ad2e 100644 --- a/tree-walk.c +++ b/tree-walk.c @@ -62,7 +62,7 @@ void *fill_tree_descriptor(struct tree_desc *desc, const unsigned char *sha1) static int entry_compare(struct name_entry *a, struct name_entry *b) { - return base_name_compare( + return df_name_compare( a->path, tree_entry_len(a->path, a->sha1), a->mode, b->path, tree_entry_len(b->path, b->sha1), b->mode); } @@ -142,6 +142,7 @@ int traverse_trees(int n, struct tree_desc *t, struct traverse_info *info) for (;;) { unsigned long mask = 0; + unsigned long dirmask = 0; int i, last; last = -1; @@ -166,10 +167,13 @@ int traverse_trees(int n, struct tree_desc *t, struct traverse_info *info) mask = 0; } mask |= 1ul << i; + if (S_ISDIR(entry[i].mode)) + dirmask |= 1ul << i; last = i; } if (!mask) break; + dirmask &= mask; /* * Clear all the unused name-entries. @@ -179,7 +183,7 @@ int traverse_trees(int n, struct tree_desc *t, struct traverse_info *info) continue; entry_clear(entry + i); } - ret = info->fn(n, mask, entry, info); + ret = info->fn(n, mask, dirmask, entry, info); if (ret < 0) break; if (ret) diff --git a/tree-walk.h b/tree-walk.h index c123cfeef4..42110a465f 100644 --- a/tree-walk.h +++ b/tree-walk.h @@ -34,7 +34,7 @@ int tree_entry(struct tree_desc *, struct name_entry *); void *fill_tree_descriptor(struct tree_desc *desc, const unsigned char *sha1); struct traverse_info; -typedef int (*traverse_callback_t)(int n, unsigned long mask, struct name_entry *entry, struct traverse_info *); +typedef int (*traverse_callback_t)(int n, unsigned long mask, unsigned long dirmask, struct name_entry *entry, struct traverse_info *); int traverse_trees(int n, struct tree_desc *t, struct traverse_info *info); struct traverse_info { @@ -42,6 +42,7 @@ struct traverse_info { struct name_entry name; int pathlen; + unsigned long conflicts; traverse_callback_t fn; void *data; }; |