public void collectWritableFiles()

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);
        }
      });
    }
  }