@Override
  public void merge(
      @NotNull SvnTarget source1,
      @NotNull SvnTarget source2,
      @NotNull File destination,
      @Nullable Depth depth,
      boolean useAncestry,
      boolean dryRun,
      boolean recordOnly,
      boolean force,
      @Nullable DiffOptions diffOptions,
      @Nullable ProgressTracker handler)
      throws VcsException {
    assertUrl(source1);
    assertUrl(source2);

    List<String> parameters = new ArrayList<String>();

    CommandUtil.put(parameters, source1);
    CommandUtil.put(parameters, source2);
    fillParameters(parameters, destination, depth, dryRun, recordOnly, force, false, diffOptions);
    CommandUtil.put(parameters, !useAncestry, "--ignore-ancestry");

    run(destination, handler, parameters);
  }
  private static List<String> prepareParameters(File[] paths, SVNDepth depth) {
    ArrayList<String> parameters = new ArrayList<String>();

    CommandUtil.put(parameters, paths);
    CommandUtil.put(parameters, depth);

    return parameters;
  }
  private void run(File destination, ProgressTracker handler, List<String> parameters)
      throws VcsException {
    BaseUpdateCommandListener listener =
        new BaseUpdateCommandListener(CommandUtil.correctUpToExistingParent(destination), handler);

    execute(myVcs, SvnTarget.fromFile(destination), SvnCommandName.merge, parameters, listener);

    listener.throwWrappedIfException();
  }
  // TODO: Add possibility to resolve content, property and tree conflicts separately.
  // TODO: Or rewrite logic to have one "Resolve conflicts" action instead of separate actions for
  // each conflict type.
  @Override
  public void resolve(
      @NotNull File path,
      @Nullable Depth depth,
      boolean resolveProperty,
      boolean resolveContent,
      boolean resolveTree)
      throws VcsException {
    List<String> parameters = new ArrayList<String>();

    CommandUtil.put(parameters, path);
    CommandUtil.put(parameters, depth);
    parameters.add("--accept");
    parameters.add("working");

    // for now parsing of the output is not required as command is executed only for one file
    // and will be either successful or exception will be thrown
    execute(myVcs, SvnTarget.fromFile(path), SvnCommandName.resolve, parameters, null);
  }
  @Override
  public void export(
      @NotNull SvnTarget from,
      @NotNull File to,
      @Nullable SVNRevision revision,
      @Nullable Depth depth,
      @Nullable String nativeLineEnd,
      boolean force,
      boolean ignoreExternals,
      @Nullable ProgressTracker handler)
      throws VcsException {
    List<String> parameters = new ArrayList<String>();

    CommandUtil.put(parameters, from);
    CommandUtil.put(parameters, to);
    CommandUtil.put(parameters, revision);
    CommandUtil.put(parameters, depth);
    CommandUtil.put(parameters, force, "--force");
    CommandUtil.put(parameters, ignoreExternals, "--ignore-externals");
    if (!StringUtil.isEmpty(nativeLineEnd)) {
      parameters.add("--native-eol");
      parameters.add(nativeLineEnd);
    }

    BaseUpdateCommandListener listener = new BaseUpdateCommandListener(to, handler);

    execute(myVcs, from, to, SvnCommandName.export, parameters, listener);

    listener.throwWrappedIfException();
  }
  @Override
  public void merge(
      @NotNull SvnTarget source,
      @NotNull File destination,
      boolean dryRun,
      @Nullable DiffOptions diffOptions,
      @Nullable final ProgressTracker handler)
      throws VcsException {
    assertUrl(source);

    List<String> parameters = new ArrayList<String>();
    CommandUtil.put(parameters, source);
    fillParameters(parameters, destination, null, dryRun, false, false, true, diffOptions);

    run(destination, handler, parameters);
  }
  @Override
  public void merge(
      @NotNull SvnTarget source,
      @NotNull SVNRevisionRange range,
      @NotNull File destination,
      @Nullable Depth depth,
      boolean dryRun,
      boolean recordOnly,
      boolean force,
      @Nullable DiffOptions diffOptions,
      @Nullable ProgressTracker handler)
      throws VcsException {
    assertUrl(source);

    List<String> parameters = new ArrayList<String>();

    parameters.add("--revision");
    parameters.add(range.getStartRevision() + ":" + range.getEndRevision());
    CommandUtil.put(parameters, source);
    fillParameters(parameters, destination, depth, dryRun, recordOnly, force, false, diffOptions);

    run(destination, handler, parameters);
  }
  private static void fillParameters(
      @NotNull List<String> parameters,
      @NotNull File destination,
      @Nullable Depth depth,
      boolean dryRun,
      boolean recordOnly,
      boolean force,
      boolean reintegrate,
      @Nullable DiffOptions diffOptions) {
    CommandUtil.put(parameters, destination);
    CommandUtil.put(parameters, diffOptions);
    CommandUtil.put(parameters, dryRun, "--dry-run");

    CommandUtil.put(parameters, depth);
    CommandUtil.put(parameters, force, "--force");
    CommandUtil.put(parameters, recordOnly, "--record-only");

    parameters.add("--accept");
    parameters.add("postpone");
    // deprecated for 1.8, but should be specified for previous clients
    CommandUtil.put(parameters, reintegrate, "--reintegrate");
  }
  @Override
  public void revert(
      @NotNull File[] paths, @Nullable SVNDepth depth, @Nullable ISVNEventHandler handler)
      throws VcsException {
    if (paths.length > 0) {
      List<String> parameters = prepareParameters(paths, depth);

      // TODO: handler should be called in parallel with command execution, but this will be in
      // other thread
      // TODO: check if that is ok for current handler implementation
      // TODO: add possibility to invoke "handler.checkCancelled" - process should be killed
      CommandExecutor command =
          execute(
              myVcs,
              SvnTarget.fromFile(paths[0]),
              CommandUtil.getHomeDirectory(),
              SvnCommandName.revert,
              parameters,
              null);
      FileStatusResultParser parser =
          new FileStatusResultParser(CHANGED_PATH, handler, new RevertStatusConvertor());
      parser.parse(command.getOutput());
    }
  }