All files / src/diff zcl_abapgit_diff_diff3.clas.abap

97.74% Statements 130/133
72.22% Branches 13/18
100% Functions 1/1
97.74% Lines 130/133

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 1341x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 11x 11x 11x 11x 1x 10x 10x 10x 10x 1x 1x 1x   1x 1x 1x     1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 21x 9x 13x 13x 13x 13x 13x 13x 13x 13x 13x 13x 13x 13x 9x 12x 12x 12x 12x 3x 3x 12x 12x 12x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 12x 4x 4x 4x 4x 4x 4x 4x 33x 29x 29x 29x 29x 29x 29x 29x 29x 12x 12x 12x 21x 1x 1x  
CLASS zcl_abapgit_diff_diff3 DEFINITION PUBLIC.
  PUBLIC SECTION.
    CLASS-METHODS compute
      IMPORTING
        iv_new         TYPE xstring
        iv_old         TYPE xstring
        " todo
        " iv_ignore_indentation TYPE abap_bool
        " iv_ignore_comments    TYPE abap_bool
        " iv_ignore_case        TYPE abap_bool
      RETURNING
        VALUE(rt_diff) TYPE zif_abapgit_definitions=>ty_diffs_tt
      RAISING
        zcx_abapgit_exception.
ENDCLASS.
 
CLASS zcl_abapgit_diff_diff3 IMPLEMENTATION.
  METHOD compute.
* Beware: this is AI generated code -Hvam 2025-09-29
    DATA: lv_new      TYPE string,
          lv_old      TYPE string,
          lv_new_last TYPE c LENGTH 1,
          lv_old_last TYPE c LENGTH 1,
          lt_new      TYPE string_table,
          lt_old      TYPE string_table,
          lt_comm     TYPE zif_abapgit_diff3=>ty_comm_result_t,
          lo_diff3    TYPE REF TO zif_abapgit_diff3,
          ls_comm     LIKE LINE OF lt_comm,
          ls_diff     TYPE zif_abapgit_definitions=>ty_diff,
          lt_ins      TYPE string_table,
          lt_del      TYPE string_table,
          lv_line     TYPE string,
          lv_max      TYPE i,
          lv_new_idx  TYPE i VALUE 0,
          lv_old_idx  TYPE i VALUE 0,
          lv_i        TYPE i.
 
    CLEAR rt_diff.
 
    lv_new = zcl_abapgit_convert=>xstring_to_string_utf8( iv_new ).
    lv_old = zcl_abapgit_convert=>xstring_to_string_utf8( iv_old ).
 
    IF lv_new IS NOT INITIAL.
      lv_new_last = substring(
        val = lv_new
        off = strlen( lv_new ) - 1 ).
    ENDIF.
    IF lv_old IS NOT INITIAL.
      lv_old_last = substring(
        val = lv_old
        off = strlen( lv_old ) - 1 ).
    ENDIF.
    IF lv_new_last = cl_abap_char_utilities=>newline
      AND lv_old_last <> cl_abap_char_utilities=>newline
      AND lv_old IS NOT INITIAL.
      lv_old = lv_old && cl_abap_char_utilities=>form_feed.
    ELSEIF lv_new_last <> cl_abap_char_utilities=>newline
      AND lv_old_last = cl_abap_char_utilities=>newline
      AND lv_new IS NOT INITIAL.
      lv_new = lv_new && cl_abap_char_utilities=>form_feed.
    ENDIF.
 
    SPLIT lv_new AT cl_abap_char_utilities=>newline INTO TABLE lt_new.
    SPLIT lv_old AT cl_abap_char_utilities=>newline INTO TABLE lt_old.
 
    lo_diff3 = zcl_abapgit_diff3=>create( ).
    lt_comm = lo_diff3->diff_comm(
      it_buffer1 = lt_new
      it_buffer2 = lt_old ).
 
    LOOP AT lt_comm INTO ls_comm.
      IF ls_comm-common IS NOT INITIAL.
        LOOP AT ls_comm-common INTO lv_line.
          lv_new_idx = lv_new_idx + 1.
          lv_old_idx = lv_old_idx + 1.
          CLEAR ls_diff.
          lv_i = lv_new_idx.
          ls_diff-new_num = lv_i.
          lv_i = lv_old_idx.
          ls_diff-old_num = lv_i.
          ls_diff-new = lv_line.
          ls_diff-old = lv_line.
          ls_diff-result = zif_abapgit_definitions=>c_diff-unchanged.
          APPEND ls_diff TO rt_diff.
        ENDLOOP.
      ELSE.
        lt_ins = ls_comm-diff-buffer1.
        lt_del = ls_comm-diff-buffer2.
        lv_max = lines( lt_ins ).
        IF lines( lt_del ) > lv_max.
          lv_max = lines( lt_del ).
        ENDIF.
        DO lv_max TIMES.
          CLEAR ls_diff.
          IF sy-index <= lines( lt_del ) AND sy-index <= lines( lt_ins ).
            lv_old_idx = lv_old_idx + 1.
            lv_new_idx = lv_new_idx + 1.
            lv_i = lv_new_idx.
            ls_diff-new_num = lv_i.
            lv_i = lv_old_idx.
            ls_diff-old_num = lv_i.
            READ TABLE lt_ins INDEX sy-index INTO lv_line.
            IF sy-subrc = 0.
              ls_diff-new = lv_line.
            ENDIF.
            READ TABLE lt_del INDEX sy-index INTO lv_line.
            IF sy-subrc = 0.
              ls_diff-old = lv_line.
            ENDIF.
            ls_diff-result = zif_abapgit_definitions=>c_diff-update.
          ELSEIF sy-index <= lines( lt_del ).
            lv_old_idx = lv_old_idx + 1.
            READ TABLE lt_del INDEX sy-index INTO lv_line.
            IF sy-subrc = 0.
              ls_diff-old = lv_line.
            ENDIF.
            ls_diff-old_num = lv_old_idx.
            ls_diff-result = zif_abapgit_definitions=>c_diff-delete.
          ELSEIF sy-index <= lines( lt_ins ).
            lv_new_idx = lv_new_idx + 1.
            READ TABLE lt_ins INDEX sy-index INTO lv_line.
            IF sy-subrc = 0.
              ls_diff-new = lv_line.
            ENDIF.
            ls_diff-new_num = lv_new_idx.
            ls_diff-result = zif_abapgit_definitions=>c_diff-insert.
          ENDIF.
          APPEND ls_diff TO rt_diff.
        ENDDO.
      ENDIF.
    ENDLOOP.
  ENDMETHOD.
ENDCLASS.