From 61cb8175d81e198fe77a749bb7d8841fe1094484 Mon Sep 17 00:00:00 2001 From: Marc Bernard <59966492+mbtools@users.noreply.github.com> Date: Tue, 5 Dec 2023 15:10:24 -0500 Subject: [PATCH] Check for ABAP language version during serialize (#6681) --- .../zcl_abapgit_objects_super.clas.abap | 26 +++-- .../zcl_abapgit_abap_language_vers.clas.abap | 101 +++++++++++++----- ...t_abap_language_vers.clas.testclasses.abap | 58 +++++++++- 3 files changed, 148 insertions(+), 37 deletions(-) diff --git a/src/objects/zcl_abapgit_objects_super.clas.abap b/src/objects/zcl_abapgit_objects_super.clas.abap index 2c7c55d41..e2eaa3259 100644 --- a/src/objects/zcl_abapgit_objects_super.clas.abap +++ b/src/objects/zcl_abapgit_objects_super.clas.abap @@ -84,10 +84,14 @@ CLASS zcl_abapgit_objects_super DEFINITION zcx_abapgit_exception . METHODS set_abap_language_version CHANGING - !cv_abap_language_version TYPE uccheck. + !cv_abap_language_version TYPE uccheck + RAISING + zcx_abapgit_exception . METHODS clear_abap_language_version CHANGING - !cv_abap_language_version TYPE uccheck. + !cv_abap_language_version TYPE uccheck + RAISING + zcx_abapgit_exception . PRIVATE SECTION. ENDCLASS. @@ -99,9 +103,14 @@ CLASS zcl_abapgit_objects_super IMPLEMENTATION. METHOD clear_abap_language_version. " Used during serializing of objects - IF ms_item-abap_language_version <> zcl_abapgit_abap_language_vers=>c_any_abap_language_version. - " ABAP language version is defined in repo setting so there's no need to serialize it + IF ms_item-abap_language_version = zcl_abapgit_abap_language_vers=>c_no_abap_language_version. + " Ignore ABAP language version CLEAR cv_abap_language_version. + ELSEIF ms_item-abap_language_version <> zcl_abapgit_abap_language_vers=>c_any_abap_language_version. + " Check if ABAP language version matches repository setting + zcl_abapgit_abap_language_vers=>check_abap_language_version( + iv_abap_language_version = cv_abap_language_version + is_item = ms_item ). ENDIF. ENDMETHOD. @@ -301,9 +310,14 @@ CLASS zcl_abapgit_objects_super IMPLEMENTATION. METHOD set_abap_language_version. " Used during deserializing of objects - IF ms_item-abap_language_version <> zcl_abapgit_abap_language_vers=>c_any_abap_language_version. - " ABAP language version is defined in repo setting so set it accordingly + IF ms_item-abap_language_version = zcl_abapgit_abap_language_vers=>c_no_abap_language_version. + " ABAP language version is derived from object type and target package (see zcl_abapgit_objects->deserialize) cv_abap_language_version = ms_item-abap_language_version. + ELSEIF ms_item-abap_language_version <> zcl_abapgit_abap_language_vers=>c_any_abap_language_version. + " Check if ABAP language version matches repository setting + zcl_abapgit_abap_language_vers=>check_abap_language_version( + iv_abap_language_version = cv_abap_language_version + is_item = ms_item ). ENDIF. ENDMETHOD. diff --git a/src/utils/zcl_abapgit_abap_language_vers.clas.abap b/src/utils/zcl_abapgit_abap_language_vers.clas.abap index 42efc90bc..76a606a52 100644 --- a/src/utils/zcl_abapgit_abap_language_vers.clas.abap +++ b/src/utils/zcl_abapgit_abap_language_vers.clas.abap @@ -31,6 +31,13 @@ CLASS zcl_abapgit_abap_language_vers DEFINITION RETURNING VALUE(rv_allowed) TYPE abap_bool. + CLASS-METHODS check_abap_language_version + IMPORTING + !iv_abap_language_version TYPE zif_abapgit_aff_types_v1=>ty_abap_language_version + !is_item TYPE zif_abapgit_definitions=>ty_item + RAISING + zcx_abapgit_exception. + PROTECTED SECTION. PRIVATE SECTION. @@ -55,6 +62,12 @@ CLASS zcl_abapgit_abap_language_vers DEFINITION RETURNING VALUE(rv_abap_language_version) TYPE string. + CLASS-METHODS get_description + IMPORTING + !iv_abap_language_version TYPE zif_abapgit_aff_types_v1=>ty_abap_language_version + RETURNING + VALUE(rv_description) TYPE string. + ENDCLASS. @@ -62,14 +75,27 @@ ENDCLASS. CLASS zcl_abapgit_abap_language_vers IMPLEMENTATION. + METHOD check_abap_language_version. + + " Check if ABAP language version matches repository setting + IF iv_abap_language_version <> is_item-abap_language_version. + zcx_abapgit_exception=>raise( + |Object { is_item-obj_type } { is_item-obj_name } has { get_description( iv_abap_language_version ) }| && + | but repository is set to { get_description( is_item-abap_language_version ) }| ). + ENDIF. + + ENDMETHOD. + + METHOD constructor. mo_dot_abapgit = io_dot_abapgit. IF zcl_abapgit_feature=>is_enabled( c_feature_flag ) = abap_false. - mv_has_abap_language_vers = abap_false. - ELSEIF get_abap_language_vers_by_repo( ) = zif_abapgit_dot_abapgit=>c_abap_language_version-undefined - OR get_abap_language_vers_by_repo( ) = zif_abapgit_dot_abapgit=>c_abap_language_version-ignore. + mv_has_abap_language_vers = abap_undefined. + ELSEIF get_abap_language_vers_by_repo( ) = zif_abapgit_dot_abapgit=>c_abap_language_version-undefined. + mv_has_abap_language_vers = abap_undefined. + ELSEIF get_abap_language_vers_by_repo( ) = zif_abapgit_dot_abapgit=>c_abap_language_version-ignore. mv_has_abap_language_vers = abap_false. ELSE. mv_has_abap_language_vers = abap_true. @@ -87,7 +113,6 @@ CLASS zcl_abapgit_abap_language_vers IMPLEMENTATION. lv_class = 'CL_ABAP_LANGUAGE_VERSION_CFG'. TRY. - CALL METHOD (lv_class)=>('GET_INSTANCE') RECEIVING ro_instance = lo_abap_language_version_cfg. @@ -114,6 +139,7 @@ CLASS zcl_abapgit_abap_language_vers IMPLEMENTATION. WHEN OTHERS. rv_abap_language_version = zif_abapgit_dot_abapgit=>c_abap_language_version-undefined. ENDCASE. + CATCH cx_root. rv_abap_language_version = zif_abapgit_dot_abapgit=>c_abap_language_version-undefined. ENDTRY. @@ -126,30 +152,32 @@ CLASS zcl_abapgit_abap_language_vers IMPLEMENTATION. DATA lv_class TYPE string. DATA lo_abap_language_version TYPE REF TO object. - IF mv_has_abap_language_vers = abap_false. + IF mv_has_abap_language_vers = abap_undefined. rv_allowed_abap_langu_version = c_any_abap_language_version. - RETURN. ">>> + ELSEIF mv_has_abap_language_vers = abap_false. + rv_allowed_abap_langu_version = c_no_abap_language_version. + ELSE. " abap_true + + lv_class = 'CL_ABAP_LANGUAGE_VERSION'. + + TRY. + CALL METHOD (lv_class)=>('GET_INSTANCE') + RECEIVING + ro_version_handler = lo_abap_language_version. + + CALL METHOD lo_abap_language_version->('IF_ABAP_LANGUAGE_VERSION~GET_DEFAULT_VERSION') + EXPORTING + iv_object_type = iv_object_type + iv_package = iv_package + RECEIVING + rv_default_version = rv_allowed_abap_langu_version. + + CATCH cx_root. + rv_allowed_abap_langu_version = get_default_abap_language_vers( iv_object_type ). + ENDTRY. + ENDIF. - lv_class = 'CL_ABAP_LANGUAGE_VERSION'. - - TRY. - - CALL METHOD (lv_class)=>('GET_INSTANCE') - RECEIVING - ro_version_handler = lo_abap_language_version. - - CALL METHOD lo_abap_language_version->('IF_ABAP_LANGUAGE_VERSION~GET_DEFAULT_VERSION') - EXPORTING - iv_object_type = iv_object_type - iv_package = iv_package - RECEIVING - rv_default_version = rv_allowed_abap_langu_version. - - CATCH cx_root. - rv_allowed_abap_langu_version = get_default_abap_language_vers( iv_object_type ). - ENDTRY. - ENDMETHOD. @@ -179,11 +207,32 @@ CLASS zcl_abapgit_abap_language_vers IMPLEMENTATION. ENDMETHOD. + METHOD get_description. + + CASE iv_abap_language_version. + WHEN zif_abapgit_aff_types_v1=>co_abap_language_version-standard + OR zif_abapgit_aff_types_v1=>co_abap_language_version_src-standard. + rv_description = 'Standard ABAP'. + WHEN zif_abapgit_aff_types_v1=>co_abap_language_version-key_user + OR zif_abapgit_aff_types_v1=>co_abap_language_version_src-key_user. + rv_description = 'ABAP for Key Users'. + WHEN zif_abapgit_aff_types_v1=>co_abap_language_version-cloud_development + OR zif_abapgit_aff_types_v1=>co_abap_language_version_src-cloud_development. + rv_description = 'ABAP for Cloud Development'. + WHEN OTHERS. + rv_description = 'Undefined'. + ENDCASE. + + rv_description = |ABAP language version "{ rv_description }"|. + + ENDMETHOD. + + METHOD get_repo_abap_language_version. DATA lv_abap_language_version TYPE string. - IF mv_has_abap_language_vers = abap_true. + IF mv_has_abap_language_vers <> abap_undefined. " abap_true or abap_false lv_abap_language_version = mo_dot_abapgit->get_abap_language_version( ). ENDIF. diff --git a/src/utils/zcl_abapgit_abap_language_vers.clas.testclasses.abap b/src/utils/zcl_abapgit_abap_language_vers.clas.testclasses.abap index cb8a52144..aa2fc1f52 100644 --- a/src/utils/zcl_abapgit_abap_language_vers.clas.testclasses.abap +++ b/src/utils/zcl_abapgit_abap_language_vers.clas.testclasses.abap @@ -120,7 +120,9 @@ CLASS ltcl_abap_language_version DEFINITION FOR TESTING RISK LEVEL HARMLESS repo_setting_feature_on FOR TESTING, object_type_feature_off FOR TESTING, object_type_feature_on FOR TESTING, - is_import_allowed FOR TESTING. + is_import_allowed FOR TESTING, + check_abap_language_vers_same FOR TESTING RAISING zcx_abapgit_exception, + check_abap_language_vers_diff FOR TESTING. ENDCLASS. @@ -208,13 +210,18 @@ CLASS ltcl_abap_language_version IMPLEMENTATION. LOOP AT mt_versions INTO lv_version. CASE lv_version. - WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-undefined - OR zif_abapgit_dot_abapgit=>c_abap_language_version-ignore. + WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-undefined. repo_setting_test( iv_version = lv_version iv_exp = zcl_abapgit_abap_language_vers=>c_any_abap_language_version ). + WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-ignore. + + repo_setting_test( + iv_version = lv_version + iv_exp = zcl_abapgit_abap_language_vers=>c_no_abap_language_version ). + WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-standard. repo_setting_test( @@ -317,8 +324,7 @@ CLASS ltcl_abap_language_version IMPLEMENTATION. LOOP AT mt_versions INTO lv_version. CASE lv_version. - WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-undefined - OR zif_abapgit_dot_abapgit=>c_abap_language_version-ignore. + WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-undefined. object_type_test( iv_version = lv_version @@ -327,6 +333,15 @@ CLASS ltcl_abap_language_version IMPLEMENTATION. iv_cloud = zcl_abapgit_abap_language_vers=>c_any_abap_language_version iv_cloud_src = zcl_abapgit_abap_language_vers=>c_any_abap_language_version ). + WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-ignore. + + object_type_test( + iv_version = lv_version + iv_standard = zcl_abapgit_abap_language_vers=>c_no_abap_language_version + iv_standard_src = zcl_abapgit_abap_language_vers=>c_no_abap_language_version + iv_cloud = zcl_abapgit_abap_language_vers=>c_no_abap_language_version + iv_cloud_src = zcl_abapgit_abap_language_vers=>c_no_abap_language_version ). + WHEN OTHERS. object_type_test( @@ -429,4 +444,37 @@ CLASS ltcl_abap_language_version IMPLEMENTATION. ENDMETHOD. + METHOD check_abap_language_vers_same. + + DATA ls_item TYPE zif_abapgit_definitions=>ty_item. + + ls_item-obj_type = 'CLAS'. + ls_item-obj_name = 'ZCL_FOO_BAR'. + ls_item-abap_language_version = zif_abapgit_aff_types_v1=>co_abap_language_version-standard. + + " Does not throw + zcl_abapgit_abap_language_vers=>check_abap_language_version( + iv_abap_language_version = zif_abapgit_aff_types_v1=>co_abap_language_version-standard + is_item = ls_item ). + + ENDMETHOD. + + METHOD check_abap_language_vers_diff. + + DATA ls_item TYPE zif_abapgit_definitions=>ty_item. + + ls_item-obj_type = 'CLAS'. + ls_item-obj_name = 'ZCL_FOO_BAR'. + ls_item-abap_language_version = zif_abapgit_aff_types_v1=>co_abap_language_version-standard. + + TRY. + zcl_abapgit_abap_language_vers=>check_abap_language_version( + iv_abap_language_version = zif_abapgit_aff_types_v1=>co_abap_language_version-cloud_development + is_item = ls_item ). + cl_abap_unit_assert=>fail( ). + CATCH zcx_abapgit_exception ##NO_HANDLER. + ENDTRY. + + ENDMETHOD. + ENDCLASS.