private @NotNull Int2ObjectMap<Int2ObjectMap<ChangeKind>> getAffectedCommits(@NotNull FilePath path) {
    Int2ObjectMap<Int2ObjectMap<ChangeKind>> affectedCommits = new Int2ObjectOpenHashMap<>();

    VirtualFile root = getRoot(path);
    if (myProviders.containsKey(root) && root != null) {
      executeAndCatch(() -> {
        myIndexStorageBackend.iterateChangesInCommits(root, path, (changes, commit) -> executeAndCatch(() -> {
          int[] parents = myIndexStorageBackend.getParents(commit);
          if (parents == null) {
            throw new CorruptedDataException("No parents for commit " + commit);
          }

          Int2ObjectMap<ChangeKind> changeMap = new Int2ObjectOpenHashMap<>(parents.length);
          if (parents.length == 0 && !changes.isEmpty()) {
            changeMap.put(commit, ContainerUtil.getFirstItem(changes));
          }
          else {
            if (parents.length != changes.size()) {
              throw new CorruptedDataException("Commit " + commit + " has " + parents.length +
                                               " parents, but " + changes.size() + " changes.");
            }
            for (int i = 0, length = parents.length; i < length; i++) {
              changeMap.put(parents[i], changes.get(i));
            }
          }

          affectedCommits.put(commit, changeMap);

          return null;
        }));
        return null;
      });
    }
    return affectedCommits;
  }
private @NotNull Int2ObjectMap<Int2ObjectMap<ChangeKind>> getAffectedCommits(@NotNull FilePath path)