From f9dbaeff85e5defbbd74728283cc2c0a05b718a9 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Fri, 1 Aug 2014 15:09:03 +0400 Subject: [PATCH 01/31] svn: Replaced SVNProperty (from SVNKit) usages with corresponding custom fields/logic --- .../idea/svn/actions/SvnMergeProvider.java | 10 +++++++--- .../idea/svn/dialogs/PropertiesComponent.java | 3 +-- .../src/org/jetbrains/idea/svn/info/Info.java | 2 ++ .../jetbrains/idea/svn/mergeinfo/BranchInfo.java | 13 +++++++++---- .../mergeinfo/OneRecursiveShotMergeInfoWorker.java | 8 ++++++-- .../idea/svn/rollback/SvnRollbackEnvironment.java | 8 +++++--- 6 files changed, 30 insertions(+), 14 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/SvnMergeProvider.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/SvnMergeProvider.java index ddd9bd572f0e..ee4f807c2570 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/SvnMergeProvider.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/SvnMergeProvider.java @@ -26,6 +26,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.vcsUtil.VcsRunnable; import com.intellij.vcsUtil.VcsUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.idea.svn.SvnPropertyKeys; import org.jetbrains.idea.svn.SvnRevisionNumber; import org.jetbrains.idea.svn.SvnUtil; import org.jetbrains.idea.svn.SvnVcs; @@ -33,7 +34,6 @@ import org.jetbrains.idea.svn.api.Depth; import org.jetbrains.idea.svn.info.Info; import org.jetbrains.idea.svn.properties.PropertyClient; import org.jetbrains.idea.svn.properties.PropertyValue; -import org.tmatesoft.svn.core.SVNProperty; import org.tmatesoft.svn.core.wc.SVNRevision; import org.tmatesoft.svn.core.wc2.SvnTarget; @@ -162,8 +162,8 @@ public class SvnMergeProvider implements MergeProvider { File ioFile = new File(file.getPath()); PropertyClient client = vcs.getFactory(ioFile).createPropertyClient(); - PropertyValue value = client.getProperty(SvnTarget.fromFile(ioFile), SVNProperty.MIME_TYPE, false, SVNRevision.WORKING); - if (value != null && SVNProperty.isBinaryMimeType(value.toString())) { + PropertyValue value = client.getProperty(SvnTarget.fromFile(ioFile), SvnPropertyKeys.SVN_MIME_TYPE, false, SVNRevision.WORKING); + if (value != null && isBinaryMimeType(value.toString())) { return true; } } @@ -173,4 +173,8 @@ public class SvnMergeProvider implements MergeProvider { return false; } + + private static boolean isBinaryMimeType(@NotNull String mimeType) { + return !mimeType.startsWith("text/"); + } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/PropertiesComponent.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/PropertiesComponent.java index cd504be56077..437e7f57e464 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/PropertiesComponent.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/PropertiesComponent.java @@ -41,7 +41,6 @@ import org.jetbrains.idea.svn.properties.PropertyConsumer; import org.jetbrains.idea.svn.properties.PropertyData; import org.jetbrains.idea.svn.properties.PropertyValue; import org.tmatesoft.svn.core.SVNException; -import org.tmatesoft.svn.core.SVNProperty; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.wc.SVNRevision; import org.tmatesoft.svn.core.wc2.SvnTarget; @@ -309,7 +308,7 @@ public class PropertiesComponent extends JPanel { PropertyValue propValue = null; try { propValue = myVcs.getFactory(myFile).createPropertyClient() - .getProperty(SvnTarget.fromFile(myFile), SVNProperty.KEYWORDS, false, SVNRevision.WORKING); + .getProperty(SvnTarget.fromFile(myFile), SvnPropertyKeys.SVN_KEYWORDS, false, SVNRevision.WORKING); } catch (VcsException e1) { // show erorr message diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/info/Info.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/info/Info.java index 96dbdbbcbc99..2162faa45906 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/info/Info.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/info/Info.java @@ -35,6 +35,8 @@ import java.util.Date; */ public class Info extends BaseNodeDescription { + public static final String SCHEDULE_ADD = "add"; + private final File myFile; private final String myPath; private final SVNURL myURL; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/mergeinfo/BranchInfo.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/mergeinfo/BranchInfo.java index 701bb2575001..f69aac4a4133 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/mergeinfo/BranchInfo.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/mergeinfo/BranchInfo.java @@ -19,11 +19,15 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.vcs.VcsException; import com.intellij.util.containers.MultiMap; +import org.jetbrains.idea.svn.SvnPropertyKeys; import org.jetbrains.idea.svn.SvnVcs; import org.jetbrains.idea.svn.history.SvnChangeList; import org.jetbrains.idea.svn.info.Info; import org.jetbrains.idea.svn.properties.PropertyValue; -import org.tmatesoft.svn.core.*; +import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.SVNMergeRange; +import org.tmatesoft.svn.core.SVNMergeRangeList; +import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.internal.util.SVNMergeInfoUtil; import org.tmatesoft.svn.core.internal.util.SVNPathUtil; import org.tmatesoft.svn.core.wc.SVNRevision; @@ -209,7 +213,8 @@ public class BranchInfo { SvnTarget target = SvnTarget.fromURL(branchUrl); try { - mergeinfoProperty = myVcs.getFactory(target).createPropertyClient().getProperty(target, SVNProperty.MERGE_INFO, false, SVNRevision.create(targetRevision)); + mergeinfoProperty = myVcs.getFactory(target).createPropertyClient().getProperty(target, SvnPropertyKeys.MERGE_INFO, false, + SVNRevision.create(targetRevision)); } catch (VcsException e) { LOG.info(e); @@ -283,13 +288,13 @@ public class BranchInfo { // look in WC SvnTarget target = SvnTarget.fromFile(pathFile, SVNRevision.WORKING); mergeinfoProperty = - myVcs.getFactory(target).createPropertyClient().getProperty(target, SVNProperty.MERGE_INFO, false, SVNRevision.WORKING); + myVcs.getFactory(target).createPropertyClient().getProperty(target, SvnPropertyKeys.MERGE_INFO, false, SVNRevision.WORKING); } else { // in repo myMixedRevisionsFound = true; SvnTarget target = SvnTarget.fromURL(svnInfo.getURL()); mergeinfoProperty = myVcs.getFactory(target).createPropertyClient() - .getProperty(target, SVNProperty.MERGE_INFO, false, SVNRevision.create(targetRevisionCorrected)); + .getProperty(target, SvnPropertyKeys.MERGE_INFO, false, SVNRevision.create(targetRevisionCorrected)); } } catch (VcsException e) { diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/mergeinfo/OneRecursiveShotMergeInfoWorker.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/mergeinfo/OneRecursiveShotMergeInfoWorker.java index 225bc6ad0396..b17d3317a801 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/mergeinfo/OneRecursiveShotMergeInfoWorker.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/mergeinfo/OneRecursiveShotMergeInfoWorker.java @@ -21,12 +21,16 @@ import com.intellij.openapi.vcs.AreaMap; import com.intellij.openapi.vcs.VcsException; import com.intellij.util.PairProcessor; import org.jetbrains.annotations.NotNull; +import org.jetbrains.idea.svn.SvnPropertyKeys; import org.jetbrains.idea.svn.api.Depth; import org.jetbrains.idea.svn.dialogs.MergeContext; import org.jetbrains.idea.svn.properties.PropertyConsumer; import org.jetbrains.idea.svn.properties.PropertyData; import org.jetbrains.idea.svn.properties.PropertyValue; -import org.tmatesoft.svn.core.*; +import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.SVNMergeRange; +import org.tmatesoft.svn.core.SVNMergeRangeList; +import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.internal.util.SVNMergeInfoUtil; import org.tmatesoft.svn.core.internal.util.SVNPathUtil; import org.tmatesoft.svn.core.wc.SVNRevision; @@ -83,7 +87,7 @@ public class OneRecursiveShotMergeInfoWorker implements MergeInfoWorker { File path = new File(myMergeContext.getWcInfo().getPath()); myMergeContext.getVcs().getFactory(path).createPropertyClient() - .getProperty(SvnTarget.fromFile(path), SVNProperty.MERGE_INFO, SVNRevision.WORKING, depth, handler); + .getProperty(SvnTarget.fromFile(path), SvnPropertyKeys.MERGE_INFO, SVNRevision.WORKING, depth, handler); } public SvnMergeInfoCache.MergeCheckResult isMerged(final String relativeToRepoURLPath, final long revisionNumber) { diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/rollback/SvnRollbackEnvironment.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/rollback/SvnRollbackEnvironment.java index 7b09461b3766..16904b673b5f 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/rollback/SvnRollbackEnvironment.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/rollback/SvnRollbackEnvironment.java @@ -37,8 +37,10 @@ import org.jetbrains.idea.svn.info.Info; import org.jetbrains.idea.svn.properties.PropertiesMap; import org.jetbrains.idea.svn.properties.PropertyConsumer; import org.jetbrains.idea.svn.properties.PropertyData; -import org.tmatesoft.svn.core.*; -import org.tmatesoft.svn.core.wc.*; +import org.tmatesoft.svn.core.SVNErrorCode; +import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.SVNURL; +import org.tmatesoft.svn.core.wc.SVNRevision; import org.tmatesoft.svn.core.wc2.SvnTarget; import java.io.File; @@ -312,7 +314,7 @@ public class SvnRollbackEnvironment extends DefaultRollbackEnvironment { if (info.isFile()) { doRevert(file, false); } else { - if (SVNProperty.SCHEDULE_ADD.equals(info.getSchedule())) { + if (Info.SCHEDULE_ADD.equals(info.getSchedule())) { doRevert(file, true); } else { boolean is17OrGreater = is17OrGreaterCopy(file, info); From a6389de97828aa304ae7dda0a262f9f829e8ff97 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Fri, 1 Aug 2014 21:53:39 +0400 Subject: [PATCH 02/31] EA-56830 EA-58978 Use "WorkingCopyFormat.UNKNOWN" (instead of null) while grouping files to commit by repositories --- .../svn4idea/src/org/jetbrains/idea/svn/SvnUtil.java | 10 +++++++--- .../idea/svn/checkin/SvnCheckinEnvironment.java | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnUtil.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnUtil.java index 43407f4b2064..371e1a563975 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnUtil.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnUtil.java @@ -58,11 +58,15 @@ import org.jetbrains.idea.svn.info.Info; import org.jetbrains.idea.svn.status.Status; import org.tmatesoft.sqljet.core.SqlJetException; import org.tmatesoft.sqljet.core.table.SqlJetDb; -import org.tmatesoft.svn.core.*; +import org.tmatesoft.svn.core.SVNErrorCode; +import org.tmatesoft.svn.core.SVNErrorMessage; +import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.internal.util.SVNPathUtil; import org.tmatesoft.svn.core.internal.wc.SVNFileUtil; import org.tmatesoft.svn.core.internal.wc2.SvnWcGeneration; -import org.tmatesoft.svn.core.wc.*; +import org.tmatesoft.svn.core.wc.SVNRevision; +import org.tmatesoft.svn.core.wc.SVNWCUtil; import org.tmatesoft.svn.core.wc2.SvnOperationFactory; import org.tmatesoft.svn.core.wc2.SvnTarget; @@ -343,7 +347,7 @@ public class SvnUtil { for (T committable : committables) { final RootUrlInfo path = vcs.getSvnFileUrlMapping().getWcRootForFilePath(convertor.convert(committable)); if (path == null) { - result.putValue(new Pair(null, null), committable); + result.putValue(Pair.create((SVNURL)null, WorkingCopyFormat.UNKNOWN), committable); } else { result.putValue(Pair.create(path.getRepositoryUrlUrl(), path.getFormat()), committable); } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/checkin/SvnCheckinEnvironment.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/checkin/SvnCheckinEnvironment.java index c9a843501253..3f43d7452b5e 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/checkin/SvnCheckinEnvironment.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/checkin/SvnCheckinEnvironment.java @@ -124,7 +124,7 @@ public class SvnCheckinEnvironment implements CheckinEnvironment { String comment, List exception, final Set feedback, - final WorkingCopyFormat format) + @NotNull WorkingCopyFormat format) throws VcsException { if (committables.isEmpty()) { return; From c8750f2c0a757b349e2c1cd7ee5802608671a3a6 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Fri, 1 Aug 2014 22:30:05 +0400 Subject: [PATCH 03/31] EA-53225 Added diagnostics when failed to parse svn properties --- .../svn/properties/CmdPropertyClient.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/properties/CmdPropertyClient.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/properties/CmdPropertyClient.java index e053776d14ce..f00c4bd7341d 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/properties/CmdPropertyClient.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/properties/CmdPropertyClient.java @@ -1,5 +1,7 @@ package org.jetbrains.idea.svn.properties; +import com.intellij.openapi.diagnostic.Attachment; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.vcs.VcsException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -30,6 +32,8 @@ import java.util.Map; */ public class CmdPropertyClient extends BaseSvnClient implements PropertyClient { + private static final Logger LOG = Logger.getInstance(CmdPropertyClient.class); + @Nullable @Override public PropertyValue getProperty(@NotNull SvnTarget target, @@ -57,7 +61,7 @@ public class CmdPropertyClient extends BaseSvnClient implements PropertyClient { parameters.add("--xml"); CommandExecutor command = execute(myVcs, target, SvnCommandName.propget, parameters, null); - PropertyData data = parseSingleProperty(target, command.getOutput()); + PropertyData data = parseSingleProperty(target, command); return data != null ? data.getValue() : null; } @@ -74,7 +78,7 @@ public class CmdPropertyClient extends BaseSvnClient implements PropertyClient { fillListParameters(target, revision, depth, parameters, false); CommandExecutor command = execute(myVcs, target, SvnCommandName.propget, parameters, null); - parseOutput(target, command.getOutput(), handler); + parseOutput(target, command, handler); } @Override @@ -86,7 +90,7 @@ public class CmdPropertyClient extends BaseSvnClient implements PropertyClient { fillListParameters(target, revision, depth, parameters, true); CommandExecutor command = execute(myVcs, target, SvnCommandName.proplist, parameters, null); - parseOutput(target, command.getOutput(), handler); + parseOutput(target, command, handler); } @Override @@ -183,7 +187,7 @@ public class CmdPropertyClient extends BaseSvnClient implements PropertyClient { } @Nullable - private PropertyData parseSingleProperty(SvnTarget target, String output) throws VcsException { + private PropertyData parseSingleProperty(SvnTarget target, @NotNull CommandExecutor command) throws VcsException { final PropertyData[] data = new PropertyData[1]; PropertyConsumer handler = new PropertyConsumer() { @Override @@ -202,14 +206,14 @@ public class CmdPropertyClient extends BaseSvnClient implements PropertyClient { } }; - parseOutput(target, output, handler); + parseOutput(target, command, handler); return data[0]; } - private static void parseOutput(SvnTarget target, String output, PropertyConsumer handler) throws VcsException { + private static void parseOutput(SvnTarget target, @NotNull CommandExecutor command, PropertyConsumer handler) throws VcsException { try { - Properties properties = CommandUtil.parse(output, Properties.class); + Properties properties = CommandUtil.parse(command.getOutput(), Properties.class); if (properties != null) { for (Target childInfo : properties.targets) { @@ -227,6 +231,8 @@ public class CmdPropertyClient extends BaseSvnClient implements PropertyClient { } } catch (JAXBException e) { + LOG.error("Could not parse properties. Command: " + command.getCommandText() + ", Warning: " + command.getErrorOutput(), + new Attachment("output.xml", command.getOutput())); throw new VcsException(e); } catch (SVNException e) { From d09417538e9a3e114f8a72e9d81b3c1faa90f840 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Mon, 4 Aug 2014 16:27:51 +0400 Subject: [PATCH 04/31] EA-38924 Added project dispose check when refreshing svn working copies info --- .../jetbrains/idea/svn/SvnFileUrlMappingImpl.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnFileUrlMappingImpl.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnFileUrlMappingImpl.java index 11838314acbd..5c660643dc66 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnFileUrlMappingImpl.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnFileUrlMappingImpl.java @@ -221,11 +221,16 @@ public class SvnFileUrlMappingImpl implements SvnFileUrlMapping, PersistentState } public void realRefresh(final Runnable afterRefreshCallback) { - final SvnVcs vcs = SvnVcs.getInstance(myProject); - final VirtualFile[] roots = myHelper.executeDefended(myProject); - final SvnRootsDetector rootsDetector = new SvnRootsDetector(vcs, this, myNestedCopiesHolder); - // do not send additional request for nested copies when in init state - rootsDetector.detectCopyRoots(roots, init(), afterRefreshCallback); + if (myProject.isDisposed()) { + afterRefreshCallback.run(); + } + else { + final SvnVcs vcs = SvnVcs.getInstance(myProject); + final VirtualFile[] roots = myHelper.executeDefended(myProject); + final SvnRootsDetector rootsDetector = new SvnRootsDetector(vcs, this, myNestedCopiesHolder); + // do not send additional request for nested copies when in init state + rootsDetector.detectCopyRoots(roots, init(), afterRefreshCallback); + } } public void applyDetectionResult(@NotNull SvnRootsDetector.Result result) { From ec1b252dff6d70364423fb6c5c857e476f8ad71e Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Mon, 4 Aug 2014 16:29:16 +0400 Subject: [PATCH 05/31] EA-38924 Refactored ProjectLevelVcsManager.getRootsUnderVcs() - @NotNull --- .../src/com/intellij/openapi/vcs/ProjectLevelVcsManager.java | 3 ++- .../intellij/openapi/vcs/impl/ProjectLevelVcsManagerImpl.java | 2 +- .../openapi/vcs/impl/projectlevelman/MappingsToRoots.java | 2 +- .../intellij/openapi/vcs/impl/projectlevelman/NewMappings.java | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/ProjectLevelVcsManager.java b/platform/vcs-api/src/com/intellij/openapi/vcs/ProjectLevelVcsManager.java index 203f4fc0f539..1586d0631521 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/ProjectLevelVcsManager.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/ProjectLevelVcsManager.java @@ -229,7 +229,8 @@ public abstract class ProjectLevelVcsManager { public abstract boolean isBackgroundVcsOperationRunning(); public abstract List getRootsUnderVcsWithoutFiltering(final AbstractVcs vcs); - public abstract VirtualFile[] getRootsUnderVcs(AbstractVcs vcs); + + public abstract VirtualFile[] getRootsUnderVcs(@NotNull AbstractVcs vcs); /** * Also includes into list all modules under roots diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/ProjectLevelVcsManagerImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/ProjectLevelVcsManagerImpl.java index b230d4f72a0d..4d10920ea44d 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/ProjectLevelVcsManagerImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/ProjectLevelVcsManagerImpl.java @@ -661,7 +661,7 @@ public class ProjectLevelVcsManagerImpl extends ProjectLevelVcsManagerEx impleme @Override @NotNull - public VirtualFile[] getRootsUnderVcs(AbstractVcs vcs) { + public VirtualFile[] getRootsUnderVcs(@NotNull AbstractVcs vcs) { return myMappingsToRoots.getRootsUnderVcs(vcs); } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/projectlevelman/MappingsToRoots.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/projectlevelman/MappingsToRoots.java index 677c26e6d9f1..1be3cbf0cda3 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/projectlevelman/MappingsToRoots.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/projectlevelman/MappingsToRoots.java @@ -42,7 +42,7 @@ public class MappingsToRoots { } @NotNull - public VirtualFile[] getRootsUnderVcs(final AbstractVcs vcs) { + public VirtualFile[] getRootsUnderVcs(@NotNull AbstractVcs vcs) { List result = myMappings.getMappingsAsFilesUnderVcs(vcs); final AbstractVcs.RootsConvertor convertor = vcs.getCustomConvertor(); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/projectlevelman/NewMappings.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/projectlevelman/NewMappings.java index 80e46c235643..4f03374ecd0a 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/projectlevelman/NewMappings.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/projectlevelman/NewMappings.java @@ -273,7 +273,7 @@ public class NewMappings { return FileUtil.startsWith(systemIndependentPath, mapping.systemIndependentPath()); } - public List getMappingsAsFilesUnderVcs(final AbstractVcs vcs) { + public List getMappingsAsFilesUnderVcs(@NotNull AbstractVcs vcs) { final List result = new ArrayList(); final String vcsName = vcs.getName(); From 02657ff3a203f37cad630e3a1f5e880bb83af408 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Mon, 4 Aug 2014 19:11:29 +0400 Subject: [PATCH 06/31] EA-49580 Make FilePath.hardRefresh() for svn-ignored files while processing "svn status" results; @NotNull --- .../jetbrains/idea/svn/RootsToWorkingCopies.java | 4 ++-- .../idea/svn/SvnChangeProviderContext.java | 8 +++++++- .../svn4idea/src/org/jetbrains/idea/svn/SvnVcs.java | 13 ++++++++----- .../idea/svn/auth/SvnAuthenticationNotifier.java | 2 +- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/RootsToWorkingCopies.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/RootsToWorkingCopies.java index 06138b345b74..c33dd38f2eba 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/RootsToWorkingCopies.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/RootsToWorkingCopies.java @@ -105,7 +105,7 @@ public class RootsToWorkingCopies implements VcsListener { @CalledInBackground @Nullable - public WorkingCopy getWcRoot(final VirtualFile root) { + public WorkingCopy getWcRoot(@NotNull VirtualFile root) { assert (! ApplicationManager.getApplication().isDispatchThread()) || ApplicationManager.getApplication().isUnitTestMode(); synchronized (myLock) { @@ -117,7 +117,7 @@ public class RootsToWorkingCopies implements VcsListener { } @Nullable - private WorkingCopy calculateRoot(final VirtualFile root) { + private WorkingCopy calculateRoot(@NotNull VirtualFile root) { File workingCopyRoot = SvnUtil.getWorkingCopyRootNew(new File(root.getPath())); WorkingCopy workingCopy = null; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnChangeProviderContext.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnChangeProviderContext.java index 9ae90c722cb3..a2abec314105 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnChangeProviderContext.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnChangeProviderContext.java @@ -244,7 +244,13 @@ class SvnChangeProviderContext implements StatusReceiver { myChangelistBuilder.processLocallyDeletedFile(createLocallyDeletedChange(filePath, status)); } else if (status.is(StatusType.STATUS_IGNORED)) { - if (!myVcs.isWcRoot(filePath)) { + if (filePath.getVirtualFile() == null) { + filePath.hardRefresh(); + } + if (filePath.getVirtualFile() == null) { + LOG.error("No virtual file for ignored file: " + filePath.getPresentableUrl() + ", isNonLocal: " + filePath.isNonLocal()); + } + else if (!myVcs.isWcRoot(filePath)) { myChangelistBuilder.processIgnoredFile(filePath.getVirtualFile()); } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnVcs.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnVcs.java index b44fd16f979f..32c7a83c1acc 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnVcs.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnVcs.java @@ -81,7 +81,6 @@ import org.jetbrains.idea.svn.history.SvnHistoryProvider; import org.jetbrains.idea.svn.info.Info; import org.jetbrains.idea.svn.info.InfoConsumer; import org.jetbrains.idea.svn.properties.PropertyClient; -import org.jetbrains.idea.svn.properties.PropertyData; import org.jetbrains.idea.svn.properties.PropertyValue; import org.jetbrains.idea.svn.rollback.SvnRollbackEnvironment; import org.jetbrains.idea.svn.status.Status; @@ -89,7 +88,10 @@ import org.jetbrains.idea.svn.status.StatusType; import org.jetbrains.idea.svn.svnkit.SvnKitManager; import org.jetbrains.idea.svn.update.SvnIntegrateEnvironment; import org.jetbrains.idea.svn.update.SvnUpdateEnvironment; -import org.tmatesoft.svn.core.*; +import org.tmatesoft.svn.core.SVNErrorCode; +import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.SVNNodeKind; +import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.internal.wc.SVNAdminUtil; import org.tmatesoft.svn.core.wc.SVNRevision; import org.tmatesoft.svn.core.wc2.SvnTarget; @@ -723,9 +725,10 @@ public class SvnVcs extends AbstractVcs { return WorkingCopyFormat.UNKNOWN.equals(format) ? SvnFormatSelector.findRootAndGetFormat(ioFile) : format; } - public boolean isWcRoot(FilePath filePath) { + public boolean isWcRoot(@NotNull FilePath filePath) { boolean isWcRoot = false; - WorkingCopy wcRoot = myRootsToWorkingCopies.getWcRoot(filePath.getVirtualFile()); + VirtualFile file = filePath.getVirtualFile(); + WorkingCopy wcRoot = file != null ? myRootsToWorkingCopies.getWcRoot(file) : null; if (wcRoot != null) { isWcRoot = wcRoot.getFile().getAbsolutePath().equals(filePath.getIOFile().getAbsolutePath()); } @@ -917,7 +920,7 @@ public class SvnVcs extends AbstractVcs { } @Override - public boolean isVcsBackgroundOperationsAllowed(VirtualFile root) { + public boolean isVcsBackgroundOperationsAllowed(@NotNull VirtualFile root) { // TODO: Currently myAuthNotifier.isAuthenticatedFor directly uses SVNKit to check credentials - so assume for now that background // TODO: operations are always allowed for command line. As sometimes this leads to errors - for instance, incoming changes are not // TODO: displayed in "Incoming" tab - incoming changes are collected using command line but not displayed because diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/auth/SvnAuthenticationNotifier.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/auth/SvnAuthenticationNotifier.java index 57c835daef2f..ffc21a011334 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/auth/SvnAuthenticationNotifier.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/auth/SvnAuthenticationNotifier.java @@ -223,7 +223,7 @@ public class SvnAuthenticationNotifier extends GenericNotifierImpl Date: Mon, 4 Aug 2014 20:11:38 +0400 Subject: [PATCH 07/31] EA-38143 Improved "AbstractRefreshablePanel" dispose check - made "myDisposed" flag volatile --- .../intellij/openapi/vcs/changes/AbstractRefreshablePanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/AbstractRefreshablePanel.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/AbstractRefreshablePanel.java index 070a4e95587a..fe20806a8ed4 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/AbstractRefreshablePanel.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/AbstractRefreshablePanel.java @@ -49,7 +49,7 @@ public abstract class AbstractRefreshablePanel implements RefreshablePanel myDetailsLoader; private final BackgroundTaskQueue myQueue; - private boolean myDisposed; + private volatile boolean myDisposed; protected AbstractRefreshablePanel(final Project project, final String loadingTitle, final BackgroundTaskQueue queue) { myQueue = queue; From 6d626d0f00c01584a0a69fb6d2b217373516622d Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Mon, 4 Aug 2014 22:06:41 +0400 Subject: [PATCH 08/31] EA-38143 Explicitly set file when creating Status instance for single file with "normal" status --- .../src/org/jetbrains/idea/svn/status/CmdStatusClient.java | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/status/CmdStatusClient.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/status/CmdStatusClient.java index 4030c83005ea..8100d73da220 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/status/CmdStatusClient.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/status/CmdStatusClient.java @@ -103,6 +103,7 @@ public class CmdStatusClient extends BaseSvnClient implements StatusClient { // so it does not contain any element and current parsing logic returns null PortableStatus status = new PortableStatus(); + status.setFile(path); status.setPath(path.getAbsolutePath()); status.setContentsStatus(StatusType.STATUS_NORMAL); status.setInfoGetter(new Getter() { From 0f556fae31dcf528c9abc8875ba1a65df7fcdce6 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Tue, 5 Aug 2014 17:13:28 +0400 Subject: [PATCH 09/31] EA-50132 Collect changes (for further commit) appeared as a result of "integrate" action in background task --- .../jetbrains/idea/svn/SvnBundle.properties | 1 + .../integrate/SvnIntegrateChangesTask.java | 46 ++++++++++++++----- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBundle.properties b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBundle.properties index df545b0373a1..3f4ae40677ae 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBundle.properties +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBundle.properties @@ -526,6 +526,7 @@ action.Subversion.integrate.changes.alien.commit.changelist.title=Integrated action.Subversion.integrate.changes.dialog.add.wc.text=Add action.Subversion.integrate.changes.dialog.remove.wc.text=Remove action.Subversion.integrate.changes.message.files.up.to.date.text=All files are up to date +action.Subversion.integrate.changes.collecting.changes.to.commit.task.title=Collecting changes to commit action.Subversion.integrate.changes.error.unable.to.collect.changes.text=Error while collecting changes to commit: {0} error.cannot.load.revisions=Can not load revision list action.Subversion.integrate.changes.message.canceled.text=Integration was canceled diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/SvnIntegrateChangesTask.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/SvnIntegrateChangesTask.java index 5dd6f24b10ba..0dd27d442ae5 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/SvnIntegrateChangesTask.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/SvnIntegrateChangesTask.java @@ -19,7 +19,9 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; +import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vcs.*; import com.intellij.openapi.vcs.changes.Change; @@ -28,6 +30,7 @@ import com.intellij.openapi.vcs.changes.InvokeAfterUpdateMode; import com.intellij.openapi.vcs.changes.VcsDirtyScopeManager; import com.intellij.openapi.vcs.changes.ui.CommitChangeListDialog; import com.intellij.openapi.vcs.ex.ProjectLevelVcsManagerEx; +import com.intellij.openapi.vcs.ui.VcsBalloonProblemNotifier; import com.intellij.openapi.vcs.update.*; import com.intellij.util.Consumer; import org.jetbrains.annotations.NotNull; @@ -330,18 +333,37 @@ public class SvnIntegrateChangesTask extends Task.Backgroundable { }); } - final SvnChangeProvider provider = new SvnChangeProvider(myVcs); - final GatheringChangelistBuilder clb = new GatheringChangelistBuilder(myVcs, myAccomulatedFiles); - try { - provider.getChanges(dirtyScope, clb, ProgressManager.getInstance().getProgressIndicator(), null); - } catch (VcsException e) { - Messages.showErrorDialog(SvnBundle.message("action.Subversion.integrate.changes.error.unable.to.collect.changes.text", - e.getMessage()), myTitle); - return; - } + new Task.Backgroundable(myVcs.getProject(), + SvnBundle.message("action.Subversion.integrate.changes.collecting.changes.to.commit.task.title")) { - if (! clb.getChanges().isEmpty()) { - CommitChangeListDialog.commitAlienChanges(myProject, clb.getChanges(), myVcs, myMerger.getComment(), myMerger.getComment()); - } + private final GatheringChangelistBuilder changesBuilder = new GatheringChangelistBuilder(myVcs, myAccomulatedFiles); + private final Ref caughtError = new Ref(); + + @Override + public void run(@NotNull ProgressIndicator indicator) { + indicator.setIndeterminate(true); + if (!myVcs.getProject().isDisposed()) { + final SvnChangeProvider provider = new SvnChangeProvider(myVcs); + + try { + provider.getChanges(dirtyScope, changesBuilder, indicator, null); + } + catch (VcsException e) { + caughtError.set(SvnBundle.message("action.Subversion.integrate.changes.error.unable.to.collect.changes.text", e.getMessage())); + } + } + } + + @Override + public void onSuccess() { + if (!caughtError.isNull()) { + VcsBalloonProblemNotifier.showOverVersionControlView(myVcs.getProject(), caughtError.get(), MessageType.ERROR); + } + else if (!changesBuilder.getChanges().isEmpty()) { + CommitChangeListDialog + .commitAlienChanges(myProject, changesBuilder.getChanges(), myVcs, myMerger.getComment(), myMerger.getComment()); + } + } + }.queue(); } } From 7c097f4794efc3b18e11d56a36e756baa40d0af2 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Tue, 5 Aug 2014 21:10:31 +0400 Subject: [PATCH 10/31] IDEA-86883 Use pre-order tree traversal (instead of post-order = depth-first) to collect selected changes in changes browser This way if internal node (i.e. folder) has change itself (i.e. svn property change, tree conflict), this change will be returned previously to child (i.e. file) changes (and necessary panels, like "Preview Diff" panel, will be firstly displayed for internal node change, according to selection) --- .../com/intellij/openapi/vcs/changes/ui/ChangesBrowserNode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesBrowserNode.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesBrowserNode.java index 7d4156873d7c..b7a42218e3e6 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesBrowserNode.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesBrowserNode.java @@ -150,7 +150,7 @@ public class ChangesBrowserNode extends DefaultMutableTreeNode { public List getAllObjectsUnder(final Class clazz) { List changes = new ArrayList(); - final Enumeration enumeration = depthFirstEnumeration(); + final Enumeration enumeration = preorderEnumeration(); while (enumeration.hasMoreElements()) { ChangesBrowserNode child = (ChangesBrowserNode)enumeration.nextElement(); final Object value = child.getUserObject(); From b2e502e7fe35e2d6d5b358ad627a678c11f4bb13 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Tue, 5 Aug 2014 22:01:51 +0400 Subject: [PATCH 11/31] svn: Refactored SvnBranchConfigurationManager - removed unnecessary/unused code, fixed warnings --- .../idea/svn/SvnBranchConfigurationManager.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfigurationManager.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfigurationManager.java index f13ed5a97a03..2631dcdb449d 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfigurationManager.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfigurationManager.java @@ -140,11 +140,6 @@ public class SvnBranchConfigurationManager implements PersistentStateComponent> map = new HashMap>(); - final Map>> origMap = configOrig.getBranchMap(); - for (String origKey : origMap.keySet()) { - map.put(origKey, origMap.get(origKey).getValue()); - } result.myConfigurationMap.put(key, helper.prepareForSerialization(configuration)); } result.mySupportsUserInfoFilter = true; @@ -196,7 +191,6 @@ public class SvnBranchConfigurationManager implements PersistentStateComponent map = object.myConfigurationMap; - final Map newMap = new HashMap(map.size(), 1); final LocalFileSystem lfs = LocalFileSystem.getInstance(); final Set> whatToInit = new HashSet>(); @@ -248,7 +242,6 @@ public class SvnBranchConfigurationManager implements PersistentStateComponent 0); + result.setUserinfoInUrl(userInfo.length() > 0); return result; } From 719b71679ef1882bc69b1177ef246dbe3f081d69 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Wed, 6 Aug 2014 17:40:10 +0400 Subject: [PATCH 12/31] svn: Refactored SvnBranchConfiguration, SvnBranchConfigurationManager - code simplifications, @NotNull --- .../idea/svn/SvnBranchConfiguration.java | 19 ++++++++++++++++--- .../svn/SvnBranchConfigurationManager.java | 19 +++++-------------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfiguration.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfiguration.java index c167fd868531..e7c52a31af80 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfiguration.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfiguration.java @@ -16,22 +16,34 @@ package org.jetbrains.idea.svn; +import org.jetbrains.annotations.NotNull; + import java.util.ArrayList; import java.util.Collections; import java.util.List; /** + * Default constructor and setters are necessary for serialization purposes. + * * @author yole */ +@SuppressWarnings("UnusedDeclaration") public class SvnBranchConfiguration { private String myTrunkUrl; - private List myBranchUrls; + @NotNull private List myBranchUrls; private boolean myUserinfoInUrl; public SvnBranchConfiguration() { myBranchUrls = new ArrayList(); } + public SvnBranchConfiguration(String trunkUrl, @NotNull List branchUrls, boolean userinfoInUrl) { + myTrunkUrl = trunkUrl; + myBranchUrls = branchUrls; + Collections.sort(myBranchUrls); + myUserinfoInUrl = userinfoInUrl; + } + public boolean isUserinfoInUrl() { return myUserinfoInUrl; } @@ -39,8 +51,8 @@ public class SvnBranchConfiguration { public void setUserinfoInUrl(final boolean userinfoInUrl) { myUserinfoInUrl = userinfoInUrl; } - - public void setBranchUrls(final List branchUrls) { + + public void setBranchUrls(@NotNull List branchUrls) { myBranchUrls = branchUrls; Collections.sort(myBranchUrls); } @@ -53,6 +65,7 @@ public class SvnBranchConfiguration { return myTrunkUrl; } + @NotNull public List getBranchUrls() { return myBranchUrls; } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfigurationManager.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfigurationManager.java index 2631dcdb449d..8461ae598afe 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfigurationManager.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfigurationManager.java @@ -136,10 +136,9 @@ public class SvnBranchConfigurationManager implements PersistentStateComponent 0); - return result; + return new SvnBranchConfiguration(newTrunkUrl, newBranchesList, userInfo.length() > 0); } private static String serializeUrl(final String url, final Ref withUserInfo) { From e4174c6716f2d0cf51c53919a41f614588fdaf0a Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Wed, 6 Aug 2014 17:56:27 +0400 Subject: [PATCH 13/31] svn: Inlined unnecessary SvnBranchConfigManager interface --- .../svn/SvnBranchConfigurationManager.java | 14 +++--- .../idea/svn/actions/SelectBranchPopup.java | 3 +- .../idea/svn/branchConfig/NewRootBunch.java | 10 ++-- .../branchConfig/SvnBranchConfigManager.java | 47 ------------------- .../dialogs/BranchConfigurationDialog.java | 7 +-- 5 files changed, 16 insertions(+), 65 deletions(-) delete mode 100644 plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigManager.java diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfigurationManager.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfigurationManager.java index 8461ae598afe..a8c43f415580 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfigurationManager.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfigurationManager.java @@ -39,7 +39,10 @@ import com.intellij.util.PairConsumer; import com.intellij.util.messages.MessageBus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.svn.branchConfig.*; +import org.jetbrains.idea.svn.branchConfig.InfoReliability; +import org.jetbrains.idea.svn.branchConfig.InfoStorage; +import org.jetbrains.idea.svn.branchConfig.NewRootBunch; +import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationNew; import org.jetbrains.idea.svn.integrate.SvnBranchItem; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; @@ -108,13 +111,13 @@ public class SvnBranchConfigurationManager implements PersistentStateComponent> myCallback; @@ -148,7 +148,7 @@ public class NewRootBunch implements SvnBranchConfigManager { private boolean myPassive; public BranchesLoadRunnable(final Project project, - final SvnBranchConfigManager bunch, + final NewRootBunch bunch, final String url, final InfoReliability infoReliability, final VirtualFile root, @@ -197,10 +197,10 @@ public class NewRootBunch implements SvnBranchConfigManager { private static class DefaultBranchConfigInitializer implements Runnable { private final Project myProject; - private final SvnBranchConfigManager myBunch; + private final NewRootBunch myBunch; private final VirtualFile myRoot; - private DefaultBranchConfigInitializer(final Project project, final SvnBranchConfigManager bunch, final VirtualFile root) { + private DefaultBranchConfigInitializer(final Project project, final NewRootBunch bunch, final VirtualFile root) { myProject = project; myRoot = root; myBunch = bunch; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigManager.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigManager.java deleted file mode 100644 index 0a47a7771171..000000000000 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigManager.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2000-2009 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jetbrains.idea.svn.branchConfig; - -import com.intellij.openapi.vcs.CalledInBackground; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.Consumer; -import com.intellij.util.PairConsumer; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.svn.integrate.SvnBranchItem; -import org.tmatesoft.svn.core.SVNURL; - -import java.util.List; -import java.util.Map; - -public interface SvnBranchConfigManager { - void updateForRoot(@NotNull VirtualFile root, @NotNull InfoStorage config, - @Nullable final PairConsumer callbackOnUpdate); - - void updateBranches(@NotNull VirtualFile root, @NotNull String branchesParent, - @NotNull InfoStorage> items); - - @NotNull - SvnBranchConfigurationNew getConfig(@NotNull VirtualFile root); - - void reloadBranches(@NotNull VirtualFile root, @NotNull String branchParentUrl, - Consumer> callback); - @Nullable - @CalledInBackground - SVNURL getWorkingBranchWithReload(final SVNURL svnurl, final VirtualFile root); - - Map getMapCopy(); -} diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/BranchConfigurationDialog.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/BranchConfigurationDialog.java index 50ddd9615d41..922336514e5a 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/BranchConfigurationDialog.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/BranchConfigurationDialog.java @@ -32,10 +32,7 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.svn.*; -import org.jetbrains.idea.svn.branchConfig.InfoReliability; -import org.jetbrains.idea.svn.branchConfig.InfoStorage; -import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigManager; -import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationNew; +import org.jetbrains.idea.svn.branchConfig.*; import org.jetbrains.idea.svn.commandLine.SvnBindException; import org.jetbrains.idea.svn.integrate.SvnBranchItem; import org.tmatesoft.svn.core.SVNURL; @@ -59,7 +56,7 @@ public class BranchConfigurationDialog extends DialogWrapper { private JList myLocationList; private JPanel myListPanel; private JLabel myErrorPrompt; - private final SvnBranchConfigManager mySvnBranchConfigManager; + private final NewRootBunch mySvnBranchConfigManager; private final VirtualFile myRoot; public BranchConfigurationDialog(@NotNull final Project project, From f43a044abee9d57e82116830330af1a41a93d659 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Wed, 6 Aug 2014 18:23:55 +0400 Subject: [PATCH 14/31] svn: Refactored NewRootBunch, SvnBranchConfigurationManager - inner classes moved to separate files --- .../svn/SvnBranchConfigurationManager.java | 132 +----------------- .../idea/svn/actions/SelectBranchPopup.java | 3 +- .../branchConfig/BranchesLoadRunnable.java | 89 ++++++++++++ .../svn/branchConfig/BranchesPreloader.java | 71 ++++++++++ .../DefaultBranchConfigInitializer.java | 48 +++++++ .../idea/svn/branchConfig/NewRootBunch.java | 86 ------------ .../branchConfig/UrlSerializationHelper.java | 112 +++++++++++++++ 7 files changed, 323 insertions(+), 218 deletions(-) create mode 100644 plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoadRunnable.java create mode 100644 plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesPreloader.java create mode 100644 plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultBranchConfigInitializer.java create mode 100644 plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/UrlSerializationHelper.java diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfigurationManager.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfigurationManager.java index a8c43f415580..b704833ada94 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfigurationManager.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfigurationManager.java @@ -27,7 +27,6 @@ import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressManagerQueue; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pair; -import com.intellij.openapi.util.Ref; import com.intellij.openapi.vcs.ProjectLevelVcsManager; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vcs.changes.committed.VcsConfigurationChangeListener; @@ -35,17 +34,10 @@ import com.intellij.openapi.vcs.impl.ProjectLevelVcsManagerImpl; import com.intellij.openapi.vcs.impl.VcsInitObject; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.PairConsumer; import com.intellij.util.messages.MessageBus; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.svn.branchConfig.InfoReliability; -import org.jetbrains.idea.svn.branchConfig.InfoStorage; -import org.jetbrains.idea.svn.branchConfig.NewRootBunch; -import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationNew; +import org.jetbrains.idea.svn.branchConfig.*; import org.jetbrains.idea.svn.integrate.SvnBranchItem; -import org.tmatesoft.svn.core.SVNException; -import org.tmatesoft.svn.core.SVNURL; import java.io.File; import java.util.*; @@ -148,47 +140,6 @@ public class SvnBranchConfigurationManager implements PersistentStateComponent { - private final Project myProject; - private final VirtualFile myRoot; - private final ProgressManagerQueue myQueue; - private final NewRootBunch myBunch; - private boolean myAll; - - public BranchesPreloader(Project project, @NotNull final NewRootBunch bunch, VirtualFile root, final ProgressManagerQueue queue) { - myBunch = bunch; - myProject = project; - myRoot = root; - myQueue = queue; - } - - public void consume(final SvnBranchConfigurationNew prev, final SvnBranchConfigurationNew next) { - myQueue.run(new Runnable() { - public void run() { - loadImpl(prev, next); - } - }); - } - - protected void loadImpl(final SvnBranchConfigurationNew prev, final SvnBranchConfigurationNew next) { - final Set oldUrls = (prev == null) ? Collections.emptySet() : new HashSet(prev.getBranchUrls()); - final SvnVcs vcs = SvnVcs.getInstance(myProject); - if (! vcs.isVcsBackgroundOperationsAllowed(myRoot)) return; - - for (String newBranchUrl : next.getBranchUrls()) { - // check if cancel had been put - if (! vcs.isVcsBackgroundOperationsAllowed(myRoot)) return; - if (myAll || (! oldUrls.contains(newBranchUrl))) { - new NewRootBunch.BranchesLoadRunnable(myProject, myBunch, newBranchUrl, InfoReliability.defaultValues, myRoot, null, true).run(); - } - } - } - - public void setAll(boolean all) { - myAll = all; - } - } - public void loadState(final ConfigurationBean object) { final UrlSerializationHelper helper = new UrlSerializationHelper(SvnVcs.getInstance(myProject)); final Map map = object.myConfigurationMap; @@ -253,85 +204,4 @@ public class SvnBranchConfigurationManager implements PersistentStateComponent withUserInfo = new Ref(); - final String trunkUrl = serializeUrl(configuration.getTrunkUrl(), withUserInfo); - - if (Boolean.FALSE.equals(withUserInfo.get())) { - return configuration; - } - - final List branches = configuration.getBranchUrls(); - final List newBranchesList = new ArrayList(branches.size()); - for (String s : branches) { - newBranchesList.add(serializeUrl(s, withUserInfo)); - } - - return new SvnBranchConfiguration(trunkUrl, newBranchesList, withUserInfo.isNull() ? false : withUserInfo.get()); - } - - public SvnBranchConfiguration afterDeserialization(final String path, final SvnBranchConfiguration configuration) { - if (! configuration.isUserinfoInUrl()) { - return configuration; - } - final String userInfo = getUserInfo(path); - if (userInfo == null) { - return configuration; - } - - final String newTrunkUrl = deserializeUrl(configuration.getTrunkUrl(), userInfo); - final List branches = configuration.getBranchUrls(); - final List newBranchesList = new ArrayList(branches.size()); - for (String s : branches) { - newBranchesList.add(deserializeUrl(s, userInfo)); - } - - return new SvnBranchConfiguration(newTrunkUrl, newBranchesList, userInfo.length() > 0); - } - - private static String serializeUrl(final String url, final Ref withUserInfo) { - if (Boolean.FALSE.equals(withUserInfo.get())) { - return url; - } - try { - final SVNURL svnurl = SVNURL.parseURIEncoded(url); - if (withUserInfo.isNull()) { - final String userInfo = svnurl.getUserInfo(); - withUserInfo.set((userInfo != null) && (userInfo.length() > 0)); - } - if (withUserInfo.get()) { - return SVNURL.create(svnurl.getProtocol(), null, svnurl.getHost(), SvnUtil.resolvePort(svnurl), svnurl.getURIEncodedPath(), true) - .toString(); - } - } - catch (SVNException e) { - // - } - return url; - } - - @Nullable - private String getUserInfo(final String path) { - final SVNURL svnurl = myVcs.getSvnFileUrlMapping().getUrlForFile(new File(path)); - return svnurl != null ? svnurl.getUserInfo() : null; - } - - private static String deserializeUrl(final String url, final String userInfo) { - try { - final SVNURL svnurl = SVNURL.parseURIEncoded(url); - return SVNURL.create(svnurl.getProtocol(), userInfo, svnurl.getHost(), SvnUtil.resolvePort(svnurl), svnurl.getURIEncodedPath(), - true).toString(); - } catch (SVNException e) { - return url; - } - } - } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/SelectBranchPopup.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/SelectBranchPopup.java index a759f3de87b7..96a5dbc3be5d 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/SelectBranchPopup.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/SelectBranchPopup.java @@ -31,6 +31,7 @@ import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.svn.*; +import org.jetbrains.idea.svn.branchConfig.BranchesLoadRunnable; import org.jetbrains.idea.svn.branchConfig.InfoReliability; import org.jetbrains.idea.svn.branchConfig.NewRootBunch; import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationNew; @@ -221,7 +222,7 @@ public class SelectBranchPopup { @Override protected void runImpl(@NotNull ProgressIndicator indicator) { final NewRootBunch manager = SvnBranchConfigurationManager.getInstance(myProject).getSvnBranchConfigManager(); - new NewRootBunch.BranchesLoadRunnable(myProject, manager, selectedBranchesHolder, InfoReliability.setByUser, myVcsRoot, null, false).run(); + new BranchesLoadRunnable(myProject, manager, selectedBranchesHolder, InfoReliability.setByUser, myVcsRoot, null, false).run(); } }); } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoadRunnable.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoadRunnable.java new file mode 100644 index 000000000000..0292621d7f5c --- /dev/null +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoadRunnable.java @@ -0,0 +1,89 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.idea.svn.branchConfig; + +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.MessageType; +import com.intellij.openapi.vcs.VcsException; +import com.intellij.openapi.vcs.ui.VcsBalloonProblemNotifier; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.Consumer; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.svn.integrate.SvnBranchItem; +import org.tmatesoft.svn.core.SVNException; + +import java.util.List; + +/** +* @author Konstantin Kolosovsky. +*/ +public class BranchesLoadRunnable implements Runnable { + private final Project myProject; + private final NewRootBunch myBunch; + private final VirtualFile myRoot; + @Nullable + private final Consumer> myCallback; + private final String myUrl; + private final InfoReliability myInfoReliability; + private boolean myPassive; + + public BranchesLoadRunnable(final Project project, + final NewRootBunch bunch, + final String url, + final InfoReliability infoReliability, + final VirtualFile root, + @Nullable final Consumer> callback, + boolean passive) { + myProject = project; + myBunch = bunch; + myUrl = url; + myInfoReliability = infoReliability; + myRoot = root; + myCallback = callback; + myPassive = passive; + } + + public void run() { + boolean callbackCalled = false; + try { + final List items = BranchesLoader.loadBranches(myProject, myUrl, myPassive); + myBunch.updateBranches(myRoot, myUrl, new InfoStorage>(items, myInfoReliability)); + if (myCallback != null) { + myCallback.consume(items); + callbackCalled = true; + } + } + catch (VcsException e) { + showError(e); + } + catch (SVNException e) { + showError(e); + } + finally { + // callback must be called by contract + if (myCallback != null && (! callbackCalled)) { + myCallback.consume(null); + } + } + } + + private void showError(Exception e) { + // already logged inside + if (InfoReliability.setByUser.equals(myInfoReliability)) { + VcsBalloonProblemNotifier.showOverChangesView(myProject, "Branches load error: " + e.getMessage(), MessageType.ERROR); + } + } +} diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesPreloader.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesPreloader.java new file mode 100644 index 000000000000..684164f9af88 --- /dev/null +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesPreloader.java @@ -0,0 +1,71 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.idea.svn.branchConfig; + +import com.intellij.openapi.progress.ProgressManagerQueue; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.PairConsumer; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.idea.svn.SvnVcs; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +/** +* @author Konstantin Kolosovsky. +*/ +public class BranchesPreloader implements PairConsumer { + private final Project myProject; + private final VirtualFile myRoot; + private final ProgressManagerQueue myQueue; + private final NewRootBunch myBunch; + private boolean myAll; + + public BranchesPreloader(Project project, @NotNull final NewRootBunch bunch, VirtualFile root, final ProgressManagerQueue queue) { + myBunch = bunch; + myProject = project; + myRoot = root; + myQueue = queue; + } + + public void consume(final SvnBranchConfigurationNew prev, final SvnBranchConfigurationNew next) { + myQueue.run(new Runnable() { + public void run() { + loadImpl(prev, next); + } + }); + } + + public void loadImpl(final SvnBranchConfigurationNew prev, final SvnBranchConfigurationNew next) { + final Set oldUrls = (prev == null) ? Collections.emptySet() : new HashSet(prev.getBranchUrls()); + final SvnVcs vcs = SvnVcs.getInstance(myProject); + if (! vcs.isVcsBackgroundOperationsAllowed(myRoot)) return; + + for (String newBranchUrl : next.getBranchUrls()) { + // check if cancel had been put + if (! vcs.isVcsBackgroundOperationsAllowed(myRoot)) return; + if (myAll || (! oldUrls.contains(newBranchUrl))) { + new BranchesLoadRunnable(myProject, myBunch, newBranchUrl, InfoReliability.defaultValues, myRoot, null, true).run(); + } + } + } + + public void setAll(boolean all) { + myAll = all; + } +} diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultBranchConfigInitializer.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultBranchConfigInitializer.java new file mode 100644 index 000000000000..59a2c756b517 --- /dev/null +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultBranchConfigInitializer.java @@ -0,0 +1,48 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.idea.svn.branchConfig; + +import com.intellij.openapi.application.Application; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; + +/** +* @author Konstantin Kolosovsky. +*/ +class DefaultBranchConfigInitializer implements Runnable { + private final Project myProject; + private final NewRootBunch myBunch; + private final VirtualFile myRoot; + + DefaultBranchConfigInitializer(final Project project, final NewRootBunch bunch, final VirtualFile root) { + myProject = project; + myRoot = root; + myBunch = bunch; + } + + public void run() { + final SvnBranchConfigurationNew result = DefaultConfigLoader.loadDefaultConfiguration(myProject, myRoot); + if (result != null) { + final Application application = ApplicationManager.getApplication(); + for (String url : result.getBranchUrls()) { + application.executeOnPooledThread(new BranchesLoadRunnable(myProject, myBunch, url, InfoReliability.defaultValues, myRoot, null, + true)); + } + myBunch.updateForRoot(myRoot, new InfoStorage(result, InfoReliability.defaultValues), null); + } + } +} diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java index cdb3d35e1b12..28a187a99305 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java @@ -15,16 +15,12 @@ */ package org.jetbrains.idea.svn.branchConfig; -import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressManagerQueue; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.util.Ref; import com.intellij.openapi.vcs.CalledInBackground; -import com.intellij.openapi.vcs.VcsException; -import com.intellij.openapi.vcs.ui.VcsBalloonProblemNotifier; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.Consumer; import com.intellij.util.PairConsumer; @@ -137,88 +133,6 @@ public class NewRootBunch { return result.get(); } - public static class BranchesLoadRunnable implements Runnable { - private final Project myProject; - private final NewRootBunch myBunch; - private final VirtualFile myRoot; - @Nullable - private final Consumer> myCallback; - private final String myUrl; - private final InfoReliability myInfoReliability; - private boolean myPassive; - - public BranchesLoadRunnable(final Project project, - final NewRootBunch bunch, - final String url, - final InfoReliability infoReliability, - final VirtualFile root, - @Nullable final Consumer> callback, - boolean passive) { - myProject = project; - myBunch = bunch; - myUrl = url; - myInfoReliability = infoReliability; - myRoot = root; - myCallback = callback; - myPassive = passive; - } - - public void run() { - boolean callbackCalled = false; - try { - final List items = BranchesLoader.loadBranches(myProject, myUrl, myPassive); - myBunch.updateBranches(myRoot, myUrl, new InfoStorage>(items, myInfoReliability)); - if (myCallback != null) { - myCallback.consume(items); - callbackCalled = true; - } - } - catch (VcsException e) { - showError(e); - } - catch (SVNException e) { - showError(e); - } - finally { - // callback must be called by contract - if (myCallback != null && (! callbackCalled)) { - myCallback.consume(null); - } - } - } - - private void showError(Exception e) { - // already logged inside - if (InfoReliability.setByUser.equals(myInfoReliability)) { - VcsBalloonProblemNotifier.showOverChangesView(myProject, "Branches load error: " + e.getMessage(), MessageType.ERROR); - } - } - } - - private static class DefaultBranchConfigInitializer implements Runnable { - private final Project myProject; - private final NewRootBunch myBunch; - private final VirtualFile myRoot; - - private DefaultBranchConfigInitializer(final Project project, final NewRootBunch bunch, final VirtualFile root) { - myProject = project; - myRoot = root; - myBunch = bunch; - } - - public void run() { - final SvnBranchConfigurationNew result = DefaultConfigLoader.loadDefaultConfiguration(myProject, myRoot); - if (result != null) { - final Application application = ApplicationManager.getApplication(); - for (String url : result.getBranchUrls()) { - application.executeOnPooledThread(new BranchesLoadRunnable(myProject, myBunch, url, InfoReliability.defaultValues, myRoot, null, - true)); - } - myBunch.updateForRoot(myRoot, new InfoStorage(result, InfoReliability.defaultValues), null); - } - } - } - public Map getMapCopy() { synchronized (myLock) { final Map result = new HashMap(); diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/UrlSerializationHelper.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/UrlSerializationHelper.java new file mode 100644 index 000000000000..c407d71c1764 --- /dev/null +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/UrlSerializationHelper.java @@ -0,0 +1,112 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.idea.svn.branchConfig; + +import com.intellij.openapi.util.Ref; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.svn.SvnBranchConfiguration; +import org.jetbrains.idea.svn.SvnUtil; +import org.jetbrains.idea.svn.SvnVcs; +import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.SVNURL; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +/** +* @author Konstantin Kolosovsky. +*/ +public class UrlSerializationHelper { + private final SvnVcs myVcs; + + public UrlSerializationHelper(final SvnVcs vcs) { + myVcs = vcs; + } + + public SvnBranchConfiguration prepareForSerialization(final SvnBranchConfiguration configuration) { + final Ref withUserInfo = new Ref(); + final String trunkUrl = serializeUrl(configuration.getTrunkUrl(), withUserInfo); + + if (Boolean.FALSE.equals(withUserInfo.get())) { + return configuration; + } + + final List branches = configuration.getBranchUrls(); + final List newBranchesList = new ArrayList(branches.size()); + for (String s : branches) { + newBranchesList.add(serializeUrl(s, withUserInfo)); + } + + return new SvnBranchConfiguration(trunkUrl, newBranchesList, withUserInfo.isNull() ? false : withUserInfo.get()); + } + + public SvnBranchConfiguration afterDeserialization(final String path, final SvnBranchConfiguration configuration) { + if (! configuration.isUserinfoInUrl()) { + return configuration; + } + final String userInfo = getUserInfo(path); + if (userInfo == null) { + return configuration; + } + + final String newTrunkUrl = deserializeUrl(configuration.getTrunkUrl(), userInfo); + final List branches = configuration.getBranchUrls(); + final List newBranchesList = new ArrayList(branches.size()); + for (String s : branches) { + newBranchesList.add(deserializeUrl(s, userInfo)); + } + + return new SvnBranchConfiguration(newTrunkUrl, newBranchesList, userInfo.length() > 0); + } + + private static String serializeUrl(final String url, final Ref withUserInfo) { + if (Boolean.FALSE.equals(withUserInfo.get())) { + return url; + } + try { + final SVNURL svnurl = SVNURL.parseURIEncoded(url); + if (withUserInfo.isNull()) { + final String userInfo = svnurl.getUserInfo(); + withUserInfo.set((userInfo != null) && (userInfo.length() > 0)); + } + if (withUserInfo.get()) { + return SVNURL.create(svnurl.getProtocol(), null, svnurl.getHost(), SvnUtil.resolvePort(svnurl), svnurl.getURIEncodedPath(), true) + .toString(); + } + } + catch (SVNException e) { + // + } + return url; + } + + @Nullable + private String getUserInfo(final String path) { + final SVNURL svnurl = myVcs.getSvnFileUrlMapping().getUrlForFile(new File(path)); + return svnurl != null ? svnurl.getUserInfo() : null; + } + + private static String deserializeUrl(final String url, final String userInfo) { + try { + final SVNURL svnurl = SVNURL.parseURIEncoded(url); + return SVNURL.create(svnurl.getProtocol(), userInfo, svnurl.getHost(), SvnUtil.resolvePort(svnurl), svnurl.getURIEncodedPath(), + true).toString(); + } catch (SVNException e) { + return url; + } + } +} From 127fa7b8f2c92de520e62b614f473b21daac5cfb Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Wed, 6 Aug 2014 20:56:49 +0400 Subject: [PATCH 15/31] svn: Moved several branches related classes to "org.jetbrains.idea.svn.branchConfig" package --- plugins/svn4idea/src/META-INF/plugin.xml | 14 +++++++------- .../idea/svn/SvnChangeProviderContext.java | 1 + .../org/jetbrains/idea/svn/SvnConfiguration.java | 1 + .../src/org/jetbrains/idea/svn/SvnUtil.java | 1 + .../src/org/jetbrains/idea/svn/SvnVcs.java | 1 + .../actions/AbstractIntegrateChangesAction.java | 1 + .../BranchConfigurationDialog.form | 2 +- .../BranchConfigurationDialog.java | 5 ++--- .../svn/branchConfig/BranchesLoadRunnable.java | 1 - .../idea/svn/branchConfig/BranchesLoader.java | 1 - .../ConfigureBranchesAction.java | 4 +--- .../CreateBranchOrTagAction.java | 4 ++-- .../CreateBranchOrTagDialog.form | 2 +- .../CreateBranchOrTagDialog.java | 5 ++--- .../idea/svn/branchConfig/DefaultConfigLoader.java | 1 - .../idea/svn/branchConfig/NewRootBunch.java | 1 - .../SelectBranchPopup.java | 13 +++++-------- .../{ => branchConfig}/SvnBranchConfiguration.java | 2 +- .../SvnBranchConfigurationManager.java | 7 +++---- .../branchConfig/SvnBranchConfigurationNew.java | 1 - .../{integrate => branchConfig}/SvnBranchItem.java | 2 +- .../{ => branchConfig}/SvnBranchMapperManager.java | 3 +-- .../SvnLoadedBrachesStorage.java | 5 +---- .../svn/branchConfig/UrlSerializationHelper.java | 1 - .../jetbrains/idea/svn/dialogs/CopiesPanel.java | 3 ++- .../idea/svn/diff/CompareWithBranchAction.java | 2 +- .../svn/history/SvnCommittedChangesProvider.java | 2 +- .../svn/history/SvnMergeInfoRootPanelManual.java | 4 ++-- .../jetbrains/idea/svn/history/WcInfoLoader.java | 3 ++- .../integrate/IntegratedSelectedOptionsDialog.java | 1 + .../svn/integrate/SourceUrlCorrectionTask.java | 2 +- .../SvnIntegrateChangesActionPerformer.java | 2 +- .../idea/svn/update/SvnUpdateRootOptionsPanel.java | 2 +- .../org/jetbrains/idea/svn/SvnQuickMergeTest.java | 3 ++- 34 files changed, 47 insertions(+), 56 deletions(-) rename plugins/svn4idea/src/org/jetbrains/idea/svn/{dialogs => branchConfig}/BranchConfigurationDialog.form (97%) rename plugins/svn4idea/src/org/jetbrains/idea/svn/{dialogs => branchConfig}/BranchConfigurationDialog.java (98%) rename plugins/svn4idea/src/org/jetbrains/idea/svn/{actions => branchConfig}/ConfigureBranchesAction.java (94%) rename plugins/svn4idea/src/org/jetbrains/idea/svn/{actions => branchConfig}/CreateBranchOrTagAction.java (98%) rename plugins/svn4idea/src/org/jetbrains/idea/svn/{dialogs => branchConfig}/CreateBranchOrTagDialog.form (99%) rename plugins/svn4idea/src/org/jetbrains/idea/svn/{dialogs => branchConfig}/CreateBranchOrTagDialog.java (98%) rename plugins/svn4idea/src/org/jetbrains/idea/svn/{actions => branchConfig}/SelectBranchPopup.java (96%) rename plugins/svn4idea/src/org/jetbrains/idea/svn/{ => branchConfig}/SvnBranchConfiguration.java (97%) rename plugins/svn4idea/src/org/jetbrains/idea/svn/{ => branchConfig}/SvnBranchConfigurationManager.java (98%) rename plugins/svn4idea/src/org/jetbrains/idea/svn/{integrate => branchConfig}/SvnBranchItem.java (97%) rename plugins/svn4idea/src/org/jetbrains/idea/svn/{ => branchConfig}/SvnBranchMapperManager.java (97%) rename plugins/svn4idea/src/org/jetbrains/idea/svn/{ => branchConfig}/SvnLoadedBrachesStorage.java (96%) diff --git a/plugins/svn4idea/src/META-INF/plugin.xml b/plugins/svn4idea/src/META-INF/plugin.xml index e831d0550a80..f44dd96fe70e 100644 --- a/plugins/svn4idea/src/META-INF/plugin.xml +++ b/plugins/svn4idea/src/META-INF/plugin.xml @@ -76,7 +76,7 @@ - + @@ -122,16 +122,16 @@ - + - - + + -
+ diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/BranchConfigurationDialog.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchConfigurationDialog.java similarity index 98% rename from plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/BranchConfigurationDialog.java rename to plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchConfigurationDialog.java index 922336514e5a..ed6b03b2032b 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/BranchConfigurationDialog.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchConfigurationDialog.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.jetbrains.idea.svn.dialogs; +package org.jetbrains.idea.svn.branchConfig; import com.intellij.openapi.actionSystem.ActionToolbarPosition; import com.intellij.openapi.project.Project; @@ -32,9 +32,8 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.svn.*; -import org.jetbrains.idea.svn.branchConfig.*; import org.jetbrains.idea.svn.commandLine.SvnBindException; -import org.jetbrains.idea.svn.integrate.SvnBranchItem; +import org.jetbrains.idea.svn.dialogs.SelectLocationDialog; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.internal.util.SVNURLUtil; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoadRunnable.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoadRunnable.java index 0292621d7f5c..96fc68ffabcb 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoadRunnable.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoadRunnable.java @@ -22,7 +22,6 @@ import com.intellij.openapi.vcs.ui.VcsBalloonProblemNotifier; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.Consumer; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.svn.integrate.SvnBranchItem; import org.tmatesoft.svn.core.SVNException; import java.util.List; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoader.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoader.java index 10f4574c7f39..f166ca9521d7 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoader.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoader.java @@ -23,7 +23,6 @@ import org.jetbrains.idea.svn.SvnVcs; import org.jetbrains.idea.svn.api.Depth; import org.jetbrains.idea.svn.browse.DirectoryEntry; import org.jetbrains.idea.svn.browse.DirectoryEntryConsumer; -import org.jetbrains.idea.svn.integrate.SvnBranchItem; import org.tmatesoft.svn.core.*; import org.tmatesoft.svn.core.wc.SVNLogClient; import org.tmatesoft.svn.core.wc.SVNRevision; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/ConfigureBranchesAction.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/ConfigureBranchesAction.java similarity index 94% rename from plugins/svn4idea/src/org/jetbrains/idea/svn/actions/ConfigureBranchesAction.java rename to plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/ConfigureBranchesAction.java index 1993a1caa0fe..3615c4b4792d 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/ConfigureBranchesAction.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/ConfigureBranchesAction.java @@ -13,12 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.svn.actions; +package org.jetbrains.idea.svn.branchConfig; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; -import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.actionSystem.Presentation; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; @@ -28,7 +27,6 @@ import com.intellij.openapi.vcs.versionBrowser.CommittedChangeList; import icons.SvnIcons; import org.jetbrains.idea.svn.SvnBundle; import org.jetbrains.idea.svn.SvnVcs; -import org.jetbrains.idea.svn.dialogs.BranchConfigurationDialog; import org.jetbrains.idea.svn.history.SvnChangeList; public class ConfigureBranchesAction extends AnAction implements DumbAware { diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/CreateBranchOrTagAction.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/CreateBranchOrTagAction.java similarity index 98% rename from plugins/svn4idea/src/org/jetbrains/idea/svn/actions/CreateBranchOrTagAction.java rename to plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/CreateBranchOrTagAction.java index c6f633416a15..da1557922a44 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/CreateBranchOrTagAction.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/CreateBranchOrTagAction.java @@ -15,7 +15,7 @@ */ -package org.jetbrains.idea.svn.actions; +package org.jetbrains.idea.svn.branchConfig; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.application.Application; @@ -35,10 +35,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.idea.svn.SvnBundle; import org.jetbrains.idea.svn.SvnStatusUtil; import org.jetbrains.idea.svn.SvnVcs; +import org.jetbrains.idea.svn.actions.BasicAction; import org.jetbrains.idea.svn.checkin.CommitEventHandler; import org.jetbrains.idea.svn.checkin.IdeaCommitHandler; import org.jetbrains.idea.svn.commandLine.SvnBindException; -import org.jetbrains.idea.svn.dialogs.CreateBranchOrTagDialog; import org.jetbrains.idea.svn.update.AutoSvnUpdater; import org.jetbrains.idea.svn.update.SingleRootSwitcher; import org.tmatesoft.svn.core.SVNErrorCode; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/CreateBranchOrTagDialog.form b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/CreateBranchOrTagDialog.form similarity index 99% rename from plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/CreateBranchOrTagDialog.form rename to plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/CreateBranchOrTagDialog.form index 6dfcae6c9f6f..96eaeaaf2c4c 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/CreateBranchOrTagDialog.form +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/CreateBranchOrTagDialog.form @@ -1,5 +1,5 @@ - + diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/CreateBranchOrTagDialog.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/CreateBranchOrTagDialog.java similarity index 98% rename from plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/CreateBranchOrTagDialog.java rename to plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/CreateBranchOrTagDialog.java index a09de54fdbc4..95ae986dd72d 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/CreateBranchOrTagDialog.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/CreateBranchOrTagDialog.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.svn.dialogs; +package org.jetbrains.idea.svn.branchConfig; import com.intellij.icons.AllIcons; import com.intellij.openapi.diagnostic.Logger; @@ -33,10 +33,9 @@ import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.idea.svn.RootUrlInfo; -import org.jetbrains.idea.svn.SvnBranchConfigurationManager; import org.jetbrains.idea.svn.SvnBundle; import org.jetbrains.idea.svn.SvnVcs; -import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationNew; +import org.jetbrains.idea.svn.dialogs.SelectLocationDialog; import org.jetbrains.idea.svn.info.Info; import org.jetbrains.idea.svn.update.SvnRevisionPanel; import org.tmatesoft.svn.core.internal.util.SVNEncodingUtil; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultConfigLoader.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultConfigLoader.java index d52798e6bfc3..1104ce33a32a 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultConfigLoader.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultConfigLoader.java @@ -28,7 +28,6 @@ import org.jetbrains.idea.svn.api.Depth; import org.jetbrains.idea.svn.browse.DirectoryEntry; import org.jetbrains.idea.svn.browse.DirectoryEntryConsumer; import org.jetbrains.idea.svn.info.Info; -import org.jetbrains.idea.svn.integrate.SvnBranchItem; import org.tmatesoft.svn.core.*; import org.tmatesoft.svn.core.internal.util.SVNPathUtil; import org.tmatesoft.svn.core.wc.SVNRevision; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java index 28a187a99305..47c10a15c291 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java @@ -26,7 +26,6 @@ import com.intellij.util.Consumer; import com.intellij.util.PairConsumer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.svn.integrate.SvnBranchItem; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/SelectBranchPopup.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SelectBranchPopup.java similarity index 96% rename from plugins/svn4idea/src/org/jetbrains/idea/svn/actions/SelectBranchPopup.java rename to plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SelectBranchPopup.java index 96a5dbc3be5d..df1b21641ca2 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/SelectBranchPopup.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SelectBranchPopup.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.svn.actions; +package org.jetbrains.idea.svn.branchConfig; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; @@ -30,13 +30,10 @@ import com.intellij.util.text.DateFormatUtil; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.svn.*; -import org.jetbrains.idea.svn.branchConfig.BranchesLoadRunnable; -import org.jetbrains.idea.svn.branchConfig.InfoReliability; -import org.jetbrains.idea.svn.branchConfig.NewRootBunch; -import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationNew; -import org.jetbrains.idea.svn.dialogs.BranchConfigurationDialog; -import org.jetbrains.idea.svn.integrate.SvnBranchItem; +import org.jetbrains.idea.svn.RootUrlInfo; +import org.jetbrains.idea.svn.SvnBundle; +import org.jetbrains.idea.svn.SvnFileUrlMapping; +import org.jetbrains.idea.svn.SvnVcs; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.internal.util.SVNPathUtil; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfiguration.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfiguration.java similarity index 97% rename from plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfiguration.java rename to plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfiguration.java index e7c52a31af80..0c6138fd08c2 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfiguration.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfiguration.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.jetbrains.idea.svn; +package org.jetbrains.idea.svn.branchConfig; import org.jetbrains.annotations.NotNull; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfigurationManager.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationManager.java similarity index 98% rename from plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfigurationManager.java rename to plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationManager.java index b704833ada94..81c1cbfe4578 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchConfigurationManager.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationManager.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.jetbrains.idea.svn; +package org.jetbrains.idea.svn.branchConfig; import com.intellij.lifecycle.PeriodicalTasksCloser; import com.intellij.openapi.application.ApplicationManager; @@ -36,8 +36,7 @@ import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.messages.MessageBus; import org.jetbrains.annotations.NotNull; -import org.jetbrains.idea.svn.branchConfig.*; -import org.jetbrains.idea.svn.integrate.SvnBranchItem; +import org.jetbrains.idea.svn.SvnVcs; import java.io.File; import java.util.*; @@ -53,7 +52,7 @@ import java.util.*; )} ) public class SvnBranchConfigurationManager implements PersistentStateComponent { - private static final Logger LOG = Logger.getInstance("#org.jetbrains.idea.svn.SvnBranchConfigurationManager"); + private static final Logger LOG = Logger.getInstance("#org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationManager"); private final Project myProject; private final ProjectLevelVcsManager myVcsManager; private final SvnLoadedBrachesStorage myStorage; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationNew.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationNew.java index 4102210a657a..c0649fdd0d83 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationNew.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationNew.java @@ -24,7 +24,6 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.svn.SvnUtil; import org.jetbrains.idea.svn.SvnVcs; import org.jetbrains.idea.svn.info.Info; -import org.jetbrains.idea.svn.integrate.SvnBranchItem; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.internal.util.SVNPathUtil; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/SvnBranchItem.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchItem.java similarity index 97% rename from plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/SvnBranchItem.java rename to plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchItem.java index f9e428d1becf..a0bd0868b6d2 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/SvnBranchItem.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchItem.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.svn.integrate; +package org.jetbrains.idea.svn.branchConfig; import java.util.Date; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchMapperManager.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchMapperManager.java similarity index 97% rename from plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchMapperManager.java rename to plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchMapperManager.java index e82e363f598a..830c67a4523f 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBranchMapperManager.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchMapperManager.java @@ -13,14 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.svn; +package org.jetbrains.idea.svn.branchConfig; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.*; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.messages.Topic; -import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationNew; import java.io.File; import java.util.*; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnLoadedBrachesStorage.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnLoadedBrachesStorage.java similarity index 96% rename from plugins/svn4idea/src/org/jetbrains/idea/svn/SvnLoadedBrachesStorage.java rename to plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnLoadedBrachesStorage.java index 8fe1fa52a938..41a1b3e434af 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnLoadedBrachesStorage.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnLoadedBrachesStorage.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.svn; +package org.jetbrains.idea.svn.branchConfig; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.project.Project; @@ -23,9 +23,6 @@ import com.intellij.util.io.DataExternalizer; import com.intellij.util.io.EnumeratorStringDescriptor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.svn.branchConfig.InfoStorage; -import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationNew; -import org.jetbrains.idea.svn.integrate.SvnBranchItem; import java.io.DataInput; import java.io.DataOutput; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/UrlSerializationHelper.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/UrlSerializationHelper.java index c407d71c1764..36c16f33a0fc 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/UrlSerializationHelper.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/UrlSerializationHelper.java @@ -17,7 +17,6 @@ package org.jetbrains.idea.svn.branchConfig; import com.intellij.openapi.util.Ref; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.svn.SvnBranchConfiguration; import org.jetbrains.idea.svn.SvnUtil; import org.jetbrains.idea.svn.SvnVcs; import org.tmatesoft.svn.core.SVNException; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/CopiesPanel.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/CopiesPanel.java index 9ca5b89d517a..1b48f9d70e5b 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/CopiesPanel.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/CopiesPanel.java @@ -45,7 +45,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.svn.*; import org.jetbrains.idea.svn.actions.CleanupWorker; -import org.jetbrains.idea.svn.actions.SelectBranchPopup; +import org.jetbrains.idea.svn.branchConfig.BranchConfigurationDialog; +import org.jetbrains.idea.svn.branchConfig.SelectBranchPopup; import org.jetbrains.idea.svn.api.ClientFactory; import org.jetbrains.idea.svn.api.Depth; import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationNew; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/diff/CompareWithBranchAction.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/diff/CompareWithBranchAction.java index a8e0ca9e5e7a..278c7d0b5e1c 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/diff/CompareWithBranchAction.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/diff/CompareWithBranchAction.java @@ -26,7 +26,7 @@ import com.intellij.openapi.vcs.FileStatusManager; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.idea.svn.*; -import org.jetbrains.idea.svn.actions.SelectBranchPopup; +import org.jetbrains.idea.svn.branchConfig.SelectBranchPopup; import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationNew; /** diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnCommittedChangesProvider.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnCommittedChangesProvider.java index 83642894711e..4712a080ad36 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnCommittedChangesProvider.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnCommittedChangesProvider.java @@ -48,7 +48,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.svn.SvnBundle; import org.jetbrains.idea.svn.SvnUtil; import org.jetbrains.idea.svn.SvnVcs; -import org.jetbrains.idea.svn.actions.ConfigureBranchesAction; +import org.jetbrains.idea.svn.branchConfig.ConfigureBranchesAction; import org.jetbrains.idea.svn.api.Depth; import org.jetbrains.idea.svn.commandLine.SvnBindException; import org.jetbrains.idea.svn.status.Status; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnMergeInfoRootPanelManual.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnMergeInfoRootPanelManual.java index c6ed3c59a5c7..d4b48281f7ca 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnMergeInfoRootPanelManual.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnMergeInfoRootPanelManual.java @@ -24,10 +24,10 @@ import com.intellij.util.NullableFunction; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.svn.SvnBranchMapperManager; +import org.jetbrains.idea.svn.branchConfig.SvnBranchMapperManager; import org.jetbrains.idea.svn.SvnBundle; import org.jetbrains.idea.svn.SvnUtil; -import org.jetbrains.idea.svn.actions.SelectBranchPopup; +import org.jetbrains.idea.svn.branchConfig.SelectBranchPopup; import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationNew; import org.jetbrains.idea.svn.dialogs.WCInfoWithBranches; import org.jetbrains.idea.svn.integrate.IntegratedSelectedOptionsDialog; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/history/WcInfoLoader.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/history/WcInfoLoader.java index e0ab6ff02ae5..bbac377776b8 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/history/WcInfoLoader.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/history/WcInfoLoader.java @@ -23,10 +23,11 @@ import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.svn.*; +import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationManager; import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationNew; import org.jetbrains.idea.svn.dialogs.WCInfo; import org.jetbrains.idea.svn.dialogs.WCInfoWithBranches; -import org.jetbrains.idea.svn.integrate.SvnBranchItem; +import org.jetbrains.idea.svn.branchConfig.SvnBranchItem; import org.tmatesoft.svn.core.internal.util.SVNPathUtil; import java.io.File; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/IntegratedSelectedOptionsDialog.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/IntegratedSelectedOptionsDialog.java index 3b2184c22484..7ff6e71ab75a 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/IntegratedSelectedOptionsDialog.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/IntegratedSelectedOptionsDialog.java @@ -32,6 +32,7 @@ import com.intellij.util.PlatformIcons; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.svn.*; +import org.jetbrains.idea.svn.branchConfig.SvnBranchMapperManager; import org.jetbrains.idea.svn.info.Info; import org.tmatesoft.svn.core.SVNURL; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/SourceUrlCorrectionTask.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/SourceUrlCorrectionTask.java index 39d51de62943..99d4696ede3f 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/SourceUrlCorrectionTask.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/SourceUrlCorrectionTask.java @@ -18,7 +18,7 @@ package org.jetbrains.idea.svn.integrate; import com.intellij.util.continuation.ContinuationContext; import com.intellij.util.continuation.Where; import org.jetbrains.annotations.NotNull; -import org.jetbrains.idea.svn.SvnBranchConfigurationManager; +import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationManager; import org.jetbrains.idea.svn.dialogs.MergeContext; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.internal.util.SVNPathUtil; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/SvnIntegrateChangesActionPerformer.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/SvnIntegrateChangesActionPerformer.java index e07fac011c9e..2ccd2242db10 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/SvnIntegrateChangesActionPerformer.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/SvnIntegrateChangesActionPerformer.java @@ -23,7 +23,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.svn.SvnBundle; import org.jetbrains.idea.svn.SvnConfiguration; import org.jetbrains.idea.svn.SvnVcs; -import org.jetbrains.idea.svn.actions.SelectBranchPopup; +import org.jetbrains.idea.svn.branchConfig.SelectBranchPopup; import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationNew; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/update/SvnUpdateRootOptionsPanel.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/update/SvnUpdateRootOptionsPanel.java index d232fdc3037f..9103c845ae75 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/update/SvnUpdateRootOptionsPanel.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/update/SvnUpdateRootOptionsPanel.java @@ -22,7 +22,7 @@ import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.vcs.FilePath; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.svn.*; -import org.jetbrains.idea.svn.actions.SelectBranchPopup; +import org.jetbrains.idea.svn.branchConfig.SelectBranchPopup; import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationNew; import org.jetbrains.idea.svn.dialogs.SelectLocationDialog; import org.jetbrains.idea.svn.history.SvnChangeList; diff --git a/plugins/svn4idea/testSource/org/jetbrains/idea/svn/SvnQuickMergeTest.java b/plugins/svn4idea/testSource/org/jetbrains/idea/svn/SvnQuickMergeTest.java index 6853141b8d45..a663e13d3b29 100644 --- a/plugins/svn4idea/testSource/org/jetbrains/idea/svn/SvnQuickMergeTest.java +++ b/plugins/svn4idea/testSource/org/jetbrains/idea/svn/SvnQuickMergeTest.java @@ -36,9 +36,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.idea.SvnTestCase; import org.jetbrains.idea.svn.branchConfig.InfoReliability; import org.jetbrains.idea.svn.branchConfig.InfoStorage; +import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationManager; import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationNew; import org.jetbrains.idea.svn.dialogs.*; -import org.jetbrains.idea.svn.integrate.SvnBranchItem; +import org.jetbrains.idea.svn.branchConfig.SvnBranchItem; import org.jetbrains.idea.svn.mergeinfo.MergeChecker; import org.junit.Before; import org.junit.Test; From 628f3fead7474bda946a0836683d8cf348b933f3 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Wed, 6 Aug 2014 22:25:19 +0400 Subject: [PATCH 16/31] svn: Fixed typo - renamed "SvnLoadedBrachesStorage" to "SvnLoadedBranchesStorage" --- plugins/svn4idea/src/META-INF/plugin.xml | 4 ++-- plugins/svn4idea/src/org/jetbrains/idea/svn/SvnVcs.java | 6 +++--- .../svn/branchConfig/SvnBranchConfigurationManager.java | 4 ++-- ...dedBrachesStorage.java => SvnLoadedBranchesStorage.java} | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) rename plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/{SvnLoadedBrachesStorage.java => SvnLoadedBranchesStorage.java} (98%) diff --git a/plugins/svn4idea/src/META-INF/plugin.xml b/plugins/svn4idea/src/META-INF/plugin.xml index f44dd96fe70e..5a441dc89565 100644 --- a/plugins/svn4idea/src/META-INF/plugin.xml +++ b/plugins/svn4idea/src/META-INF/plugin.xml @@ -128,8 +128,8 @@ serviceImplementation="org.jetbrains.idea.svn.history.LoadedRevisionsCache"/> - + { private final RootsToWorkingCopies myRootsToWorkingCopies; private final SvnAuthenticationNotifier myAuthNotifier; - private final SvnLoadedBrachesStorage myLoadedBranchesStorage; + private final SvnLoadedBranchesStorage myLoadedBranchesStorage; private final SvnExecutableChecker myChecker; @@ -160,7 +160,7 @@ public class SvnVcs extends AbstractVcs { private final boolean myLogExceptions; - public SvnVcs(final Project project, MessageBus bus, SvnConfiguration svnConfiguration, final SvnLoadedBrachesStorage storage) { + public SvnVcs(final Project project, MessageBus bus, SvnConfiguration svnConfiguration, final SvnLoadedBranchesStorage storage) { super(project, VCS_NAME); myLoadedBranchesStorage = storage; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationManager.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationManager.java index 81c1cbfe4578..13b3ac1bdefd 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationManager.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationManager.java @@ -55,12 +55,12 @@ public class SvnBranchConfigurationManager implements PersistentStateComponent>> myState; private final File myFile; private final Project myProject; - public SvnLoadedBrachesStorage(final Project project) { + public SvnLoadedBranchesStorage(final Project project) { myProject = project; final File vcsFile = new File(PathManager.getSystemPath(), "vcs"); File file = new File(vcsFile, "svn_branches"); From d9b4bb907695389f8bd375d26e2873e980421354 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Thu, 7 Aug 2014 00:02:12 +0400 Subject: [PATCH 17/31] EA-39670 Moved branches configuration initialization from SvnBranchConfigurationManager.loadState() to SvnBranchConfigurationManager.getInstance() - this way initialization occurs not under read action and it is valid to call LocalFileSystem.refreshAndFind...() (even from not EDT) --- .../SvnBranchConfigurationManager.java | 43 ++++++++++++++----- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationManager.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationManager.java index 13b3ac1bdefd..39c8f6458a4c 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationManager.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationManager.java @@ -34,6 +34,7 @@ import com.intellij.openapi.vcs.impl.ProjectLevelVcsManagerImpl; import com.intellij.openapi.vcs.impl.VcsInitObject; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.messages.MessageBus; import org.jetbrains.annotations.NotNull; import org.jetbrains.idea.svn.SvnVcs; @@ -57,6 +58,7 @@ public class SvnBranchConfigurationManager implements PersistentStateComponent map = object.myConfigurationMap; - final LocalFileSystem lfs = LocalFileSystem.getInstance(); + public void loadState(ConfigurationBean object) { + myConfigurationBean = object; + } - final Set> whatToInit = new HashSet>(); - for (Map.Entry entry : map.entrySet()) { + private synchronized void initialize() { + if (!myIsInitialized) { + myIsInitialized = true; + + preloadBranches(resolveAllBranchPoints()); + } + } + + @NotNull + private Set> resolveAllBranchPoints() { + final LocalFileSystem lfs = LocalFileSystem.getInstance(); + final UrlSerializationHelper helper = new UrlSerializationHelper(SvnVcs.getInstance(myProject)); + final Set> branchPointsToLoad = ContainerUtil.newHashSet(); + for (Map.Entry entry : myConfigurationBean.myConfigurationMap.entrySet()) { final SvnBranchConfiguration configuration = entry.getValue(); final VirtualFile root = lfs.refreshAndFindFileByIoFile(new File(entry.getKey())); if (root == null) { @@ -167,19 +186,23 @@ public class SvnBranchConfigurationManager implements PersistentStateComponent>(stored, InfoReliability.setByUser)); } else { - whatToInit.add(Pair.create(root, newConfig)); + branchPointsToLoad.add(Pair.create(root, newConfig)); newConfig.addBranches(branchUrl, new InfoStorage>(new ArrayList(), InfoReliability.empty)); } } myBunch.updateForRoot(root, new InfoStorage(newConfig, InfoReliability.setByUser), null); } + return branchPointsToLoad; + } + + private void preloadBranches(@NotNull final Collection> branchPoints) { ((ProjectLevelVcsManagerImpl) myVcsManager).addInitializationRequest(VcsInitObject.BRANCHES, new Runnable() { public void run() { ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { public void run() { try { - for (Pair pair : whatToInit) { + for (Pair pair : branchPoints) { final BranchesPreloader branchesPreloader = new BranchesPreloader(myProject, myBunch, pair.getFirst(), myBranchesLoader); branchesPreloader.setAll(true); branchesPreloader.loadImpl(null, pair.getSecond()); @@ -192,8 +215,6 @@ public class SvnBranchConfigurationManager implements PersistentStateComponent getStored(String branchUrl) { From 12d0104ca60caf5142278f5294f580713ecb5de4 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Thu, 7 Aug 2014 00:31:27 +0400 Subject: [PATCH 18/31] svn: Refactoring - DefaultConfigLoader logic moved to DefaultBranchConfigInitializer, removed DefaultConfigLoader --- .../DefaultBranchConfigInitializer.java | 95 ++++++++++++++- .../svn/branchConfig/DefaultConfigLoader.java | 112 ------------------ 2 files changed, 92 insertions(+), 115 deletions(-) delete mode 100644 plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultConfigLoader.java diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultBranchConfigInitializer.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultBranchConfigInitializer.java index 59a2c756b517..c1ff1f9f971b 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultBranchConfigInitializer.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultBranchConfigInitializer.java @@ -17,25 +17,52 @@ package org.jetbrains.idea.svn.branchConfig; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.svn.SvnVcs; +import org.jetbrains.idea.svn.api.Depth; +import org.jetbrains.idea.svn.browse.DirectoryEntry; +import org.jetbrains.idea.svn.browse.DirectoryEntryConsumer; +import org.jetbrains.idea.svn.info.Info; +import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.SVNURL; +import org.tmatesoft.svn.core.internal.util.SVNPathUtil; +import org.tmatesoft.svn.core.wc.SVNRevision; +import org.tmatesoft.svn.core.wc2.SvnTarget; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; /** * @author Konstantin Kolosovsky. */ -class DefaultBranchConfigInitializer implements Runnable { +public class DefaultBranchConfigInitializer implements Runnable { + + private static final Logger LOG = Logger.getInstance(DefaultBranchConfigInitializer.class); + + @NonNls private static final String DEFAULT_TRUNK_NAME = "trunk"; + @NonNls private static final String DEFAULT_BRANCHES_NAME = "branches"; + @NonNls private static final String DEFAULT_TAGS_NAME = "tags"; + private final Project myProject; private final NewRootBunch myBunch; private final VirtualFile myRoot; - DefaultBranchConfigInitializer(final Project project, final NewRootBunch bunch, final VirtualFile root) { + public DefaultBranchConfigInitializer(final Project project, final NewRootBunch bunch, final VirtualFile root) { myProject = project; myRoot = root; myBunch = bunch; } public void run() { - final SvnBranchConfigurationNew result = DefaultConfigLoader.loadDefaultConfiguration(myProject, myRoot); + final SvnBranchConfigurationNew result = loadDefaultConfiguration(); if (result != null) { final Application application = ApplicationManager.getApplication(); for (String url : result.getBranchUrls()) { @@ -45,4 +72,66 @@ class DefaultBranchConfigInitializer implements Runnable { myBunch.updateForRoot(myRoot, new InfoStorage(result, InfoReliability.defaultValues), null); } } + + @Nullable + public SvnBranchConfigurationNew loadDefaultConfiguration() { + try { + final SvnVcs vcs = SvnVcs.getInstance(myProject); + + File rootFile = new File(myRoot.getPath()); + final Info info = vcs.getInfo(rootFile); + if (info == null || info.getURL() == null) { + LOG.info("Directory is not a working copy: " + myRoot.getPresentableUrl()); + return null; + } + SVNURL baseUrl = info.getURL(); + + final SvnBranchConfigurationNew result = new SvnBranchConfigurationNew(); + result.setTrunkUrl(baseUrl.toString()); + while (true) { + final String s = SVNPathUtil.tail(baseUrl.getPath()); + if (s.equalsIgnoreCase(DEFAULT_TRUNK_NAME) || s.equalsIgnoreCase(DEFAULT_BRANCHES_NAME) || s.equalsIgnoreCase(DEFAULT_TAGS_NAME)) { + SVNURL rootPath = baseUrl.removePathTail(); + SvnTarget target = SvnTarget.fromURL(rootPath); + + vcs.getFactory(target).createBrowseClient().list(target, SVNRevision.HEAD, Depth.IMMEDIATES, createHandler(result, rootPath)); + break; + } + if (SVNPathUtil.removeTail(baseUrl.getPath()).length() == 0) { + break; + } + baseUrl = baseUrl.removePathTail(); + } + return result; + } + catch (SVNException e) { + LOG.info(e); + return null; + } + catch (VcsException e) { + LOG.info(e); + return null; + } + } + + @NotNull + private static DirectoryEntryConsumer createHandler(final SvnBranchConfigurationNew result, final SVNURL rootPath) { + return new DirectoryEntryConsumer() { + + @Override + public void consume(final DirectoryEntry entry) throws SVNException { + if (entry.isDirectory()) { + SVNURL childUrl = rootPath.appendPath(entry.getName(), false); + + if (StringUtil.endsWithIgnoreCase(entry.getName(), DEFAULT_TRUNK_NAME)) { + result.setTrunkUrl(childUrl.toString()); + } + else { + result.addBranches(childUrl.toString(), + new InfoStorage>(new ArrayList(0), InfoReliability.defaultValues)); + } + } + } + }; + } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultConfigLoader.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultConfigLoader.java deleted file mode 100644 index 1104ce33a32a..000000000000 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultConfigLoader.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright 2000-2009 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jetbrains.idea.svn.branchConfig; - -import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vcs.VcsException; -import com.intellij.openapi.vfs.VirtualFile; -import org.jetbrains.annotations.NonNls; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.svn.SvnVcs; -import org.jetbrains.idea.svn.api.Depth; -import org.jetbrains.idea.svn.browse.DirectoryEntry; -import org.jetbrains.idea.svn.browse.DirectoryEntryConsumer; -import org.jetbrains.idea.svn.info.Info; -import org.tmatesoft.svn.core.*; -import org.tmatesoft.svn.core.internal.util.SVNPathUtil; -import org.tmatesoft.svn.core.wc.SVNRevision; -import org.tmatesoft.svn.core.wc2.SvnTarget; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -public class DefaultConfigLoader { - - private static final Logger LOG = Logger.getInstance("#org.jetbrains.idea.svn.branchConfig.DefaultConfigLoader"); - - @NonNls private static final String DEFAULT_TRUNK_NAME = "trunk"; - @NonNls private static final String DEFAULT_BRANCHES_NAME = "branches"; - @NonNls private static final String DEFAULT_TAGS_NAME = "tags"; - - private DefaultConfigLoader() { - } - - @Nullable - public static SvnBranchConfigurationNew loadDefaultConfiguration(final Project project, final VirtualFile vcsRoot) { - try { - final SvnVcs vcs = SvnVcs.getInstance(project); - - File rootFile = new File(vcsRoot.getPath()); - final Info info = vcs.getInfo(rootFile); - if (info == null || info.getURL() == null) { - LOG.info("Directory is not a working copy: " + vcsRoot.getPresentableUrl()); - return null; - } - SVNURL baseUrl = info.getURL(); - - final SvnBranchConfigurationNew result = new SvnBranchConfigurationNew(); - result.setTrunkUrl(baseUrl.toString()); - while(true) { - final String s = SVNPathUtil.tail(baseUrl.getPath()); - if (s.equalsIgnoreCase(DEFAULT_TRUNK_NAME) || s.equalsIgnoreCase(DEFAULT_BRANCHES_NAME) || s.equalsIgnoreCase(DEFAULT_TAGS_NAME)) { - SVNURL rootPath = baseUrl.removePathTail(); - SvnTarget target = SvnTarget.fromURL(rootPath); - - vcs.getFactory(target).createBrowseClient().list(target, SVNRevision.HEAD, Depth.IMMEDIATES, createHandler(result, rootPath)); - break; - } - if (SVNPathUtil.removeTail(baseUrl.getPath()).length() == 0) { - break; - } - baseUrl = baseUrl.removePathTail(); - } - return result; - } - catch (SVNException e) { - LOG.info(e); - return null; - } - catch (VcsException e) { - LOG.info(e); - return null; - } - } - - @NotNull - private static DirectoryEntryConsumer createHandler(final SvnBranchConfigurationNew result, final SVNURL rootPath) { - return new DirectoryEntryConsumer() { - - @Override - public void consume(final DirectoryEntry entry) throws SVNException { - if (entry.isDirectory()) { - SVNURL childUrl = rootPath.appendPath(entry.getName(), false); - - if (StringUtil.endsWithIgnoreCase(entry.getName(), DEFAULT_TRUNK_NAME)) { - result.setTrunkUrl(childUrl.toString()); - } - else { - result.addBranches(childUrl.toString(), - new InfoStorage>(new ArrayList(0), InfoReliability.defaultValues)); - } - } - } - }; - } -} From ee1ad1b5e75c13f801afb5ca040fd9d271120b8b Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Thu, 7 Aug 2014 02:20:12 +0400 Subject: [PATCH 19/31] svn: Refactored DefaultBranchConfigInitializer - methods extracted, code simplified, @NotNull --- .../DefaultBranchConfigInitializer.java | 116 ++++++++++-------- 1 file changed, 68 insertions(+), 48 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultBranchConfigInitializer.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultBranchConfigInitializer.java index c1ff1f9f971b..f9b09141707d 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultBranchConfigInitializer.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultBranchConfigInitializer.java @@ -15,28 +15,27 @@ */ package org.jetbrains.idea.svn.branchConfig; -import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vcs.VcsException; +import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.svn.SvnUtil; import org.jetbrains.idea.svn.SvnVcs; import org.jetbrains.idea.svn.api.Depth; import org.jetbrains.idea.svn.browse.DirectoryEntry; import org.jetbrains.idea.svn.browse.DirectoryEntryConsumer; -import org.jetbrains.idea.svn.info.Info; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.internal.util.SVNPathUtil; import org.tmatesoft.svn.core.wc.SVNRevision; import org.tmatesoft.svn.core.wc2.SvnTarget; -import java.io.File; import java.util.ArrayList; import java.util.List; @@ -51,71 +50,92 @@ public class DefaultBranchConfigInitializer implements Runnable { @NonNls private static final String DEFAULT_BRANCHES_NAME = "branches"; @NonNls private static final String DEFAULT_TAGS_NAME = "tags"; - private final Project myProject; - private final NewRootBunch myBunch; - private final VirtualFile myRoot; + @NotNull private final Project myProject; + @NotNull private final NewRootBunch myBunch; + @NotNull private final VirtualFile myRoot; - public DefaultBranchConfigInitializer(final Project project, final NewRootBunch bunch, final VirtualFile root) { + public DefaultBranchConfigInitializer(@NotNull Project project, @NotNull NewRootBunch bunch, @NotNull VirtualFile root) { myProject = project; myRoot = root; myBunch = bunch; } public void run() { - final SvnBranchConfigurationNew result = loadDefaultConfiguration(); - if (result != null) { - final Application application = ApplicationManager.getApplication(); - for (String url : result.getBranchUrls()) { - application.executeOnPooledThread(new BranchesLoadRunnable(myProject, myBunch, url, InfoReliability.defaultValues, myRoot, null, - true)); + SvnBranchConfigurationNew configuration = getDefaultConfiguration(); + + if (configuration != null) { + for (String url : configuration.getBranchUrls()) { + ApplicationManager.getApplication() + .executeOnPooledThread(new BranchesLoadRunnable(myProject, myBunch, url, InfoReliability.defaultValues, myRoot, null, true)); } - myBunch.updateForRoot(myRoot, new InfoStorage(result, InfoReliability.defaultValues), null); + + myBunch.updateForRoot(myRoot, new InfoStorage(configuration, InfoReliability.defaultValues), null); } } @Nullable - public SvnBranchConfigurationNew loadDefaultConfiguration() { - try { - final SvnVcs vcs = SvnVcs.getInstance(myProject); + public SvnBranchConfigurationNew getDefaultConfiguration() { + SvnBranchConfigurationNew result = null; + SvnVcs vcs = SvnVcs.getInstance(myProject); + SVNURL rootUrl = SvnUtil.getUrl(vcs, VfsUtilCore.virtualToIoFile(myRoot)); - File rootFile = new File(myRoot.getPath()); - final Info info = vcs.getInfo(rootFile); - if (info == null || info.getURL() == null) { - LOG.info("Directory is not a working copy: " + myRoot.getPresentableUrl()); - return null; + if (rootUrl != null) { + try { + result = getDefaultConfiguration(vcs, rootUrl); } - SVNURL baseUrl = info.getURL(); - - final SvnBranchConfigurationNew result = new SvnBranchConfigurationNew(); - result.setTrunkUrl(baseUrl.toString()); - while (true) { - final String s = SVNPathUtil.tail(baseUrl.getPath()); - if (s.equalsIgnoreCase(DEFAULT_TRUNK_NAME) || s.equalsIgnoreCase(DEFAULT_BRANCHES_NAME) || s.equalsIgnoreCase(DEFAULT_TAGS_NAME)) { - SVNURL rootPath = baseUrl.removePathTail(); - SvnTarget target = SvnTarget.fromURL(rootPath); - - vcs.getFactory(target).createBrowseClient().list(target, SVNRevision.HEAD, Depth.IMMEDIATES, createHandler(result, rootPath)); - break; - } - if (SVNPathUtil.removeTail(baseUrl.getPath()).length() == 0) { - break; - } - baseUrl = baseUrl.removePathTail(); + catch (SVNException e) { + LOG.info(e); + } + catch (VcsException e) { + LOG.info(e); } - return result; } - catch (SVNException e) { - LOG.info(e); - return null; - } - catch (VcsException e) { - LOG.info(e); - return null; + else { + LOG.info("Directory is not a working copy: " + myRoot.getPresentableUrl()); } + + return result; } @NotNull - private static DirectoryEntryConsumer createHandler(final SvnBranchConfigurationNew result, final SVNURL rootPath) { + private static SvnBranchConfigurationNew getDefaultConfiguration(@NotNull SvnVcs vcs, @NotNull SVNURL url) + throws SVNException, VcsException { + SvnBranchConfigurationNew result = new SvnBranchConfigurationNew(); + result.setTrunkUrl(url.toString()); + + SVNURL branchLocationsParent = getBranchLocationsParent(url); + if (branchLocationsParent != null) { + SvnTarget target = SvnTarget.fromURL(branchLocationsParent); + + vcs.getFactory(target).createBrowseClient().list(target, SVNRevision.HEAD, Depth.IMMEDIATES, createHandler(result, target.getURL())); + } + + return result; + } + + @Nullable + private static SVNURL getBranchLocationsParent(@NotNull SVNURL url) throws SVNException { + while (!hasEmptyName(url) && !hasDefaultName(url)) { + url = url.removePathTail(); + } + + return hasDefaultName(url) ? url.removePathTail() : null; + } + + private static boolean hasEmptyName(@NotNull SVNURL url) { + return StringUtil.isEmpty(SVNPathUtil.tail(url.getPath())); + } + + private static boolean hasDefaultName(@NotNull SVNURL url) { + String name = SVNPathUtil.tail(url.getPath()); + + return name.equalsIgnoreCase(DEFAULT_TRUNK_NAME) || + name.equalsIgnoreCase(DEFAULT_BRANCHES_NAME) || + name.equalsIgnoreCase(DEFAULT_TAGS_NAME); + } + + @NotNull + private static DirectoryEntryConsumer createHandler(@NotNull final SvnBranchConfigurationNew result, @NotNull final SVNURL rootPath) { return new DirectoryEntryConsumer() { @Override From a24ef18ebd3ee84b3ddbd67559a660eafa4e5329 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Thu, 7 Aug 2014 10:29:00 +0400 Subject: [PATCH 20/31] svn: Refactoring - BranchesLoadRunnable logic moved to BranchesLoader, removed BranchesLoadRunnable --- .../branchConfig/BranchesLoadRunnable.java | 88 ------------------- .../idea/svn/branchConfig/BranchesLoader.java | 78 +++++++++++++--- .../svn/branchConfig/BranchesPreloader.java | 2 +- .../DefaultBranchConfigInitializer.java | 4 +- .../idea/svn/branchConfig/NewRootBunch.java | 6 +- .../svn/branchConfig/SelectBranchPopup.java | 2 +- 6 files changed, 75 insertions(+), 105 deletions(-) delete mode 100644 plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoadRunnable.java diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoadRunnable.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoadRunnable.java deleted file mode 100644 index 96fc68ffabcb..000000000000 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoadRunnable.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2000-2014 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jetbrains.idea.svn.branchConfig; - -import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.MessageType; -import com.intellij.openapi.vcs.VcsException; -import com.intellij.openapi.vcs.ui.VcsBalloonProblemNotifier; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.Consumer; -import org.jetbrains.annotations.Nullable; -import org.tmatesoft.svn.core.SVNException; - -import java.util.List; - -/** -* @author Konstantin Kolosovsky. -*/ -public class BranchesLoadRunnable implements Runnable { - private final Project myProject; - private final NewRootBunch myBunch; - private final VirtualFile myRoot; - @Nullable - private final Consumer> myCallback; - private final String myUrl; - private final InfoReliability myInfoReliability; - private boolean myPassive; - - public BranchesLoadRunnable(final Project project, - final NewRootBunch bunch, - final String url, - final InfoReliability infoReliability, - final VirtualFile root, - @Nullable final Consumer> callback, - boolean passive) { - myProject = project; - myBunch = bunch; - myUrl = url; - myInfoReliability = infoReliability; - myRoot = root; - myCallback = callback; - myPassive = passive; - } - - public void run() { - boolean callbackCalled = false; - try { - final List items = BranchesLoader.loadBranches(myProject, myUrl, myPassive); - myBunch.updateBranches(myRoot, myUrl, new InfoStorage>(items, myInfoReliability)); - if (myCallback != null) { - myCallback.consume(items); - callbackCalled = true; - } - } - catch (VcsException e) { - showError(e); - } - catch (SVNException e) { - showError(e); - } - finally { - // callback must be called by contract - if (myCallback != null && (! callbackCalled)) { - myCallback.consume(null); - } - } - } - - private void showError(Exception e) { - // already logged inside - if (InfoReliability.setByUser.equals(myInfoReliability)) { - VcsBalloonProblemNotifier.showOverChangesView(myProject, "Branches load error: " + e.getMessage(), MessageType.ERROR); - } - } -} diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoader.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoader.java index f166ca9521d7..b083baa7ebf1 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoader.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoader.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,8 +16,13 @@ package org.jetbrains.idea.svn.branchConfig; import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.vcs.VcsException; +import com.intellij.openapi.vcs.ui.VcsBalloonProblemNotifier; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.Consumer; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.svn.SvnConfiguration; import org.jetbrains.idea.svn.SvnVcs; import org.jetbrains.idea.svn.api.Depth; @@ -32,27 +37,73 @@ import java.util.Collections; import java.util.LinkedList; import java.util.List; -public class BranchesLoader { +/** + * @author Konstantin Kolosovsky. + */ +public class BranchesLoader implements Runnable { + private final Project myProject; + private final NewRootBunch myBunch; + private final VirtualFile myRoot; + @Nullable private final Consumer> myCallback; + private final String myUrl; + private final InfoReliability myInfoReliability; + private boolean myPassive; - private BranchesLoader() { + public BranchesLoader(final Project project, + final NewRootBunch bunch, + final String url, + final InfoReliability infoReliability, + final VirtualFile root, + @Nullable final Consumer> callback, + boolean passive) { + myProject = project; + myBunch = bunch; + myUrl = url; + myInfoReliability = infoReliability; + myRoot = root; + myCallback = callback; + myPassive = passive; } - public static List loadBranches(final Project project, final String url, boolean passive) throws SVNException, - VcsException { - final SvnConfiguration configuration = SvnConfiguration.getInstance(project); - final SvnVcs vcs = SvnVcs.getInstance(project); - SVNURL branchesUrl = SVNURL.parseURIEncoded(url); + public void run() { + boolean callbackCalled = false; + try { + final List items = loadBranches(); + myBunch.updateBranches(myRoot, myUrl, new InfoStorage>(items, myInfoReliability)); + if (myCallback != null) { + myCallback.consume(items); + callbackCalled = true; + } + } + catch (VcsException e) { + showError(e); + } + catch (SVNException e) { + showError(e); + } + finally { + // callback must be called by contract + if (myCallback != null && (!callbackCalled)) { + myCallback.consume(null); + } + } + } + + public List loadBranches() throws SVNException, VcsException { + final SvnConfiguration configuration = SvnConfiguration.getInstance(myProject); + final SvnVcs vcs = SvnVcs.getInstance(myProject); + SVNURL branchesUrl = SVNURL.parseURIEncoded(myUrl); List result = new LinkedList(); SvnTarget target = SvnTarget.fromURL(branchesUrl); - if (!passive) { + if (!myPassive) { // TODO: Implement ability to specify interactive/non-interactive auth mode for clients DirectoryEntryConsumer handler = createConsumer(branchesUrl, result); vcs.getFactory(target).createBrowseClient().list(target, SVNRevision.HEAD, Depth.IMMEDIATES, handler); } else { ISVNDirEntryHandler handler = createHandler(branchesUrl, result); - SVNLogClient client = vcs.getSvnKitManager().createLogClient(configuration.getPassiveAuthenticationManager(project)); + SVNLogClient client = vcs.getSvnKitManager().createLogClient(configuration.getPassiveAuthenticationManager(myProject)); client .doList(target.getURL(), target.getPegRevision(), SVNRevision.HEAD, false, SVNDepth.IMMEDIATES, SVNDirEntry.DIRENT_ALL, handler); } @@ -61,6 +112,13 @@ public class BranchesLoader { return result; } + private void showError(Exception e) { + // already logged inside + if (InfoReliability.setByUser.equals(myInfoReliability)) { + VcsBalloonProblemNotifier.showOverChangesView(myProject, "Branches load error: " + e.getMessage(), MessageType.ERROR); + } + } + @NotNull private static ISVNDirEntryHandler createHandler(@NotNull final SVNURL branchesUrl, @NotNull final List result) { return new ISVNDirEntryHandler() { diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesPreloader.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesPreloader.java index 684164f9af88..f5c7dc9fceab 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesPreloader.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesPreloader.java @@ -60,7 +60,7 @@ public class BranchesPreloader implements PairConsumer(configuration, InfoReliability.defaultValues), null); diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java index 47c10a15c291..7514f923153b 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java @@ -92,8 +92,8 @@ public class NewRootBunch { public void reloadBranches(@NotNull final VirtualFile root, @NotNull final String branchParentUrl, final Consumer> callback) { - ApplicationManager.getApplication().executeOnPooledThread(new BranchesLoadRunnable(myProject, this, branchParentUrl, - InfoReliability.setByUser, root, callback, true)); + ApplicationManager.getApplication() + .executeOnPooledThread(new BranchesLoader(myProject, this, branchParentUrl, InfoReliability.setByUser, root, callback, true)); } @Nullable @@ -118,7 +118,7 @@ public class NewRootBunch { if (group == null) { runnable.run(); } else { - new BranchesLoadRunnable(myProject, this, group, InfoReliability.setByUser, root, + new BranchesLoader(myProject, this, group, InfoReliability.setByUser, root, new Consumer>() { public void consume(List svnBranchItems) { runnable.run(); diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SelectBranchPopup.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SelectBranchPopup.java index df1b21641ca2..8e45a5c73d13 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SelectBranchPopup.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SelectBranchPopup.java @@ -219,7 +219,7 @@ public class SelectBranchPopup { @Override protected void runImpl(@NotNull ProgressIndicator indicator) { final NewRootBunch manager = SvnBranchConfigurationManager.getInstance(myProject).getSvnBranchConfigManager(); - new BranchesLoadRunnable(myProject, manager, selectedBranchesHolder, InfoReliability.setByUser, myVcsRoot, null, false).run(); + new BranchesLoader(myProject, manager, selectedBranchesHolder, InfoReliability.setByUser, myVcsRoot, null, false).run(); } }); } From 4648413dfd98895af36017795158e624384480dc Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Thu, 7 Aug 2014 10:55:37 +0400 Subject: [PATCH 21/31] svn: Refactored BranchesLoader - code simplified, @NotNull --- .../idea/svn/branchConfig/BranchesLoader.java | 41 +++++++++---------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoader.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoader.java index b083baa7ebf1..abb95d094f6e 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoader.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoader.java @@ -41,20 +41,20 @@ import java.util.List; * @author Konstantin Kolosovsky. */ public class BranchesLoader implements Runnable { - private final Project myProject; - private final NewRootBunch myBunch; - private final VirtualFile myRoot; + @NotNull private final Project myProject; + @NotNull private final NewRootBunch myBunch; + @NotNull private final VirtualFile myRoot; @Nullable private final Consumer> myCallback; - private final String myUrl; - private final InfoReliability myInfoReliability; - private boolean myPassive; + @NotNull private final String myUrl; + @NotNull private final InfoReliability myInfoReliability; + private final boolean myPassive; - public BranchesLoader(final Project project, - final NewRootBunch bunch, - final String url, - final InfoReliability infoReliability, - final VirtualFile root, - @Nullable final Consumer> callback, + public BranchesLoader(@NotNull Project project, + @NotNull NewRootBunch bunch, + @NotNull String url, + @NotNull InfoReliability infoReliability, + @NotNull VirtualFile root, + @Nullable Consumer> callback, boolean passive) { myProject = project; myBunch = bunch; @@ -66,14 +66,11 @@ public class BranchesLoader implements Runnable { } public void run() { - boolean callbackCalled = false; + List branches = null; + try { - final List items = loadBranches(); - myBunch.updateBranches(myRoot, myUrl, new InfoStorage>(items, myInfoReliability)); - if (myCallback != null) { - myCallback.consume(items); - callbackCalled = true; - } + branches = loadBranches(); + myBunch.updateBranches(myRoot, myUrl, new InfoStorage>(branches, myInfoReliability)); } catch (VcsException e) { showError(e); @@ -82,13 +79,13 @@ public class BranchesLoader implements Runnable { showError(e); } finally { - // callback must be called by contract - if (myCallback != null && (!callbackCalled)) { - myCallback.consume(null); + if (myCallback != null) { + myCallback.consume(branches); } } } + @NotNull public List loadBranches() throws SVNException, VcsException { final SvnConfiguration configuration = SvnConfiguration.getInstance(myProject); final SvnVcs vcs = SvnVcs.getInstance(myProject); From 70dc8dec52ccfd960c9387b224ddd55ee6f7fb72 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Thu, 7 Aug 2014 12:11:02 +0400 Subject: [PATCH 22/31] svn: Refactored BranchesLoader - make callback be Runnable (instead of Consumer>) --- .../svn/branchConfig/BranchConfigurationDialog.java | 2 +- .../idea/svn/branchConfig/BranchesLoader.java | 11 ++++------- .../idea/svn/branchConfig/NewRootBunch.java | 13 +++---------- 3 files changed, 8 insertions(+), 18 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchConfigurationDialog.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchConfigurationDialog.java index ed6b03b2032b..52d087f8b017 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchConfigurationDialog.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchConfigurationDialog.java @@ -111,7 +111,7 @@ public class BranchConfigurationDialog extends DialogWrapper { if (!configuration.getBranchUrls().contains(selectedUrl)) { configuration .addBranches(selectedUrl, new InfoStorage>(new ArrayList(), InfoReliability.empty)); - mySvnBranchConfigManager.reloadBranches(myRoot, selectedUrl, null); + mySvnBranchConfigManager.reloadBranches(myRoot, selectedUrl); listModel.fireItemAdded(); myLocationList.setSelectedIndex(listModel.getSize() - 1); } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoader.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoader.java index abb95d094f6e..028abf0a647d 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoader.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoader.java @@ -20,7 +20,6 @@ import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vcs.ui.VcsBalloonProblemNotifier; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.Consumer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.svn.SvnConfiguration; @@ -44,7 +43,7 @@ public class BranchesLoader implements Runnable { @NotNull private final Project myProject; @NotNull private final NewRootBunch myBunch; @NotNull private final VirtualFile myRoot; - @Nullable private final Consumer> myCallback; + @Nullable private final Runnable myCallback; @NotNull private final String myUrl; @NotNull private final InfoReliability myInfoReliability; private final boolean myPassive; @@ -54,7 +53,7 @@ public class BranchesLoader implements Runnable { @NotNull String url, @NotNull InfoReliability infoReliability, @NotNull VirtualFile root, - @Nullable Consumer> callback, + @Nullable Runnable callback, boolean passive) { myProject = project; myBunch = bunch; @@ -66,10 +65,8 @@ public class BranchesLoader implements Runnable { } public void run() { - List branches = null; - try { - branches = loadBranches(); + List branches = loadBranches(); myBunch.updateBranches(myRoot, myUrl, new InfoStorage>(branches, myInfoReliability)); } catch (VcsException e) { @@ -80,7 +77,7 @@ public class BranchesLoader implements Runnable { } finally { if (myCallback != null) { - myCallback.consume(branches); + myCallback.run(); } } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java index 7514f923153b..c3627635addd 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java @@ -22,7 +22,6 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Ref; import com.intellij.openapi.vcs.CalledInBackground; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.Consumer; import com.intellij.util.PairConsumer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -90,10 +89,9 @@ public class NewRootBunch { } } - public void reloadBranches(@NotNull final VirtualFile root, @NotNull final String branchParentUrl, - final Consumer> callback) { + public void reloadBranches(@NotNull final VirtualFile root, @NotNull final String branchParentUrl) { ApplicationManager.getApplication() - .executeOnPooledThread(new BranchesLoader(myProject, this, branchParentUrl, InfoReliability.setByUser, root, callback, true)); + .executeOnPooledThread(new BranchesLoader(myProject, this, branchParentUrl, InfoReliability.setByUser, root, null, true)); } @Nullable @@ -118,12 +116,7 @@ public class NewRootBunch { if (group == null) { runnable.run(); } else { - new BranchesLoader(myProject, this, group, InfoReliability.setByUser, root, - new Consumer>() { - public void consume(List svnBranchItems) { - runnable.run(); - } - }, true).run(); + new BranchesLoader(myProject, this, group, InfoReliability.setByUser, root, runnable, true).run(); } } catch (SVNException e) { From f120c25ff31f242f180c633a95807a18fe3e2b7f Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Thu, 7 Aug 2014 12:27:58 +0400 Subject: [PATCH 23/31] svn: Refactored BranchesLoader - removed unnecessary "callback" logic --- .../idea/svn/branchConfig/BranchesLoader.java | 9 --------- .../svn/branchConfig/BranchesPreloader.java | 2 +- .../DefaultBranchConfigInitializer.java | 2 +- .../idea/svn/branchConfig/NewRootBunch.java | 20 ++++--------------- .../svn/branchConfig/SelectBranchPopup.java | 2 +- 5 files changed, 7 insertions(+), 28 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoader.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoader.java index 028abf0a647d..ba0288da9699 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoader.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesLoader.java @@ -21,7 +21,6 @@ import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vcs.ui.VcsBalloonProblemNotifier; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.svn.SvnConfiguration; import org.jetbrains.idea.svn.SvnVcs; import org.jetbrains.idea.svn.api.Depth; @@ -43,7 +42,6 @@ public class BranchesLoader implements Runnable { @NotNull private final Project myProject; @NotNull private final NewRootBunch myBunch; @NotNull private final VirtualFile myRoot; - @Nullable private final Runnable myCallback; @NotNull private final String myUrl; @NotNull private final InfoReliability myInfoReliability; private final boolean myPassive; @@ -53,14 +51,12 @@ public class BranchesLoader implements Runnable { @NotNull String url, @NotNull InfoReliability infoReliability, @NotNull VirtualFile root, - @Nullable Runnable callback, boolean passive) { myProject = project; myBunch = bunch; myUrl = url; myInfoReliability = infoReliability; myRoot = root; - myCallback = callback; myPassive = passive; } @@ -75,11 +71,6 @@ public class BranchesLoader implements Runnable { catch (SVNException e) { showError(e); } - finally { - if (myCallback != null) { - myCallback.run(); - } - } } @NotNull diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesPreloader.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesPreloader.java index f5c7dc9fceab..949fc62914b6 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesPreloader.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesPreloader.java @@ -60,7 +60,7 @@ public class BranchesPreloader implements PairConsumer(configuration, InfoReliability.defaultValues), null); diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java index c3627635addd..4722600b707e 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java @@ -91,7 +91,7 @@ public class NewRootBunch { public void reloadBranches(@NotNull final VirtualFile root, @NotNull final String branchParentUrl) { ApplicationManager.getApplication() - .executeOnPooledThread(new BranchesLoader(myProject, this, branchParentUrl, InfoReliability.setByUser, root, null, true)); + .executeOnPooledThread(new BranchesLoader(myProject, this, branchParentUrl, InfoReliability.setByUser, root, true)); } @Nullable @@ -101,23 +101,11 @@ public class NewRootBunch { try { final SvnBranchConfigurationNew configuration = myMap.get(root).getValue(); final String group = configuration.getGroupToLoadToReachUrl(svnurl); - final Runnable runnable = new Runnable() { - public void run() { - final SvnBranchConfigurationNew reloadedConfiguration = myMap.get(root).getValue(); - try { - result.set(reloadedConfiguration.getWorkingBranch(svnurl)); - } - catch (SVNException e) { - // - } - } - }; - if (group == null) { - runnable.run(); - } else { - new BranchesLoader(myProject, this, group, InfoReliability.setByUser, root, runnable, true).run(); + if (group != null) { + new BranchesLoader(myProject, this, group, InfoReliability.setByUser, root, true).run(); } + result.set(myMap.get(root).getValue().getWorkingBranch(svnurl)); } catch (SVNException e) { // diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SelectBranchPopup.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SelectBranchPopup.java index 8e45a5c73d13..f48fc6489406 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SelectBranchPopup.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SelectBranchPopup.java @@ -219,7 +219,7 @@ public class SelectBranchPopup { @Override protected void runImpl(@NotNull ProgressIndicator indicator) { final NewRootBunch manager = SvnBranchConfigurationManager.getInstance(myProject).getSvnBranchConfigManager(); - new BranchesLoader(myProject, manager, selectedBranchesHolder, InfoReliability.setByUser, myVcsRoot, null, false).run(); + new BranchesLoader(myProject, manager, selectedBranchesHolder, InfoReliability.setByUser, myVcsRoot, false).run(); } }); } From 0003a77e2cd9762a7a33995801048b86a8054e2f Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Thu, 7 Aug 2014 12:39:52 +0400 Subject: [PATCH 24/31] svn: Refactored BranchesPreloader - removed unnecessary "myAll" field (as currently when "myAll" is true "prev" parameter of loadImpl() is always null, which ensures the same logic) --- .../jetbrains/idea/svn/branchConfig/BranchesPreloader.java | 7 +------ .../svn/branchConfig/SvnBranchConfigurationManager.java | 4 +--- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesPreloader.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesPreloader.java index 949fc62914b6..f25d73c08ef2 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesPreloader.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesPreloader.java @@ -34,7 +34,6 @@ public class BranchesPreloader implements PairConsumer pair : branchPoints) { - final BranchesPreloader branchesPreloader = new BranchesPreloader(myProject, myBunch, pair.getFirst(), myBranchesLoader); - branchesPreloader.setAll(true); - branchesPreloader.loadImpl(null, pair.getSecond()); + new BranchesPreloader(myProject, myBunch, pair.getFirst(), myBranchesLoader).loadImpl(null, pair.getSecond()); } } catch (ProcessCanceledException e) { From bae76a9fb06eab0b7f02a58ab4aed128ca65c8ea Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Thu, 7 Aug 2014 13:12:31 +0400 Subject: [PATCH 25/31] svn: Refactored InfoStorage.accept() - removed "callbackOnUpdate" parameter, but rather return flag indicating if value was updated --- .../idea/svn/branchConfig/InfoStorage.java | 14 ++++++-------- .../idea/svn/branchConfig/NewRootBunch.java | 15 +++++++++++---- .../branchConfig/SvnBranchConfigurationNew.java | 2 +- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/InfoStorage.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/InfoStorage.java index 493721e3a8d1..fe10696768c1 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/InfoStorage.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/InfoStorage.java @@ -15,9 +15,6 @@ */ package org.jetbrains.idea.svn.branchConfig; -import com.intellij.util.PairConsumer; -import org.jetbrains.annotations.Nullable; - public class InfoStorage { public T myT; public InfoReliability myInfoReliability; @@ -27,14 +24,15 @@ public class InfoStorage { myInfoReliability = infoReliability; } - public void accept(final InfoStorage infoStorage, @Nullable final PairConsumer callbackOnUpdate) { - if (infoStorage.myInfoReliability.shouldOverride(myInfoReliability)) { - if (callbackOnUpdate != null) { - callbackOnUpdate.consume(myT, infoStorage.myT); - } + public boolean accept(final InfoStorage infoStorage) { + boolean override = infoStorage.myInfoReliability.shouldOverride(myInfoReliability); + + if (override) { myT = infoStorage.myT; myInfoReliability = infoStorage.myInfoReliability; } + + return override; } public T getValue() { diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java index 4722600b707e..89322108bb99 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java @@ -49,14 +49,21 @@ public class NewRootBunch { public void updateForRoot(@NotNull final VirtualFile root, @NotNull final InfoStorage config, @Nullable final PairConsumer callbackOnUpdate) { synchronized (myLock) { + SvnBranchConfigurationNew previous; + boolean override; final InfoStorage existing = myMap.get(root); + if (existing == null) { + previous = null; + override = true; myMap.put(root, config); - if (callbackOnUpdate != null) { - callbackOnUpdate.consume(null, config.getValue()); - } } else { - existing.accept(config, callbackOnUpdate); + previous = existing.getValue(); + override = existing.accept(config); + } + + if (callbackOnUpdate != null && override) { + callbackOnUpdate.consume(previous, config.getValue()); } } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationNew.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationNew.java index c0649fdd0d83..3ce3c986c8ae 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationNew.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationNew.java @@ -97,7 +97,7 @@ public class SvnBranchConfigurationNew { LOG.info("Branches list not updated for : '" + branchParentName + "; since config has changed."); return; } - current.accept(items, null); + current.accept(items); } public Map>> getBranchMap() { From 516282219806959a2236e1cc1eae3c6568fe64d2 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Sat, 9 Aug 2014 21:24:05 +0400 Subject: [PATCH 26/31] svn: Refactored NewRootBunch.updateForRoot() - use explicit parameter to reload branches (instead of accepting arbitrary Consumer) --- .../svn/branchConfig/BranchesPreloader.java | 16 ++-------------- .../DefaultBranchConfigInitializer.java | 2 +- .../idea/svn/branchConfig/NewRootBunch.java | 17 +++++++++++------ .../SvnBranchConfigurationManager.java | 7 +++---- 4 files changed, 17 insertions(+), 25 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesPreloader.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesPreloader.java index f25d73c08ef2..5d8a4295a3e2 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesPreloader.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesPreloader.java @@ -15,10 +15,8 @@ */ package org.jetbrains.idea.svn.branchConfig; -import com.intellij.openapi.progress.ProgressManagerQueue; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.PairConsumer; import org.jetbrains.annotations.NotNull; import org.jetbrains.idea.svn.SvnVcs; @@ -29,25 +27,15 @@ import java.util.Set; /** * @author Konstantin Kolosovsky. */ -public class BranchesPreloader implements PairConsumer { +public class BranchesPreloader { private final Project myProject; private final VirtualFile myRoot; - private final ProgressManagerQueue myQueue; private final NewRootBunch myBunch; - public BranchesPreloader(Project project, @NotNull final NewRootBunch bunch, VirtualFile root, final ProgressManagerQueue queue) { + public BranchesPreloader(Project project, @NotNull final NewRootBunch bunch, VirtualFile root) { myBunch = bunch; myProject = project; myRoot = root; - myQueue = queue; - } - - public void consume(final SvnBranchConfigurationNew prev, final SvnBranchConfigurationNew next) { - myQueue.run(new Runnable() { - public void run() { - loadImpl(prev, next); - } - }); } public void loadImpl(final SvnBranchConfigurationNew prev, final SvnBranchConfigurationNew next) { diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultBranchConfigInitializer.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultBranchConfigInitializer.java index e56ee6d2c49c..ec3d67053b45 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultBranchConfigInitializer.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultBranchConfigInitializer.java @@ -69,7 +69,7 @@ public class DefaultBranchConfigInitializer implements Runnable { new BranchesLoader(myProject, myBunch, url, InfoReliability.defaultValues, myRoot, true)); } - myBunch.updateForRoot(myRoot, new InfoStorage(configuration, InfoReliability.defaultValues), null); + myBunch.updateForRoot(myRoot, new InfoStorage(configuration, InfoReliability.defaultValues), false); } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java index 89322108bb99..63166f1183cb 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java @@ -22,7 +22,6 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Ref; import com.intellij.openapi.vcs.CalledInBackground; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.PairConsumer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.tmatesoft.svn.core.SVNException; @@ -46,10 +45,11 @@ public class NewRootBunch { myMap = new HashMap>(); } - public void updateForRoot(@NotNull final VirtualFile root, @NotNull final InfoStorage config, - @Nullable final PairConsumer callbackOnUpdate) { + public void updateForRoot(@NotNull final VirtualFile root, + @NotNull final InfoStorage config, + boolean reload) { synchronized (myLock) { - SvnBranchConfigurationNew previous; + final SvnBranchConfigurationNew previous; boolean override; final InfoStorage existing = myMap.get(root); @@ -62,8 +62,13 @@ public class NewRootBunch { override = existing.accept(config); } - if (callbackOnUpdate != null && override) { - callbackOnUpdate.consume(previous, config.getValue()); + if (reload && override) { + myBranchesLoader.run(new Runnable() { + @Override + public void run() { + new BranchesPreloader(myProject, NewRootBunch.this, root).loadImpl(previous, config.getValue()); + } + }); } } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationManager.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationManager.java index 768eab1bba28..eaabb920feb7 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationManager.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationManager.java @@ -121,8 +121,7 @@ public class SvnBranchConfigurationManager implements PersistentStateComponent(configuration, InfoReliability.setByUser), - new BranchesPreloader(myProject, myBunch, vcsRoot, myBranchesLoader)); + myBunch.updateForRoot(vcsRoot, new InfoStorage(configuration, InfoReliability.setByUser), true); SvnBranchMapperManager.getInstance().notifyBranchesChanged(myProject, vcsRoot, configuration); @@ -191,7 +190,7 @@ public class SvnBranchConfigurationManager implements PersistentStateComponent(newConfig, InfoReliability.setByUser), null); + myBunch.updateForRoot(root, new InfoStorage(newConfig, InfoReliability.setByUser), false); } return branchPointsToLoad; } @@ -203,7 +202,7 @@ public class SvnBranchConfigurationManager implements PersistentStateComponent pair : branchPoints) { - new BranchesPreloader(myProject, myBunch, pair.getFirst(), myBranchesLoader).loadImpl(null, pair.getSecond()); + new BranchesPreloader(myProject, myBunch, pair.getFirst()).loadImpl(null, pair.getSecond()); } } catch (ProcessCanceledException e) { From 60c4e91ff0e7e8b22fd101a9270d873eb71dee71 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Sat, 9 Aug 2014 21:34:21 +0400 Subject: [PATCH 27/31] svn: Refactoring - BranchesPreloader logic moved to NewRootBunch, removed BranchesPreloader --- .../svn/branchConfig/BranchesPreloader.java | 54 ------------------- .../idea/svn/branchConfig/NewRootBunch.java | 21 ++++++-- .../SvnBranchConfigurationManager.java | 2 +- 3 files changed, 18 insertions(+), 59 deletions(-) delete mode 100644 plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesPreloader.java diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesPreloader.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesPreloader.java deleted file mode 100644 index 5d8a4295a3e2..000000000000 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchesPreloader.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2000-2014 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jetbrains.idea.svn.branchConfig; - -import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.VirtualFile; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.idea.svn.SvnVcs; - -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; - -/** -* @author Konstantin Kolosovsky. -*/ -public class BranchesPreloader { - private final Project myProject; - private final VirtualFile myRoot; - private final NewRootBunch myBunch; - - public BranchesPreloader(Project project, @NotNull final NewRootBunch bunch, VirtualFile root) { - myBunch = bunch; - myProject = project; - myRoot = root; - } - - public void loadImpl(final SvnBranchConfigurationNew prev, final SvnBranchConfigurationNew next) { - final Set oldUrls = (prev == null) ? Collections.emptySet() : new HashSet(prev.getBranchUrls()); - final SvnVcs vcs = SvnVcs.getInstance(myProject); - if (! vcs.isVcsBackgroundOperationsAllowed(myRoot)) return; - - for (String newBranchUrl : next.getBranchUrls()) { - // check if cancel had been put - if (! vcs.isVcsBackgroundOperationsAllowed(myRoot)) return; - if (!oldUrls.contains(newBranchUrl)) { - new BranchesLoader(myProject, myBunch, newBranchUrl, InfoReliability.defaultValues, myRoot, true).run(); - } - } - } -} diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java index 63166f1183cb..6e4bfa2c3c8a 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java @@ -24,12 +24,11 @@ import com.intellij.openapi.vcs.CalledInBackground; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.svn.SvnVcs; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; // synch is here public class NewRootBunch { @@ -66,7 +65,7 @@ public class NewRootBunch { myBranchesLoader.run(new Runnable() { @Override public void run() { - new BranchesPreloader(myProject, NewRootBunch.this, root).loadImpl(previous, config.getValue()); + reloadBranches(root, previous, config.getValue()); } }); } @@ -106,6 +105,20 @@ public class NewRootBunch { .executeOnPooledThread(new BranchesLoader(myProject, this, branchParentUrl, InfoReliability.setByUser, root, true)); } + public void reloadBranches(@NotNull VirtualFile root, @Nullable SvnBranchConfigurationNew prev, @NotNull SvnBranchConfigurationNew next) { + final Set oldUrls = (prev == null) ? Collections.emptySet() : new HashSet(prev.getBranchUrls()); + final SvnVcs vcs = SvnVcs.getInstance(myProject); + if (!vcs.isVcsBackgroundOperationsAllowed(root)) return; + + for (String newBranchUrl : next.getBranchUrls()) { + // check if cancel had been put + if (!vcs.isVcsBackgroundOperationsAllowed(root)) return; + if (!oldUrls.contains(newBranchUrl)) { + new BranchesLoader(myProject, this, newBranchUrl, InfoReliability.defaultValues, root, true).run(); + } + } + } + @Nullable @CalledInBackground public SVNURL getWorkingBranchWithReload(final SVNURL svnurl, final VirtualFile root) { diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationManager.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationManager.java index eaabb920feb7..772e5edd2755 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationManager.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchConfigurationManager.java @@ -202,7 +202,7 @@ public class SvnBranchConfigurationManager implements PersistentStateComponent pair : branchPoints) { - new BranchesPreloader(myProject, myBunch, pair.getFirst()).loadImpl(null, pair.getSecond()); + myBunch.reloadBranches(pair.getFirst(), null, pair.getSecond()); } } catch (ProcessCanceledException e) { From e708d036c845142b1532e743c8012c23feeddb17 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Sat, 9 Aug 2014 23:44:32 +0400 Subject: [PATCH 28/31] svn: Refactoring - provide access to reload branches logic through corresponding NewRootBunch methods (instead of using BranchesLoader directly) --- .../BranchConfigurationDialog.java | 2 +- .../DefaultBranchConfigInitializer.java | 4 +-- .../idea/svn/branchConfig/NewRootBunch.java | 31 ++++++++++++++----- .../svn/branchConfig/SelectBranchPopup.java | 3 +- 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchConfigurationDialog.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchConfigurationDialog.java index 52d087f8b017..0e0fce947088 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchConfigurationDialog.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/BranchConfigurationDialog.java @@ -111,7 +111,7 @@ public class BranchConfigurationDialog extends DialogWrapper { if (!configuration.getBranchUrls().contains(selectedUrl)) { configuration .addBranches(selectedUrl, new InfoStorage>(new ArrayList(), InfoReliability.empty)); - mySvnBranchConfigManager.reloadBranches(myRoot, selectedUrl); + mySvnBranchConfigManager.reloadBranchesAsync(myRoot, selectedUrl, InfoReliability.setByUser); listModel.fireItemAdded(); myLocationList.setSelectedIndex(listModel.getSize() - 1); } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultBranchConfigInitializer.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultBranchConfigInitializer.java index ec3d67053b45..37b78459448c 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultBranchConfigInitializer.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/DefaultBranchConfigInitializer.java @@ -15,7 +15,6 @@ */ package org.jetbrains.idea.svn.branchConfig; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; @@ -65,8 +64,7 @@ public class DefaultBranchConfigInitializer implements Runnable { if (configuration != null) { for (String url : configuration.getBranchUrls()) { - ApplicationManager.getApplication().executeOnPooledThread( - new BranchesLoader(myProject, myBunch, url, InfoReliability.defaultValues, myRoot, true)); + myBunch.reloadBranchesAsync(myRoot, url, InfoReliability.defaultValues); } myBunch.updateForRoot(myRoot, new InfoStorage(configuration, InfoReliability.defaultValues), false); diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java index 6e4bfa2c3c8a..6f7f4185a815 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/NewRootBunch.java @@ -56,7 +56,8 @@ public class NewRootBunch { previous = null; override = true; myMap.put(root, config); - } else { + } + else { previous = existing.getValue(); override = existing.accept(config); } @@ -93,16 +94,23 @@ public class NewRootBunch { result = new SvnBranchConfigurationNew(); myMap.put(root, new InfoStorage(result, InfoReliability.empty)); myBranchesLoader.run(new DefaultBranchConfigInitializer(myProject, this, root)); - } else { + } + else { result = value.getValue(); } return result; } } - public void reloadBranches(@NotNull final VirtualFile root, @NotNull final String branchParentUrl) { - ApplicationManager.getApplication() - .executeOnPooledThread(new BranchesLoader(myProject, this, branchParentUrl, InfoReliability.setByUser, root, true)); + public void reloadBranchesAsync(@NotNull final VirtualFile root, + @NotNull final String branchLocation, + @NotNull final InfoReliability reliability) { + ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { + @Override + public void run() { + reloadBranches(root, branchLocation, reliability, true); + } + }); } public void reloadBranches(@NotNull VirtualFile root, @Nullable SvnBranchConfigurationNew prev, @NotNull SvnBranchConfigurationNew next) { @@ -114,11 +122,18 @@ public class NewRootBunch { // check if cancel had been put if (!vcs.isVcsBackgroundOperationsAllowed(root)) return; if (!oldUrls.contains(newBranchUrl)) { - new BranchesLoader(myProject, this, newBranchUrl, InfoReliability.defaultValues, root, true).run(); + reloadBranches(root, newBranchUrl, InfoReliability.defaultValues, true); } } } + public void reloadBranches(@NotNull VirtualFile root, + @NotNull String branchLocation, + @NotNull InfoReliability reliability, + boolean passive) { + new BranchesLoader(myProject, this, branchLocation, reliability, root, passive).run(); + } + @Nullable @CalledInBackground public SVNURL getWorkingBranchWithReload(final SVNURL svnurl, final VirtualFile root) { @@ -128,7 +143,7 @@ public class NewRootBunch { final String group = configuration.getGroupToLoadToReachUrl(svnurl); if (group != null) { - new BranchesLoader(myProject, this, group, InfoReliability.setByUser, root, true).run(); + reloadBranches(root, group, InfoReliability.setByUser, true); } result.set(myMap.get(root).getValue().getWorkingBranch(svnurl)); } @@ -147,4 +162,4 @@ public class NewRootBunch { return result; } } -} +} \ No newline at end of file diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SelectBranchPopup.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SelectBranchPopup.java index f48fc6489406..445ce4e9afe3 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SelectBranchPopup.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SelectBranchPopup.java @@ -219,7 +219,8 @@ public class SelectBranchPopup { @Override protected void runImpl(@NotNull ProgressIndicator indicator) { final NewRootBunch manager = SvnBranchConfigurationManager.getInstance(myProject).getSvnBranchConfigManager(); - new BranchesLoader(myProject, manager, selectedBranchesHolder, InfoReliability.setByUser, myVcsRoot, false).run(); + + manager.reloadBranches(myVcsRoot, selectedBranchesHolder, InfoReliability.setByUser, false); } }); } From 6ac9448652ee125b7bb5475cdcd33a429f35e5e7 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Tue, 12 Aug 2014 18:44:42 +0400 Subject: [PATCH 29/31] svn: Refactored SvnScopeZipper - removed unused/unnecessary code, code simplified, @NotNull --- .../jetbrains/idea/svn/SvnScopeZipper.java | 86 ++++++++----------- 1 file changed, 37 insertions(+), 49 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnScopeZipper.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnScopeZipper.java index a5612a69172a..4a8652cb573a 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnScopeZipper.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnScopeZipper.java @@ -19,22 +19,25 @@ import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vcs.FilePathImpl; import com.intellij.openapi.vcs.changes.VcsDirtyScope; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; -import java.util.*; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; public class SvnScopeZipper implements Runnable { - private final VcsDirtyScope myIn; - private final List myRecursiveDirs; - // instead of set and heavy equals of file path - private final Map myNonRecursiveDirs; - // those alone in their immediate parent - private final List mySingleFiles; - public SvnScopeZipper(final VcsDirtyScope in) { + @NotNull private final VcsDirtyScope myIn; + @NotNull private final List myRecursiveDirs; + // instead of set and heavy equals of file path + @NotNull private final Map myNonRecursiveDirs; + + public SvnScopeZipper(@NotNull VcsDirtyScope in) { myIn = in; - myRecursiveDirs = new ArrayList(in.getRecursivelyDirtyDirectories()); - myNonRecursiveDirs = new HashMap(); - mySingleFiles = new ArrayList(); + myRecursiveDirs = ContainerUtil.newArrayList(in.getRecursivelyDirtyDirectories()); + myNonRecursiveDirs = ContainerUtil.newHashMap(); } public void run() { @@ -46,7 +49,6 @@ public class SvnScopeZipper implements Runnable { final VirtualFile vFile = file.getVirtualFile(); // todo take care about this 'not valid' - right now keeping things as they used to be final MyDirNonRecursive me = createOrGet(file); - me.setInterestedInParent(true); if (vFile != null && vFile.isValid()) { for (VirtualFile child : vFile.getChildren()) { me.add(new FilePathImpl(child)); @@ -59,72 +61,58 @@ public class SvnScopeZipper implements Runnable { item.add(file); } } - - // move alone files into a separate list - /*for (Iterator> iterator = myNonRecursiveDirs.entrySet().iterator(); iterator.hasNext();) { - final Map.Entry entry = iterator.next(); - final MyDirNonRecursive item = entry.getValue(); - if ((! item.isInterestedInParent()) && (item.getChildrenList().size() == 1)) { - iterator.remove(); - mySingleFiles.add(item.getChildrenList().iterator().next()); - } - }*/ } - private MyDirNonRecursive createOrGet(final FilePath parent) { - final String key = getKey(parent); - final MyDirNonRecursive result = myNonRecursiveDirs.get(key); - if (result != null) return result; - final MyDirNonRecursive newItem = new MyDirNonRecursive(parent); - myNonRecursiveDirs.put(key, newItem); - return newItem; + @NotNull + private MyDirNonRecursive createOrGet(@NotNull FilePath parent) { + String key = getKey(parent); + MyDirNonRecursive result = myNonRecursiveDirs.get(key); + + if (result == null) { + result = new MyDirNonRecursive(parent); + myNonRecursiveDirs.put(key, result); + } + + return result; } + @NotNull public List getRecursiveDirs() { return myRecursiveDirs; } + @NotNull public Map getNonRecursiveDirs() { return myNonRecursiveDirs; } - public List getSingleFiles() { - return mySingleFiles; + public static String getKey(@NotNull FilePath path) { + return path.getPresentableUrl(); } static class MyDirNonRecursive { - private boolean myInterestedInParent; - private final FilePath myDir; + + @NotNull private final FilePath myDir; // instead of set and heavy equals of file path - private final Map myChildren; + @NotNull private final Map myChildren; - private MyDirNonRecursive(final FilePath dir) { + private MyDirNonRecursive(@NotNull FilePath dir) { myDir = dir; - myChildren = new HashMap(); + myChildren = ContainerUtil.newHashMap(); } - public boolean isInterestedInParent() { - return myInterestedInParent; - } - - public void setInterestedInParent(boolean interestedInParent) { - myInterestedInParent = interestedInParent; - } - - public void add(final FilePath path) { + public void add(@NotNull FilePath path) { myChildren.put(getKey(path), path); } + @NotNull public Collection getChildrenList() { return myChildren.values(); } + @NotNull public FilePath getDir() { return myDir; } } - - public static String getKey(final FilePath path) { - return path.getPresentableUrl(); - } } From 859286d47bfac85c8dc13b3cca3ab4ac075bcbf7 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Tue, 12 Aug 2014 19:53:36 +0400 Subject: [PATCH 30/31] IDEA-128131 Do not process parent of dirty directory while collecting local changes This fix is essentially revert of commit 07c6409, which was used to fix IDEA-94845. Currently IDEA-94845 is not reproduced even after such revert. --- .../src/org/jetbrains/idea/svn/SvnScopeZipper.java | 10 ++++++---- .../update/AbstractSvnUpdateIntegrateEnvironment.java | 1 + 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnScopeZipper.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnScopeZipper.java index 4a8652cb573a..d4c98221a567 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnScopeZipper.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnScopeZipper.java @@ -55,10 +55,12 @@ public class SvnScopeZipper implements Runnable { } } } - final FilePath parent = file.getParentPath(); - if (parent != null) { - final MyDirNonRecursive item = createOrGet(parent); - item.add(file); + else { + final FilePath parent = file.getParentPath(); + if (parent != null) { + final MyDirNonRecursive item = createOrGet(parent); + item.add(file); + } } } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/update/AbstractSvnUpdateIntegrateEnvironment.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/update/AbstractSvnUpdateIntegrateEnvironment.java index b4e788c75260..42bc3890e1d0 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/update/AbstractSvnUpdateIntegrateEnvironment.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/update/AbstractSvnUpdateIntegrateEnvironment.java @@ -145,6 +145,7 @@ public abstract class AbstractSvnUpdateIntegrateEnvironment implements UpdateEnv } public void onRefreshFilesCompleted() { + // TODO: why do we need to mark all roots as dirty here??? dirtyRoots(); for (Runnable groupWorker : myGroupWorkers) { From e1882ceac5923a27e8c599ccf0cd250fc78ef882 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Wed, 13 Aug 2014 00:48:25 +0400 Subject: [PATCH 31/31] svn: Removed unnecessary WcRootsChangeConsumer interface and corresponding Topic --- .../branchConfig/SvnBranchMapperManager.java | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchMapperManager.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchMapperManager.java index 830c67a4523f..f9f99bea1e17 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchMapperManager.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/branchConfig/SvnBranchMapperManager.java @@ -15,14 +15,15 @@ */ package org.jetbrains.idea.svn.branchConfig; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.*; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.messages.Topic; import java.io.File; -import java.util.*; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; /** * Holds what working copies we have for URLs @@ -55,7 +56,6 @@ public class SvnBranchMapperManager implements PersistentStateComponent roots) { - ApplicationManager.getApplication().getMessageBus().syncPublisher(WC_ROOTS_CHANGED).rootsChanged(url, roots); } public void notifyBranchesChanged(final Project project, final VirtualFile vcsRoot, final SvnBranchConfigurationNew configuration) { @@ -103,11 +98,4 @@ public class SvnBranchMapperManager implements PersistentStateComponent roots); - } - - public static final Topic WC_ROOTS_CHANGED = - new Topic("SVN_WC_ROOTS_CHANGED", WcRootsChangeConsumer.class); }