Skip to content

Three way merge #2

@azmeuk

Description

@azmeuk

Hi. First of all, thank you for your work.
It would be awesome for deepmerge to be able to solve three way merge cases, as the one described in this stackoverflow question.

The problem is to merge two dictionaries A and B, knowing a common previous state C of both dictionaries. The merge needs to occur in subelements too. In the case of real conflict, an exception needs to be raised.

1 - In the following example, the merge method should understand that A and B edited different items, and thus the merge should not raise a conflict:

C = {"x": 0, "y": 0}
A = {"x": 1, "y": 0} # Edit x, but not y
B = {"x": 0, "y": 1} # Edit y, but not x
# merge(A, B, C) => {"x": 1, "y": 1}

2 - The merge needs to be able to deal with new items and deleted items:

C = {"x": 0}
A = {"x": 0, "y": 0} # Add y, keep x untouched
B = {}               # Delete x
# merge(A, B, C) => {"y": 0}

3 - The merge should raise an exception when a real conflict occurs

C = {"x": 0}
A = {"x": 1}         # Edit x 
B = {"x": 2}         # Also edit x
# merge(A, B, C) => raise Exception

C = {"x": 0}
A = {"x": 1}         # Edit x 
B = {}               # Delete x
# merge(A, B, C) => raise Exception

4 - The merge should work recursively

C = {"deeper": {"x": 0, "y": 0}}
A = {"deeper": {"x": 1, "y": 0}} # Edit deeper["x"], but not deeper["y"]
B = {"deeper": {"x": 0, "y": 1}} # Edit deeper["y"], but not deeper["x"]
# merge(A, B, C) => {"deeper": {"x": 1, "y": 1}}

Would you accept a pull request for this job (if I ever had time to submit one) ?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions