void (@NotNull AnActionEvent e) { // show dialog for comment and folder name, then create folder // then refresh selected node. Url root; RepositoryTreeNode node = getRepositoryBrowser().getSelectedNode(); if (node == null) { return; } while (node.getSVNDirEntry() != null) { node = (RepositoryTreeNode)node.getParent(); } root = node.getURL(); final RepositoryTreeNode selectedNode = getSelectedNode(); if (selectedNode == null) { return; } Url sourceURL = selectedNode.getURL(); DiffOptionsDialog dialog = new DiffOptionsDialog(myProject, root, sourceURL); if (dialog.showAndGet()) { Url targetURL = dialog.getTargetURL(); if (dialog.isReverseDiff()) { targetURL = sourceURL; sourceURL = dialog.getTargetURL(); } final Url sURL = sourceURL; final Url tURL = targetURL; Runnable command; boolean cancelable; if (dialog.isUnifiedDiff()) { final File targetFile = dialog.getTargetFile(); command = () -> { targetFile.getParentFile().mkdirs(); doUnifiedDiff(targetFile, sURL, tURL); }; cancelable = false; } else { command = () -> { try { doGraphicalDiff(sURL, tURL); } catch (final VcsException ex) { runOrInvokeLaterAboveProgress( () -> showErrorDialog(myProject, ex.getMessage(), message("dialog.title.error")), null, myProject ); } }; cancelable = true; } ProgressManager.getInstance() .runProcessWithProgressSynchronously(command, message("dialog.title.computing.difference"), cancelable, myProject); } }