From ea798193d01b9f6d295b737c515befdf1d1277c9 Mon Sep 17 00:00:00 2001 From: christianguenter2 Date: Wed, 20 Jun 2018 19:53:14 +0200 Subject: [PATCH] Block commit/push if code inspection has errors - new local setting to set check variant - new local setting to block pull if code inspector check fails - check is executed before staging - new page to display code inspector results --- src/persist/zif_abapgit_persistence.intf.abap | 8 +- .../zcl_abapgit_gui_page_code_insp.clas.abap | 271 ++++++++++++++++++ .../zcl_abapgit_gui_page_code_insp.clas.xml | 19 ++ .../zcl_abapgit_gui_page_repo_sett.clas.abap | 45 ++- src/ui/zcl_abapgit_gui_page_syntax.clas.abap | 10 +- src/ui/zcl_abapgit_gui_router.clas.abap | 40 ++- src/ui/zcl_abapgit_gui_view_repo.clas.abap | 2 + src/ui/zcl_abapgit_popups.clas.abap | 1 + src/ui/zcl_abapgit_services_git.clas.abap | 3 + src/ui/zif_abapgit_popups.intf.abap | 2 +- src/utils/zcl_abapgit_log.clas.abap | 8 +- src/zabapgit_css_common.w3mi.data.css | 1 + src/zcl_abapgit_code_inspector.clas.abap | 232 +++++++++++++++ src/zcl_abapgit_code_inspector.clas.xml | 18 ++ src/zcl_abapgit_dot_abapgit.clas.abap | 7 +- src/zcl_abapgit_factory.clas.abap | 93 +++++- src/zcl_abapgit_injector.clas.abap | 59 +++- src/zcl_abapgit_repo_online.clas.abap | 61 +++- ..._abapgit_repo_online.clas.testclasses.abap | 241 ++++++++++++++++ src/zcl_abapgit_repo_online.clas.xml | 1 + src/zcl_abapgit_syntax_check.clas.abap | 145 +--------- src/zif_abapgit_code_inspector.intf.abap | 15 + src/zif_abapgit_code_inspector.intf.xml | 16 ++ src/zif_abapgit_definitions.intf.abap | 1 + src/zif_abapgit_dot_abapgit.intf.abap | 10 +- 25 files changed, 1121 insertions(+), 188 deletions(-) create mode 100644 src/ui/zcl_abapgit_gui_page_code_insp.clas.abap create mode 100644 src/ui/zcl_abapgit_gui_page_code_insp.clas.xml create mode 100644 src/zcl_abapgit_code_inspector.clas.abap create mode 100644 src/zcl_abapgit_code_inspector.clas.xml create mode 100644 src/zcl_abapgit_repo_online.clas.testclasses.abap create mode 100644 src/zif_abapgit_code_inspector.intf.abap create mode 100644 src/zif_abapgit_code_inspector.intf.xml diff --git a/src/persist/zif_abapgit_persistence.intf.abap b/src/persist/zif_abapgit_persistence.intf.abap index acd528d96..7e2d136b3 100644 --- a/src/persist/zif_abapgit_persistence.intf.abap +++ b/src/persist/zif_abapgit_persistence.intf.abap @@ -20,9 +20,11 @@ INTERFACE zif_abapgit_persistence PUBLIC. TYPES: BEGIN OF ty_local_settings, - ignore_subpackages TYPE abap_bool, - write_protected TYPE abap_bool, - only_local_objects TYPE abap_bool, + ignore_subpackages TYPE abap_bool, + write_protected TYPE abap_bool, + only_local_objects TYPE abap_bool, + code_inspector_check_variant TYPE sci_chkv , + block_commit TYPE abap_bool, END OF ty_local_settings. TYPES: ty_local_checksum_tt TYPE STANDARD TABLE OF ty_local_checksum WITH DEFAULT KEY. diff --git a/src/ui/zcl_abapgit_gui_page_code_insp.clas.abap b/src/ui/zcl_abapgit_gui_page_code_insp.clas.abap new file mode 100644 index 000000000..9a13225aa --- /dev/null +++ b/src/ui/zcl_abapgit_gui_page_code_insp.clas.abap @@ -0,0 +1,271 @@ +CLASS zcl_abapgit_gui_page_code_insp DEFINITION PUBLIC FINAL CREATE PUBLIC + INHERITING FROM zcl_abapgit_gui_page. + + PUBLIC SECTION. + METHODS: + constructor + IMPORTING + io_repo TYPE REF TO zcl_abapgit_repo + RAISING + zcx_abapgit_exception, + + zif_abapgit_gui_page~on_event + REDEFINITION, + + zif_abapgit_gui_page~render + REDEFINITION. + + + PROTECTED SECTION. + DATA: mo_repo TYPE REF TO zcl_abapgit_repo_online. + + METHODS: + render_content REDEFINITION. + + PRIVATE SECTION. + CONSTANTS: + BEGIN OF c_actions, + stage TYPE string VALUE 'stage' ##NO_TEXT, + rerun TYPE string VALUE 'rerun' ##NO_TEXT, + END OF c_actions. + + DATA: + mt_result TYPE scit_alvlist. + + METHODS: + build_menu + RETURNING + VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar, + + run_code_inspector + RAISING + zcx_abapgit_exception, + + has_inspection_errors + RETURNING + VALUE(rv_has_inspection_errors) TYPE abap_bool, + + is_stage_allowed + RETURNING + VALUE(rv_is_stage_allowed) TYPE abap_bool, + jump + IMPORTING + is_item TYPE zif_abapgit_definitions=>ty_item + RAISING + zcx_abapgit_exception. + +ENDCLASS. + + + +CLASS zcl_abapgit_gui_page_code_insp IMPLEMENTATION. + + + METHOD build_menu. + + DATA: lv_opt TYPE c LENGTH 1. + + CREATE OBJECT ro_menu. + + ro_menu->add( iv_txt = 'Re-Run' + iv_act = c_actions-rerun + iv_cur = abap_false ) ##NO_TEXT. + + IF is_stage_allowed( ) = abap_false. + lv_opt = zif_abapgit_definitions=>gc_html_opt-crossout. + ENDIF. + + ro_menu->add( iv_txt = 'Stage' + iv_act = c_actions-stage + iv_cur = abap_false + iv_opt = lv_opt ) ##NO_TEXT. + + ENDMETHOD. + + + METHOD constructor. + super->constructor( ). + mo_repo ?= io_repo. + ms_control-page_title = 'Code Inspector'. + run_code_inspector( ). + ENDMETHOD. " constructor. + + + METHOD has_inspection_errors. + + READ TABLE mt_result TRANSPORTING NO FIELDS + WITH KEY kind = 'E'. + rv_has_inspection_errors = boolc( sy-subrc = 0 ). + + ENDMETHOD. + + + METHOD is_stage_allowed. + + rv_is_stage_allowed = boolc( NOT ( mo_repo->get_local_settings( )-block_commit = abap_true + AND has_inspection_errors( ) = abap_true ) ). + + ENDMETHOD. + + + METHOD render_content. + + DATA: lv_check_variant TYPE sci_chkv, + lv_class TYPE string. + FIELD-SYMBOLS: TYPE scir_alvlist. + + CREATE OBJECT ro_html. + + lv_check_variant = mo_repo->get_local_settings( )-code_inspector_check_variant. + + IF lv_check_variant IS INITIAL. + ro_html->add( |No check variant maintained in repo settings.| ). + RETURN. + ENDIF. + + ro_html->add( '

' ). + + ro_html->add( |Code inspector check variant: { + mo_repo->get_local_settings( )-code_inspector_check_variant + }
| ). + + IF lines( mt_result ) = 0. + ro_html->add( '
No code inspector findings
' ). + ENDIF. + + ro_html->add( |
| ). + + LOOP AT mt_result ASSIGNING . + + ro_html->add( '
' ). + ro_html->add_a( iv_txt = |{ -objtype } { -objname }| + iv_act = |{ -objtype }{ -objname }| + iv_typ = zif_abapgit_definitions=>gc_action_type-sapevent ). + ro_html->add( '
' ). + + CASE -kind. + WHEN 'E'. + lv_class = 'error'. + WHEN 'W'. + lv_class = 'warning'. + WHEN OTHERS. + lv_class = 'grey'. + ENDCASE. + + ro_html->add( |
Line { -line ALPHA = OUT }: { -text }

| ). + ENDLOOP. + + ro_html->add( '
' ). + + ENDMETHOD. "render_content + + + METHOD run_code_inspector. + + mt_result = mo_repo->run_code_inspector( ). + + ENDMETHOD. + + + METHOD zif_abapgit_gui_page~on_event. + + DATA: lo_repo_online TYPE REF TO zcl_abapgit_repo_online, + ls_item TYPE zif_abapgit_definitions=>ty_item. + + lo_repo_online ?= mo_repo. + + CASE iv_action. + WHEN c_actions-stage. + + IF is_stage_allowed( ) = abap_true. + + " we need to refresh as the source might have changed + lo_repo_online->refresh( ). + + CREATE OBJECT ei_page TYPE zcl_abapgit_gui_page_stage + EXPORTING + io_repo = lo_repo_online. + + ev_state = zif_abapgit_definitions=>gc_event_state-new_page. + + ELSE. + + ei_page = me. + ev_state = zif_abapgit_definitions=>gc_event_state-no_more_act. + + ENDIF. + + WHEN c_actions-rerun. + + run_code_inspector( ). + + ei_page = me. + ev_state = zif_abapgit_definitions=>gc_event_state-re_render. + + WHEN OTHERS. + + ls_item-obj_type = iv_action(4). + ls_item-obj_name = iv_action+4(*). + + jump( ls_item ). + +* zcl_abapgit_objects=>jump( ls_item ). + + ev_state = zif_abapgit_definitions=>gc_event_state-no_more_act. + + ENDCASE. + + ENDMETHOD. + + + METHOD zif_abapgit_gui_page~render. + + ms_control-page_menu = build_menu( ). + ro_html = super->zif_abapgit_gui_page~render( ). + + ENDMETHOD. + + + METHOD jump. + + DATA: lo_test TYPE REF TO cl_ci_test_root, + li_code_inspector TYPE REF TO zif_abapgit_code_inspector, + ls_info TYPE scir_rest, + lo_result TYPE REF TO cl_ci_result_root, + lv_check_variant_name TYPE sci_chkv, + lv_package TYPE devclass, + lv_srcid TYPE scr_source_id. + + FIELD-SYMBOLS: TYPE scir_alvlist. + + READ TABLE mt_result WITH KEY objtype = is_item-obj_type + objname = is_item-obj_name + ASSIGNING . + ASSERT sy-subrc = 0. + + lv_package = mo_repo->get_package( ). + lv_check_variant_name = mo_repo->get_local_settings( )-code_inspector_check_variant. + + li_code_inspector = zcl_abapgit_factory=>get_code_inspector( + iv_package = lv_package + iv_check_variant_name = lv_check_variant_name ). + + " see SCI_LCL_DYNP_530 / HANDLE_DOUBLE_CLICK + + MOVE-CORRESPONDING TO ls_info. + + lo_test = cl_ci_tests=>get_test_ref( -test ). + lo_result = lo_test->get_result_node( -kind ). + + lv_srcid = li_code_inspector->get_inspection( )->objs->objectsinf-srcid. + + lo_result->set_srcid( + p_info = ls_info + p_srcid = lv_srcid ). + + lo_result->set_info( ls_info ). + lo_result->if_ci_test~navigate( ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/ui/zcl_abapgit_gui_page_code_insp.clas.xml b/src/ui/zcl_abapgit_gui_page_code_insp.clas.xml new file mode 100644 index 000000000..2f89b24d1 --- /dev/null +++ b/src/ui/zcl_abapgit_gui_page_code_insp.clas.xml @@ -0,0 +1,19 @@ + + + + + + ZCL_ABAPGIT_GUI_PAGE_CODE_INSP + 1 + E + GUI - Syntax check page + 2 + 1 + X + X + X + X + + + + diff --git a/src/ui/zcl_abapgit_gui_page_repo_sett.clas.abap b/src/ui/zcl_abapgit_gui_page_repo_sett.clas.abap index 6747010a6..0af72d89d 100644 --- a/src/ui/zcl_abapgit_gui_page_repo_sett.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_repo_sett.clas.abap @@ -45,12 +45,14 @@ CLASS zcl_abapgit_gui_page_repo_sett DEFINITION METHODS render_content REDEFINITION . + PRIVATE SECTION. + ENDCLASS. -CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_SETT IMPLEMENTATION. +CLASS zcl_abapgit_gui_page_repo_sett IMPLEMENTATION. METHOD constructor. @@ -137,6 +139,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_SETT IMPLEMENTATION. ls_settings TYPE zif_abapgit_persistence=>ty_repo-local_settings. + ls_settings = mo_repo->get_local_settings( ). io_html->add( '

Local settings

' ). @@ -159,6 +162,19 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_SETT IMPLEMENTATION. ENDIF. io_html->add( |Only local objects
| ). + io_html->add( '
' ). + io_html->add( 'Code inspector check variant: ' ). + io_html->add( '
' ). + + CLEAR lv_checked. + IF ls_settings-block_commit = abap_true. + lv_checked = | checked|. + ENDIF. + io_html->add( |Block commit commit/push if code inspection has erros: | + && |
| ). + + ENDMETHOD. @@ -200,8 +216,9 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_SETT IMPLEMENTATION. METHOD save_local_settings. - DATA: ls_settings TYPE zif_abapgit_persistence=>ty_repo-local_settings, - ls_post_field LIKE LINE OF it_post_fields. + DATA: ls_settings TYPE zif_abapgit_persistence=>ty_repo-local_settings, + ls_post_field LIKE LINE OF it_post_fields, + lv_check_variant TYPE sci_chkv. ls_settings = mo_repo->get_local_settings( ). @@ -227,6 +244,26 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_SETT IMPLEMENTATION. ls_settings-only_local_objects = abap_false. ENDIF. + READ TABLE it_post_fields INTO ls_post_field WITH KEY name = 'check_variant'. + ASSERT sy-subrc = 0. + lv_check_variant = to_upper( ls_post_field-value ). + IF ls_post_field-value IS NOT INITIAL. + zcl_abapgit_code_inspector=>validate_check_variant( lv_check_variant ). + ENDIF. + ls_settings-code_inspector_check_variant = lv_check_variant. + + READ TABLE it_post_fields INTO ls_post_field WITH KEY name = 'block_commit' value = 'on'. + IF sy-subrc = 0. + ls_settings-block_commit = abap_true. + ELSE. + ls_settings-block_commit = abap_false. + ENDIF. + + IF ls_settings-block_commit = abap_true + AND ls_settings-code_inspector_check_variant IS INITIAL. + zcx_abapgit_exception=>raise( |If block commit is active, a check variant has to be maintained.| ). + ENDIF. + mo_repo->set_local_settings( ls_settings ). ENDMETHOD. @@ -241,4 +278,6 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_SETT IMPLEMENTATION. ENDCASE. ENDMETHOD. + + ENDCLASS. diff --git a/src/ui/zcl_abapgit_gui_page_syntax.clas.abap b/src/ui/zcl_abapgit_gui_page_syntax.clas.abap index 27039f3a1..1604f0abd 100644 --- a/src/ui/zcl_abapgit_gui_page_syntax.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_syntax.clas.abap @@ -16,7 +16,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GUI_PAGE_SYNTAX IMPLEMENTATION. +CLASS zcl_abapgit_gui_page_syntax IMPLEMENTATION. METHOD constructor. @@ -28,11 +28,13 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_SYNTAX IMPLEMENTATION. METHOD render_content. - DATA: lt_result TYPE scit_alvlist, - ls_result LIKE LINE OF lt_result. + DATA: li_syntax_check TYPE REF TO zif_abapgit_code_inspector, + lt_result TYPE scit_alvlist, + ls_result LIKE LINE OF lt_result. + li_syntax_check = zcl_abapgit_factory=>get_syntax_check( iv_package = mo_repo->get_package( ) ). - lt_result = zcl_abapgit_syntax_check=>run( mo_repo->get_package( ) ). + lt_result = li_syntax_check->run( ). CREATE OBJECT ro_html. ro_html->add( '
' ). diff --git a/src/ui/zcl_abapgit_gui_router.clas.abap b/src/ui/zcl_abapgit_gui_router.clas.abap index ac369715f..ca0c2c871 100644 --- a/src/ui/zcl_abapgit_gui_router.clas.abap +++ b/src/ui/zcl_abapgit_gui_router.clas.abap @@ -128,10 +128,11 @@ CLASS zcl_abapgit_gui_router IMPLEMENTATION. METHOD get_page_stage. - DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, - lv_key TYPE zif_abapgit_persistence=>ty_repo-key, - lv_seed TYPE string, - lo_stage_page TYPE REF TO zcl_abapgit_gui_page_stage. + DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, + lv_key TYPE zif_abapgit_persistence=>ty_repo-key, + lv_seed TYPE string, + lo_stage_page TYPE REF TO zcl_abapgit_gui_page_stage, + lo_code_inspector_page TYPE REF TO zcl_abapgit_gui_page_code_insp. FIND FIRST OCCURRENCE OF '=' IN iv_getdata. IF sy-subrc <> 0. " Not found ? -> just repo key in params @@ -145,15 +146,27 @@ CLASS zcl_abapgit_gui_router IMPLEMENTATION. lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ). - " force refresh on stage, to make sure the latest local and remote files are used - lo_repo->refresh( ). + IF lo_repo->get_local_settings( )-code_inspector_check_variant IS NOT INITIAL. - CREATE OBJECT lo_stage_page - EXPORTING - io_repo = lo_repo - iv_seed = lv_seed. + CREATE OBJECT lo_code_inspector_page + EXPORTING + io_repo = lo_repo. - ri_page = lo_stage_page. + ri_page = lo_code_inspector_page. + + ELSE. + + " force refresh on stage, to make sure the latest local and remote files are used + lo_repo->refresh( ). + + CREATE OBJECT lo_stage_page + EXPORTING + io_repo = lo_repo + iv_seed = lv_seed. + + ri_page = lo_stage_page. + + ENDIF. ENDMETHOD. "get_page_stage @@ -266,6 +279,11 @@ CLASS zcl_abapgit_gui_router IMPLEMENTATION. EXPORTING io_repo = zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ). ev_state = zif_abapgit_definitions=>gc_event_state-new_page. + WHEN zif_abapgit_definitions=>gc_action-repo_code_inspector. + CREATE OBJECT ei_page TYPE zcl_abapgit_gui_page_code_insp + EXPORTING + io_repo = zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ). + ev_state = zif_abapgit_definitions=>gc_event_state-new_page. WHEN zif_abapgit_definitions=>gc_action-repo_purge. " Repo remove & purge all objects zcl_abapgit_services_repo=>purge( lv_key ). ev_state = zif_abapgit_definitions=>gc_event_state-re_render. diff --git a/src/ui/zcl_abapgit_gui_view_repo.clas.abap b/src/ui/zcl_abapgit_gui_view_repo.clas.abap index f41fc2c4d..4368a5788 100644 --- a/src/ui/zcl_abapgit_gui_view_repo.clas.abap +++ b/src/ui/zcl_abapgit_gui_view_repo.clas.abap @@ -199,6 +199,8 @@ CLASS zcl_abapgit_gui_view_repo IMPLEMENTATION. ENDIF. lo_tb_advanced->add( iv_txt = 'Syntax Check' iv_act = |{ zif_abapgit_definitions=>gc_action-repo_syntax_check }?{ lv_key }| ). + lo_tb_advanced->add( iv_txt = 'Run Code Inspector' + iv_act = |{ zif_abapgit_definitions=>gc_action-repo_code_inspector }?{ lv_key }| ). lo_tb_advanced->add( iv_txt = 'Repo settings' iv_act = |{ zif_abapgit_definitions=>gc_action-repo_settings }?{ lv_key }| ). diff --git a/src/ui/zcl_abapgit_popups.clas.abap b/src/ui/zcl_abapgit_popups.clas.abap index 023df35a7..ee54d7ead 100644 --- a/src/ui/zcl_abapgit_popups.clas.abap +++ b/src/ui/zcl_abapgit_popups.clas.abap @@ -1160,4 +1160,5 @@ CLASS zcl_abapgit_popups IMPLEMENTATION. ENDIF. ENDMETHOD. "run_page_class_popup + ENDCLASS. diff --git a/src/ui/zcl_abapgit_services_git.clas.abap b/src/ui/zcl_abapgit_services_git.clas.abap index 85b37b82c..6321586d5 100644 --- a/src/ui/zcl_abapgit_services_git.clas.abap +++ b/src/ui/zcl_abapgit_services_git.clas.abap @@ -73,6 +73,9 @@ CLASS zcl_abapgit_services_git DEFINITION zcx_abapgit_exception zcx_abapgit_cancel. + PRIVATE SECTION. + + ENDCLASS. diff --git a/src/ui/zif_abapgit_popups.intf.abap b/src/ui/zif_abapgit_popups.intf.abap index 0d9f9e8fc..acf3e5e21 100644 --- a/src/ui/zif_abapgit_popups.intf.abap +++ b/src/ui/zif_abapgit_popups.intf.abap @@ -156,6 +156,6 @@ INTERFACE zif_abapgit_popups VALUE(rv_transport) TYPE trkorr RAISING zcx_abapgit_exception - zcx_abapgit_cancel . + zcx_abapgit_cancel. ENDINTERFACE. diff --git a/src/utils/zcl_abapgit_log.clas.abap b/src/utils/zcl_abapgit_log.clas.abap index 30b7668ac..5818803df 100644 --- a/src/utils/zcl_abapgit_log.clas.abap +++ b/src/utils/zcl_abapgit_log.clas.abap @@ -15,7 +15,9 @@ CLASS zcl_abapgit_log DEFINITION PUBLIC CREATE PUBLIC. has_rc "For unit tests mainly IMPORTING iv_rc TYPE balsort RETURNING VALUE(rv_yes) TYPE abap_bool, - show. + show + IMPORTING + iv_header_text TYPE csequence DEFAULT 'Log'. PRIVATE SECTION. TYPES: BEGIN OF ty_log, @@ -42,7 +44,7 @@ ENDCLASS. -CLASS zcl_abapgit_log IMPLEMENTATION. +CLASS ZCL_ABAPGIT_LOG IMPLEMENTATION. METHOD add. @@ -142,7 +144,7 @@ CLASS zcl_abapgit_log IMPLEMENTATION. CREATE OBJECT lo_form_header EXPORTING - text = |Log|. + text = iv_header_text. lo_alv->set_top_of_list( lo_form_header ). diff --git a/src/zabapgit_css_common.w3mi.data.css b/src/zabapgit_css_common.w3mi.data.css index 968c72bbf..8eff85e72 100644 --- a/src/zabapgit_css_common.w3mi.data.css +++ b/src/zabapgit_css_common.w3mi.data.css @@ -48,6 +48,7 @@ input:focus, textarea:focus { .attention { color: red !important; } .error { color: #d41919 !important; } .warning { color: #efb301 !important; } +.success { color: green !important; } .blue { color: #5e8dc9 !important; } .red { color: red !important; } .white { color: white !important; } diff --git a/src/zcl_abapgit_code_inspector.clas.abap b/src/zcl_abapgit_code_inspector.clas.abap new file mode 100644 index 000000000..fc66e2a10 --- /dev/null +++ b/src/zcl_abapgit_code_inspector.clas.abap @@ -0,0 +1,232 @@ +CLASS zcl_abapgit_code_inspector DEFINITION + PUBLIC + CREATE PROTECTED + GLOBAL FRIENDS zcl_abapgit_factory. + + PUBLIC SECTION. + INTERFACES: + zif_abapgit_code_inspector. + + METHODS: + constructor + IMPORTING + iv_package TYPE devclass + iv_check_variant_name TYPE sci_chkv OPTIONAL + RAISING + zcx_abapgit_exception. + + CLASS-METHODS: + validate_check_variant + IMPORTING + iv_check_variant_name TYPE sci_chkv + RAISING + zcx_abapgit_exception. + + PROTECTED SECTION. + TYPES: + ty_tdevc_tt TYPE STANDARD TABLE OF tdevc WITH DEFAULT KEY . + + DATA: + mv_package TYPE devclass. + + METHODS: + create_variant + RETURNING + VALUE(ro_variant) TYPE REF TO cl_ci_checkvariant + RAISING + zcx_abapgit_exception. + + PRIVATE SECTION. + DATA: + mv_check_variant_name TYPE sci_chkv, + mo_inspection TYPE REF TO cl_ci_inspection. + + METHODS: + find_all_subpackages + IMPORTING + iv_package TYPE devclass + RETURNING + VALUE(rt_packages) TYPE ty_tdevc_tt, + + create_objectset + RETURNING + VALUE(ro_set) TYPE REF TO cl_ci_objectset, + + run_inspection + IMPORTING + io_inspection TYPE REF TO cl_ci_inspection + RETURNING + VALUE(rt_list) TYPE scit_alvlist, + + create_inspection + IMPORTING + io_set TYPE REF TO cl_ci_objectset + io_variant TYPE REF TO cl_ci_checkvariant + RETURNING + VALUE(ro_inspection) TYPE REF TO cl_ci_inspection. + +ENDCLASS. + + + +CLASS zcl_abapgit_code_inspector IMPLEMENTATION. + + + METHOD constructor. + + mv_package = iv_package. + mv_check_variant_name = iv_check_variant_name. + + ENDMETHOD. + + + METHOD create_inspection. + + cl_ci_inspection=>create( + EXPORTING + p_user = sy-uname + p_name = '' + RECEIVING + p_ref = ro_inspection + EXCEPTIONS + locked = 1 + error_in_enqueue = 2 + not_authorized = 3 + OTHERS = 4 ). + ASSERT sy-subrc = 0. + + ro_inspection->set( + p_chkv = io_variant + p_objs = io_set ). + + ENDMETHOD. + + + METHOD create_objectset. + + DATA: lt_objs TYPE scit_objs, + lt_packages TYPE ty_tdevc_tt. + + + lt_packages = find_all_subpackages( mv_package ). + IF lines( lt_packages ) = 0. + RETURN. + ENDIF. + + SELECT object AS objtype obj_name AS objname + FROM tadir + INTO CORRESPONDING FIELDS OF TABLE lt_objs + FOR ALL ENTRIES IN lt_packages + WHERE devclass = lt_packages-devclass + AND delflag = abap_false + AND pgmid = 'R3TR'. "#EC CI_GENBUFF + + ro_set = cl_ci_objectset=>save_from_list( lt_objs ). + + ENDMETHOD. + + + METHOD create_variant. + + IF mv_check_variant_name IS INITIAL. + zcx_abapgit_exception=>raise( |No check variant supplied.| ). + ENDIF. + + cl_ci_checkvariant=>get_ref( + EXPORTING + p_user = '' + p_name = mv_check_variant_name + RECEIVING + p_ref = ro_variant + EXCEPTIONS + chkv_not_exists = 1 + missing_parameter = 2 + OTHERS = 3 ). + + CASE sy-subrc. + WHEN 1. + zcx_abapgit_exception=>raise( |Check variant { mv_check_variant_name } doesn't exist| ). + WHEN 2. + zcx_abapgit_exception=>raise( |Parameter missing for check variant { mv_check_variant_name }| ). + ENDCASE. + + ENDMETHOD. + + + METHOD find_all_subpackages. + +* TODO, in the future, move this method to the ABAPGIT global package class + + DATA: ls_package LIKE LINE OF rt_packages, + lt_found LIKE rt_packages, + lt_sub LIKE rt_packages. + + + SELECT SINGLE * FROM tdevc INTO ls_package WHERE devclass = iv_package. + ASSERT sy-subrc = 0. + APPEND ls_package TO rt_packages. + + SELECT * FROM tdevc APPENDING TABLE lt_sub + WHERE parentcl = ls_package-devclass. + + LOOP AT lt_sub INTO ls_package. + lt_found = find_all_subpackages( ls_package-devclass ). + APPEND LINES OF lt_found TO rt_packages. + ENDLOOP. + + ENDMETHOD. + + + METHOD run_inspection. + + io_inspection->run( + EXCEPTIONS + invalid_check_version = 1 + OTHERS = 2 ). + ASSERT sy-subrc = 0. + + io_inspection->plain_list( + IMPORTING + p_list = rt_list ). + + ENDMETHOD. + + + METHOD zif_abapgit_code_inspector~run. + + DATA: lo_set TYPE REF TO cl_ci_objectset, + lo_variant TYPE REF TO cl_ci_checkvariant. + + lo_set = create_objectset( ). + lo_variant = create_variant( ). + + mo_inspection = create_inspection( + io_set = lo_set + io_variant = lo_variant ). + + rt_list = run_inspection( mo_inspection ). + + ENDMETHOD. + + METHOD validate_check_variant. + + cl_ci_checkvariant=>get_ref( + EXPORTING + p_user = '' + p_name = iv_check_variant_name + EXCEPTIONS + chkv_not_exists = 1 + missing_parameter = 2 + OTHERS = 3 ). + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |No valid check variant { iv_check_variant_name }| ). + ENDIF. + + ENDMETHOD. + + METHOD zif_abapgit_code_inspector~get_inspection. + ro_inspection = mo_inspection. + ENDMETHOD. + +ENDCLASS. diff --git a/src/zcl_abapgit_code_inspector.clas.xml b/src/zcl_abapgit_code_inspector.clas.xml new file mode 100644 index 000000000..27134a6b2 --- /dev/null +++ b/src/zcl_abapgit_code_inspector.clas.xml @@ -0,0 +1,18 @@ + + + + + + ZCL_ABAPGIT_CODE_INSPECTOR + 1 + E + abapGit Code Inspector + 1 + 1 + X + X + X + + + + diff --git a/src/zcl_abapgit_dot_abapgit.clas.abap b/src/zcl_abapgit_dot_abapgit.clas.abap index 8f6273029..e2b2dfeaa 100644 --- a/src/zcl_abapgit_dot_abapgit.clas.abap +++ b/src/zcl_abapgit_dot_abapgit.clas.abap @@ -42,15 +42,19 @@ CLASS zcl_abapgit_dot_abapgit DEFINITION METHODS get_starting_folder RETURNING VALUE(rv_path) TYPE string . + METHODS get_folder_logic RETURNING VALUE(rv_logic) TYPE string . + METHODS set_folder_logic IMPORTING !iv_logic TYPE string . + METHODS set_starting_folder IMPORTING !iv_path TYPE string . + METHODS get_master_language RETURNING VALUE(rv_language) TYPE spras . @@ -77,7 +81,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_DOT_ABAPGIT IMPLEMENTATION. +CLASS zcl_abapgit_dot_abapgit IMPLEMENTATION. METHOD add_ignore. @@ -276,4 +280,5 @@ CLASS ZCL_ABAPGIT_DOT_ABAPGIT IMPLEMENTATION. ASSERT sy-subrc = 0. ENDMETHOD. + ENDCLASS. diff --git a/src/zcl_abapgit_factory.clas.abap b/src/zcl_abapgit_factory.clas.abap index 8038164d7..5bf49aad8 100644 --- a/src/zcl_abapgit_factory.clas.abap +++ b/src/zcl_abapgit_factory.clas.abap @@ -14,7 +14,25 @@ CLASS zcl_abapgit_factory DEFINITION IMPORTING iv_package TYPE devclass RETURNING - VALUE(ri_sap_package) TYPE REF TO zif_abapgit_sap_package. + VALUE(ri_sap_package) TYPE REF TO zif_abapgit_sap_package, + + get_code_inspector + IMPORTING + iv_package TYPE devclass + iv_check_variant_name TYPE sci_chkv + RETURNING + VALUE(ri_code_inspector) TYPE REF TO zif_abapgit_code_inspector + RAISING + zcx_abapgit_exception, + + get_syntax_check + IMPORTING + iv_package TYPE devclass + RETURNING + VALUE(ri_syntax_check) TYPE REF TO zif_abapgit_code_inspector + raising + zcx_abapgit_exception. + PRIVATE SECTION. TYPES: @@ -23,11 +41,27 @@ CLASS zcl_abapgit_factory DEFINITION instance TYPE REF TO zif_abapgit_sap_package, END OF ty_sap_package, tty_sap_package TYPE HASHED TABLE OF ty_sap_package - WITH UNIQUE KEY package. + WITH UNIQUE KEY package, + + BEGIN OF ty_code_inspector, + package TYPE devclass, + check_variant_name TYPE sci_chkv, + instance TYPE REF TO zif_abapgit_code_inspector, + END OF ty_code_inspector, + tty_code_inspector TYPE HASHED TABLE OF ty_code_inspector + WITH UNIQUE KEY package check_variant_name, + BEGIN OF ty_syntax_check, + package TYPE devclass, + instance TYPE REF TO zif_abapgit_code_inspector, + END OF ty_syntax_check, + tty_syntax_check TYPE HASHED TABLE OF ty_syntax_check + WITH UNIQUE KEY package. CLASS-DATA: - mi_tadir TYPE REF TO zif_abapgit_tadir, - mt_sap_package TYPE tty_sap_package. + mi_tadir TYPE REF TO zif_abapgit_tadir, + mt_sap_package TYPE tty_sap_package, + mt_code_inspector TYPE tty_code_inspector, + mt_syntax_check TYPE tty_syntax_check. ENDCLASS. @@ -69,4 +103,55 @@ CLASS zcl_abapgit_factory IMPLEMENTATION. ENDMETHOD. + METHOD get_code_inspector. + + DATA: ls_code_inspector LIKE LINE OF mt_code_inspector. + FIELD-SYMBOLS: TYPE zcl_abapgit_factory=>ty_code_inspector. + + READ TABLE mt_code_inspector ASSIGNING + WITH TABLE KEY package = iv_package + check_variant_name = iv_check_variant_name. + IF sy-subrc <> 0. + ls_code_inspector-package = iv_package. + ls_code_inspector-check_variant_name = iv_check_variant_name. + + CREATE OBJECT ls_code_inspector-instance TYPE zcl_abapgit_code_inspector + EXPORTING + iv_package = iv_package + iv_check_variant_name = iv_check_variant_name. + + INSERT ls_code_inspector + INTO TABLE mt_code_inspector + ASSIGNING . + + ENDIF. + + ri_code_inspector = -instance. + + ENDMETHOD. + + METHOD get_syntax_check. + + DATA: ls_syntax_check LIKE LINE OF mt_syntax_check. + FIELD-SYMBOLS: TYPE zcl_abapgit_factory=>ty_syntax_check. + + READ TABLE mt_syntax_check ASSIGNING + WITH TABLE KEY package = iv_package. + IF sy-subrc <> 0. + ls_syntax_check-package = iv_package. + + CREATE OBJECT ls_syntax_check-instance TYPE zcl_abapgit_syntax_check + EXPORTING + iv_package = iv_package. + + INSERT ls_syntax_check + INTO TABLE mt_syntax_check + ASSIGNING . + + ENDIF. + + ri_syntax_check = -instance. + + ENDMETHOD. + ENDCLASS. diff --git a/src/zcl_abapgit_injector.clas.abap b/src/zcl_abapgit_injector.clas.abap index 4a8ca2e63..2fdfba815 100644 --- a/src/zcl_abapgit_injector.clas.abap +++ b/src/zcl_abapgit_injector.clas.abap @@ -13,7 +13,18 @@ CLASS zcl_abapgit_injector DEFINITION set_sap_package IMPORTING iv_package TYPE devclass - ii_sap_package TYPE REF TO zif_abapgit_sap_package. + ii_sap_package TYPE REF TO zif_abapgit_sap_package, + + set_code_inspector + IMPORTING + iv_package TYPE devclass + iv_check_variant_name TYPE sci_chkv OPTIONAL + ii_code_inspector TYPE REF TO zif_abapgit_code_inspector, + + set_syntax_check + IMPORTING + iv_package TYPE devclass + ii_syntax_check TYPE REF TO zif_abapgit_code_inspector. ENDCLASS. @@ -49,4 +60,50 @@ CLASS zcl_abapgit_injector IMPLEMENTATION. ENDMETHOD. + METHOD set_code_inspector. + + DATA: ls_code_inspector LIKE LINE OF zcl_abapgit_factory=>mt_code_inspector. + FIELD-SYMBOLS: LIKE LINE OF zcl_abapgit_factory=>mt_code_inspector. + + READ TABLE zcl_abapgit_factory=>mt_code_inspector + ASSIGNING + WITH TABLE KEY package = iv_package + check_variant_name = iv_check_variant_name. + IF sy-subrc <> 0. + + ls_code_inspector-package = iv_package. + ls_code_inspector-check_variant_name = iv_check_variant_name. + + INSERT ls_code_inspector + INTO TABLE zcl_abapgit_factory=>mt_code_inspector + ASSIGNING . + + ENDIF. + + -instance = ii_code_inspector. + + ENDMETHOD. + + METHOD set_syntax_check. + + DATA: ls_syntax_check LIKE LINE OF zcl_abapgit_factory=>mt_syntax_check. + FIELD-SYMBOLS: LIKE LINE OF zcl_abapgit_factory=>mt_syntax_check. + + READ TABLE zcl_abapgit_factory=>mt_syntax_check + ASSIGNING + WITH TABLE KEY package = iv_package. + IF sy-subrc <> 0. + + ls_syntax_check-package = iv_package. + + INSERT ls_syntax_check + INTO TABLE zcl_abapgit_factory=>mt_syntax_check + ASSIGNING . + + ENDIF. + + -instance = ii_syntax_check. + + ENDMETHOD. + ENDCLASS. diff --git a/src/zcl_abapgit_repo_online.clas.abap b/src/zcl_abapgit_repo_online.clas.abap index e600f8bc9..91cc5c90d 100644 --- a/src/zcl_abapgit_repo_online.clas.abap +++ b/src/zcl_abapgit_repo_online.clas.abap @@ -76,7 +76,11 @@ CLASS zcl_abapgit_repo_online DEFINITION VALUE(rt_unnecessary_local_objects) TYPE zif_abapgit_definitions=>ty_tadir_tt RAISING zcx_abapgit_exception . - + METHODS run_code_inspector + RETURNING + VALUE(rt_list) TYPE scit_alvlist + RAISING + zcx_abapgit_exception . METHODS deserialize REDEFINITION . METHODS get_files_remote @@ -87,11 +91,12 @@ CLASS zcl_abapgit_repo_online DEFINITION REDEFINITION . PRIVATE SECTION. DATA: - mt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, - mv_branch TYPE zif_abapgit_definitions=>ty_sha1, - mv_initialized TYPE abap_bool, - mo_branches TYPE REF TO zcl_abapgit_git_branch_list, - mt_status TYPE zif_abapgit_definitions=>ty_results_tt. + mt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, + mv_branch TYPE zif_abapgit_definitions=>ty_sha1, + mv_initialized TYPE abap_bool, + mo_branches TYPE REF TO zcl_abapgit_git_branch_list, + mt_status TYPE zif_abapgit_definitions=>ty_results_tt, + mv_code_inspector_successful TYPE abap_bool. METHODS: handle_stage_ignore @@ -107,7 +112,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_REPO_ONLINE IMPLEMENTATION. +CLASS zcl_abapgit_repo_online IMPLEMENTATION. METHOD actualize_head_branch. @@ -305,11 +310,16 @@ CLASS ZCL_ABAPGIT_REPO_ONLINE IMPLEMENTATION. handle_stage_ignore( io_stage ). + IF ms_data-local_settings-block_commit = abap_true + AND mv_code_inspector_successful = abap_false. + zcx_abapgit_exception=>raise( |A successful code inspection is required| ). + ENDIF. + zcl_abapgit_git_porcelain=>push( EXPORTING is_comment = is_comment - io_repo = me - io_stage = io_stage - IMPORTING ev_branch = lv_branch - et_updated_files = lt_updated_files ). + io_repo = me + io_stage = io_stage + IMPORTING ev_branch = lv_branch + et_updated_files = lt_updated_files ). IF io_stage->get_branch_sha1( ) = get_sha1_local( ). * pushing to the branch currently represented by this repository object @@ -325,6 +335,8 @@ CLASS ZCL_ABAPGIT_REPO_ONLINE IMPLEMENTATION. set( iv_sha1 = lv_branch ). ENDIF. + CLEAR: mv_code_inspector_successful. + ENDMETHOD. "push @@ -427,6 +439,33 @@ CLASS ZCL_ABAPGIT_REPO_ONLINE IMPLEMENTATION. ENDMETHOD. " reset_status. + METHOD run_code_inspector. + + DATA: li_code_inspector TYPE REF TO zif_abapgit_code_inspector, + lv_check_variant TYPE string. + + lv_check_variant = get_local_settings( )-code_inspector_check_variant. + + IF lv_check_variant IS INITIAL. + zcx_abapgit_exception=>raise( |No check variant maintained in repo settings.| ). + ENDIF. + + li_code_inspector = zcl_abapgit_factory=>get_code_inspector( + iv_package = get_package( ) + iv_check_variant_name = |{ lv_check_variant }| ). + + rt_list = li_code_inspector->run( ). + + DELETE rt_list WHERE kind = 'N'. + + READ TABLE rt_list TRANSPORTING NO FIELDS + WITH KEY kind = 'E'. + + mv_code_inspector_successful = boolc( sy-subrc = 0 ). + + ENDMETHOD. + + METHOD set_branch_name. IF ms_data-local_settings-write_protected = abap_true. diff --git a/src/zcl_abapgit_repo_online.clas.testclasses.abap b/src/zcl_abapgit_repo_online.clas.testclasses.abap new file mode 100644 index 000000000..d5532e846 --- /dev/null +++ b/src/zcl_abapgit_repo_online.clas.testclasses.abap @@ -0,0 +1,241 @@ +*"* use this source file for your ABAP unit test classes +CLASS ltd_code_inspector DEFINITION FOR TESTING. + + PUBLIC SECTION. + INTERFACES: + zif_abapgit_code_inspector PARTIALLY IMPLEMENTED. + + METHODS: + constructor + IMPORTING + iv_package TYPE devclass. + PRIVATE SECTION. + DATA mv_package TYPE devclass. + +ENDCLASS. + +CLASS ltd_code_inspector IMPLEMENTATION. + + METHOD constructor. + + mv_package = iv_package. + + ENDMETHOD. + + METHOD zif_abapgit_code_inspector~run. + + DATA: ls_list LIKE LINE OF rt_list. + + IF mv_package = '$DUMMY'. + + ls_list-kind = 'E'. + INSERT ls_list INTO TABLE rt_list. + + ENDIF. + + + ENDMETHOD. + +ENDCLASS. + +CLASS ltcl_run_code_inspection DEFINITION FINAL FOR TESTING + DURATION SHORT + RISK LEVEL HARMLESS. + + PRIVATE SECTION. + DATA: + mo_repo_online TYPE REF TO zcl_abapgit_repo_online, + mv_error_text TYPE string, + mt_act_list TYPE scit_alvlist. + + METHODS: + exception_when_no_check_var FOR TESTING RAISING cx_static_check, + exception_when_error FOR TESTING RAISING cx_static_check, + no_exception_when_no_error FOR TESTING RAISING cx_static_check, + push_not_possible_if_ci_req FOR TESTING RAISING cx_static_check, + + given_online_repo + IMPORTING + iv_package TYPE devclass + RAISING + zcx_abapgit_exception, + + given_check_variant + IMPORTING + iv_check_variant TYPE string, + + given_mock_code_inspector + IMPORTING + iv_package TYPE devclass + iv_check_variant TYPE sci_chkv , + + given_block_commit + IMPORTING + iv_block_commit TYPE abap_bool, + + when_push, + + then_exception_text_is + IMPORTING + iv_exp_error_text TYPE csequence, + + when_run_code_inspector, + + then_ci_detected_an_error, + + then_no_exception_is_raised. + +ENDCLASS. + +CLASS zcl_abapgit_repo_online DEFINITION LOCAL FRIENDS ltcl_run_code_inspection. + +CLASS ltcl_run_code_inspection IMPLEMENTATION. + + METHOD exception_when_no_check_var. + + given_online_repo( iv_package = '$DUMMY' ). + given_check_variant( || ). + when_run_code_inspector( ). + then_exception_text_is( |No check variant maintained in repo settings.| ). + + ENDMETHOD. + + METHOD exception_when_error. + + + given_online_repo( '$DUMMY' ). + given_check_variant( |variant| ). + given_mock_code_inspector( iv_package = '$DUMMY' + iv_check_variant = |variant| ). + + when_run_code_inspector( ). + then_ci_detected_an_error( ). + + ENDMETHOD. + + METHOD no_exception_when_no_error. + + DATA: lx_error TYPE REF TO zcx_abapgit_exception. + + given_online_repo( '$PACKAGE' ). + given_check_variant( |variant| ). + given_mock_code_inspector( iv_package = '$PACKAGE' + iv_check_variant = |variant| ). + when_run_code_inspector( ). + then_no_exception_is_raised( ). + + ENDMETHOD. + + + METHOD given_online_repo. + + DATA: ls_data TYPE zif_abapgit_persistence=>ty_repo. + + ls_data-key = 'dummmy'. + ls_data-package = iv_package. + + CREATE OBJECT mo_repo_online + EXPORTING + is_data = ls_data. + + ENDMETHOD. + + + METHOD given_check_variant. + mo_repo_online->ms_data-local_settings-code_inspector_check_variant = iv_check_variant. + ENDMETHOD. + + + METHOD given_mock_code_inspector. + + DATA: lo_mock_code_inspector TYPE REF TO ltd_code_inspector. + + CREATE OBJECT lo_mock_code_inspector + EXPORTING + iv_package = iv_package. + + zcl_abapgit_injector=>set_code_inspector( iv_package = iv_package + iv_check_variant_name = iv_check_variant + ii_code_inspector = lo_mock_code_inspector ). + + + ENDMETHOD. + + METHOD push_not_possible_if_ci_req. + + given_online_repo( '$PACKAGE' ). + given_check_variant( |variant| ). + given_block_commit( abap_true ). + when_push( ). + then_exception_text_is( |A successful code inspection is required| ). + + ENDMETHOD. + + + METHOD given_block_commit. + + mo_repo_online->ms_data-local_settings-block_commit = abap_true. + + ENDMETHOD. + + + METHOD when_push. + + DATA: ls_comment TYPE zif_abapgit_definitions=>ty_comment, + lo_stage TYPE REF TO zcl_abapgit_stage, + lx_error TYPE REF TO zcx_abapgit_exception. + + CREATE OBJECT lo_stage + EXPORTING + iv_branch_name = 'refs/master' + iv_branch_sha1 = 'dummy'. + + TRY. + mo_repo_online->push( is_comment = ls_comment + io_stage = lo_stage ). + + CATCH zcx_abapgit_exception INTO lx_error. + mv_error_text = lx_error->get_text( ). + ENDTRY. + + ENDMETHOD. + + + METHOD then_exception_text_is. + + cl_abap_unit_assert=>assert_equals( + exp = iv_exp_error_text + act = mv_error_text ). + + ENDMETHOD. + + + METHOD when_run_code_inspector. + + DATA: lx_error TYPE REF TO zcx_abapgit_exception. + + TRY. + mt_act_list = mo_repo_online->run_code_inspector( ). + CATCH zcx_abapgit_exception INTO lx_error. + mv_error_text = lx_error->get_text( ). + ENDTRY. + + ENDMETHOD. + + + METHOD then_ci_detected_an_error. + + READ TABLE mt_act_list TRANSPORTING NO FIELDS + WITH KEY kind = 'E'. + cl_abap_unit_assert=>assert_subrc( exp = 0 ). + + ENDMETHOD. + + + METHOD then_no_exception_is_raised. + + cl_abap_unit_assert=>assert_initial( mv_error_text ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/zcl_abapgit_repo_online.clas.xml b/src/zcl_abapgit_repo_online.clas.xml index 419f71945..9b0a8cad2 100644 --- a/src/zcl_abapgit_repo_online.clas.xml +++ b/src/zcl_abapgit_repo_online.clas.xml @@ -13,6 +13,7 @@ X X X + X diff --git a/src/zcl_abapgit_syntax_check.clas.abap b/src/zcl_abapgit_syntax_check.clas.abap index 7e6ce8e4c..60e61c15e 100644 --- a/src/zcl_abapgit_syntax_check.clas.abap +++ b/src/zcl_abapgit_syntax_check.clas.abap @@ -1,44 +1,12 @@ CLASS zcl_abapgit_syntax_check DEFINITION PUBLIC - CREATE PUBLIC . + INHERITING FROM zcl_abapgit_code_inspector + GLOBAL FRIENDS zcl_abapgit_factory. - PUBLIC SECTION. - - CLASS-METHODS run - IMPORTING - !iv_package TYPE devclass - RETURNING - VALUE(rt_list) TYPE scit_alvlist . PROTECTED SECTION. + METHODS: + create_variant REDEFINITION. - TYPES: - ty_tdevc_tt TYPE STANDARD TABLE OF tdevc WITH DEFAULT KEY . - - CLASS-METHODS find_all_subpackages - IMPORTING - !iv_package TYPE devclass - RETURNING - VALUE(rt_packages) TYPE ty_tdevc_tt . - CLASS-METHODS create_inspection - IMPORTING - !io_set TYPE REF TO cl_ci_objectset - !io_variant TYPE REF TO cl_ci_checkvariant - RETURNING - VALUE(ro_inspection) TYPE REF TO cl_ci_inspection . - CLASS-METHODS create_objectset - IMPORTING - !iv_package TYPE devclass - RETURNING - VALUE(ro_set) TYPE REF TO cl_ci_objectset . - CLASS-METHODS create_variant - RETURNING - VALUE(ro_variant) TYPE REF TO cl_ci_checkvariant . - CLASS-METHODS run_inspection - IMPORTING - !io_inspection TYPE REF TO cl_ci_inspection - RETURNING - VALUE(rt_list) TYPE scit_alvlist . - PRIVATE SECTION. ENDCLASS. @@ -46,58 +14,11 @@ ENDCLASS. CLASS ZCL_ABAPGIT_SYNTAX_CHECK IMPLEMENTATION. - METHOD create_inspection. - - cl_ci_inspection=>create( - EXPORTING - p_user = sy-uname - p_name = '' - RECEIVING - p_ref = ro_inspection - EXCEPTIONS - locked = 1 - error_in_enqueue = 2 - not_authorized = 3 - OTHERS = 4 ). - ASSERT sy-subrc = 0. - - ro_inspection->set( - p_chkv = io_variant - p_objs = io_set ). - - ENDMETHOD. - - - METHOD create_objectset. - - DATA: lt_objs TYPE scit_objs, - lt_packages TYPE ty_tdevc_tt. - - - lt_packages = find_all_subpackages( iv_package ). - IF lines( lt_packages ) = 0. - RETURN. - ENDIF. - - SELECT object AS objtype obj_name AS objname - FROM tadir - INTO CORRESPONDING FIELDS OF TABLE lt_objs - FOR ALL ENTRIES IN lt_packages - WHERE devclass = lt_packages-devclass - AND delflag = abap_false - AND pgmid = 'R3TR'. "#EC CI_GENBUFF - - ro_set = cl_ci_objectset=>save_from_list( lt_objs ). - - ENDMETHOD. - - METHOD create_variant. DATA: lt_variant TYPE sci_tstvar, ls_variant LIKE LINE OF lt_variant. - cl_ci_checkvariant=>create( EXPORTING p_user = sy-uname @@ -123,62 +44,4 @@ CLASS ZCL_ABAPGIT_SYNTAX_CHECK IMPLEMENTATION. ASSERT sy-subrc = 0. ENDMETHOD. - - - METHOD find_all_subpackages. - -* TODO, in the future, move this method to the ABAPGIT global package class - - DATA: ls_package LIKE LINE OF rt_packages, - lt_found LIKE rt_packages, - lt_sub LIKE rt_packages. - - - SELECT SINGLE * FROM tdevc INTO ls_package WHERE devclass = iv_package. - ASSERT sy-subrc = 0. - APPEND ls_package TO rt_packages. - - SELECT * FROM tdevc APPENDING TABLE lt_sub - WHERE parentcl = ls_package-devclass. - - LOOP AT lt_sub INTO ls_package. - lt_found = find_all_subpackages( ls_package-devclass ). - APPEND LINES OF lt_found TO rt_packages. - ENDLOOP. - - ENDMETHOD. - - - METHOD run. - - DATA: lo_set TYPE REF TO cl_ci_objectset, - lo_inspection TYPE REF TO cl_ci_inspection, - lo_variant TYPE REF TO cl_ci_checkvariant. - - - lo_set = create_objectset( iv_package ). - lo_variant = create_variant( ). - - lo_inspection = create_inspection( - io_set = lo_set - io_variant = lo_variant ). - - rt_list = run_inspection( lo_inspection ). - - ENDMETHOD. - - - METHOD run_inspection. - - io_inspection->run( - EXCEPTIONS - invalid_check_version = 1 - OTHERS = 2 ). - ASSERT sy-subrc = 0. - - io_inspection->plain_list( - IMPORTING - p_list = rt_list ). - - ENDMETHOD. ENDCLASS. diff --git a/src/zif_abapgit_code_inspector.intf.abap b/src/zif_abapgit_code_inspector.intf.abap new file mode 100644 index 000000000..4b2a93a8e --- /dev/null +++ b/src/zif_abapgit_code_inspector.intf.abap @@ -0,0 +1,15 @@ +INTERFACE zif_abapgit_code_inspector + PUBLIC. + + METHODS: + run + RETURNING + VALUE(rt_list) TYPE scit_alvlist + RAISING + zcx_abapgit_exception, + + get_inspection + RETURNING + VALUE(ro_inspection) TYPE REF TO cl_ci_inspection. + +ENDINTERFACE. diff --git a/src/zif_abapgit_code_inspector.intf.xml b/src/zif_abapgit_code_inspector.intf.xml new file mode 100644 index 000000000..d17fad249 --- /dev/null +++ b/src/zif_abapgit_code_inspector.intf.xml @@ -0,0 +1,16 @@ + + + + + + ZIF_ABAPGIT_CODE_INSPECTOR + 1 + E + abapGit Code Inspector + 2 + 1 + X + + + + diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index 653215f95..8d1c4d1ed 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -395,6 +395,7 @@ INTERFACE zif_abapgit_definitions PUBLIC. repo_toggle_fav TYPE string VALUE 'repo_toggle_fav', repo_transport_to_branch TYPE string VALUE 'repo_transport_to_branch', repo_syntax_check TYPE string VALUE 'repo_syntax_check', + repo_code_inspector TYPE string VALUE 'repo_code_inspector', abapgit_home TYPE string VALUE 'abapgit_home', abapgit_wiki TYPE string VALUE 'abapgit_wiki', diff --git a/src/zif_abapgit_dot_abapgit.intf.abap b/src/zif_abapgit_dot_abapgit.intf.abap index 1ac09f89c..0a9280be9 100644 --- a/src/zif_abapgit_dot_abapgit.intf.abap +++ b/src/zif_abapgit_dot_abapgit.intf.abap @@ -10,11 +10,11 @@ INTERFACE zif_abapgit_dot_abapgit PUBLIC. ty_requirement_tt TYPE STANDARD TABLE OF ty_requirement WITH DEFAULT KEY . TYPES: BEGIN OF ty_dot_abapgit, - master_language TYPE spras, - starting_folder TYPE string, - folder_logic TYPE string, - ignore TYPE STANDARD TABLE OF string WITH DEFAULT KEY, - requirements TYPE ty_requirement_tt, + master_language TYPE spras, + starting_folder TYPE string, + folder_logic TYPE string, + ignore TYPE STANDARD TABLE OF string WITH DEFAULT KEY, + requirements TYPE ty_requirement_tt, END OF ty_dot_abapgit . CONSTANTS: