]> git.ipfire.org Git - thirdparty/git.git/commitdiff
merge-ort: process_renames() now needs more defensiveness
authorElijah Newren <newren@gmail.com>
Tue, 19 Jan 2021 19:53:52 +0000 (19:53 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 21 Jan 2021 06:18:55 +0000 (22:18 -0800)
Since directory rename detection adds new paths to opt->priv->paths and
removes old ones, process_renames() needs to now check whether
pair->one->path actually exists in opt->priv->paths instead of just
assuming it does.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
merge-ort.c

index 1152d0ae21ec6c65c81b892a8153f51042dcd187..7314f9c69c2d7658e9f0213c90b004c4141e673c 100644 (file)
@@ -1410,12 +1410,28 @@ static int process_renames(struct merge_options *opt,
                const char *rename_branch = NULL, *delete_branch = NULL;
 
                old_ent = strmap_get_entry(&opt->priv->paths, pair->one->path);
-               oldpath = old_ent->key;
-               oldinfo = old_ent->value;
-
                new_ent = strmap_get_entry(&opt->priv->paths, pair->two->path);
-               newpath = new_ent->key;
-               newinfo = new_ent->value;
+               if (old_ent) {
+                       oldpath = old_ent->key;
+                       oldinfo = old_ent->value;
+               }
+               newpath = pair->two->path;
+               if (new_ent) {
+                       newpath = new_ent->key;
+                       newinfo = new_ent->value;
+               }
+
+               /*
+                * If pair->one->path isn't in opt->priv->paths, that means
+                * that either directory rename detection removed that
+                * path, or a parent directory of oldpath was resolved and
+                * we don't even need the rename; in either case, we can
+                * skip it.  If oldinfo->merged.clean, then the other side
+                * of history had no changes to oldpath and we don't need
+                * the rename and can skip it.
+                */
+               if (!oldinfo || oldinfo->merged.clean)
+                       continue;
 
                /*
                 * diff_filepairs have copies of pathnames, thus we have to