After we initialize the various fields in `opts` but before we actually
use them, we might return early. Move the initialization further down,
to immediately before we use `opts`.

This limits the scope of `opts` and will help a later commit fix a
memory leak without having to worry about those early returns.

This patch is best viewed using something like this (note the tab!):
--color-moved --anchored="      trees[nr_trees] = parse_tree_indirect"

Signed-off-by: Martin Ågren <martin.ag...@gmail.com>
Signed-off-by: Junio C Hamano <gits...@pobox.com>
---
 merge.c | 34 ++++++++++++++++++----------------
 1 file changed, 18 insertions(+), 16 deletions(-)

diff --git a/merge.c b/merge.c
index f06a4773d4..f123658e58 100644
--- a/merge.c
+++ b/merge.c
@@ -94,23 +94,7 @@ int checkout_fast_forward(const struct object_id *head,
                return -1;
 
        memset(&trees, 0, sizeof(trees));
-       memset(&opts, 0, sizeof(opts));
        memset(&t, 0, sizeof(t));
-       if (overwrite_ignore) {
-               memset(&dir, 0, sizeof(dir));
-               dir.flags |= DIR_SHOW_IGNORED;
-               setup_standard_excludes(&dir);
-               opts.dir = &dir;
-       }
-
-       opts.head_idx = 1;
-       opts.src_index = &the_index;
-       opts.dst_index = &the_index;
-       opts.update = 1;
-       opts.verbose_update = 1;
-       opts.merge = 1;
-       opts.fn = twoway_merge;
-       setup_unpack_trees_porcelain(&opts, "merge");
 
        trees[nr_trees] = parse_tree_indirect(head);
        if (!trees[nr_trees++]) {
@@ -126,6 +110,24 @@ int checkout_fast_forward(const struct object_id *head,
                parse_tree(trees[i]);
                init_tree_desc(t+i, trees[i]->buffer, trees[i]->size);
        }
+
+       memset(&opts, 0, sizeof(opts));
+       if (overwrite_ignore) {
+               memset(&dir, 0, sizeof(dir));
+               dir.flags |= DIR_SHOW_IGNORED;
+               setup_standard_excludes(&dir);
+               opts.dir = &dir;
+       }
+
+       opts.head_idx = 1;
+       opts.src_index = &the_index;
+       opts.dst_index = &the_index;
+       opts.update = 1;
+       opts.verbose_update = 1;
+       opts.merge = 1;
+       opts.fn = twoway_merge;
+       setup_unpack_trees_porcelain(&opts, "merge");
+
        if (unpack_trees(nr_trees, t, &opts)) {
                rollback_lock_file(&lock_file);
                return -1;
-- 
2.17.0.840.g5d83f92caf

Reply via email to