Bug 573232 - Merge editor: JDT logs exception when input is "Last HEAD" and conflicting file not in Eclipse workspace
Summary: Merge editor: JDT logs exception when input is "Last HEAD" and conflicting fi...
Status: RESOLVED FIXED
Alias: None
Product: EGit
Classification: Technology
Component: UI (show other bugs)
Version: 5.12   Edit
Hardware: PC Mac OS X
: P3 normal (vote)
Target Milestone: 5.12   Edit
Assignee: Thomas Wolf CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2021-04-29 04:11 EDT by Thomas Wolf CLA
Modified: 2021-06-01 07:58 EDT (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Thomas Wolf CLA 2021-04-29 04:11:35 EDT
If a conflicting Java file is not in the Eclipse workspace and stage 2 is used as "current" input ("Last HEAD"), JDT UI logs a PartInitException. The merge editor comes up, but the content viewer is not fully initialized. User-visible effect is that "Show whitespace" doesn't work on the "current" side.

Exception trace:

!ENTRY org.eclipse.jdt.ui 4 10001 2021-04-28 22:55:44.922
!MESSAGE Internal Error
!STACK 1
org.eclipse.ui.PartInitException: Cannot determine URI for '<full filesystem path to non-workspace file>'.
	at org.eclipse.ui.texteditor.AbstractTextEditor.internalInit(AbstractTextEditor.java:3186)
	at org.eclipse.ui.texteditor.AbstractTextEditor.init(AbstractTextEditor.java:3197)
	at org.eclipse.jdt.internal.ui.compare.JavaMergeViewer.getSourceViewerConfiguration(JavaMergeViewer.java:276)
	at org.eclipse.jdt.internal.ui.compare.JavaMergeViewer.configureTextViewer(JavaMergeViewer.java:215)
	at org.eclipse.compare.contentmergeviewer.TextMergeViewer.configureSourceViewer(TextMergeViewer.java:3114)
	at org.eclipse.compare.contentmergeviewer.TextMergeViewer.updateContent(TextMergeViewer.java:3062)
	at org.eclipse.compare.contentmergeviewer.ContentMergeViewer.internalRefresh(ContentMergeViewer.java:811)
	at org.eclipse.compare.contentmergeviewer.ContentMergeViewer.inputChanged(ContentMergeViewer.java:710)
	at org.eclipse.jface.viewers.ContentViewer.setInput(ContentViewer.java:286)
	at org.eclipse.jdt.internal.ui.compare.JavaMergeViewer.setInput(JavaMergeViewer.java:152)
	at org.eclipse.compare.CompareViewerSwitchingPane.setInput(CompareViewerSwitchingPane.java:277)
	at org.eclipse.compare.internal.CompareContentViewerSwitchingPane.setInput(CompareContentViewerSwitchingPane.java:191)
	at org.eclipse.compare.CompareEditorInput.internalSetContentPaneInput(CompareEditorInput.java:845)
	at org.eclipse.compare.CompareEditorInput.access$7(CompareEditorInput.java:843)
	at org.eclipse.compare.CompareEditorInput$10.run(CompareEditorInput.java:786)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
	at org.eclipse.compare.CompareEditorInput.feed1(CompareEditorInput.java:773)
	at org.eclipse.compare.CompareEditorInput.access$2(CompareEditorInput.java:772)
	at org.eclipse.compare.CompareEditorInput$4.open(CompareEditorInput.java:658)
	at org.eclipse.compare.CompareViewerPane.open(CompareViewerPane.java:325)
	at org.eclipse.jface.viewers.StructuredViewer$2.run(StructuredViewer.java:855)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:50)
	at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:173)
	at org.eclipse.jface.viewers.StructuredViewer.fireOpen(StructuredViewer.java:852)
	at org.eclipse.compare.structuremergeviewer.DiffTreeViewer.internalOpen(DiffTreeViewer.java:654)
	at org.eclipse.compare.structuremergeviewer.DiffTreeViewer.access$3(DiffTreeViewer.java:651)
	at org.eclipse.compare.structuremergeviewer.DiffTreeViewer$1.openSelectedChange(DiffTreeViewer.java:195)
	at org.eclipse.compare.internal.CompareEditorInputNavigator.openElement(CompareEditorInputNavigator.java:97)
	at org.eclipse.compare.internal.CompareEditorInputNavigator.selectChange(CompareEditorInputNavigator.java:66)
	at org.eclipse.egit.ui.internal.merge.GitMergeEditorInput.contentsCreated(GitMergeEditorInput.java:275)
	at org.eclipse.compare.CompareEditorInput.createContents(CompareEditorInput.java:585)
	at org.eclipse.compare.internal.CompareEditor.createCompareControl(CompareEditor.java:462)
	at org.eclipse.compare.internal.CompareEditor.access$6(CompareEditor.java:422)
	at org.eclipse.compare.internal.CompareEditor$1$1.run(CompareEditor.java:378)
	at org.eclipse.ui.internal.UILockListener.doPendingWork(UILockListener.java:162)
	at org.eclipse.ui.internal.UISynchronizer$3.run(UISynchronizer.java:154)
	at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
	at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182)
	at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4032)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3708)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150)
	at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1519)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1492)
Caused by: org.eclipse.core.runtime.CoreException: Cannot determine URI for '<full filesystem path to non-workspace file>'.
	at org.eclipse.core.internal.filebuffers.ResourceFileBuffer.create(ResourceFileBuffer.java:239)
	at org.eclipse.core.internal.filebuffers.TextFileBufferManager.connect(TextFileBufferManager.java:112)
	at org.eclipse.ui.editors.text.TextFileDocumentProvider.createFileInfo(TextFileDocumentProvider.java:560)
	at org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitDocumentProvider.createFileInfo(CompilationUnitDocumentProvider.java:1010)
	at org.eclipse.ui.editors.text.TextFileDocumentProvider.connect(TextFileDocumentProvider.java:478)
	at org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitDocumentProvider.connect(CompilationUnitDocumentProvider.java:1274)
	at org.eclipse.ui.texteditor.AbstractTextEditor.doSetInput(AbstractTextEditor.java:4178)
	at org.eclipse.ui.texteditor.StatusTextEditor.doSetInput(StatusTextEditor.java:229)
	at org.eclipse.ui.texteditor.AbstractDecoratedTextEditor.doSetInput(AbstractDecoratedTextEditor.java:1466)
	at org.eclipse.jdt.internal.ui.javaeditor.JavaEditor.internalDoSetInput(JavaEditor.java:2557)
	at org.eclipse.jdt.internal.ui.javaeditor.JavaEditor.doSetInput(JavaEditor.java:2544)
	at org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor.doSetInput(CompilationUnitEditor.java:1417)
	at org.eclipse.jdt.internal.ui.compare.JavaMergeViewer$CompilationUnitEditorAdapter.doSetInput(JavaMergeViewer.java:613)
	at org.eclipse.ui.texteditor.AbstractTextEditor$5.run(AbstractTextEditor.java:3154)
	at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:437)
	at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:353)
	at org.eclipse.ui.internal.WorkbenchWindow$14.run(WorkbenchWindow.java:2184)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
	at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2180)
	at org.eclipse.ui.texteditor.AbstractTextEditor.internalInit(AbstractTextEditor.java:3172)
	... 62 more
Comment 1 Thomas Wolf CLA 2021-04-29 04:15:31 EDT
This is caused by the super-hacky way EGit handles non-workspace files in this case. LocationEditableRevision is just broken.

A better way would be to create a hidden IResource linked via a file:// URI. That way we'd have a real IResource and wouldn't need to hack around that much.

Of course such a hidden IResource would also need to be removed again.

There's precedent for this in JDT's ExternalFolderManager and in CompareWithOtherResourceDialog from Compare UI.
Comment 2 Eclipse Genie CLA 2021-05-03 03:53:57 EDT
New Gerrit change created: https://git.eclipse.org/r/c/egit/egit/+/180108