merge-ort: add basic rename detection
Get series with b4
b4 am [email protected]Versions newest first · linked by author and title
- v3 Latest11 patches 0 repliesNew
- v211 patches 10 repliesSuperseded
- v111 patches 19 repliesSuperseded
Changes in v3 from the cover letter
* 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)
Patches in v3 No applies recorded yet
| # | Subject and files | Size | Replies | Applied |
|---|---|---|---|---|
| 1/11 | merge-ort: add basic data structures for handling renamesmerge-ort.c | +24 | 0 replies | |
| 2/11 | merge-ort: add initial outline for basic rename detectionmerge-ort.c | +60 | 0 replies | |
| 3/11 | merge-ort: implement detect_regular_renames()merge-ort.c | +31 | 0 replies | |
| 4/11 | merge-ort: implement compare_pairs() and collect_renames()merge-ort.c | +33 | 0 replies | |
| 5/11 | merge-ort: add basic outline for process_renames()merge-ort.c | +97 | 0 replies | |
| 6/11 | merge-ort: add implementation of both sides renaming identicallymerge-ort.c | +18 | 0 replies | |
| 7/11 | merge-ort: add implementation of both sides renaming differentlymerge-ort.c | +55 | 0 replies | |
| 8/11 | merge-ort: add implementation of rename/delete conflictsmerge-ort.c | +40 | 0 replies | |
| 9/11 | merge-ort: add implementation of rename collisionsmerge-ort.c | +51 | 0 replies | |
| 10/11 | merge-ort: add implementation of normal rename handlingmerge-ort.c | +5 | 0 replies | |
| 11/11 | merge-ort: add implementation of type-changed rename handlingmerge-ort.c | +32 | 0 replies |
Reviews trailers per patch
No Reviewed-by, Acked-by or Tested-by trailers for v3 yet.
Cover letter [PATCH v3 00/11] merge-ort: add basic rename detection
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
## 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) {Signature · 1 line
gitgitgadget