[PATCH v3 00/11] merge-ort: add basic rename detection
- From
Elijah Newren via GitGitGadget <gitgitgadget@gmail.com>
- Date
- Dec 15, 2020, 18:27 UTC
- Message-ID
- <pull.812.v3.git.1608056886.gitgitgadget@gmail.com>
- In-Reply-To
- <pull.812.v2.git.1607962900.gitgitgadget@gmail.com>
This series builds on en/merge-ort-2 and adds basic rename detection to merge-ort.
Changes since v2 (all due to feedback from Stolee's reviews):
* reordered two of the patches (one depended on vars declared in another) * a few other adjustments to make patches individually compile (I usually check this; so embarrassing that I somehow missed it)
Elijah Newren (11): merge-ort: add basic data structures for handling renames merge-ort: add initial outline for basic rename detection merge-ort: implement detect_regular_renames() merge-ort: implement compare_pairs() and collect_renames() merge-ort: add basic outline for process_renames() merge-ort: add implementation of both sides renaming identically merge-ort: add implementation of both sides renaming differently merge-ort: add implementation of rename/delete conflicts merge-ort: add implementation of rename collisions merge-ort: add implementation of normal rename handling merge-ort: add implementation of type-changed rename handling
merge-ort.c | 446 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 430 insertions(+), 16 deletions(-)
base-commit: c5a6f65527aa3b6f5d7cf25437a88d8727ab0646 Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-812%2Fnewren%2Fort-renames-v3 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-812/newren/ort-renames-v3 Pull-Request: https://github.com/gitgitgadget/git/pull/812
Range-diff vs v2:
1: 78621ca0788 = 1: 78621ca0788 merge-ort: add basic data structures for handling renames
2: d846decf40b = 2: d846decf40b merge-ort: add initial outline for basic rename detection
3: 620fc64032d = 3: 620fc64032d merge-ort: implement detect_regular_renames()
4: 9382dc4d50b = 4: 9382dc4d50b merge-ort: implement compare_pairs() and collect_renames()
5: d20fab8d403 = 5: d20fab8d403 merge-ort: add basic outline for process_renames()
6: 15fff3dd0c4 ! 6: 7ec51feb418 merge-ort: add implementation of both sides renaming identically
@@ merge-ort.c: static int process_renames(struct merge_options *opt,
const char *pathnames[3];
+ struct version_info merged;
+ struct conflict_info *base, *side1, *side2;
-+ unsigned was_binary_blob = 0;
pathnames[0] = oldpath;
pathnames[1] = newpath;
7: d00e26be784 ! 7: d37e2626c30 merge-ort: add implementation of both sides renaming differently
@@ Commit message
Signed-off-by: Elijah Newren <newren@gmail.com>
## merge-ort.c ##
+@@ merge-ort.c: static int process_renames(struct merge_options *opt,
+ const char *pathnames[3];
+ struct version_info merged;
+ struct conflict_info *base, *side1, *side2;
++ unsigned was_binary_blob = 0;
+
+ pathnames[0] = oldpath;
+ pathnames[1] = newpath;
@@ merge-ort.c: static int process_renames(struct merge_options *opt,
}
9: f017534243c ! 8: 6b79da5e8a4 merge-ort: add implementation of rename/delete conflicts
@@ merge-ort.c: static int process_renames(struct merge_options *opt,
old_ent = strmap_get_entry(&opt->priv->paths, pair->one->path);
oldpath = old_ent->key;
@@ merge-ort.c: static int process_renames(struct merge_options *opt,
- if (type_changed && collision) {
/* special handling so later blocks can handle this */
die("Not yet implemented");
+ }
+ if (source_deleted) {
+ if (target_index == 1) {
+ rename_branch = opt->branch1;
@@ merge-ort.c: static int process_renames(struct merge_options *opt,
+ rename_branch = opt->branch2;
+ delete_branch = opt->branch1;
+ }
- }
++ }
assert(source_deleted || oldinfo->filemask & old_sidemask);
+
@@ merge-ort.c: static int process_renames(struct merge_options *opt,
- "to %s in %s, but deleted in %s."),
- oldpath, newpath, rename_branch, delete_branch);
+ /* rename/add/delete or rename/rename(2to1)/delete */
+ die("Not yet implemented");
} else {
- /* a few different cases... */
+ /*
8: edd610321a0 ! 9: 065fc0396dc merge-ort: add implementation of rename collisions
@@ merge-ort.c: static int process_renames(struct merge_options *opt,
+ &side1->stages[1],
+ &side2->stages[2],
+ pathnames,
-+ 1 + 2*opt->priv->call_depth,
++ 1 + 2 * opt->priv->call_depth,
+ &merged);
+
+ memcpy(&newinfo->stages[target_index], &merged,
@@ merge-ort.c: static int process_renames(struct merge_options *opt,
+ "to %s in %s, but deleted in %s."),
+ oldpath, newpath, rename_branch, delete_branch);
} else {
- /* a few different cases... */
- if (type_changed) {
+ /*
+ * a few different cases...start by copying the
10: 22cb7110261 = 10: 73426c16687 merge-ort: add implementation of normal rename handling
11: ff09ddb9caf ! 11: 8f4662398ab merge-ort: add implementation of type-changed rename handling
@@ Commit message
## merge-ort.c ##
@@ merge-ort.c: static int process_renames(struct merge_options *opt,
+ (S_ISREG(oldinfo->stages[other_source_index].mode) !=
S_ISREG(newinfo->stages[target_index].mode));
if (type_changed && collision) {
- /* special handling so later blocks can handle this */
+- /* special handling so later blocks can handle this */
- die("Not yet implemented");
+ /*
++ * special handling so later blocks can handle this...
++ *
+ * if type_changed && collision are both true, then this
+ * was really a double rename, but one side wasn't
+ * detected due to lack of break detection. I.e.
@@ merge-ort.c: static int process_renames(struct merge_options *opt,
+ * See also t6430, 'rename vs. rename/symlink'
+ */
+ collision = 0;
-+ }
+ }
if (source_deleted) {
if (target_index == 1) {
- rename_branch = opt->branch1;
@@ merge-ort.c: static int process_renames(struct merge_options *opt,
newinfo->pathnames[0] = oldpath;
if (type_changed) {-- gitgitgadget