From 611a35fd7f058eae560a0d895a0247505da054bc Mon Sep 17 00:00:00 2001 From: irengrig Date: Fri, 8 Apr 2011 15:00:09 +0400 Subject: [PATCH] IDEA-67609 VCS Create patch has only *.patch extension as default one Remember what standard extension - patch or diff - was last used. Check that file doesn't exist - before patch creation --- .../openapi/vcs/VcsConfiguration.java | 20 +++++++++++++++++++ .../patch/CreatePatchCommitExecutor.java | 4 +++- .../patch/CreatePatchConfigurationPanel.java | 2 +- .../vcs/changes/patch/PatchNameChecker.java | 5 +++++ .../changes/shelf/ShelveChangesManager.java | 16 ++++++--------- .../openapi/vcs/impl/VcsFileTypeFactory.java | 3 ++- 6 files changed, 37 insertions(+), 13 deletions(-) diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/VcsConfiguration.java b/platform/vcs-api/src/com/intellij/openapi/vcs/VcsConfiguration.java index feb81aec45b1..fc23a789e4b6 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/VcsConfiguration.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/VcsConfiguration.java @@ -28,6 +28,8 @@ import com.intellij.openapi.startup.StartupManager; import com.intellij.openapi.util.DefaultJDOMExternalizer; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.WriteExternalException; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.text.StringUtil; import org.jdom.Element; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -54,6 +56,10 @@ public final class VcsConfiguration implements PersistentStateComponent @NonNls private static final String VALUE_ATTR = "value"; @NonNls private static final String CONFIRM_MOVE_TO_FAILED_COMMIT_ELEMENT = "confirmMoveToFailedCommit"; @NonNls private static final String CONFIRM_REMOVE_EMPTY_CHANGELIST_ELEMENT = "confirmRemoveEmptyChangelist"; + + @NonNls public static final String PATCH = "patch"; + @NonNls public static final String DIFF = "diff"; + private Project myProject; public boolean OFFER_MOVE_TO_ANOTHER_CHANGELIST_ON_PARTIAL_COMMIT = true; @@ -73,6 +79,7 @@ public final class VcsConfiguration implements PersistentStateComponent public int CHANGED_ON_SERVER_INTERVAL = 60; public boolean SHOW_ONLY_CHANGED_IN_SELECTION_DIFF = true; public boolean CHECK_COMMIT_MESSAGE_SPELLING = true; + public String DEFAULT_PATCH_EXTENSION = PATCH; public enum StandardOption { ADD(VcsBundle.message("vcs.command.name.add")), @@ -346,4 +353,17 @@ public final class VcsConfiguration implements PersistentStateComponent } + public String getPatchFileExtension() { + return DEFAULT_PATCH_EXTENSION; + } + + public void acceptLastCreatedPatchName(final String string) { + if (StringUtil.isEmptyOrSpaces(string)) return; + final String extension = FileUtil.getExtension(string); + if (DIFF.equalsIgnoreCase(extension)) { + DEFAULT_PATCH_EXTENSION = DIFF; + } else if (PATCH.equalsIgnoreCase(extension)) { + DEFAULT_PATCH_EXTENSION = PATCH; + } + } } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchCommitExecutor.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchCommitExecutor.java index e6d35a44e239..8557825a87bf 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchCommitExecutor.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchCommitExecutor.java @@ -29,6 +29,7 @@ import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.JDOMExternalizable; import com.intellij.openapi.util.WriteExternalException; import com.intellij.openapi.vcs.VcsBundle; +import com.intellij.openapi.vcs.VcsConfiguration; import com.intellij.openapi.vcs.changes.*; import com.intellij.openapi.vcs.changes.shelf.ShelveChangesManager; import com.intellij.util.WaitForProgressToShow; @@ -118,7 +119,7 @@ public class CreatePatchCommitExecutor implements CommitExecutorWithHelp, Projec if (PATCH_PATH.length() == 0) { PATCH_PATH = myProject.getBaseDir().getPresentableUrl(); } - myPanel.setFileName(ShelveChangesManager.suggestPatchName(commitMessage, new File(PATCH_PATH))); + myPanel.setFileName(ShelveChangesManager.suggestPatchName(myProject, commitMessage, new File(PATCH_PATH), null)); myPanel.setReversePatch(REVERSE_PATCH); return myPanel.getPanel(); } @@ -150,6 +151,7 @@ public class CreatePatchCommitExecutor implements CommitExecutorWithHelp, Projec try { final String fileName = myPanel.getFileName(); final File file = new File(fileName).getAbsoluteFile(); + VcsConfiguration.getInstance(myProject).acceptLastCreatedPatchName(file.getName()); PATCH_PATH = file.getParent(); REVERSE_PATCH = myPanel.isReversePatch(); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchConfigurationPanel.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchConfigurationPanel.java index b1800bffdd4d..3a538b536c03 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchConfigurationPanel.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchConfigurationPanel.java @@ -141,7 +141,7 @@ public class CreatePatchConfigurationPanel { } public boolean isOkToExecute() { - return myErrorLabel.getText() == null || myErrorLabel.getText().length() == 0; + return myErrorLabel.getText() == null || myErrorLabel.getText().length() == 0; } public String getError() { diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/PatchNameChecker.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/PatchNameChecker.java index 61ab41ab393c..a4263be19c96 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/PatchNameChecker.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/PatchNameChecker.java @@ -21,8 +21,10 @@ public class PatchNameChecker { public final static int MAX = 100; private final String myName; private String myError; + private final String myPath; public PatchNameChecker(final String name) { + myPath = name; myName = new File(name).getName(); } @@ -33,6 +35,9 @@ public class PatchNameChecker { } else if (myName.length() > MAX) { myError = "File name length cannot exceed " + MAX + " characters"; return false; + } else if (new File(myPath).exists()) { + myError = "File with the same name already exists"; + return false; } return true; } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelveChangesManager.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelveChangesManager.java index a26bfd96bc7e..993647004fa0 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelveChangesManager.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelveChangesManager.java @@ -37,10 +37,7 @@ import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.*; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.vcs.FilePath; -import com.intellij.openapi.vcs.FilePathImpl; -import com.intellij.openapi.vcs.VcsBundle; -import com.intellij.openapi.vcs.VcsException; +import com.intellij.openapi.vcs.*; import com.intellij.openapi.vcs.changes.*; import com.intellij.openapi.vcs.changes.patch.PatchNameChecker; import com.intellij.openapi.vcs.changes.ui.RollbackWorker; @@ -65,8 +62,6 @@ import java.util.*; public class ShelveChangesManager implements ProjectComponent, JDOMExternalizable { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.vcs.changes.shelf.ShelveChangesManager"); - @NonNls private static final String PATCH_EXTENSION = "patch"; - public static ShelveChangesManager getInstance(Project project) { return PeriodicalTasksCloser.getInstance().safeGetComponent(project, ShelveChangesManager.class); } @@ -286,16 +281,17 @@ public class ShelveChangesManager implements ProjectComponent, JDOMExternalizabl file.mkdirs(); } - return suggestPatchName(commitMessage.length() > PatchNameChecker.MAX ? (commitMessage.substring(0, PatchNameChecker.MAX)) : - commitMessage, file); + return suggestPatchName(myProject, commitMessage.length() > PatchNameChecker.MAX ? (commitMessage.substring(0, PatchNameChecker.MAX)) : + commitMessage, file, VcsConfiguration.PATCH); } - public static File suggestPatchName(final String commitMessage, final File file) { + public static File suggestPatchName(Project project, final String commitMessage, final File file, String extension) { @NonNls String defaultPath = PathUtil.suggestFileName(commitMessage); if (defaultPath.length() == 0) { defaultPath = "unnamed"; } - return FileUtil.findSequentNonexistentFile(file, defaultPath, PATCH_EXTENSION); + return FileUtil.findSequentNonexistentFile(file, defaultPath, + extension == null ? VcsConfiguration.getInstance(project).getPatchFileExtension() : extension); } public void unshelveChangeList(final ShelvedChangeList changeList, @Nullable final List changes, diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/VcsFileTypeFactory.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/VcsFileTypeFactory.java index 5f1fc1676208..aeee91a2b280 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/VcsFileTypeFactory.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/VcsFileTypeFactory.java @@ -17,6 +17,7 @@ package com.intellij.openapi.vcs.impl; import com.intellij.openapi.fileTypes.FileTypeFactory; import com.intellij.openapi.fileTypes.FileTypeConsumer; +import com.intellij.openapi.vcs.VcsConfiguration; import com.intellij.openapi.vcs.changes.patch.PatchFileType; import org.jetbrains.annotations.NotNull; @@ -25,6 +26,6 @@ import org.jetbrains.annotations.NotNull; */ public class VcsFileTypeFactory extends FileTypeFactory { public void createFileTypes(@NotNull FileTypeConsumer consumer) { - consumer.consume(new PatchFileType(), "patch;diff"); + consumer.consume(new PatchFileType(), VcsConfiguration.PATCH + ";" + VcsConfiguration.DIFF); } }