void (@NotNull AnActionEvent e) { myProject = notNull(e.getData(CommonDataKeys.PROJECT), ProjectManager.getInstance().getDefaultProject()); // provide window to select the root directory final HgInitDialog hgInitDialog = new HgInitDialog(myProject); if (!hgInitDialog.showAndGet()) { return; } final VirtualFile selectedRoot = hgInitDialog.getSelectedFolder(); if (selectedRoot == null) { return; } // check if the selected folder is not yet under mercurial and provide some options in that case final VirtualFile vcsRoot = HgUtil.getNearestHgRoot(selectedRoot); VirtualFile mapRoot = selectedRoot; boolean needToCreateRepo = false; if (vcsRoot != null) { final HgInitAlreadyUnderHgDialog dialog = new HgInitAlreadyUnderHgDialog(myProject, selectedRoot.getPresentableUrl(), vcsRoot.getPresentableUrl()); if (!dialog.showAndGet()) { return; } if (dialog.getAnswer() == HgInitAlreadyUnderHgDialog.Answer.USE_PARENT_REPO) { mapRoot = vcsRoot; } else if (dialog.getAnswer() == HgInitAlreadyUnderHgDialog.Answer.CREATE_REPO_HERE) { needToCreateRepo = true; } } else { // no parent repository => creating the repository here. needToCreateRepo = true; } boolean finalNeedToCreateRepo = needToCreateRepo; VirtualFile finalMapRoot = mapRoot; BackgroundTaskUtil.executeOnPooledThread(HgDisposable.getInstance(myProject), () -> { if (!finalNeedToCreateRepo || createRepository(requireNonNull(myProject), selectedRoot)) { updateDirectoryMappings(finalMapRoot); } }); }