From 5127bfdb9d8850ca21d33fd1d06c11793ee24311 Mon Sep 17 00:00:00 2001 From: Marc Bernard <59966492+mbtools@users.noreply.github.com> Date: Mon, 9 May 2022 08:08:32 +0200 Subject: [PATCH] DDIC: Improve active/inactive check (#5486) * DDIC: Improve active/inactive check Use `is_active_ddic` (function `DDIF_STATE_GET`) for all DDIC object types. This is more accurate than the current method (function `RS_INACTIVE_OBJECTS_WARNING`) since it detects newly created but not active objects as well. * Fix const * Remove "no active version" error * Update comment Co-authored-by: Lars Hvam --- src/objects/zcl_abapgit_object_doma.clas.abap | 7 +++++-- src/objects/zcl_abapgit_object_dtel.clas.abap | 2 +- src/objects/zcl_abapgit_object_enqu.clas.abap | 6 ++++-- src/objects/zcl_abapgit_object_shlp.clas.abap | 6 ++++-- src/objects/zcl_abapgit_object_tabl.clas.abap | 2 +- src/objects/zcl_abapgit_object_ttyp.clas.abap | 6 ++++-- src/objects/zcl_abapgit_object_type.clas.abap | 11 +++++----- src/objects/zcl_abapgit_object_view.clas.abap | 9 ++++++--- .../zcl_abapgit_objects_super.clas.abap | 20 ++++++++++++++++--- 9 files changed, 48 insertions(+), 21 deletions(-) diff --git a/src/objects/zcl_abapgit_object_doma.clas.abap b/src/objects/zcl_abapgit_object_doma.clas.abap index 371d08a7b..0a5331408 100644 --- a/src/objects/zcl_abapgit_object_doma.clas.abap +++ b/src/objects/zcl_abapgit_object_doma.clas.abap @@ -353,6 +353,7 @@ CLASS zcl_abapgit_object_doma IMPLEMENTATION. METHOD zif_abapgit_object~serialize. DATA: lv_name TYPE ddobjname, + lv_state TYPE ddgotstate, ls_dd01v TYPE dd01v, lv_masklen TYPE c LENGTH 4, lt_dd07v TYPE TABLE OF dd07v. @@ -364,8 +365,10 @@ CLASS zcl_abapgit_object_doma IMPLEMENTATION. CALL FUNCTION 'DDIF_DOMA_GET' EXPORTING name = lv_name + state = 'A' langu = mv_language IMPORTING + gotstate = lv_state dd01v_wa = ls_dd01v TABLES dd07v_tab = lt_dd07v @@ -376,8 +379,8 @@ CLASS zcl_abapgit_object_doma IMPLEMENTATION. zcx_abapgit_exception=>raise_t100( ). ENDIF. - IF ls_dd01v IS INITIAL. - zcx_abapgit_exception=>raise( |No active version found for { ms_item-obj_type } { ms_item-obj_name }| ). + IF ls_dd01v IS INITIAL OR lv_state <> 'A'. + RETURN. ENDIF. CLEAR: ls_dd01v-as4user, diff --git a/src/objects/zcl_abapgit_object_dtel.clas.abap b/src/objects/zcl_abapgit_object_dtel.clas.abap index 28c82aa77..a739f0bce 100644 --- a/src/objects/zcl_abapgit_object_dtel.clas.abap +++ b/src/objects/zcl_abapgit_object_dtel.clas.abap @@ -281,7 +281,7 @@ CLASS zcl_abapgit_object_dtel IMPLEMENTATION. AND as4local = 'A' AND as4vers = '0000'. IF sy-subrc <> 0 OR ls_dd04v IS INITIAL. - zcx_abapgit_exception=>raise( |No active version found for { ms_item-obj_type } { ms_item-obj_name }| ). + RETURN. ENDIF. SELECT SINGLE * FROM dd04t diff --git a/src/objects/zcl_abapgit_object_enqu.clas.abap b/src/objects/zcl_abapgit_object_enqu.clas.abap index b82803b11..56ea6693a 100644 --- a/src/objects/zcl_abapgit_object_enqu.clas.abap +++ b/src/objects/zcl_abapgit_object_enqu.clas.abap @@ -136,6 +136,7 @@ CLASS zcl_abapgit_object_enqu IMPLEMENTATION. METHOD zif_abapgit_object~serialize. DATA: lv_name TYPE ddobjname, + lv_state TYPE ddgotstate, ls_dd25v TYPE dd25v, lt_dd26e TYPE TABLE OF dd26e, lt_dd27p TYPE ty_dd27p. @@ -148,6 +149,7 @@ CLASS zcl_abapgit_object_enqu IMPLEMENTATION. state = 'A' langu = mv_language IMPORTING + gotstate = lv_state dd25v_wa = ls_dd25v TABLES dd26e_tab = lt_dd26e @@ -159,8 +161,8 @@ CLASS zcl_abapgit_object_enqu IMPLEMENTATION. zcx_abapgit_exception=>raise_t100( ). ENDIF. - IF ls_dd25v IS INITIAL. - zcx_abapgit_exception=>raise( |No active version found for { ms_item-obj_type } { ms_item-obj_name }| ). + IF ls_dd25v IS INITIAL OR lv_state <> 'A'. + RETURN. ENDIF. CLEAR: ls_dd25v-as4user, diff --git a/src/objects/zcl_abapgit_object_shlp.clas.abap b/src/objects/zcl_abapgit_object_shlp.clas.abap index e5a1e671a..55bb0b265 100644 --- a/src/objects/zcl_abapgit_object_shlp.clas.abap +++ b/src/objects/zcl_abapgit_object_shlp.clas.abap @@ -135,6 +135,7 @@ CLASS zcl_abapgit_object_shlp IMPLEMENTATION. METHOD zif_abapgit_object~serialize. DATA: lv_name TYPE ddobjname, + lv_state TYPE ddgotstate, ls_dd30v TYPE dd30v, lt_dd31v TYPE TABLE OF dd31v, lt_dd32p TYPE TABLE OF dd32p, @@ -151,6 +152,7 @@ CLASS zcl_abapgit_object_shlp IMPLEMENTATION. state = 'A' langu = mv_language IMPORTING + gotstate = lv_state dd30v_wa = ls_dd30v TABLES dd31v_tab = lt_dd31v @@ -163,8 +165,8 @@ CLASS zcl_abapgit_object_shlp IMPLEMENTATION. zcx_abapgit_exception=>raise_t100( ). ENDIF. - IF ls_dd30v IS INITIAL. - zcx_abapgit_exception=>raise( |No active version found for { ms_item-obj_type } { ms_item-obj_name }| ). + IF ls_dd30v IS INITIAL OR lv_state <> 'A'. + RETURN. ENDIF. CLEAR: ls_dd30v-as4user, diff --git a/src/objects/zcl_abapgit_object_tabl.clas.abap b/src/objects/zcl_abapgit_object_tabl.clas.abap index 07dbd3f51..1ec9ac869 100644 --- a/src/objects/zcl_abapgit_object_tabl.clas.abap +++ b/src/objects/zcl_abapgit_object_tabl.clas.abap @@ -905,7 +905,7 @@ CLASS zcl_abapgit_object_tabl IMPLEMENTATION. METHOD zif_abapgit_object~is_active. - rv_active = is_active_ddic( ). + rv_active = is_active( ). ENDMETHOD. diff --git a/src/objects/zcl_abapgit_object_ttyp.clas.abap b/src/objects/zcl_abapgit_object_ttyp.clas.abap index 2431d3e10..c52d0de16 100644 --- a/src/objects/zcl_abapgit_object_ttyp.clas.abap +++ b/src/objects/zcl_abapgit_object_ttyp.clas.abap @@ -144,6 +144,7 @@ CLASS zcl_abapgit_object_ttyp IMPLEMENTATION. METHOD zif_abapgit_object~serialize. DATA: lv_name TYPE ddobjname, + lv_state TYPE ddgotstate, lt_dd42v TYPE dd42v_tab, lt_dd43v TYPE dd43v_tab, ls_dd40v TYPE dd40v. @@ -157,6 +158,7 @@ CLASS zcl_abapgit_object_ttyp IMPLEMENTATION. state = 'A' langu = mv_language IMPORTING + gotstate = lv_state dd40v_wa = ls_dd40v TABLES dd42v_tab = lt_dd42v @@ -169,8 +171,8 @@ CLASS zcl_abapgit_object_ttyp IMPLEMENTATION. zcx_abapgit_exception=>raise_t100( ). ENDIF. - IF ls_dd40v IS INITIAL. - zcx_abapgit_exception=>raise( |No active version found for { ms_item-obj_type } { ms_item-obj_name }| ). + IF ls_dd40v IS INITIAL OR lv_state <> 'A'. + RETURN. ENDIF. CLEAR: ls_dd40v-as4user, diff --git a/src/objects/zcl_abapgit_object_type.clas.abap b/src/objects/zcl_abapgit_object_type.clas.abap index 0b395c902..dac34fb2d 100644 --- a/src/objects/zcl_abapgit_object_type.clas.abap +++ b/src/objects/zcl_abapgit_object_type.clas.abap @@ -78,7 +78,7 @@ CLASS zcl_abapgit_object_type IMPLEMENTATION. lv_typdname = ms_item-obj_name. - " Active version + " Get active version, ignore errors if not found CALL FUNCTION 'TYPD_GET_OBJECT' EXPORTING typdname = lv_typdname @@ -90,10 +90,7 @@ CLASS zcl_abapgit_object_type IMPLEMENTATION. EXCEPTIONS version_not_found = 1 reps_not_exist = 2 - OTHERS = 3. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( |No active version found for { ms_item-obj_type } { ms_item-obj_name }| ). - ENDIF. + OTHERS = 3 ##FM_SUBRC_OK. ENDMETHOD. @@ -208,6 +205,10 @@ CLASS zcl_abapgit_object_type IMPLEMENTATION. read( IMPORTING ev_ddtext = lv_ddtext et_source = lt_source ). + IF lt_source IS INITIAL. + RETURN. + ENDIF. + io_xml->add( iv_name = 'DDTEXT' ig_data = lv_ddtext ). diff --git a/src/objects/zcl_abapgit_object_view.clas.abap b/src/objects/zcl_abapgit_object_view.clas.abap index f93168cb6..72d0122f7 100644 --- a/src/objects/zcl_abapgit_object_view.clas.abap +++ b/src/objects/zcl_abapgit_object_view.clas.abap @@ -30,6 +30,7 @@ CLASS zcl_abapgit_object_view DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje METHODS: read_view EXPORTING + ev_state TYPE ddgotstate es_dd25v TYPE dd25v es_dd09l TYPE dd09l et_dd26v TYPE ty_dd26v @@ -38,7 +39,6 @@ CLASS zcl_abapgit_object_view DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje et_dd28v TYPE ty_dd28v RAISING zcx_abapgit_exception. - ENDCLASS. @@ -58,6 +58,7 @@ CLASS zcl_abapgit_object_view IMPLEMENTATION. state = 'A' langu = mv_language IMPORTING + gotstate = ev_state dd25v_wa = es_dd25v dd09l_wa = es_dd09l TABLES @@ -235,6 +236,7 @@ CLASS zcl_abapgit_object_view IMPLEMENTATION. METHOD zif_abapgit_object~serialize. DATA: ls_dd25v TYPE dd25v, + lv_state TYPE ddgotstate, ls_dd09l TYPE dd09l, lt_dd26v TYPE ty_dd26v, lt_dd27p TYPE ty_dd27p, @@ -245,6 +247,7 @@ CLASS zcl_abapgit_object_view IMPLEMENTATION. read_view( IMPORTING + ev_state = lv_state es_dd25v = ls_dd25v es_dd09l = ls_dd09l et_dd26v = lt_dd26v @@ -252,8 +255,8 @@ CLASS zcl_abapgit_object_view IMPLEMENTATION. et_dd28j = lt_dd28j et_dd28v = lt_dd28v ). - IF ls_dd25v IS INITIAL. - zcx_abapgit_exception=>raise( |No active version found for { ms_item-obj_type } { ms_item-obj_name }| ). + IF ls_dd25v IS INITIAL OR lv_state <> 'A'. + RETURN. ENDIF. CLEAR: ls_dd25v-as4user, diff --git a/src/objects/zcl_abapgit_objects_super.clas.abap b/src/objects/zcl_abapgit_objects_super.clas.abap index d1e83b08d..1e4fafdaa 100644 --- a/src/objects/zcl_abapgit_objects_super.clas.abap +++ b/src/objects/zcl_abapgit_objects_super.clas.abap @@ -82,12 +82,12 @@ CLASS zcl_abapgit_objects_super DEFINITION !ii_xml TYPE REF TO zif_abapgit_xml_input RAISING zcx_abapgit_exception . + PRIVATE SECTION. METHODS is_active_ddic RETURNING VALUE(rv_active) TYPE abap_bool RAISING zcx_abapgit_exception . - PRIVATE SECTION. ENDCLASS. @@ -279,10 +279,20 @@ CLASS zcl_abapgit_objects_super IMPLEMENTATION. METHOD is_active. + " DDIC types (see LSINTF01, FORM det_dtabname) + CONSTANTS lc_ddic_type TYPE string + VALUE 'DDLS,DOMA,DTEL,ENQU,INDX,MCID,MCOB,SHLP,SQLT,SQSC,STOB,TABL,TTYP,VIEW,XINX'. + DATA: lt_messages TYPE STANDARD TABLE OF sprot_u WITH DEFAULT KEY, lt_e071_tadirs TYPE STANDARD TABLE OF e071 WITH DEFAULT KEY, ls_e071_tadir LIKE LINE OF lt_e071_tadirs. + " For DDIC types, use more accurate method + IF lc_ddic_type CS ms_item-obj_type. + rv_active = is_active_ddic( ). + RETURN. + ENDIF. + ms_item-inactive = abap_false. ls_e071_tadir-object = ms_item-obj_type. @@ -303,6 +313,7 @@ CLASS zcl_abapgit_objects_super IMPLEMENTATION. ENDIF. rv_active = boolc( ms_item-inactive = abap_false ). + ENDMETHOD. @@ -318,11 +329,15 @@ CLASS zcl_abapgit_objects_super IMPLEMENTATION. lv_type = ms_item-obj_type. lv_name = ms_item-obj_name. + " Check if an inactive version of the DDIC object exists + " state = 'A' checks if an active version exists but does not detect new or modified objects + " state = 'M' checks for all possible versions so we can find out if an inactive one exists + " See documentation of the function module CALL FUNCTION 'DDIF_STATE_GET' EXPORTING type = lv_type name = lv_name - state = 'A' + state = 'M' IMPORTING gotstate = lv_state EXCEPTIONS @@ -333,7 +348,6 @@ CLASS zcl_abapgit_objects_super IMPLEMENTATION. ENDIF. rv_active = boolc( ms_item-inactive = abap_false ). - ENDMETHOD.