boolean (StructuredIdeActivity activity) { saveAllDocuments(); boolean success = false; boolean fatalErrorHappened = false; notifyBranchWillChange(); try (AccessToken ignore = DvcsUtil.workingTreeChangeStarted(myProject, getOperationName())) { while (hasMoreRepositories() && !fatalErrorHappened) { final GitRepository repository = next(); VirtualFile root = repository.getRoot(); Hash startHash = getHead(repository); GitLocalChangesWouldBeOverwrittenDetector localChangesDetector = new GitLocalChangesWouldBeOverwrittenDetector(root, GitLocalChangesWouldBeOverwrittenDetector.Operation.CHECKOUT); GitSimpleEventDetector unmergedFiles = new GitSimpleEventDetector(GitSimpleEventDetector.Event.UNMERGED_PREVENTING_CHECKOUT); GitSimpleEventDetector unknownPathspec = new GitSimpleEventDetector(GitSimpleEventDetector.Event.INVALID_REFERENCE); GitUntrackedFilesOverwrittenByOperationDetector untrackedOverwrittenByCheckout = new GitUntrackedFilesOverwrittenByOperationDetector(root); StructuredIdeActivity checkoutOperation = CHECKOUT_OPERATION.startedWithParent(myProject, activity); GitCommandResult result = myGit.checkout(repository, myStartPointReference, myNewBranch, false, myDetach, myReset, localChangesDetector, unmergedFiles, unknownPathspec, untrackedOverwrittenByCheckout); checkoutOperation.finished(); if (result.success()) { StructuredIdeActivity vfsRefresh = VFS_REFRESH.startedWithParent(myProject, activity); updateAndRefreshChangedVfs(repository, startHash); vfsRefresh.finished(); markSuccessful(repository); } else if (unmergedFiles.hasHappened()) { fatalUnmergedFilesError(); fatalErrorHappened = true; } else if (localChangesDetector.wasMessageDetected()) { boolean smartCheckoutSucceeded = smartCheckoutOrNotify(repository, localChangesDetector, activity); if (!smartCheckoutSucceeded) { fatalErrorHappened = true; } } else if (untrackedOverwrittenByCheckout.wasMessageDetected()) { fatalUntrackedFilesError(repository.getRoot(), untrackedOverwrittenByCheckout.getRelativeFilePaths()); fatalErrorHappened = true; } else if (!myRefShouldBeValid && unknownPathspec.hasHappened()) { markSkip(repository); } else { fatalError(getCommonErrorTitle(), result); fatalErrorHappened = true; } } } if (!fatalErrorHappened) { Collection<GitRepository> repositories = getSkippedRepositories(); String revisionNotFound = GitBundle.message("checkout.operation.revision.not.found", repositories.size(), joinShortNames(repositories, REPOSITORIES_LIMIT)); if (wereSuccessful()) { if (!wereSkipped()) { notifySuccess(); } else { Collection<GitRepository> successfulRepositories = getSuccessfulRepositories(); HtmlBuilder builder = new HtmlBuilder(); String mentionSuccess = GitBundle.message("checkout.operation.in", getSuccessMessage(), successfulRepositories.size(), joinShortNames(successfulRepositories, REPOSITORIES_LIMIT)); builder.appendRaw(mentionSuccess); if (wereSkipped()) { builder.br().append(revisionNotFound); } builder.br().appendLink(ROLLBACK_HREF_ATTRIBUTE, GitBundle.message("checkout.operation.rollback")); VcsNotifier.getInstance(myProject).notifySuccess(CHECKOUT_SUCCESS, "", builder.toString(), new RollbackOperationNotificationListener()); } success = true; notifyBranchHasChanged(myStartPointReference); updateRecentBranch(); } else { LOG.assertTrue(!myRefShouldBeValid); notifyError(GitBundle.message("checkout.operation.could.not.checkout.error", getRefPresentation(myStartPointReference)), revisionNotFound); } } return success; }