mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[git] IDEA-87092 handle local changes overwritten error on unstash
Unstashing is currently a modal process => show a dialog instead of a notification.
This commit is contained in:
@@ -51,6 +51,7 @@ import git4idea.merge.GitConflictResolver;
|
||||
import git4idea.repo.GitRepository;
|
||||
import git4idea.stash.GitStashUtils;
|
||||
import git4idea.util.GitUIUtil;
|
||||
import git4idea.util.LocalChangesWouldBeOverwrittenHelper;
|
||||
import git4idea.util.UntrackedFilesNotifier;
|
||||
import git4idea.validators.GitBranchNameValidator;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -68,6 +69,8 @@ import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import static git4idea.commands.GitLocalChangesWouldBeOverwrittenDetector.Operation.MERGE;
|
||||
|
||||
/**
|
||||
* The unstash dialog
|
||||
*/
|
||||
@@ -349,7 +352,9 @@ public class GitUnstashDialog extends DialogWrapper {
|
||||
}
|
||||
});
|
||||
GitUntrackedFilesOverwrittenByOperationDetector untrackedFilesDetector = new GitUntrackedFilesOverwrittenByOperationDetector(root);
|
||||
GitLocalChangesWouldBeOverwrittenDetector localChangesDetector = new GitLocalChangesWouldBeOverwrittenDetector(root, MERGE);
|
||||
h.addLineListener(untrackedFilesDetector);
|
||||
h.addLineListener(localChangesDetector);
|
||||
|
||||
GitUtil.workingTreeChangeStarted(myProject);
|
||||
try {
|
||||
@@ -371,6 +376,8 @@ public class GitUnstashDialog extends DialogWrapper {
|
||||
} else if (untrackedFilesDetector.wasMessageDetected()) {
|
||||
UntrackedFilesNotifier.notifyUntrackedFilesOverwrittenBy(myProject, root, untrackedFilesDetector.getRelativeFilePaths(),
|
||||
"unstash", null);
|
||||
} else if (localChangesDetector.wasMessageDetected()) {
|
||||
LocalChangesWouldBeOverwrittenHelper.showErrorDialog(myProject, root, "unstash", localChangesDetector.getRelativeFilePaths());
|
||||
} else if (!res.success()) {
|
||||
GitUIUtil.showOperationErrors(myProject, h.errors(), h.printableCommandLine());
|
||||
}
|
||||
|
||||
@@ -35,12 +35,12 @@ import java.util.List;
|
||||
public class LocalChangesWouldBeOverwrittenHelper {
|
||||
|
||||
@NotNull
|
||||
public static String getErrorNotificationDescription() {
|
||||
private static String getErrorNotificationDescription() {
|
||||
return getErrorDescription(true);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static String getErrorDialogDescription() {
|
||||
private static String getErrorDialogDescription() {
|
||||
return getErrorDescription(false);
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ public class LocalChangesWouldBeOverwrittenHelper {
|
||||
}
|
||||
}
|
||||
|
||||
public static void showErrorNotification(@NotNull final Project project, @NotNull VirtualFile root, @NotNull final String operationName,
|
||||
public static void showErrorNotification(@NotNull final Project project, @NotNull final VirtualFile root, @NotNull final String operationName,
|
||||
@NotNull final Collection<String> relativeFilePaths) {
|
||||
final Collection<String> absolutePaths = GitUtil.toAbsolute(root, relativeFilePaths);
|
||||
final List<Change> changes = GitUtil.findLocalChangesForPaths(project, root, absolutePaths, false);
|
||||
@@ -66,20 +66,33 @@ public class LocalChangesWouldBeOverwrittenHelper {
|
||||
@Override
|
||||
protected void hyperlinkActivated(@NotNull Notification notification,
|
||||
@NotNull HyperlinkEvent e) {
|
||||
String title = "Local Changes Prevent from " + StringUtil.capitalize(operationName);
|
||||
String description = getErrorDialogDescription();
|
||||
if (changes.isEmpty()) {
|
||||
GitUtil.showPathsInDialog(project, absolutePaths, title, description);
|
||||
}
|
||||
else {
|
||||
DialogBuilder builder = new DialogBuilder(project);
|
||||
builder.setNorthPanel(new MultiLineLabel(description));
|
||||
builder.setCenterPanel(new ChangesBrowserWithRollback(project, changes));
|
||||
builder.addOkAction();
|
||||
builder.setTitle(title);
|
||||
builder.show();
|
||||
}
|
||||
showErrorDialog(project, operationName, changes, absolutePaths);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static void showErrorDialog(@NotNull Project project, @NotNull VirtualFile root, @NotNull String operationName,
|
||||
@NotNull Collection<String> relativeFilePaths) {
|
||||
Collection<String> absolutePaths = GitUtil.toAbsolute(root, relativeFilePaths);
|
||||
List<Change> changes = GitUtil.findLocalChangesForPaths(project, root, absolutePaths, false);
|
||||
showErrorDialog(project, operationName, changes, absolutePaths);
|
||||
}
|
||||
|
||||
private static void showErrorDialog(@NotNull Project project, @NotNull String operationName, @NotNull List<Change> changes,
|
||||
@NotNull Collection<String> absolutePaths) {
|
||||
String title = "Local Changes Prevent from " + StringUtil.capitalize(operationName);
|
||||
String description = getErrorDialogDescription();
|
||||
if (changes.isEmpty()) {
|
||||
GitUtil.showPathsInDialog(project, absolutePaths, title, description);
|
||||
}
|
||||
else {
|
||||
DialogBuilder builder = new DialogBuilder(project);
|
||||
builder.setNorthPanel(new MultiLineLabel(description));
|
||||
builder.setCenterPanel(new ChangesBrowserWithRollback(project, changes));
|
||||
builder.addOkAction();
|
||||
builder.setTitle(title);
|
||||
builder.show();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user