From a2fd6092d279dfcc0725aa93a10d7cb3030fa864 Mon Sep 17 00:00:00 2001 From: Fabian Lupa Date: Sat, 18 Mar 2017 15:17:46 +0100 Subject: [PATCH] Requirements to software components in .abapgit.xml --- src/zabapgit.prog.abap | 1 + src/zabapgit_dot_abapgit.prog.abap | 9 +- src/zabapgit_repo_impl.prog.abap | 7 +- src/zabapgit_requirements.prog.abap | 229 ++++++++++++++++++++++++++++ src/zabapgit_requirements.prog.xml | 25 +++ 5 files changed, 269 insertions(+), 2 deletions(-) create mode 100644 src/zabapgit_requirements.prog.abap create mode 100644 src/zabapgit_requirements.prog.xml diff --git a/src/zabapgit.prog.abap b/src/zabapgit.prog.abap index 679013375..a055e6d56 100644 --- a/src/zabapgit.prog.abap +++ b/src/zabapgit.prog.abap @@ -49,6 +49,7 @@ INCLUDE zabapgit_dot_abapgit. INCLUDE zabapgit_persistence. INCLUDE zabapgit_sap_package. INCLUDE zabapgit_folder_logic. +INCLUDE zabapgit_requirements. INCLUDE zabapgit_stage. INCLUDE zabapgit_git_helpers. diff --git a/src/zabapgit_dot_abapgit.prog.abap b/src/zabapgit_dot_abapgit.prog.abap index ee93e0270..833299f93 100644 --- a/src/zabapgit_dot_abapgit.prog.abap +++ b/src/zabapgit_dot_abapgit.prog.abap @@ -12,11 +12,18 @@ CLASS lcl_dot_abapgit DEFINITION FINAL FRIENDS ltcl_dot_abapgit. full TYPE string VALUE 'FULL', END OF c_folder_logic. - TYPES: BEGIN OF ty_dot_abapgit, + TYPES: BEGIN OF ty_requirement, + component TYPE dlvunit, + min_release TYPE saprelease, + min_patch TYPE sappatchlv, + END OF ty_requirement, + ty_requirement_tab TYPE STANDARD TABLE OF ty_requirement WITH DEFAULT KEY, + 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_tab, END OF ty_dot_abapgit. CLASS-METHODS: diff --git a/src/zabapgit_repo_impl.prog.abap b/src/zabapgit_repo_impl.prog.abap index 9bfbe772a..bfddd093a 100644 --- a/src/zabapgit_repo_impl.prog.abap +++ b/src/zabapgit_repo_impl.prog.abap @@ -477,7 +477,8 @@ CLASS lcl_repo IMPLEMENTATION. METHOD deserialize. DATA: lt_updated_files TYPE ty_file_signatures_tt, - lo_dot_abapgit TYPE REF TO lcl_dot_abapgit. + lo_dot_abapgit TYPE REF TO lcl_dot_abapgit, + lt_requirements TYPE STANDARD TABLE OF lcl_dot_abapgit=>ty_requirement. IF get_dot_abapgit( )->get_master_language( ) <> sy-langu. @@ -487,6 +488,10 @@ CLASS lcl_repo IMPLEMENTATION. lo_dot_abapgit = find_remote_dot_abapgit( ). IF lo_dot_abapgit IS BOUND. set_dot_abapgit( lo_dot_abapgit ). + + " Check if requirements are met + lt_requirements = lo_dot_abapgit->get_data( )-requirements. + lcl_requirement_helper=>check_requirements( lt_requirements ). ENDIF. lt_updated_files = lcl_objects=>deserialize( me ). diff --git a/src/zabapgit_requirements.prog.abap b/src/zabapgit_requirements.prog.abap new file mode 100644 index 000000000..a23bbe596 --- /dev/null +++ b/src/zabapgit_requirements.prog.abap @@ -0,0 +1,229 @@ +*&---------------------------------------------------------------------* +*& Include zabapgit_requirements +*&---------------------------------------------------------------------* + +"! Helper class for checking requirements / dependencies +CLASS lcl_requirement_helper DEFINITION FINAL. + PUBLIC SECTION. + TYPES: + BEGIN OF gty_status, + met TYPE abap_bool, + component TYPE dlvunit, + description TYPE text80, + installed_release TYPE saprelease, + installed_patch TYPE sappatchlv, + required_release TYPE saprelease, + required_patch TYPE sappatchlv, + END OF gty_status, + gty_status_tab TYPE STANDARD TABLE OF gty_status WITH DEFAULT KEY. + CLASS-METHODS: + "! Check if the given requirements are met with user interaction + "!

+ "! Shows a popup if requested and asks the user if he wants to continue if there are unmet + "! requirements. If not an exception is raised. + "!

+ "! @parameter it_requirements | The requirements to check + "! @parameter iv_show_popup | Show popup with requirements + "! @raising lcx_exception | Cancelled by user or internal error + check_requirements IMPORTING it_requirements TYPE lcl_dot_abapgit=>ty_requirement_tab + iv_show_popup TYPE abap_bool DEFAULT abap_true + RAISING lcx_exception, + "! Get a table with information about each requirement + "! @parameter it_requirements | Requirements + "! @parameter rt_status | Result + "! @raising lcx_exception | Internal error + get_requirement_met_status IMPORTING it_requirements TYPE lcl_dot_abapgit=>ty_requirement_tab + RETURNING VALUE(rt_status) TYPE gty_status_tab + RAISING lcx_exception. + PROTECTED SECTION. + PRIVATE SECTION. + CLASS-METHODS: + show_requirement_popup IMPORTING it_requirements TYPE gty_status_tab + RAISING lcx_exception, + version_greater_or_equal IMPORTING is_status TYPE gty_status + RETURNING VALUE(rv_true) TYPE abap_bool. +ENDCLASS. + +CLASS lcl_requirement_helper IMPLEMENTATION. + METHOD check_requirements. + DATA: lt_met_status TYPE gty_status_tab, + lv_answer TYPE c LENGTH 1. + + lt_met_status = get_requirement_met_status( it_requirements ). + + IF iv_show_popup = abap_true. + show_requirement_popup( lt_met_status ). + ENDIF. + + LOOP AT lt_met_status TRANSPORTING NO FIELDS WHERE met = abap_false. + EXIT. + ENDLOOP. + + IF sy-subrc = 0. + CALL FUNCTION 'POPUP_TO_CONFIRM' + EXPORTING + text_question = 'The project has unmet requirements. Install anyways?' + IMPORTING + answer = lv_answer. + IF lv_answer <> '1'. + lcx_exception=>raise( 'Cancelling because of unmet requirements.' ). + ENDIF. + ENDIF. + ENDMETHOD. + + METHOD get_requirement_met_status. + DATA: lt_installed TYPE STANDARD TABLE OF cvers_sdu. + FIELD-SYMBOLS: TYPE lcl_dot_abapgit=>ty_requirement, + TYPE gty_status, + TYPE cvers_sdu. + + CALL FUNCTION 'DELIVERY_GET_INSTALLED_COMPS' + TABLES + tt_comptab = lt_installed + EXCEPTIONS + no_release_found = 1 + OTHERS = 2. + IF sy-subrc <> 0. + lcx_exception=>raise( |Error from DELIVERY_GET_INSTALLED_COMPS { sy-subrc }| ) ##NO_TEXT. + ENDIF. + + LOOP AT it_requirements ASSIGNING . + APPEND INITIAL LINE TO rt_status ASSIGNING . + -component = -component. + -required_release = -min_release. + -required_patch = -min_patch. + + READ TABLE lt_installed WITH KEY component = -component + ASSIGNING . + IF sy-subrc = 0. + -installed_release = -release. + -installed_patch = -extrelease. + -description = -desc_text. + + -met = version_greater_or_equal( ). + ENDIF. + + UNASSIGN . + ENDLOOP. + ENDMETHOD. + + METHOD version_greater_or_equal. + DATA: lv_number TYPE numc4. + + TRY. + MOVE EXACT: is_status-installed_release TO lv_number, + is_status-installed_patch TO lv_number, + is_status-required_release TO lv_number, + is_status-required_patch TO lv_number. + CATCH cx_sy_conversion_error. + " Cannot compare by number, assume requirement not fullfilled (user can force install + " anyways if this was an error) + rv_true = abap_false. + RETURN. + ENDTRY. + + " Check if versions are comparable by number + IF is_status-installed_release > is_status-required_release + OR ( is_status-installed_release = is_status-required_release + AND ( is_status-required_patch IS INITIAL OR + is_status-installed_patch >= is_status-required_patch ) ). + + rv_true = abap_true. + ENDIF. + ENDMETHOD. + + METHOD show_requirement_popup. + CONSTANTS: lc_color_column_name TYPE lvc_fname VALUE 'COLOR'. + DATA: lo_alv TYPE REF TO cl_salv_table, + lo_column TYPE REF TO cl_salv_column, + lr_colored_table TYPE REF TO data, + lo_tab_descr TYPE REF TO cl_abap_tabledescr, + lo_struct_descr TYPE REF TO cl_abap_structdescr, + lo_enh_struct_descr TYPE REF TO cl_abap_structdescr, + lo_enh_tab_descr TYPE REF TO cl_abap_tabledescr, + lt_comps TYPE cl_abap_structdescr=>component_table, + lt_color_neg TYPE lvc_t_scol, + lt_color_pos TYPE lvc_t_scol, + ls_color TYPE lvc_s_scol, + lx_ex TYPE REF TO cx_root. + FIELD-SYMBOLS: TYPE abap_componentdescr, + TYPE STANDARD TABLE, + TYPE data, + TYPE lvc_t_scol, + TYPE abap_bool. + + ls_color-color-col = col_negative. + APPEND ls_color TO lt_color_neg. + + ls_color-color-col = col_positive. + APPEND ls_color TO lt_color_pos. + + CLEAR ls_color. + + lo_tab_descr ?= cl_abap_typedescr=>describe_by_data( it_requirements ). + lo_struct_descr ?= lo_tab_descr->get_table_line_type( ). + lt_comps = lo_struct_descr->get_components( ). + APPEND INITIAL LINE TO lt_comps ASSIGNING . + -name = lc_color_column_name. + -type ?= cl_abap_typedescr=>describe_by_name( 'LVC_T_SCOL' ). + lo_enh_struct_descr = cl_abap_structdescr=>get( lt_comps ). + lo_enh_tab_descr = cl_abap_tabledescr=>get( lo_enh_struct_descr ). + + CREATE DATA lr_colored_table TYPE HANDLE lo_enh_tab_descr. + ASSERT lr_colored_table IS BOUND. + ASSIGN lr_colored_table->* TO . + ASSERT IS ASSIGNED. + + MOVE-CORRESPONDING it_requirements TO . + + LOOP AT ASSIGNING . + ASSIGN COMPONENT 'MET' OF STRUCTURE TO . + ASSERT IS ASSIGNED. + ASSIGN COMPONENT lc_color_column_name OF STRUCTURE TO . + ASSERT IS ASSIGNED. + IF = abap_false. + = lt_color_neg. + ELSE. + = lt_color_pos. + ENDIF. + UNASSIGN: , . + ENDLOOP. + UNASSIGN . + + TRY. + cl_salv_table=>factory( + IMPORTING + r_salv_table = lo_alv + CHANGING + t_table = + ). + + lo_alv->get_columns(: + )->get_column( 'MET' )->set_short_text( 'Met' ), + )->set_color_column( lc_color_column_name ), + )->set_optimize( ), + ). + + lo_column = lo_alv->get_columns( )->get_column( 'REQUIRED_RELEASE' ). + lo_column->set_fixed_header_text( 'S'). + lo_column->set_short_text( 'Req. Rel.' ). + + lo_column = lo_alv->get_columns( )->get_column( 'REQUIRED_PATCH' ). + lo_column->set_fixed_header_text( 'S'). + lo_column->set_short_text( 'Req. SP L.' ). + + lo_alv->set_screen_popup( start_column = 30 + end_column = 100 + start_line = 10 + end_line = 20 ). + lo_alv->get_display_settings( )->set_list_header( 'Requirements' ). + lo_alv->display( ). + + CATCH cx_salv_msg cx_salv_not_found cx_salv_data_error INTO lx_ex. + RAISE EXCEPTION TYPE lcx_exception + EXPORTING + iv_text = lx_ex->get_text( ) + ix_previous = lx_ex. + ENDTRY. + ENDMETHOD. +ENDCLASS. diff --git a/src/zabapgit_requirements.prog.xml b/src/zabapgit_requirements.prog.xml new file mode 100644 index 000000000..6b4225a08 --- /dev/null +++ b/src/zabapgit_requirements.prog.xml @@ -0,0 +1,25 @@ + + + + + + ZABAPGIT_REQUIREMENTS + A + X + S + D$ + I + X + D$S + X + + + + R + ZABAPGIT_REQUIREMENTS + 21 + + + + +