public void processUpdatedFiles(final UpdatedFiles updatedFiles,
                                  final @Nullable Consumer<? super List<CommittedChangeList>> incomingChangesConsumer) {
    final Runnable task = () -> {
      debug("Processing updated files");
      final Collection<ChangesCacheFile> caches = myCachesHolder.getAllCaches();
      myPendingUpdateCount += caches.size();
      for(final ChangesCacheFile cache: caches) {
        try {
          if (cache.isEmpty()) {
            pendingUpdateProcessed(incomingChangesConsumer);
            continue;
          }
          debug("Processing updated files in " + cache.getLocation());
          boolean needRefresh = cache.processUpdatedFiles(updatedFiles, myNewIncomingChanges);
          if (needRefresh) {
            debug("Found unaccounted files, requesting refresh");
            // todo do we need double-queueing here???
            processUpdatedFilesAfterRefresh(cache, updatedFiles, incomingChangesConsumer);
          }
          else {
            debug("Clearing cached incoming changelists");
            myCachedIncomingChangeLists = null;
            pendingUpdateProcessed(incomingChangesConsumer);
          }
        }
        catch (IOException e) {
          LOG.error(e);
        }
      }
    };
    myTaskQueue.run(task);
  }
public void processUpdatedFiles(final UpdatedFiles updatedFiles,
                                  final @Nullable Consumer<? super List<CommittedChangeList>> incomingChangesConsumer)