Web lists-archives.com

Re: [PATCH 08/30] directory rename detection: files/directories in the way of some renames




On Fri, Nov 10, 2017 at 11:05 AM, Elijah Newren <newren@xxxxxxxxx> wrote:
> Signed-off-by: Elijah Newren <newren@xxxxxxxxx>
> ---
>  t/t6043-merge-rename-directories.sh | 303 ++++++++++++++++++++++++++++++++++++
>  1 file changed, 303 insertions(+)
>
> diff --git a/t/t6043-merge-rename-directories.sh b/t/t6043-merge-rename-directories.sh
> index ec054b210a..d15153c652 100755
> --- a/t/t6043-merge-rename-directories.sh
> +++ b/t/t6043-merge-rename-directories.sh
> @@ -750,4 +750,307 @@ test_expect_success '4a-check: Directory split, with original directory still pr
>  #   detection.)  But, sadly, see testcase 8b.
>  ###########################################################################
>
> +
> +###########################################################################
> +# SECTION 5: Files/directories in the way of subset of to-be-renamed paths
> +#
> +# Implicitly renaming files due to a detected directory rename could run
> +# into problems if there are files or directories in the way of the paths
> +# we want to rename.  Explore such cases in this section.
> +###########################################################################
> +
> +# Testcase 5a, Merge directories, other side adds files to original and target
> +#   Commit A: z/{b,c},       y/d
> +#   Commit B: z/{b,c,e_1,f}, y/{d,e_2}
> +#   Commit C: y/{b,c,d}
> +#   Expected: z/e_1, y/{b,c,d,e_2,f} + CONFLICT warning
> +#   NOTE: While directory rename detection is active here causing z/f to
> +#         become y/f, we did not apply this for z/e_1 because that would
> +#         give us an add/add conflict for y/e_1 vs y/e_2.  This problem with
> +#         this add/add, is that both versions of y/e are from the same side
> +#         of history, giving us no way to represent this conflict in the
> +#         index.

Makes sense.

> +# Testcase 5b, Rename/delete in order to get add/add/add conflict
> +#   (Related to testcase 8d; these may appear slightly inconsistent to users;
> +#    Also related to testcases 7d and 7e)
> +#   Commit A: z/{b,c,d_1}
> +#   Commit B: y/{b,c,d_2}
> +#   Commit C: z/{b,c,d_1,e}, y/d_3
> +#   Expected: y/{b,c,e}, CONFLICT(add/add: y/d_2 vs. y/d_3)
> +#   NOTE: If z/d_1 in commit C were to be involved in dir rename detection, as
> +#         we normaly would since z/ is being renamed to y/, then this would be
> +#         a rename/delete (z/d_1 -> y/d_1 vs. deleted) AND an add/add/add
> +#         conflict of y/d_1 vs. y/d_2 vs. y/d_3.  Add/add/add is not
> +#         representable in the index, so the existence of y/d_3 needs to
> +#         cause us to bail on directory rename detection for that path, falling
> +#         back to git behavior without the directory rename detection.


> +
> +# Testcase 5c, Transitive rename would cause rename/rename/rename/add/add/add
> +#   (Directory rename detection would result in transitive rename vs.
> +#    rename/rename(1to2) and turn it into a rename/rename(1to3).  Further,
> +#    rename paths conflict with separate adds on the other side)
> +#   (Related to testcases 3b and 7c)
> +#   Commit A: z/{b,c}, x/d_1
> +#   Commit B: y/{b,c,d_2}, w/d_1
> +#   Commit C: z/{b,c,d_1,e}, w/d_3, y/d_4
> +#   Expected: A mess, but only a rename/rename(1to2)/add/add mess.  Use the
> +#             presence of y/d_4 in C to avoid doing transitive rename of
> +#             x/d_1 -> z/d_1 -> y/d_1, so that the only paths we have at
> +#             y/d are y/d_2 and y/d_4.  We still do the move from z/e to y/e,
> +#             though, because it doesn't have anything in the way.

Missing the expected state, only the explanation is given.


> +# Testcase 5d, Directory/file/file conflict due to directory rename
> +#   Commit A: z/{b,c}
> +#   Commit B: y/{b,c,d_1}
> +#   Commit C: z/{b,c,d_2,f}, y/d/e
> +#   Expected: y/{b,c,d/e,f}, z/d_2, CONFLICT(file/directory), y/d_1~HEAD
> +#   Note: The fact that y/d/ exists in C makes us bail on directory rename
> +#         detection for z/d_2, but that doesn't prevent us from applying the
> +#         directory rename detection for z/f -> y/f.

Makes sense.

> +
> +###########################################################################
> +# Rules suggested by section 5:
> +#
> +#   If a subset of to-be-renamed files have a file or directory in the way,
> +#   "turn off" the directory rename for those specific sub-paths,

Makes sense.

>  falling
> +#   back to old handling.  But, sadly, see testcases 8a and 8b.

You seem to be hinting at these all the time.