Merge pull request #1526 from christianguenter2/issue_1524_move_check_before_stage

Block commit/push if code inspection has errors
This commit is contained in:
Lars Hvam 2018-06-28 13:33:33 +02:00 committed by GitHub
commit 7181eab4e5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
25 changed files with 1121 additions and 188 deletions

View File

@ -23,6 +23,8 @@ INTERFACE zif_abapgit_persistence PUBLIC.
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.

View File

@ -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: <ls_result> 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( '<div class="toc"><br/>' ).
ro_html->add( |Code inspector check variant: {
mo_repo->get_local_settings( )-code_inspector_check_variant
}<br/>| ).
IF lines( mt_result ) = 0.
ro_html->add( '<br/><div class="success">No code inspector findings</div>' ).
ENDIF.
ro_html->add( |<br/>| ).
LOOP AT mt_result ASSIGNING <ls_result>.
ro_html->add( '<div>' ).
ro_html->add_a( iv_txt = |{ <ls_result>-objtype } { <ls_result>-objname }|
iv_act = |{ <ls_result>-objtype }{ <ls_result>-objname }|
iv_typ = zif_abapgit_definitions=>gc_action_type-sapevent ).
ro_html->add( '</div>' ).
CASE <ls_result>-kind.
WHEN 'E'.
lv_class = 'error'.
WHEN 'W'.
lv_class = 'warning'.
WHEN OTHERS.
lv_class = 'grey'.
ENDCASE.
ro_html->add( |<div class="{ lv_class }">Line { <ls_result>-line ALPHA = OUT }: { <ls_result>-text }</div><br>| ).
ENDLOOP.
ro_html->add( '</div>' ).
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: <ls_result> TYPE scir_alvlist.
READ TABLE mt_result WITH KEY objtype = is_item-obj_type
objname = is_item-obj_name
ASSIGNING <ls_result>.
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 <ls_result> TO ls_info.
lo_test = cl_ci_tests=>get_test_ref( <ls_result>-test ).
lo_result = lo_test->get_result_node( <ls_result>-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.

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCL_ABAPGIT_GUI_PAGE_CODE_INSP</CLSNAME>
<VERSION>1</VERSION>
<LANGU>E</LANGU>
<DESCRIPT>GUI - Syntax check page</DESCRIPT>
<EXPOSURE>2</EXPOSURE>
<STATE>1</STATE>
<CLSFINAL>X</CLSFINAL>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -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( '<h2>Local settings</h2>' ).
@ -159,6 +162,19 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_SETT IMPLEMENTATION.
ENDIF.
io_html->add( |Only local objects <input name="only_local_objects" type="checkbox"{ lv_checked }><br>| ).
io_html->add( '<br>' ).
io_html->add( 'Code inspector check variant: <input name="check_variant" type="text" size="30" value="' &&
ls_settings-code_inspector_check_variant && '">' ).
io_html->add( '<br>' ).
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: |
&& |<input name="block_commit" type="checkbox"{ lv_checked }><br>| ).
ENDMETHOD.
@ -201,7 +217,8 @@ 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.
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.

View File

@ -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,
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( '<div class="toc">' ).

View File

@ -131,7 +131,8 @@ CLASS zcl_abapgit_gui_router IMPLEMENTATION.
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_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,6 +146,16 @@ CLASS zcl_abapgit_gui_router IMPLEMENTATION.
lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ).
IF lo_repo->get_local_settings( )-code_inspector_check_variant IS NOT INITIAL.
CREATE OBJECT lo_code_inspector_page
EXPORTING
io_repo = lo_repo.
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( ).
@ -155,6 +166,8 @@ CLASS zcl_abapgit_gui_router IMPLEMENTATION.
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.

View File

@ -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 }| ).

View File

@ -1160,4 +1160,5 @@ CLASS zcl_abapgit_popups IMPLEMENTATION.
ENDIF.
ENDMETHOD. "run_page_class_popup
ENDCLASS.

View File

@ -73,6 +73,9 @@ CLASS zcl_abapgit_services_git DEFINITION
zcx_abapgit_exception
zcx_abapgit_cancel.
PRIVATE SECTION.
ENDCLASS.

View File

@ -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 ).

View File

@ -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; }

View File

@ -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.

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCL_ABAPGIT_CODE_INSPECTOR</CLSNAME>
<VERSION>1</VERSION>
<LANGU>E</LANGU>
<DESCRIPT>abapGit Code Inspector</DESCRIPT>
<EXPOSURE>1</EXPOSURE>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -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.

View File

@ -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,
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.
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: <ls_code_inspector> TYPE zcl_abapgit_factory=>ty_code_inspector.
READ TABLE mt_code_inspector ASSIGNING <ls_code_inspector>
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 <ls_code_inspector>.
ENDIF.
ri_code_inspector = <ls_code_inspector>-instance.
ENDMETHOD.
METHOD get_syntax_check.
DATA: ls_syntax_check LIKE LINE OF mt_syntax_check.
FIELD-SYMBOLS: <ls_syntax_check> TYPE zcl_abapgit_factory=>ty_syntax_check.
READ TABLE mt_syntax_check ASSIGNING <ls_syntax_check>
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 <ls_syntax_check>.
ENDIF.
ri_syntax_check = <ls_syntax_check>-instance.
ENDMETHOD.
ENDCLASS.

View File

@ -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: <ls_code_inspector> LIKE LINE OF zcl_abapgit_factory=>mt_code_inspector.
READ TABLE zcl_abapgit_factory=>mt_code_inspector
ASSIGNING <ls_code_inspector>
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 <ls_code_inspector>.
ENDIF.
<ls_code_inspector>-instance = ii_code_inspector.
ENDMETHOD.
METHOD set_syntax_check.
DATA: ls_syntax_check LIKE LINE OF zcl_abapgit_factory=>mt_syntax_check.
FIELD-SYMBOLS: <ls_syntax_check> LIKE LINE OF zcl_abapgit_factory=>mt_syntax_check.
READ TABLE zcl_abapgit_factory=>mt_syntax_check
ASSIGNING <ls_syntax_check>
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 <ls_syntax_check>.
ENDIF.
<ls_syntax_check>-instance = ii_syntax_check.
ENDMETHOD.
ENDCLASS.

View File

@ -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
@ -91,7 +95,8 @@ CLASS zcl_abapgit_repo_online DEFINITION
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_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,6 +310,11 @@ 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
@ -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.

View File

@ -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.

View File

@ -13,6 +13,7 @@
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
</VSEOCLASS>
</asx:values>
</asx:abap>

View File

@ -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.

View File

@ -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.

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_INTF" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOINTERF>
<CLSNAME>ZIF_ABAPGIT_CODE_INSPECTOR</CLSNAME>
<VERSION>1</VERSION>
<LANGU>E</LANGU>
<DESCRIPT>abapGit Code Inspector</DESCRIPT>
<EXPOSURE>2</EXPOSURE>
<STATE>1</STATE>
<UNICODE>X</UNICODE>
</VSEOINTERF>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -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',