static @NotNull VcsLogUserIndex create(@NotNull StorageId.Directory storageId,
                                         @Nullable StorageLockContext storageLockContext,
                                         @NotNull VcsUserRegistry userRegistry,
                                         @NotNull VcsLogErrorHandler errorHandler,
                                         @NotNull Disposable disposableParent) throws IOException {
    Disposable disposable = Disposer.newDisposable(disposableParent);
    try {
      PersistentMapBasedForwardIndex forwardIndex = new PersistentMapBasedForwardIndex(storageId.getStorageFile(USERS + ".idx"),
                                                                                       true, false, storageLockContext);
      Disposer.register(disposable, () -> catchAndWarn(LOG, forwardIndex::close));

      PersistentEnumerator<VcsUser> userEnumerator = createUserEnumerator(storageId, storageLockContext, userRegistry);
      Disposer.register(disposable, () -> catchAndWarn(LOG, userEnumerator::close));

      UserIndexer userIndexer = new UserIndexer(userEnumerator, e -> errorHandler.handleError(VcsLogErrorHandler.Source.Index, e));
      return new VcsLogUserIndex(storageId, userIndexer, forwardIndex, storageLockContext, errorHandler, disposable);
    }
    catch (Throwable t) {
      Disposer.dispose(disposable);
      throw t;
    }
  }
static @NotNull VcsLogUserIndex create(@NotNull StorageId.Directory storageId,
                                         @Nullable StorageLockContext storageLockContext,
                                         @NotNull VcsUserRegistry userRegistry,
                                         @NotNull VcsLogErrorHandler errorHandler,
                                         @NotNull Disposable disposableParent)