Как использовать diff3 конфликта стиля в JGit? - PullRequest
0 голосов
/ 28 марта 2019

В git легко и полезно использовать diff3 в качестве стиля конфликта в случае конфликтов слияния, в которых блоки конфликтов состоят из нашей / базовой / их версий. Однако, когда я использую jGit для слияния, он сообщает только о нас и их, я не нашел API для настройки diff3 в качестве стиля конфликта.

Я пытался выполнить поиск в Google, но большинство результатов связано с Git. И я также погрузился в исходный код jGit, но кажется, что MergeFormatterPass (https://github.com/eclipse/jgit/blob/master/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeFormatterPass.java) необходимо изменить, чтобы сохранить базовый контент в конфликтных блоках.

Хотя jGit является открытым исходным кодом на Github, но он не допускает проблем.

private String mergeTextually(String leftContent, String baseContent, String rightContent) {
    String textualMergeResult = null;
    try {
      // TODO merge with diff3 conflict style
      RawTextComparator textComparator = RawTextComparator.WS_IGNORE_ALL;
      @SuppressWarnings("rawtypes")
      MergeResult mergeResult =
          new MergeAlgorithm()
              .merge(
                  textComparator,
                  new RawText(Constants.encode(baseContent)),
                  new RawText(Constants.encode(leftContent)),
                  new RawText(Constants.encode(rightContent)));
      ByteArrayOutputStream output = new ByteArrayOutputStream();
      (new MergeFormatter())
          .formatMerge(
              output,
              mergeResult,
              Side.BASE.asString(),
              Side.OURS.asString(),
              Side.THEIRS.asString(),
              StandardCharsets.UTF_8);
      textualMergeResult = new String(output.toByteArray(), StandardCharsets.UTF_8);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return textualMergeResult;
  }

Ожидаемые конфликтные блоки в diff3:

<<<<<<<
    /**
     * The path that was passed in the constructor.
     */
    public Path getRoot() {
        return root;
=======
    private Path getRoot() {
        return root;
|||||||
    public JavaParser getJavaParser() {
        return javaParser;
    }

    public SourceRoot setJavaParser(JavaParser javaParser) {
        this.javaParser = javaParser;
        return this;
>>>>>>>

Фактические конфликтные блоки, сгенерированные jGit:

<<<<<<<
    /**
     * The path that was passed in the constructor.
     */
    public Path getRoot() {
        return root;
=======
    public JavaParser getJavaParser() {
        return javaParser;
    }

    public SourceRoot setJavaParser(JavaParser javaParser) {
        this.javaParser = javaParser;
        return this;
>>>>>>>
...