From f4a9142a2025a14496cd8ec50ab8e4df331fd938 Mon Sep 17 00:00:00 2001 From: irengrig Date: Wed, 25 Aug 2010 00:42:17 +0400 Subject: [PATCH] IDEA-53288 Idea should support standard Subversion layout: if target remote folder is not new, check whether it is empty --- .../src/org/jetbrains/idea/svn/SvnUtil.java | 19 ++++++-- .../idea/svn/actions/ShareProjectAction.java | 47 ++++++++++++++++--- 2 files changed, 57 insertions(+), 9 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnUtil.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnUtil.java index 331146cf3eae..bc9900aeea39 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnUtil.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnUtil.java @@ -21,6 +21,7 @@ import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Computable; +import com.intellij.openapi.util.Ref; import com.intellij.openapi.vcs.AbstractVcsHelper; import com.intellij.openapi.vcs.RepositoryLocation; import com.intellij.openapi.vcs.VcsException; @@ -36,9 +37,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationNew; import org.jetbrains.idea.svn.dialogs.LockDialog; import org.jetbrains.idea.svn.dialogs.WCInfo; -import org.tmatesoft.svn.core.SVNDepth; -import org.tmatesoft.svn.core.SVNException; -import org.tmatesoft.svn.core.SVNURL; +import org.tmatesoft.svn.core.*; import org.tmatesoft.svn.core.internal.wc.SVNFileUtil; import org.tmatesoft.svn.core.internal.wc.admin.SVNEntry; import org.tmatesoft.svn.core.internal.wc.admin.SVNWCAccess; @@ -634,4 +633,18 @@ public class SvnUtil { } } } + + public static boolean remoteFolderIsEmpty(final SvnVcs vcs, final String url) throws SVNException { + final SVNRepository repository; + repository = vcs.createRepository(url); + final Ref result = new Ref(true); + repository.getDir("", -1, null, new ISVNDirEntryHandler() { + public void handleDirEntry(final SVNDirEntry dirEntry) throws SVNException { + if (dirEntry != null) { + result.set(false); + } + } + }); + return result.get(); + } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/ShareProjectAction.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/ShareProjectAction.java index b5068c5722c8..c9ceed28994e 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/ShareProjectAction.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/ShareProjectAction.java @@ -23,6 +23,7 @@ import com.intellij.openapi.application.ApplicationNamesInfo; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.Ref; @@ -31,10 +32,7 @@ import com.intellij.openapi.vcs.ProjectLevelVcsManager; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vcs.changes.VcsDirtyScopeManager; import com.intellij.openapi.vfs.VirtualFile; -import org.jetbrains.idea.svn.SvnBundle; -import org.jetbrains.idea.svn.SvnStatusUtil; -import org.jetbrains.idea.svn.SvnVcs; -import org.jetbrains.idea.svn.SvnWorkingCopyFormatHolder; +import org.jetbrains.idea.svn.*; import org.jetbrains.idea.svn.checkout.SvnCheckoutProvider; import org.jetbrains.idea.svn.dialogs.ShareDialog; import org.tmatesoft.svn.core.SVNCommitInfo; @@ -106,9 +104,23 @@ public class ShareProjectAction extends BasicAction { final Ref actionStarted = new Ref(Boolean.TRUE); final SVNException[] error = new SVNException[1]; + final ShareDialog.ShareTarget shareTarget = shareDialog.getShareTarget(); + final ProgressManager progressManager = ProgressManager.getInstance(); + + if (ShareDialog.ShareTarget.useSelected.equals(shareTarget)) { + final boolean folderEmpty = checkRemoteFolder(project, activeVcs, parent, progressManager); + + if (! folderEmpty) { + final int promptAnswer = + Messages.showYesNoDialog(project, "Remote folder \"" + parent + "\" is not empty.\nDo you want to continue sharing?", + "Share directory", Messages.getWarningIcon()); + if (DialogWrapper.OK_EXIT_CODE != promptAnswer) return false; + } + } + ExclusiveBackgroundVcsAction.run(project, new Runnable() { public void run() { - ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() { + progressManager.runProcessWithProgressSynchronously(new Runnable() { public void run() { try { final ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator(); @@ -123,7 +135,6 @@ public class ShareProjectAction extends BasicAction { final SVNURL checkoutUrl; final SVNRevision revision; - final ShareDialog.ShareTarget shareTarget = shareDialog.getShareTarget(); if (ShareDialog.ShareTarget.useSelected.equals(shareTarget)) { checkoutUrl = parenUrl; revision = SVNRevision.HEAD; @@ -174,6 +185,30 @@ public class ShareProjectAction extends BasicAction { return false; } + private static boolean checkRemoteFolder(Project project, + final SvnVcs activeVcs, + final String parent, + ProgressManager progressManager) throws VcsException { + final SVNException[] exc = new SVNException[1]; + final boolean[] folderEmpty = new boolean[1]; + + progressManager.runProcessWithProgressSynchronously(new Runnable() { + @Override + public void run() { + try { + folderEmpty[0] = SvnUtil.remoteFolderIsEmpty(activeVcs, parent); + } + catch (SVNException e) { + exc[0] = e; + } + } + }, "Check remote folder contents", false, project); + if (exc[0] != null) { + throw new VcsException(exc[0]); + } + return folderEmpty[0]; + } + private static Pair createRemoteFolder(final SvnVcs vcs, final SVNURL parent, final String folderName) throws SVNException { SVNURL url = parent.appendPath(folderName, false); final String urlText = url.toString();