in src/net/sourceforge/transparent/ChangeManagement/CCaseWriteableAndUnversionedCollector.java [48:110]
public void collectWritableFiles( final FilePath filePath )
{
final VirtualFile vf = filePath.getVirtualFile();
if( vf != null )
{
final ArrayDeque<VirtualFile> chain = new ArrayDeque<>();
final Map<VirtualFile, Boolean> chainROFlag = new HashMap<>();
ProjectLevelVcsManager.getInstance(myProject).iterateVcsRoot(vf, file -> {
final String path = file.getPath().replace('\\', '/');
final VirtualFile vFile = file.getVirtualFile();
if (vFile == null || ! vFile.isValid()) return true;
if (myTransparentI.isFileIgnored(vFile)) {
myFilesIgnored.add(path);
return true;
}
if (CCaseChangeProvider.isValidFile(vFile)) {
myFilesWritable.add(path);
} else if (! vFile.isDirectory()) {
if (! Boolean.TRUE.equals(chainROFlag.get(vFile.getParent())) && ! vFile.isWritable() && ! myTransparentI.isRenamedFile(vFile.getPath())) {
// then remove parents from unversioned; only check if not yet met before
chainROFlag.put(vFile.getParent(), true);
}
} else {
final boolean versioned = directoryIsVersioned(vFile);
if (! versioned) {
// directory probably unversioned
myDirs.add(vFile);
chain.addFirst(vFile);
} else if (! Boolean.TRUE.equals(chainROFlag.get(vFile)) && ! chain.isEmpty()) {
// directory is versioned
chainROFlag.put(vFile, true);
}
}
return true;
},
new VirtualFileFilter() {
@Override
public boolean shouldGoIntoDirectory(@NotNull VirtualFile file) {
final boolean ignored = myTransparentI.isFileIgnored(file);
if (ignored) {
myFilesIgnored.add(file.getPath());
}
return !ignored;
}
@Override
public void afterChildrenVisited(@NotNull VirtualFile file) {
if (! file.isDirectory()) return;
// also there is a case when a directory is detected as checked out -> remove its parents from unversioned...
final Boolean ro = chainROFlag.get(file);
if (Boolean.TRUE.equals(ro)) {
removeParentsFromUnversioned(file);
}
if (!chain.isEmpty() && chain.getFirst().equals(file)){
chain.removeFirst();
}
chainROFlag.remove(file);
}
});
}
}