From 7a43b6047535490cdaaefae4c45e73cbed75a276 Mon Sep 17 00:00:00 2001 From: irengrig Date: Wed, 6 Oct 2010 20:12:46 +0400 Subject: [PATCH] VCS: unversioned: changes are detected when VFS refresh events are send; ignored: test works :) --- .../vcs/changes/ChangeListManagerImpl.java | 33 ++++++++++------- .../vcs/changes/VcsDirtyScopeVfsListener.java | 36 +++++++++++-------- .../jetbrains/idea/svn/IgnoredFilesTest.java | 20 +++++++---- 3 files changed, 54 insertions(+), 35 deletions(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java index 1253c07886b3..fb3eea4db205 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java @@ -276,24 +276,29 @@ public class ChangeListManagerImpl extends ChangeListManagerEx implements Projec } } + private VcsDirtyScopeManagerImpl getVcsManager() { + try { + return ((VcsDirtyScopeManagerImpl) VcsDirtyScopeManager.getInstance(myProject)); + } + catch(ProcessCanceledException ex) { + return null; + } + catch(Exception ex) { + LOG.error(ex); + return null; + } + } + private void updateImmediately(final AtomicSectionsAware atomicSectionsAware) { - FileHolderComposite composite; - ChangeListWorker changeListWorker; + final FileHolderComposite composite; + final ChangeListWorker changeListWorker; final ProjectLevelVcsManager vcsManager = ProjectLevelVcsManager.getInstance(myProject); if (! vcsManager.hasActiveVcss()) return; - final VcsDirtyScopeManagerImpl dirtyScopeManager; - try { - dirtyScopeManager = ((VcsDirtyScopeManagerImpl) VcsDirtyScopeManager.getInstanceChecked(myProject)); - } - catch(ProcessCanceledException ex) { - return; - } - catch(Exception ex) { - LOG.error(ex); - return; - } + final VcsDirtyScopeManagerImpl dirtyScopeManager = getVcsManager(); + if (dirtyScopeManager == null) return; + final VcsInvalidated invalidated = dirtyScopeManager.retrieveScopes(); if (invalidated == null || invalidated.isEmpty()) { // a hack here; but otherwise everything here should be refactored ;) @@ -305,6 +310,8 @@ public class ChangeListManagerImpl extends ChangeListManagerEx implements Projec final boolean wasEverythingDirty = invalidated.isEverythingDirty(); final List scopes = invalidated.getScopes(); + + try { checkIfDisposed(); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsDirtyScopeVfsListener.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsDirtyScopeVfsListener.java index dd653c55f792..be64be80935e 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsDirtyScopeVfsListener.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsDirtyScopeVfsListener.java @@ -22,7 +22,8 @@ import com.intellij.openapi.project.ProjectLocator; import com.intellij.openapi.util.Pair; import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vcs.FilePathImpl; -import com.intellij.openapi.vfs.*; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.openapi.vfs.newvfs.BulkFileListener; import com.intellij.openapi.vfs.newvfs.events.*; import com.intellij.util.containers.HashMap; @@ -71,13 +72,15 @@ public class VcsDirtyScopeVfsListener implements ApplicationComponent, BulkFileL // collect files and directories - sources of events for (VFileEvent event : events) { final VirtualFile file = getFileForEvent(event); - if (file == null) { continue; } + if (file == null) { + continue; + } if (event instanceof VFileDeleteEvent) { if (!file.isInLocalFileSystem()) { continue; } - dirtyFilesAndDirs.add(file); + dirtyFilesAndDirs.add(file, true); } else if (event instanceof VFileMoveEvent || event instanceof VFilePropertyChangeEvent) { - dirtyFilesAndDirs.addToFiles(file); + dirtyFilesAndDirs.addToFiles(file, false); // todo ? } } // and notify VCSDirtyScopeManager @@ -90,20 +93,22 @@ public class VcsDirtyScopeVfsListener implements ApplicationComponent, BulkFileL // collect files and directories - sources of events for (VFileEvent event : events) { final VirtualFile file = getFileForEvent(event); - if (file == null) { continue; } + if (file == null) { + continue; + } if (event instanceof VFileContentChangeEvent || event instanceof VFileCopyEvent || event instanceof VFileCreateEvent) { - dirtyFilesAndDirs.addToFiles(file); + dirtyFilesAndDirs.add(file, false); } else if (event instanceof VFilePropertyChangeEvent) { final VFilePropertyChangeEvent pce = (VFilePropertyChangeEvent) event; if (pce.getPropertyName().equals(VirtualFile.PROP_NAME)) { // if a file was renamed, then the file is dirty and its parent directory is dirty too; // if a directory was renamed, all its children are recursively dirty, the parent dir is also dirty but not recursively. - dirtyFilesAndDirs.add(file); // the file is dirty recursively - dirtyFilesAndDirs.addToFiles(file.getParent()); // directory is dirty alone. if parent is null - is checked in the method + dirtyFilesAndDirs.add(file, false); // the file is dirty recursively + dirtyFilesAndDirs.addToFiles(file.getParent(), false); // directory is dirty alone. if parent is null - is checked in the method } else { - dirtyFilesAndDirs.addToFiles(file); + dirtyFilesAndDirs.addToFiles(file, false); } } } @@ -133,11 +138,12 @@ public class VcsDirtyScopeVfsListener implements ApplicationComponent, BulkFileL * @param file file which path is to be added. * @param addToFiles If true, then add to dirty files even if it is a directory. Otherwise add to the proper set. */ - private void add(VirtualFile file, boolean addToFiles) { + public void add(VirtualFile file, boolean addToFiles, final boolean forDelete) { if (file == null) { return; } final boolean isDirectory = file.isDirectory(); // need to create FilePath explicitly without referring to VirtualFile because the path of VirtualFile may change - final FilePathImpl path = new FilePathImpl(new File(file.getPath()), isDirectory); + final FilePathImpl path = forDelete ? new FilePathImpl(new File(file.getPath()), isDirectory) : + new FilePathImpl(file); final Collection managers = getManagers(file); for (VcsDirtyScopeManager manager : managers) { @@ -158,16 +164,16 @@ public class VcsDirtyScopeVfsListener implements ApplicationComponent, BulkFileL /** * Adds files to the collection of files and directories - to the collection of directories (which are handled recursively). */ - void add(VirtualFile file) { - add(file, false); + void add(VirtualFile file, final boolean forDelete) { + add(file, false, forDelete); } /** * Adds to the collection of files. A file (even if it is a directory) is marked dirty alone (not recursively). * Use this method, when you want directory not to be marked dirty recursively. */ - void addToFiles(VirtualFile file) { - add(file, true); + void addToFiles(VirtualFile file, final boolean forDelete) { + add(file, true, forDelete); } void markDirty() { diff --git a/plugins/svn4idea/testSource/org/jetbrains/idea/svn/IgnoredFilesTest.java b/plugins/svn4idea/testSource/org/jetbrains/idea/svn/IgnoredFilesTest.java index 7ba9d18a01b3..7057c621a889 100644 --- a/plugins/svn4idea/testSource/org/jetbrains/idea/svn/IgnoredFilesTest.java +++ b/plugins/svn4idea/testSource/org/jetbrains/idea/svn/IgnoredFilesTest.java @@ -4,16 +4,22 @@ import com.intellij.ide.startup.impl.StartupManagerImpl; import com.intellij.openapi.components.ProjectComponent; import com.intellij.openapi.startup.StartupManager; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.vcs.FileStatus; import com.intellij.openapi.vcs.ProjectLevelVcsManager; import com.intellij.openapi.vcs.changes.ChangeListManager; +import com.intellij.openapi.vcs.changes.IgnoredBeanFactory; +import com.intellij.openapi.vcs.changes.IgnoredFileBean; import com.intellij.openapi.vcs.changes.VcsDirtyScopeManager; import com.intellij.openapi.vcs.impl.ProjectLevelVcsManagerImpl; import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.testFramework.AbstractVcsTestCase; import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory; import com.intellij.testFramework.fixtures.TempDirTestFixture; import org.junit.After; +import org.junit.Assert; import org.junit.Before; +import org.junit.Test; import java.io.File; @@ -46,7 +52,7 @@ public class IgnoredFilesTest extends AbstractVcsTestCase { myVcs = SvnVcs.getInstance(myProject); myVcsManager = (ProjectLevelVcsManagerImpl) ProjectLevelVcsManager.getInstance(myProject); myVcsManager.registerVcs(myVcs); - myVcsManager.setDirectoryMapping("", myVcs.getName()); + myVcsManager.setDirectoryMapping(myWorkingCopyDir.getPath(), myVcs.getName()); ((ProjectComponent) myChangeListManager).projectOpened(); myVcsDirtyScopeManager = VcsDirtyScopeManager.getInstance(myProject); @@ -72,7 +78,7 @@ public class IgnoredFilesTest extends AbstractVcsTestCase { } // they all blink now - /* + @Test public void testFileIsIgnored() throws Exception { final String filePath1 = myClientRoot.getPath() + "/a"; @@ -97,8 +103,8 @@ public class IgnoredFilesTest extends AbstractVcsTestCase { @Test public void testDirIsIgnored() throws Exception { - final String dirPath1 = myClientRoot.getPath() + "/a"; - final File dir = new File(dirPath1); + //final String dirPath1 = myClientRoot.getPath() + "/a"; + final File dir = new File(myClientRoot, "a"); dir.mkdir(); final File innerDir = new File(dir, "innerDir"); innerDir.mkdir(); @@ -111,7 +117,7 @@ public class IgnoredFilesTest extends AbstractVcsTestCase { final VirtualFile vf1 = myLocalFileSystem.refreshAndFindFileByIoFile(file1); final VirtualFile vf2 = myLocalFileSystem.refreshAndFindFileByIoFile(file2); - final IgnoredFileBean ignoredFileBean = IgnoredBeanFactory.ignoreUnderDirectory(dirPath1, myProject); + final IgnoredFileBean ignoredFileBean = IgnoredBeanFactory.ignoreUnderDirectory(FileUtil.toSystemIndependentName(dir.getPath()), myProject); myChangeListManager.addFilesToIgnore(ignoredFileBean); dirty(); @@ -124,7 +130,7 @@ public class IgnoredFilesTest extends AbstractVcsTestCase { @Test public void testPatternIsIgnored() throws Exception { final String dirPath1 = myClientRoot.getPath() + "/a"; - final File dir = new File(dirPath1); + final File dir = new File(myClientRoot, "a"); dir.mkdir(); final File innerDir = new File(dir, "innerDir"); innerDir.mkdir(); @@ -155,5 +161,5 @@ public class IgnoredFilesTest extends AbstractVcsTestCase { Assert.assertNotNull(vf); Assert.assertTrue(myChangeListManager.isIgnoredFile(vf)); Assert.assertEquals(FileStatus.IGNORED, myChangeListManager.getStatus(vf)); - } */ + } }