From fb5a2722fd72cfbf1b953bb8ee0fbd256ce9216a Mon Sep 17 00:00:00 2001 From: irengrig Date: Thu, 26 Jul 2012 14:58:56 +0400 Subject: [PATCH] svn annotations + commit: 1) fix occasionally introduced bug with missing .entries listener for svn 2) force-refresh wc.db and .entries after commit from IDEA 3) force notify annotations about commit --- .../idea/svn/SvnEntriesFileListener.java | 2 +- .../src/org/jetbrains/idea/svn/SvnVcs.java | 4 + .../idea/svn/annotate/SvnFileAnnotation.java | 1 + .../svn/checkin/SvnCheckinHandlerFactory.java | 89 ++++++++++++++++++- 4 files changed, 91 insertions(+), 5 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnEntriesFileListener.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnEntriesFileListener.java index 0f001dd3bdb5..38872bed2ed1 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnEntriesFileListener.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnEntriesFileListener.java @@ -155,7 +155,7 @@ public class SvnEntriesFileListener extends VirtualFileAdapter { } } - private void fileRevisionProbablyChanged(final VirtualFile file) { + public void fileRevisionProbablyChanged(final VirtualFile file) { final SvnEntriesListener[] listeners = myListeners.toArray(new SvnEntriesListener[myListeners.size()]); SwingUtilities.invokeLater(new Runnable() { public void run() { diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnVcs.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnVcs.java index ad9ec3a3a169..ff2f285e0f1c 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnVcs.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnVcs.java @@ -805,6 +805,10 @@ public class SvnVcs extends AbstractVcs { } } + public SvnEntriesFileListener getEntriesFileListener() { + return myEntriesFileListener; + } + @Override public DiffProvider getDiffProvider() { if (mySvnDiffProvider == null) { diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/annotate/SvnFileAnnotation.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/annotate/SvnFileAnnotation.java index 65571b3ecb0d..cc31afe57778 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/annotate/SvnFileAnnotation.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/annotate/SvnFileAnnotation.java @@ -55,6 +55,7 @@ public class SvnFileAnnotation extends BaseSvnFileAnnotation { public SvnFileAnnotation(SvnVcs vcs, VirtualFile file, String contents, VcsRevisionNumber baseRevision) { super(vcs, contents, baseRevision); myFile = file; + myVcs.addEntriesListener(myListener); } public void dispose() { diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/checkin/SvnCheckinHandlerFactory.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/checkin/SvnCheckinHandlerFactory.java index 599f46280361..6c4b91b375f1 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/checkin/SvnCheckinHandlerFactory.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/checkin/SvnCheckinHandlerFactory.java @@ -16,27 +16,37 @@ package org.jetbrains.idea.svn.checkin; import com.intellij.ide.DataManager; -import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.actionSystem.ActionManager; +import com.intellij.openapi.actionSystem.ActionPlaces; +import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.project.Project; -import com.intellij.openapi.vcs.*; +import com.intellij.openapi.vcs.CheckinProjectPanel; +import com.intellij.openapi.vcs.FilePath; +import com.intellij.openapi.vcs.FilePathImpl; +import com.intellij.openapi.vcs.ProjectLevelVcsManager; +import com.intellij.openapi.vcs.changes.Change; +import com.intellij.openapi.vcs.changes.ChangesUtil; import com.intellij.openapi.vcs.checkin.CheckinHandler; import com.intellij.openapi.vcs.checkin.VcsCheckinHandlerFactory; import com.intellij.openapi.vcs.ui.RefreshableOnComponent; import com.intellij.openapi.vcs.update.ActionInfo; +import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.WindowManager; +import com.intellij.util.containers.hash.HashMap; import org.jetbrains.annotations.NotNull; -import org.jetbrains.idea.svn.SvnConfiguration; -import org.jetbrains.idea.svn.SvnVcs; +import org.jetbrains.idea.svn.*; import org.jetbrains.idea.svn.update.AutoSvnUpdater; import javax.swing.*; +import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map; /** * Created with IntelliJ IDEA. @@ -55,13 +65,21 @@ public class SvnCheckinHandlerFactory extends VcsCheckinHandlerFactory { final Project project = panel.getProject(); final Collection commitRoots = panel.getRoots(); return new CheckinHandler() { + private Collection myChanges = panel.getSelectedChanges(); + @Override public RefreshableOnComponent getBeforeCheckinConfigurationPanel() { return null; } + @Override + public void includedChangesChanged() { + myChanges = panel.getSelectedChanges(); + } + @Override public void checkinSuccessful() { + forceRefreshAdministrative(project); if (SvnConfiguration.getInstance(project).isAutoUpdateAfterCommit()) { final VirtualFile[] roots = ProjectLevelVcsManager.getInstance(project).getRootsUnderVcs(SvnVcs.getInstance(project)); final List paths = new ArrayList(); @@ -91,6 +109,69 @@ public class SvnCheckinHandlerFactory extends VcsCheckinHandlerFactory { }, ModalityState.NON_MODAL); } } + + private void forceRefreshAdministrative(Project project) { + final SvnVcs vcs = SvnVcs.getInstance(project); + final SvnFileUrlMapping mapping = vcs.getSvnFileUrlMapping(); + final List paths = ChangesUtil.getPaths(myChanges); + // for annotations + final SvnEntriesFileListener listener = vcs.getEntriesFileListener(); + ApplicationManager.getApplication().invokeLater(new Runnable() { + @Override + public void run() { + for (FilePath path : paths) { + VirtualFile vf = path.getVirtualFile(); + if (vf == null) { + path.hardRefresh(); + vf = path.getVirtualFile(); + } + if (vf != null) { + listener.fileRevisionProbablyChanged(vf); + } + } + } + }, ModalityState.NON_MODAL); + + final ProjectLevelVcsManager vcsManager = ProjectLevelVcsManager.getInstance(project); + + final Map less17 = new HashMap(); + final Map exactly17 = new HashMap(); + + for (FilePath path : paths) { + if (! vcs.equals(vcsManager.getVcsFor(path))) continue; + final RootUrlInfo root = mapping.getWcRootForFilePath(path.getIOFile()); + if (root == null) continue; + + final WorkingCopyFormat format = root.getFormat(); + if (WorkingCopyFormat.ONE_DOT_SEVEN.equals(format)) { + if (! exactly17.containsKey(root.getVirtualFile())) { + final VirtualFile admin = root.getVirtualFile().findChild(SvnUtil.SVN_ADMIN_DIR_NAME); + if (admin != null) { + final VirtualFile wc_db = admin.findChild(SvnUtil.WC_DB_FILE_NAME); + if (wc_db != null) { + exactly17.put(root.getVirtualFile(), wc_db); + } + } + } + } else { + final File parentOfAdmin = path.isDirectory() ? path.getIOFile() : (path.getParentPath() == null ? null : path.getParentPath().getIOFile()); + if (parentOfAdmin != null && ! less17.containsKey(parentOfAdmin)) { + final File entries = new File(parentOfAdmin, SvnUtil.SVN_ADMIN_DIR_NAME + File.separator + SvnUtil.ENTRIES_FILE_NAME); + less17.put(parentOfAdmin, entries); + } + } + } + + for (VirtualFile file : exactly17.values()) { + if (file != null) { + file.refresh(false, false); + } + } + final LocalFileSystem lfs = LocalFileSystem.getInstance(); + for (File file : less17.values()) { + lfs.refreshAndFindFileByIoFile(file); + } + } }; } }