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: