@Override
  protected void perform(@NotNull SvnVcs vcs, @NotNull VirtualFile file, @NotNull DataContext context) {
    Info info = vcs.getInfo(file);
    if (info == null) {
      LOG.info("Could not get info for " + file);
      return;
    }

    RelocateDialog dlg = new RelocateDialog(vcs.getProject(), info.getUrl());
    if (!dlg.showAndGet()) {
      return;
    }
    String beforeURL = dlg.getBeforeURL();
    String afterURL = dlg.getAfterURL();
    if (beforeURL.equals(afterURL)) return;
    ProgressManager.getInstance().runProcessWithProgressSynchronously(() -> {
      ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator();
      if (indicator != null) {
        indicator.setIndeterminate(true);
      }

      try {
        File path = VfsUtilCore.virtualToIoFile(file);

        vcs.getFactory(path).createRelocateClient().relocate(path, createUrl(beforeURL, false), createUrl(afterURL, false));
        VcsDirtyScopeManager.getInstance(vcs.getProject()).markEverythingDirty();
      }
      catch (VcsException e) {
        runOrInvokeLaterAboveProgress(
          () -> Messages.showErrorDialog(
            vcs.getProject(),
            message("dialog.message.error.relocating.working.copy", e.getMessage()),
            message("dialog.title.relocate.working.copy")
          ),
          null,
          vcs.getProject()
        );
      }
    }, message("progress.title.relocating.working.copy"), false, vcs.getProject());
  }
@Override
  protected void perform(@NotNull SvnVcs vcs, @NotNull VirtualFile file, @NotNull DataContext context)