[ https://issues.apache.org/jira/browse/JCR-1314?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12559532#action_12559532 ]
Tobias Bocanegra commented on JCR-1314: --------------------------------------- i think the spec is wrong: in 8.2.10 it says: If N is currently checked-in then: 1) If V' is a successor (to any degree) of V, then the merge result for N is update. 2) If V' is a predecessor (to any degree) of V or if V and V' are identical (i.e., are actually the same version), then the merge result for N is leave. 3) If V is neither a successor of, predecessor of, nor identical with V', then the merge result for N is failed. If N is currently checked-out then: 4) If V' is a predecessor (to any degree) of V or if V and V' are identical (i.e., are actually the same version), then the merge result for N is leave. 1) means, if the version you merge against is newer, do an update 2,4) mean, if the version you merge against is older or same, leave it where as in 8.2.10.1: a) if v' is a successor of v and n is not checked-in doupdate(n, n'). b) else if v is equal to or a predecessor of v' doleave(n). a) means, if the version you merge against is newer and checked-out, do update. which is the same as 1) b) means, if the version you merge against is newer or same, do leave. which is not the same as 2,4) so i think the code is correct. which also makes sense, since you don't want to update to an older version. are you sure you did the merge the right way around ? can you provide a test class ? > Node incorrectly overridden when performing a merge > --------------------------------------------------- > > Key: JCR-1314 > URL: https://issues.apache.org/jira/browse/JCR-1314 > Project: Jackrabbit > Issue Type: Bug > Components: versioning > Affects Versions: 1.4, 1.5 > Reporter: Bob Wieler > Priority: Critical > > The implementation of the merge algorithm provided in the JCR specification > is incorrect and can result in nodes being overridden. This can be > demonstrated by the following simple steps: > 1. Create a repository with a nt:file node containing whatever data (n') > 2. Commit the changes to the node to create the initial version (v') > 3. Copy the node to a new workspace > 4. Edit the node in the second workspace (n) > 5. Commit the changes to the second workspace to create the second version (v) > 6. Merge the changes from the first workspace into the second workspace > According to the JCR specification (from 8.2.10.1): > if v' is a successor of v and n is not checked-in doupdate(n, n'). > else if v is equal to or a predecessor of v' doleave(n). > else dofail(n, v'). > In the above example, v' is a predecessor of v so the doupdate(n, n') is not > done. v and v' are also not equal and v is not a predecessor of v' so the > doleaven(n) is not done. Therefore the dofail(n, v') is what should be called. > The code in NodeImpl.java is not however doing what is expected. Line 3337 in > NodeImpl.java (subversion revision 611855) has the following: > } else if (v.isSame(vp) || v.isMoreRecent(vp)) { > // If V' is a predecessor (to any degree) of V or if V and V' are > // identical (i.e., are actually the same version), then the merge > // result for N is leave. This case can be thought of as the case > where > // N' is "older" or the "same age" as N and therefore N should be > left alone. > return null; > } else { > The doMergeTest method returns null (essentially a doleave(n) in the spec > algorithm) if v and v' are the same or v' is a predecessor to v - in other > words if v and v' are the same or v is a _successor_ to v' - which is exactly > the opposite to what the specification requires (if v is equal to or a > _predecessor_ of v'). The proper if statement would be to have: > } else if (v.isSame(vp) || vp.isMoreRecent(v)) { > Unfortunately, this was causing us to lose data when performing a merge. I > have updated our version of jackrabbit with the above change and merging now > works as expected. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.