Introduction
3-way-merge(henceforth 3WM) is popularly used at SCM(Source code Configuration Management) tool. But, there is no standard way of implementation. And most of them is for text(source code). So, there are already lots of study regarding Text-3WM. But, for me, it's very difficult to find study regarding Json-3WM. Someone may think Json-3WM is subset of Text-3WM. And I think it can be one of possible algorithm of Json-3WM. But, is it enough? This article is for this topic.
Assumption
Array vs. Object
At Json, Array is considered as Object. At Javascript, typeof []
gives object. For example, [1, 2]
can be represented as {0:1, 1:2}
. In this article, Array is handled as one of primitive value, not an object - just like JSON-Merge-Patch(RFC 7386).
Merge
Way of merging two Json object is clearly defined at JSON-Merge-Patch(RFC 7386). Therefore this article is only focusing on 3-way-mergee.
3-Way Merge: Clear
In most common cases, it looks clear. For example,
Mergable
<base>
{
"a": "b",
"c": {
"d": "e",
"f": "g"
}
}
<our>
{
"a": "b",
"c": {
"d": "e",
"f": "g",
"h": "i" # <=
}
}
<their>
{
"a": "b",
"c": {
"d": "e",
"f": "z" # <=
}
}
<merged>
{
"a": "b",
"c": {
"d": "e",
"f": "z", # <=
"h": "i" # <=
}
}
Conflict
<base>
{
"a": "b",
"c": {
"d": "e",
"f": "g"
}
}
<our>
{
"a": "b",
"c": {
"d": "e",
"f": "z" # <=
}
}
<their>
{
"a": "b",
"c": {
"d": "e",
"f": "y" # <=
}
}
3-Way Merge: Not clear
This is main topic of this discussion. Consider following example
<base>
{
"a": "b",
"c": {
"d": "e",
"f": "g"
}
}
<our>
{
"a": "b",
"c": {
"d": "e",
"f": "z" # <=
}
}
And
<their>
{
"a": "b"
# <=
}
It seems conflict. Then, which property is conflicted? /c or /c/f?
Case: /c/f (Incorrect)
In this interpretation, merged result with Accept-Our option (resolve strategy for conflicted property) should be
<merged: accept-our>
{
"a": "b",
"c": {
"f": "z" # <=
}
}
What is issue of above? In this case, there is no difference from below version of <their> object.
<their>
{
"a": "b",
"c": {} # <=
}
In case of above version, everything looks clear. Definitely, /c/f is property conflicted. Then, Is it natural that two different changes gives same merged result? I think No. Therefore this is not correct interpretation of given example.
Case: /c
In this case, interpretation of changes are
- <their>: Deleting /c.
- <our>: Changing /c/f and /c(sub-property of /c is changed).
So, /c is conflicted and merged result with Accept-Our option (resolve strategy for conflicted property) should be
Whole sub-object /c is resolved with /c of <our> object because of Accept-Our merge strategy.<merged: accept-our>(same with <our>) { "a": "b", "c": { "d": "e", "f": "z" } }
Summary
This article describes private opinion related with 3-way-merge algorithm of Json object. There is NO correct answer. This is just one of suggestion.
'Domain > Software' 카테고리의 다른 글
[Essay] 생산성 향상에 따른 부정적인 경험, 그리고 반발. (0) | 2016.01.26 |
---|---|
[GNUMake] GNUMake variable expansion - dependency section (0) | 2015.03.19 |
[GNUMake] 'shell' function (0) | 2015.03.19 |
variable expansion at command section on GNUMake (0) | 2015.02.02 |
Apache에 다양한 service를 올릴때 주의할 점. (0) | 2014.10.27 |