diff -r cdd693dc844c versioning/apichanges.xml --- a/versioning/apichanges.xml Thu Mar 13 10:31:56 2008 +0100 +++ b/versioning/apichanges.xml Thu Mar 13 18:31:45 2008 +0100 @@ -108,6 +108,21 @@ is the proper place. + Added isMutable() method to VCSInterceptor + + + + + + This new method provides ability to override default File.canWrite() query for versioning systems that + keep files read-only on disk and are able to make them read-write on demand in the interceptor (eg. in doDelete()). + + + + + + + Added getFiles() method to VCSContext diff -r cdd693dc844c versioning/nbproject/project.properties --- a/versioning/nbproject/project.properties Thu Mar 13 10:31:56 2008 +0100 +++ b/versioning/nbproject/project.properties Thu Mar 13 18:31:45 2008 +0100 @@ -41,14 +41,14 @@ javac.source=1.5 javac.source=1.5 javadoc.name=Versioning -spec.version.base=1.6.0 +spec.version.base=1.7.0 is.autoload=true javadoc.arch=${basedir}/arch.xml javadoc.apichanges=${basedir}/apichanges.xml # unit tests extra setup -test-unit-sys-prop.data.root.dir=${basedir}/test/work/sys/data +test-unit-sys-prop.data.root.dir=${basedir}/work/sys/data test.unit.cp.extra=${openide.util.dir}/lib/org-openide-util.jar:\ ${core.startup.dir}/core/core.jar:\ diff -r cdd693dc844c versioning/nbproject/project.xml --- a/versioning/nbproject/project.xml Thu Mar 13 10:31:56 2008 +0100 +++ b/versioning/nbproject/project.xml Thu Mar 13 18:31:45 2008 +0100 @@ -96,7 +96,7 @@ made subject to such option by the copyr 2 - 1.2 + 1.14 diff -r cdd693dc844c versioning/src/org/netbeans/modules/versioning/FilesystemInterceptor.java --- a/versioning/src/org/netbeans/modules/versioning/FilesystemInterceptor.java Thu Mar 13 10:31:56 2008 +0100 +++ b/versioning/src/org/netbeans/modules/versioning/FilesystemInterceptor.java Thu Mar 13 18:31:45 2008 +0100 @@ -106,6 +106,22 @@ class FilesystemInterceptor extends Prov return filesystems; } + // ================================================================================================== + // QUERIES + // ================================================================================================== + + @Override + public boolean canWrite(File file) { + if (file.canWrite()) { + return true; + } + if (!file.exists()) { + return false; + } + // can be optimized by taking out local history from the search + return getInterceptor(file, false).isMutable(file); + } + // ================================================================================================== // CHANGE // ================================================================================================== @@ -362,6 +378,10 @@ class FilesystemInterceptor extends Prov this.isDirectory = isDirectory; } + public boolean isMutable(File file) { + return interceptor.isMutable(file); + } + public boolean beforeDelete() { lhInterceptor.beforeDelete(file); return interceptor.beforeDelete(file); diff -r cdd693dc844c versioning/src/org/netbeans/modules/versioning/spi/VCSInterceptor.java --- a/versioning/src/org/netbeans/modules/versioning/spi/VCSInterceptor.java Thu Mar 13 10:31:56 2008 +0100 +++ b/versioning/src/org/netbeans/modules/versioning/spi/VCSInterceptor.java Thu Mar 13 18:31:45 2008 +0100 @@ -54,6 +54,24 @@ public abstract class VCSInterceptor { * Protected constructor, does nothing. */ protected VCSInterceptor() { + } + + // ================================================================================================== + // QUERIES + // ================================================================================================== + + /** + * Queries the versioning system for file mutability (write, delete, move). Versioning systems that keep files + * read-only in working copy can override this method to signal that such files are in fact mutable even if + * they appear read-only on local file system. When IDE eventually tries to delete or write to these files then + * the Versioning system should intercept these calls and make requested files writable on-demand. + * + * @param file a file to query + * @return true if the file is mutable (writable, deletable and movable), false otherwise + * @since 1.7 + */ + public boolean isMutable(File file) { + return file.canWrite(); } // ================================================================================================== diff -r cdd693dc844c versioning/test/unit/src/org/netbeans/modules/versioning/spi/VCSInterceptorTest.java --- a/versioning/test/unit/src/org/netbeans/modules/versioning/spi/VCSInterceptorTest.java Thu Mar 13 10:31:56 2008 +0100 +++ b/versioning/test/unit/src/org/netbeans/modules/versioning/spi/VCSInterceptorTest.java Thu Mar 13 18:31:45 2008 +0100 @@ -80,6 +80,22 @@ public class VCSInterceptorTest extends inteceptor.clearTestData(); } + public void testIsMutable() throws IOException { + File f = new File(dataRootDir, "workdir/root-test-versioned"); + FileObject fo = FileUtil.toFileObject(f); + fo = fo.createData("checkme.txt"); + File file = FileUtil.toFile(fo); + fo.canWrite(); + assertTrue(inteceptor.getBeforeCreateFiles().contains(file)); + assertTrue(inteceptor.getDoCreateFiles().contains(file)); + assertTrue(inteceptor.getCreatedFiles().contains(file)); + assertFalse(inteceptor.getIsMutableFiles().contains(file)); + + file.setReadOnly(); + fo.canWrite(); + assertTrue(inteceptor.getIsMutableFiles().contains(file)); + } + public void testChangedFile() throws IOException { File f = new File(dataRootDir, "workdir/root-test-versioned"); FileObject fo = FileUtil.toFileObject(f); diff -r cdd693dc844c versioning/test/unit/src/org/netbeans/modules/versioning/spi/testvcs/TestVCSInterceptor.java --- a/versioning/test/unit/src/org/netbeans/modules/versioning/spi/testvcs/TestVCSInterceptor.java Thu Mar 13 10:31:56 2008 +0100 +++ b/versioning/test/unit/src/org/netbeans/modules/versioning/spi/testvcs/TestVCSInterceptor.java Thu Mar 13 18:31:45 2008 +0100 @@ -62,8 +62,14 @@ public class TestVCSInterceptor extends private final List beforeEditFiles = new ArrayList(); private final List beforeChangeFiles = new ArrayList(); private final List afterChangeFiles = new ArrayList(); + private final List isMutableFiles = new ArrayList(); public TestVCSInterceptor() { + } + + public boolean isMutable(File file) { + isMutableFiles.add(file); + return super.isMutable(file); } public boolean beforeCreate(File file, boolean isDirectory) { @@ -127,6 +133,10 @@ public class TestVCSInterceptor extends beforeEditFiles.add(file); } + public List getIsMutableFiles() { + return isMutableFiles; + } + public List getBeforeCreateFiles() { return beforeCreateFiles; } @@ -183,5 +193,6 @@ public class TestVCSInterceptor extends beforeEditFiles.clear(); beforeChangeFiles.clear(); afterChangeFiles.clear(); + isMutableFiles.clear(); } }