[PATCH 07/17] unpack-trees: split traverse_trees() code into a separate function
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
unpack-trees.c | 64 ++++++++++++++++++++++++++++++-------------------------
1 files changed, 35 insertions(+), 29 deletions(-)
diff --git a/unpack-trees.c b/unpack-trees.c
index 3c7a7c9..4889e24 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -792,6 +792,39 @@ static int unpack_callback(int n, unsigned long mask, unsigned long dirmask, str
return mask;
}
+static int unpack_traverse(unsigned len, struct tree_desc *t, struct unpack_trees_options *o)
+{
+ const char *prefix = o->prefix ? o->prefix : "";
+ struct traverse_info info;
+
+ if (!len)
+ return 0;
+
+ setup_traverse_info(&info, prefix);
+ info.fn = unpack_callback;
+ info.data = o;
+ info.show_all_errors = o->show_all_errors;
+
+ if (o->prefix) {
+ /*
+ * Unpack existing index entries that sort before the
+ * prefix the tree is spliced into. Note that o->merge
+ * is always true in this case.
+ */
+ while (1) {
+ struct cache_entry *ce = next_cache_entry(o);
+ if (!ce)
+ break;
+ if (ce_in_traverse_path(ce, &info))
+ break;
+ if (unpack_index_entry(ce, o) < 0)
+ return 1;
+ }
+ }
+
+ return traverse_trees(len, t, &info) < 0;
+}
+
/*
* N-way merge "len" trees. Returns 0 on success, -1 on failure to manipulate the
* resulting index, -2 on failure to reflect the changes to the work tree.
@@ -831,35 +864,8 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
dfc = xcalloc(1, cache_entry_size(0));
o->df_conflict_entry = dfc;
- if (len) {
- const char *prefix = o->prefix ? o->prefix : "";
- struct traverse_info info;
-
- setup_traverse_info(&info, prefix);
- info.fn = unpack_callback;
- info.data = o;
- info.show_all_errors = o->show_all_errors;
-
- if (o->prefix) {
- /*
- * Unpack existing index entries that sort before the
- * prefix the tree is spliced into. Note that o->merge
- * is always true in this case.
- */
- while (1) {
- struct cache_entry *ce = next_cache_entry(o);
- if (!ce)
- break;
- if (ce_in_traverse_path(ce, &info))
- break;
- if (unpack_index_entry(ce, o) < 0)
- goto return_failed;
- }
- }
-
- if (traverse_trees(len, t, &info) < 0)
- goto return_failed;
- }
+ if (unpack_traverse(len, t, o))
+ goto return_failed;
/* Any left-over entries in the index? */
if (o->merge) {
--
1.7.1.rc1.69.g24c2f7