Bug 559633 - NPE on git merge
Summary: NPE on git merge
Status: NEW
Alias: None
Product: EMFCompare
Classification: Modeling
Component: Core (show other bugs)
Version: 3.3.0   Edit
Hardware: PC Windows 10
: P3 major (vote)
Target Milestone: ---   Edit
Assignee: EMF Compare CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2020-01-28 10:06 EST by Rolf Theunissen CLA
Modified: 2020-02-03 08:50 EST (History)
1 user (show)

See Also:


Attachments
Ecore model which cause the NPE (1021 bytes, application/octet-stream)
2020-02-03 08:08 EST, Rolf Theunissen CLA
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Rolf Theunissen CLA 2020-01-28 10:06:07 EST
I get the following NPE when merging a branch. It fails on a Ecore model with Sirius representation, that do exist in the local branch but do not exist in the branch that is merged in.

This leaves the whole workspace in a doubtful state, it seems that only part of the branch is merged.


java.lang.NullPointerException
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.createContainmentDifferencesNoOrdering(DefaultDiffEngine.java:470)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.computeContainmentDifferences(DefaultDiffEngine.java:324)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.computeDifferences(DefaultDiffEngine.java:757)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.internalCheckForDifferences(DefaultDiffEngine.java:180)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.internalCheckForDifferences(DefaultDiffEngine.java:191)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.internalCheckForDifferences(DefaultDiffEngine.java:191)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.checkForDifferences(DefaultDiffEngine.java:156)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.diff(DefaultDiffEngine.java:129)
	at org.eclipse.emf.compare.EMFCompare.compare(EMFCompare.java:240)
	at org.eclipse.emf.compare.ide.ui.internal.logical.EMFResourceMappingMerger.mergeMapping(EMFResourceMappingMerger.java:266)
	at org.eclipse.emf.compare.ide.ui.internal.logical.EMFResourceMappingMerger.merge(EMFResourceMappingMerger.java:143)
	at org.eclipse.emf.compare.egit.internal.merge.RecursiveModelMerger$ModelMerge.run(RecursiveModelMerger.java:441)
	at org.eclipse.emf.compare.egit.internal.merge.RecursiveModelMerger$ModelMerge.access$1(RecursiveModelMerger.java:436)
	at org.eclipse.emf.compare.egit.internal.merge.RecursiveModelMerger.mergeTreeWalk(RecursiveModelMerger.java:249)
	at org.eclipse.jgit.merge.ResolveMerger.mergeTrees(ResolveMerger.java:1282)
	at org.eclipse.emf.compare.egit.internal.merge.RecursiveModelMerger.mergeTrees(RecursiveModelMerger.java:135)
	at org.eclipse.jgit.merge.ResolveMerger.mergeImpl(ResolveMerger.java:390)
	at org.eclipse.jgit.merge.Merger.merge(Merger.java:266)
	at org.eclipse.jgit.merge.Merger.merge(Merger.java:219)
	at org.eclipse.jgit.merge.ThreeWayMerger.merge(ThreeWayMerger.java:129)
	at org.eclipse.jgit.api.MergeCommand.call(MergeCommand.java:359)
	at org.eclipse.egit.core.op.MergeOperation$1.run(MergeOperation.java:195)
	at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2292)
	at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2317)
	at org.eclipse.egit.core.op.MergeOperation.execute(MergeOperation.java:224)
	at org.eclipse.egit.core.internal.job.JobUtil$2.runInWorkspace(JobUtil.java:107)
	at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:42)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
Comment 1 Laurent Goubet CLA 2020-02-03 03:38:15 EST
This is something that we haven't reproduced on our side. Looks like this is happening during two-way comparisons? Are you comparing two local files together?
Comment 2 Rolf Theunissen CLA 2020-02-03 04:14:53 EST
(In reply to Laurent Goubet from comment #1)
> This is something that we haven't reproduced on our side. Looks like this is
> happening during two-way comparisons? Are you comparing two local files
> together?

No, this happens while doing a git merge, completely automatically. I have a branch in which new EMF models are created (including Sirius representation). Then I try to merge in the (master) branch that does not contain the new models.

I see 'starting merge operations' for all models in both branches, that succeed. Only for this model the NPE occurs. Snippet from the log follows.

!ENTRY org.eclipse.emf.compare.ide.ui 0 0 2020-02-03 10:07:59.844
!MESSAGE Starting model merge operation with 3 model resource(s).
!SUBENTRY 1 org.eclipse.emf.compare.ide.ui 0 0 2020-02-03 10:07:59.844
!MESSAGE \example.com\model\model.aird
!SUBENTRY 1 org.eclipse.emf.compare.ide.ui 0 0 2020-02-03 10:07:59.844
!MESSAGE \example.com\model\model.ecore
!SUBENTRY 1 org.eclipse.emf.compare.ide.ui 0 0 2020-02-03 10:07:59.844
!MESSAGE \example.\model\model.genmodel

!ENTRY org.eclipse.egit.ui 4 0 2020-02-03 10:07:59.946
!MESSAGE An internal error occurred during: "Merging with refs/remotes/origin/master".
!STACK 0
java.lang.NullPointerException
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.createContainmentDifferencesNoOrdering(DefaultDiffEngine.java:470)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.computeContainmentDifferences(DefaultDiffEngine.java:324)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.computeDifferences(DefaultDiffEngine.java:757)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.internalCheckForDifferences(DefaultDiffEngine.java:180)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.internalCheckForDifferences(DefaultDiffEngine.java:191)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.internalCheckForDifferences(DefaultDiffEngine.java:191)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.checkForDifferences(DefaultDiffEngine.java:156)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.diff(DefaultDiffEngine.java:129)
	at org.eclipse.emf.compare.EMFCompare.compare(EMFCompare.java:240)
	at org.eclipse.emf.compare.ide.ui.internal.logical.EMFResourceMappingMerger.mergeMapping(EMFResourceMappingMerger.java:266)
	at org.eclipse.emf.compare.ide.ui.internal.logical.EMFResourceMappingMerger.merge(EMFResourceMappingMerger.java:143)
	at org.eclipse.emf.compare.egit.internal.merge.RecursiveModelMerger$ModelMerge.run(RecursiveModelMerger.java:441)
	at org.eclipse.emf.compare.egit.internal.merge.RecursiveModelMerger$ModelMerge.access$1(RecursiveModelMerger.java:436)
	at org.eclipse.emf.compare.egit.internal.merge.RecursiveModelMerger.mergeTreeWalk(RecursiveModelMerger.java:249)
	at org.eclipse.jgit.merge.ResolveMerger.mergeTrees(ResolveMerger.java:1282)
	at org.eclipse.emf.compare.egit.internal.merge.RecursiveModelMerger.mergeTrees(RecursiveModelMerger.java:135)
	at org.eclipse.jgit.merge.ResolveMerger.mergeImpl(ResolveMerger.java:390)
	at org.eclipse.jgit.merge.Merger.merge(Merger.java:266)
	at org.eclipse.jgit.merge.Merger.merge(Merger.java:219)
	at org.eclipse.jgit.merge.ThreeWayMerger.merge(ThreeWayMerger.java:129)
	at org.eclipse.jgit.api.MergeCommand.call(MergeCommand.java:359)
	at org.eclipse.egit.core.op.MergeOperation$1.run(MergeOperation.java:195)
	at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2292)
	at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2317)
	at org.eclipse.egit.core.op.MergeOperation.execute(MergeOperation.java:224)
	at org.eclipse.egit.core.internal.job.JobUtil$2.runInWorkspace(JobUtil.java:107)
	at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:42)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

!ENTRY org.eclipse.core.jobs 4 2 2020-02-03 10:07:59.948
!MESSAGE An internal error occurred during: "Merging with refs/remotes/origin/master".
!STACK 0
java.lang.NullPointerException
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.createContainmentDifferencesNoOrdering(DefaultDiffEngine.java:470)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.computeContainmentDifferences(DefaultDiffEngine.java:324)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.computeDifferences(DefaultDiffEngine.java:757)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.internalCheckForDifferences(DefaultDiffEngine.java:180)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.internalCheckForDifferences(DefaultDiffEngine.java:191)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.internalCheckForDifferences(DefaultDiffEngine.java:191)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.checkForDifferences(DefaultDiffEngine.java:156)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.diff(DefaultDiffEngine.java:129)
	at org.eclipse.emf.compare.EMFCompare.compare(EMFCompare.java:240)
	at org.eclipse.emf.compare.ide.ui.internal.logical.EMFResourceMappingMerger.mergeMapping(EMFResourceMappingMerger.java:266)
	at org.eclipse.emf.compare.ide.ui.internal.logical.EMFResourceMappingMerger.merge(EMFResourceMappingMerger.java:143)
	at org.eclipse.emf.compare.egit.internal.merge.RecursiveModelMerger$ModelMerge.run(RecursiveModelMerger.java:441)
	at org.eclipse.emf.compare.egit.internal.merge.RecursiveModelMerger$ModelMerge.access$1(RecursiveModelMerger.java:436)
	at org.eclipse.emf.compare.egit.internal.merge.RecursiveModelMerger.mergeTreeWalk(RecursiveModelMerger.java:249)
	at org.eclipse.jgit.merge.ResolveMerger.mergeTrees(ResolveMerger.java:1282)
	at org.eclipse.emf.compare.egit.internal.merge.RecursiveModelMerger.mergeTrees(RecursiveModelMerger.java:135)
	at org.eclipse.jgit.merge.ResolveMerger.mergeImpl(ResolveMerger.java:390)
	at org.eclipse.jgit.merge.Merger.merge(Merger.java:266)
	at org.eclipse.jgit.merge.Merger.merge(Merger.java:219)
	at org.eclipse.jgit.merge.ThreeWayMerger.merge(ThreeWayMerger.java:129)
	at org.eclipse.jgit.api.MergeCommand.call(MergeCommand.java:359)
	at org.eclipse.egit.core.op.MergeOperation$1.run(MergeOperation.java:195)
	at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2292)
	at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2317)
	at org.eclipse.egit.core.op.MergeOperation.execute(MergeOperation.java:224)
	at org.eclipse.egit.core.internal.job.JobUtil$2.runInWorkspace(JobUtil.java:107)
	at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:42)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
Comment 3 Laurent Goubet CLA 2020-02-03 04:20:56 EST
This is strange, the line this NPE originates from shouldn't be called during three way comparisons at all. Which version of EMF Compare are you using?
Comment 4 Rolf Theunissen CLA 2020-02-03 04:26:07 EST
(In reply to Laurent Goubet from comment #3)
> This is strange, the line this NPE originates from shouldn't be called
> during three way comparisons at all. Which version of EMF Compare are you
> using?

EMF Compare Core 3.5.3.201911051515
Comment 5 Laurent Goubet CLA 2020-02-03 05:54:33 EST
Rolf,

I don't understand why we're getting to this particular line of code. I cannot reproduce on my side since I'm only going through "fast-forward" EGit merges when I try to execute the steps you're describing here (creating models in another branch then merging that branch into master).

Any way you could provide us with the example repository you're using to test?
Comment 6 Rolf Theunissen CLA 2020-02-03 08:08:59 EST
Created attachment 281679 [details]
Ecore model which cause the NPE

In my installation this Ecore model causes the NPE. It is also triggered when comparing this model to any other ecore model.

When the eTypeParameter is removed from the children attribute, the compare does not throw an NPE.


Trace from comparing models:
java.lang.NullPointerException
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.createContainmentDifferencesNoOrdering(DefaultDiffEngine.java:470)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.computeContainmentDifferences(DefaultDiffEngine.java:324)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.computeDifferences(DefaultDiffEngine.java:757)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.internalCheckForDifferences(DefaultDiffEngine.java:180)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.internalCheckForDifferences(DefaultDiffEngine.java:191)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.internalCheckForDifferences(DefaultDiffEngine.java:191)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.checkForDifferences(DefaultDiffEngine.java:156)
	at org.eclipse.emf.compare.diff.DefaultDiffEngine.diff(DefaultDiffEngine.java:129)
	at org.eclipse.emf.compare.EMFCompare.compare(EMFCompare.java:240)
	at org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.EMFCompareStructureMergeViewer.compareInputChanged(EMFCompareStructureMergeViewer.java:1599)
	at org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.EMFCompareStructureMergeViewer$CompareInputChangedJob.run(EMFCompareStructureMergeViewer.java:224)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
Comment 7 Laurent Goubet CLA 2020-02-03 08:50:45 EST
Alright, EGenericTypes are objects handled in special ways by EMF so we have exceptions in EMF Compare to try and avoid these corner cases. It seems like EGenericTypes with type arguments are not correctly handled. Here, apparently, the parameter has not been matched so diff detection cannot work.