diff --git a/plugins/git4idea/src/git4idea/checkin/GitCheckinHandlerFactory.java b/plugins/git4idea/src/git4idea/checkin/GitCheckinHandlerFactory.java index 4a400e07a842..741878a4c437 100644 --- a/plugins/git4idea/src/git4idea/checkin/GitCheckinHandlerFactory.java +++ b/plugins/git4idea/src/git4idea/checkin/GitCheckinHandlerFactory.java @@ -17,6 +17,9 @@ package git4idea.checkin; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Pair; @@ -48,6 +51,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.concurrent.atomic.AtomicReference; /** * Prohibits commiting with an empty messages. @@ -104,12 +108,25 @@ public class GitCheckinHandlerFactory extends VcsCheckinHandlerFactory { return ReturnResult.COMMIT; } - PlatformFacade platformFacade = ServiceManager.getService(myProject, PlatformFacade.class); - Git git = ServiceManager.getService(Git.class); + final PlatformFacade platformFacade = ServiceManager.getService(myProject, PlatformFacade.class); + final Git git = ServiceManager.getService(Git.class); - Collection files = myPanel.getVirtualFiles(); // deleted files aren't included, but for them we don't care about CRLFs. - GitCrlfProblemsDetector crlfHelper = GitCrlfProblemsDetector.detect(myProject, platformFacade, git, files); - if (crlfHelper.shouldWarn()) { + final Collection files = myPanel.getVirtualFiles(); // deleted files aren't included, but for them we don't care about CRLFs. + final AtomicReference crlfHelper = new AtomicReference(); + ProgressManager.getInstance().run( + new Task.Modal(myProject, "Checking for line separator issues...", true) { + @Override + public void run(@NotNull ProgressIndicator indicator) { + crlfHelper.set(GitCrlfProblemsDetector.detect(GitCheckinHandlerFactory.MyCheckinHandler.this.myProject, + platformFacade, git, files)); + } + }); + + if (crlfHelper.get() == null) { // detection cancelled + return ReturnResult.CANCEL; + } + + if (crlfHelper.get().shouldWarn()) { final GitCrlfDialog dialog = new GitCrlfDialog(myProject); UIUtil.invokeAndWaitIfNeeded(new Runnable() { @Override diff --git a/plugins/git4idea/src/git4idea/crlf/GitCrlfProblemsDetector.java b/plugins/git4idea/src/git4idea/crlf/GitCrlfProblemsDetector.java index 85ae42a567e0..e37a0cf9e8e1 100644 --- a/plugins/git4idea/src/git4idea/crlf/GitCrlfProblemsDetector.java +++ b/plugins/git4idea/src/git4idea/crlf/GitCrlfProblemsDetector.java @@ -16,6 +16,7 @@ package git4idea.crlf; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.progress.ProgressIndicatorProvider; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vcs.VcsException; @@ -116,6 +117,7 @@ public class GitCrlfProblemsDetector { Map> attributes = parser.getAttributes(); Collection filesWithoutAttrs = new ArrayList(); for (VirtualFile file : files) { + ProgressIndicatorProvider.checkCanceled(); String relativePath = FileUtil.getRelativePath(root.getPath(), file.getPath(), '/'); Collection attrs = attributes.get(relativePath); if (attrs == null || !attrs.contains(GitAttribute.TEXT) && !attrs.contains(GitAttribute.CRLF)) { @@ -146,6 +148,7 @@ public class GitCrlfProblemsDetector { private Collection findFilesWithCrlf(@NotNull Collection files) { Collection filesWithCrlf = new ArrayList(); for (VirtualFile file : files) { + ProgressIndicatorProvider.checkCanceled(); String separator = myPlatformFacade.getLineSeparator(file, true); if (CRLF.equals(separator)) { filesWithCrlf.add(file);