diff --git a/src/http/zcl_abapgit_http.clas.abap b/src/http/zcl_abapgit_http.clas.abap index a30bcfe79..edcb2ce0e 100644 --- a/src/http/zcl_abapgit_http.clas.abap +++ b/src/http/zcl_abapgit_http.clas.abap @@ -91,7 +91,7 @@ CLASS zcl_abapgit_http IMPLEMENTATION. lo_digest TYPE REF TO zcl_abapgit_http_digest. - lv_default_user = zcl_abapgit_persistence_user=>get_instance( )->get_repo_login( iv_url ). + lv_default_user = zcl_abapgit_persist_factory=>get_user( )->get_repo_login( iv_url ). lv_user = lv_default_user. zcl_abapgit_password_dialog=>popup( @@ -106,7 +106,7 @@ CLASS zcl_abapgit_http IMPLEMENTATION. ENDIF. IF lv_user <> lv_default_user. - zcl_abapgit_persistence_user=>get_instance( )->set_repo_login( + zcl_abapgit_persist_factory=>get_user( )->set_repo_login( iv_url = iv_url iv_login = lv_user ). ENDIF. diff --git a/src/objects/core/zcl_abapgit_objects_check.clas.abap b/src/objects/core/zcl_abapgit_objects_check.clas.abap index 0bfee4e8e..72f47f327 100644 --- a/src/objects/core/zcl_abapgit_objects_check.clas.abap +++ b/src/objects/core/zcl_abapgit_objects_check.clas.abap @@ -1,17 +1,19 @@ CLASS zcl_abapgit_objects_check DEFINITION PUBLIC - CREATE PUBLIC . + CREATE PUBLIC. PUBLIC SECTION. + CLASS-METHODS class_constructor. + CLASS-METHODS deserialize_checks IMPORTING !ii_repo TYPE REF TO zif_abapgit_repo RETURNING VALUE(rs_checks) TYPE zif_abapgit_definitions=>ty_deserialize_checks RAISING - zcx_abapgit_exception . - CLASS-METHODS class_constructor. + zcx_abapgit_exception. + CLASS-METHODS checks_adjust IMPORTING !ii_repo TYPE REF TO zif_abapgit_repo @@ -19,11 +21,22 @@ CLASS zcl_abapgit_objects_check DEFINITION CHANGING !ct_results TYPE zif_abapgit_definitions=>ty_results_tt RAISING - zcx_abapgit_exception . - PROTECTED SECTION. + zcx_abapgit_exception. + PROTECTED SECTION. PRIVATE SECTION. - CLASS-DATA: gi_exit TYPE REF TO zif_abapgit_exit. + + CLASS-DATA gi_exit TYPE REF TO zif_abapgit_exit. + + CLASS-METHODS adjust_result + IMPORTING + !iv_txt TYPE string + !it_overwrite_old TYPE zif_abapgit_definitions=>ty_overwrite_tt + !it_overwrite_new TYPE zif_abapgit_definitions=>ty_overwrite_tt + CHANGING + !ct_results TYPE zif_abapgit_definitions=>ty_results_tt + RAISING + zcx_abapgit_exception. CLASS-METHODS warning_overwrite_adjust IMPORTING @@ -32,11 +45,13 @@ CLASS zcl_abapgit_objects_check DEFINITION !ct_results TYPE zif_abapgit_definitions=>ty_results_tt RAISING zcx_abapgit_exception. + CLASS-METHODS warning_overwrite_find IMPORTING !it_results TYPE zif_abapgit_definitions=>ty_results_tt RETURNING VALUE(rt_overwrite) TYPE zif_abapgit_definitions=>ty_overwrite_tt. + CLASS-METHODS warning_package_adjust IMPORTING !ii_repo TYPE REF TO zif_abapgit_repo @@ -45,6 +60,7 @@ CLASS zcl_abapgit_objects_check DEFINITION !ct_results TYPE zif_abapgit_definitions=>ty_results_tt RAISING zcx_abapgit_exception. + CLASS-METHODS warning_package_find IMPORTING !it_results TYPE zif_abapgit_definitions=>ty_results_tt @@ -53,17 +69,38 @@ CLASS zcl_abapgit_objects_check DEFINITION VALUE(rt_overwrite) TYPE zif_abapgit_definitions=>ty_overwrite_tt RAISING zcx_abapgit_exception. + + CLASS-METHODS warning_data_loss_adjust + IMPORTING + !ii_repo TYPE REF TO zif_abapgit_repo + !it_overwrite TYPE zif_abapgit_definitions=>ty_overwrite_tt + CHANGING + !ct_results TYPE zif_abapgit_definitions=>ty_results_tt + RAISING + zcx_abapgit_exception. + + CLASS-METHODS warning_data_loss_find + IMPORTING + !ii_repo TYPE REF TO zif_abapgit_repo + !it_results TYPE zif_abapgit_definitions=>ty_results_tt + RETURNING + VALUE(rt_overwrite) TYPE zif_abapgit_definitions=>ty_overwrite_tt + RAISING + zcx_abapgit_exception. + CLASS-METHODS determine_transport_request IMPORTING ii_repo TYPE REF TO zif_abapgit_repo iv_transport_type TYPE zif_abapgit_definitions=>ty_transport_type RETURNING VALUE(rv_transport_request) TYPE trkorr. + CLASS-METHODS check_multiple_files IMPORTING !it_results TYPE zif_abapgit_definitions=>ty_results_tt RAISING zcx_abapgit_exception. + ENDCLASS. @@ -71,8 +108,36 @@ ENDCLASS. CLASS zcl_abapgit_objects_check IMPLEMENTATION. + METHOD adjust_result. + + DATA ls_overwrite TYPE zif_abapgit_definitions=>ty_overwrite. + + FIELD-SYMBOLS TYPE zif_abapgit_definitions=>ty_overwrite. + + LOOP AT it_overwrite_new ASSIGNING . + + READ TABLE it_overwrite_old INTO ls_overwrite WITH TABLE KEY object_type_and_name + COMPONENTS obj_type = -obj_type obj_name = -obj_name. + IF sy-subrc <> 0 OR ls_overwrite-decision IS INITIAL. + zcx_abapgit_exception=>raise( |{ iv_txt } { -obj_type } { -obj_name } undecided| ). + ENDIF. + + IF ls_overwrite-decision = zif_abapgit_definitions=>c_no. + DELETE ct_results WHERE obj_type = -obj_type AND obj_name = -obj_name. + ASSERT sy-subrc = 0. + ENDIF. + + ENDLOOP. + + ENDMETHOD. + + METHOD checks_adjust. + " Make sure to get the current status, as something might have changed in the meanwhile + " - Remove objects from results that were deselected in confirmation popup + " - Raise exception if an object has no decision of what to do + warning_overwrite_adjust( EXPORTING it_overwrite = is_checks-overwrite @@ -86,6 +151,13 @@ CLASS zcl_abapgit_objects_check IMPLEMENTATION. CHANGING ct_results = ct_results ). + warning_data_loss_adjust( + EXPORTING + ii_repo = ii_repo + it_overwrite = is_checks-data_loss + CHANGING + ct_results = ct_results ). + ENDMETHOD. @@ -144,6 +216,10 @@ CLASS zcl_abapgit_objects_check IMPLEMENTATION. ii_repo = ii_repo it_results = lt_results ). + rs_checks-data_loss = warning_data_loss_find( + ii_repo = ii_repo + it_results = lt_results ). + IF lines( lt_results ) > 0. li_package = zcl_abapgit_factory=>get_sap_package( ii_repo->get_package( ) ). rs_checks-transport-required = li_package->are_changes_recorded_in_tr_req( ). @@ -174,33 +250,62 @@ CLASS zcl_abapgit_objects_check IMPLEMENTATION. ENDMETHOD. - METHOD warning_overwrite_adjust. + METHOD warning_data_loss_adjust. - DATA: lt_overwrite LIKE it_overwrite, - ls_overwrite LIKE LINE OF lt_overwrite. + DATA lt_overwrite LIKE it_overwrite. - FIELD-SYMBOLS: LIKE LINE OF lt_overwrite. + lt_overwrite = warning_data_loss_find( + it_results = ct_results + ii_repo = ii_repo ). + + adjust_result( + EXPORTING + iv_txt = 'Potential data loss for' + it_overwrite_old = it_overwrite + it_overwrite_new = lt_overwrite + CHANGING + ct_results = ct_results ). + + ENDMETHOD. -* make sure to get the current status, as something might have changed in the meanwhile - lt_overwrite = warning_overwrite_find( ct_results ). + METHOD warning_data_loss_find. - LOOP AT lt_overwrite ASSIGNING . + DATA: + ls_item TYPE zif_abapgit_definitions=>ty_item, + li_comparator TYPE REF TO zif_abapgit_comparator, + lv_result TYPE string. - READ TABLE it_overwrite INTO ls_overwrite - WITH TABLE KEY object_type_and_name - COMPONENTS obj_type = -obj_type - obj_name = -obj_name. - IF sy-subrc <> 0 OR ls_overwrite-decision IS INITIAL. - zcx_abapgit_exception=>raise( |Overwrite { -obj_type } { - -obj_name } undecided| ). + FIELD-SYMBOLS: + LIKE LINE OF it_results, + LIKE LINE OF rt_overwrite. + + " For optimal performance, we limit here by object type since we know that only TABL has a comparator + " If there are other object types in the future, extend the where clause or remove the check on object type. + LOOP AT it_results ASSIGNING WHERE match IS INITIAL AND filename CP '*.xml' + AND obj_type = 'TABL' ##PRIMKEY[SEC_KEY]. + + CLEAR ls_item. + MOVE-CORRESPONDING TO ls_item. + + li_comparator = zcl_abapgit_objects_compare=>get_comparator( ls_item ). + IF NOT li_comparator IS BOUND. + RETURN. ENDIF. - IF ls_overwrite-decision = zif_abapgit_definitions=>c_no. - DELETE ct_results WHERE - obj_type = -obj_type AND - obj_name = -obj_name. - ASSERT sy-subrc = 0. + lv_result = zcl_abapgit_objects_compare=>get_result( + ii_comparator = li_comparator + iv_filename = -filename + it_local = ii_repo->get_files_local( ) + it_remote = ii_repo->get_files_remote( iv_ignore_files = abap_true ) ). + + IF lv_result IS NOT INITIAL. + APPEND INITIAL LINE TO rt_overwrite ASSIGNING . + MOVE-CORRESPONDING TO . + -devclass = -package. + -action = zif_abapgit_objects=>c_deserialize_action-data_loss. + -icon = icon_warning. + -text = lv_result. ENDIF. ENDLOOP. @@ -208,6 +313,23 @@ CLASS zcl_abapgit_objects_check IMPLEMENTATION. ENDMETHOD. + METHOD warning_overwrite_adjust. + + DATA lt_overwrite LIKE it_overwrite. + + lt_overwrite = warning_overwrite_find( ct_results ). + + adjust_result( + EXPORTING + iv_txt = 'Overwrite of object' + it_overwrite_old = it_overwrite + it_overwrite_new = lt_overwrite + CHANGING + ct_results = ct_results ). + + ENDMETHOD. + + METHOD warning_overwrite_find. DATA: @@ -301,36 +423,19 @@ CLASS zcl_abapgit_objects_check IMPLEMENTATION. METHOD warning_package_adjust. - DATA: lt_overwrite LIKE it_overwrite, - ls_overwrite LIKE LINE OF lt_overwrite. + DATA lt_overwrite LIKE it_overwrite. - FIELD-SYMBOLS: LIKE LINE OF lt_overwrite. - - -* make sure to get the current status, as something might have changed in the meanwhile lt_overwrite = warning_package_find( - it_results = ct_results - ii_repo = ii_repo ). + it_results = ct_results + ii_repo = ii_repo ). - LOOP AT lt_overwrite ASSIGNING . - - READ TABLE it_overwrite INTO ls_overwrite - WITH TABLE KEY object_type_and_name - COMPONENTS obj_type = -obj_type - obj_name = -obj_name. - IF sy-subrc <> 0 OR ls_overwrite-decision IS INITIAL. - zcx_abapgit_exception=>raise( |Overwrite of package { -obj_type } { - -obj_name } undecided| ). - ENDIF. - - IF ls_overwrite-decision = zif_abapgit_definitions=>c_no. - DELETE ct_results WHERE - obj_type = -obj_type AND - obj_name = -obj_name. - ASSERT sy-subrc = 0. - ENDIF. - - ENDLOOP. + adjust_result( + EXPORTING + iv_txt = 'Overwrite of package' + it_overwrite_old = it_overwrite + it_overwrite_new = lt_overwrite + CHANGING + ct_results = ct_results ). ENDMETHOD. @@ -361,7 +466,7 @@ CLASS zcl_abapgit_objects_check IMPLEMENTATION. iv_obj_name = -obj_name ). IF NOT ls_tadir IS INITIAL AND ls_tadir-devclass <> lv_package. -* overwriting object from different package than expected + " overwriting object from different package than expected CLEAR ls_overwrite. CONCATENATE -lstate -rstate INTO ls_overwrite-state RESPECTING BLANKS. REPLACE ALL OCCURRENCES OF ` ` IN ls_overwrite-state WITH '_'. diff --git a/src/objects/core/zcl_abapgit_objects_compare.clas.abap b/src/objects/core/zcl_abapgit_objects_compare.clas.abap new file mode 100644 index 000000000..28571c4b8 --- /dev/null +++ b/src/objects/core/zcl_abapgit_objects_compare.clas.abap @@ -0,0 +1,114 @@ +CLASS zcl_abapgit_objects_compare DEFINITION + PUBLIC + FINAL + CREATE PUBLIC. + + PUBLIC SECTION. + + CLASS-METHODS get_comparator + IMPORTING + is_item TYPE zif_abapgit_definitions=>ty_item + RETURNING + VALUE(ri_comparator) TYPE REF TO zif_abapgit_comparator. + + CLASS-METHODS get_result + IMPORTING + ii_comparator TYPE REF TO zif_abapgit_comparator + iv_filename TYPE string + it_local TYPE zif_abapgit_definitions=>ty_files_item_tt + it_remote TYPE zif_abapgit_git_definitions=>ty_files_tt + RETURNING + VALUE(rv_result) TYPE string + RAISING + zcx_abapgit_exception. + + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS zcl_abapgit_objects_compare IMPLEMENTATION. + + + METHOD get_comparator. + + DATA lv_class_name TYPE seoclsname. + + CONCATENATE 'ZCL_ABAPGIT_OBJECT_' is_item-obj_type '_COMPAR' INTO lv_class_name. + + IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_true. + " Prevent accidental usage of object handlers in the developer version + lv_class_name = |\\PROGRAM={ sy-repid }\\CLASS={ lv_class_name }|. + ENDIF. + + TRY. + CREATE OBJECT ri_comparator TYPE (lv_class_name) + EXPORTING + is_item = is_item. + CATCH cx_sy_create_object_error ##NO_HANDLER. + " No instance, no comparator for this object type + ENDTRY. + + ENDMETHOD. + + + METHOD get_result. + + " this method is used for comparing local with remote objects + " before pull, this is useful eg. when overwriting a TABL object. + " only the main XML file is used for comparison + + DATA: + ls_remote_file TYPE zif_abapgit_git_definitions=>ty_file, + ls_local_file TYPE zif_abapgit_definitions=>ty_file_item, + li_remote_version TYPE REF TO zif_abapgit_xml_input, + li_local_version TYPE REF TO zif_abapgit_xml_input, + li_log TYPE REF TO zif_abapgit_log, + ls_msg TYPE zif_abapgit_log=>ty_log_out, + lt_msg TYPE zif_abapgit_log=>ty_log_outs, + ls_result TYPE zif_abapgit_comparator=>ty_result. + + " REMOTE + " if file does not exist in remote, we don't need to validate + READ TABLE it_remote WITH KEY file COMPONENTS filename = iv_filename INTO ls_remote_file. + IF sy-subrc <> 0. + RETURN. + ENDIF. + + CREATE OBJECT li_remote_version TYPE zcl_abapgit_xml_input + EXPORTING + iv_xml = zcl_abapgit_convert=>xstring_to_string_utf8( ls_remote_file-data ) + iv_filename = iv_filename. + + " LOCAL + " if file does not exist locally, we don't need to validate + READ TABLE it_local WITH KEY file-filename = iv_filename INTO ls_local_file. + IF sy-subrc <> 0. + RETURN. + ENDIF. + + CREATE OBJECT li_local_version TYPE zcl_abapgit_xml_input + EXPORTING + iv_xml = zcl_abapgit_convert=>xstring_to_string_utf8( ls_local_file-file-data ) + iv_filename = iv_filename. + + " COMPARE + CREATE OBJECT li_log TYPE zcl_abapgit_log. + + ls_result = ii_comparator->compare( + ii_local = li_local_version + ii_remote = li_remote_version + ii_log = li_log ). + + rv_result = ls_result-text. + + " To keep it simple, append the log messages to the result + lt_msg = li_log->get_messages( ). + + LOOP AT lt_msg INTO ls_msg. + rv_result = |{ rv_result }, { ls_msg-text }|. + ENDLOOP. + + ENDMETHOD. +ENDCLASS. diff --git a/src/objects/core/zcl_abapgit_objects_compare.clas.xml b/src/objects/core/zcl_abapgit_objects_compare.clas.xml new file mode 100644 index 000000000..facaed18b --- /dev/null +++ b/src/objects/core/zcl_abapgit_objects_compare.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_ABAPGIT_OBJECTS_COMPARE + E + abapGit - Objects Comparator + 1 + X + X + X + + + + diff --git a/src/objects/tabl/zcl_abapgit_object_tabl.clas.abap b/src/objects/tabl/zcl_abapgit_object_tabl.clas.abap index dbd329525..f020dfd67 100644 --- a/src/objects/tabl/zcl_abapgit_object_tabl.clas.abap +++ b/src/objects/tabl/zcl_abapgit_object_tabl.clas.abap @@ -866,24 +866,8 @@ CLASS zcl_abapgit_object_tabl IMPLEMENTATION. METHOD zif_abapgit_object~get_comparator. - - DATA: li_local_version_output TYPE REF TO zif_abapgit_xml_output, - li_local_version_input TYPE REF TO zif_abapgit_xml_input. - - - CREATE OBJECT li_local_version_output TYPE zcl_abapgit_xml_output. - - zif_abapgit_object~serialize( li_local_version_output ). - - CREATE OBJECT li_local_version_input - TYPE zcl_abapgit_xml_input - EXPORTING - iv_xml = li_local_version_output->render( ). - - CREATE OBJECT ri_comparator TYPE zcl_abapgit_object_tabl_compar - EXPORTING - ii_local = li_local_version_input. - + " Moved to zcl_abapgit_objects_compare + RETURN. ENDMETHOD. diff --git a/src/objects/tabl/zcl_abapgit_object_tabl_compar.clas.abap b/src/objects/tabl/zcl_abapgit_object_tabl_compar.clas.abap index 3a5bccd54..79cb39e1c 100644 --- a/src/objects/tabl/zcl_abapgit_object_tabl_compar.clas.abap +++ b/src/objects/tabl/zcl_abapgit_object_tabl_compar.clas.abap @@ -1,24 +1,25 @@ CLASS zcl_abapgit_object_tabl_compar DEFINITION PUBLIC - CREATE PUBLIC . + CREATE PUBLIC. PUBLIC SECTION. - INTERFACES zif_abapgit_comparator . + INTERFACES zif_abapgit_comparator. METHODS constructor IMPORTING - !ii_local TYPE REF TO zif_abapgit_xml_input. + !is_item TYPE zif_abapgit_definitions=>ty_item. + PROTECTED SECTION. TYPES: ty_founds TYPE STANDARD TABLE OF rsfindlst - WITH NON-UNIQUE DEFAULT KEY . + WITH NON-UNIQUE DEFAULT KEY. TYPES: ty_seu_obj TYPE STANDARD TABLE OF seu_obj - WITH NON-UNIQUE DEFAULT KEY . + WITH NON-UNIQUE DEFAULT KEY. - DATA mi_local TYPE REF TO zif_abapgit_xml_input. + DATA ms_item TYPE zif_abapgit_definitions=>ty_item. METHODS get_where_used_recursive IMPORTING @@ -29,14 +30,16 @@ CLASS zcl_abapgit_object_tabl_compar DEFINITION RETURNING VALUE(rt_founds_all) TYPE ty_founds RAISING - zcx_abapgit_exception . + zcx_abapgit_exception. + METHODS is_structure_used_in_db_table IMPORTING !iv_object_name TYPE dd02v-tabname RETURNING VALUE(rv_is_structure_used_in_db_tab) TYPE abap_bool RAISING - zcx_abapgit_exception . + zcx_abapgit_exception. + METHODS validate IMPORTING !ii_remote_version TYPE REF TO zif_abapgit_xml_input @@ -45,19 +48,19 @@ CLASS zcl_abapgit_object_tabl_compar DEFINITION RETURNING VALUE(rv_message) TYPE string RAISING - zcx_abapgit_exception . - PRIVATE SECTION. + zcx_abapgit_exception. + PRIVATE SECTION. ENDCLASS. -CLASS ZCL_ABAPGIT_OBJECT_TABL_COMPAR IMPLEMENTATION. +CLASS zcl_abapgit_object_tabl_compar IMPLEMENTATION. METHOD constructor. - mi_local = ii_local. + ms_item = is_item. ENDMETHOD. @@ -152,7 +155,6 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL_COMPAR IMPLEMENTATION. lt_current_table_fields TYPE TABLE OF dd03p, ls_current_table_field LIKE LINE OF lt_current_table_fields, ls_dd02v TYPE dd02v, - ls_item TYPE zif_abapgit_definitions=>ty_item, lv_inconsistent TYPE abap_bool. FIELD-SYMBOLS TYPE abap_bool. @@ -176,18 +178,15 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL_COMPAR IMPLEMENTATION. ii_remote_version->read( EXPORTING - iv_name = 'DD03P_TABLE' + iv_name = 'DD03P_TABLE' CHANGING - cg_data = lt_previous_table_fields ). + cg_data = lt_previous_table_fields ). ii_local_version->read( EXPORTING - iv_name = 'DD03P_TABLE' + iv_name = 'DD03P_TABLE' CHANGING - cg_data = lt_current_table_fields ). - - ls_item-obj_name = ls_dd02v-tabname. - ls_item-obj_type = 'TABL'. + cg_data = lt_current_table_fields ). LOOP AT lt_previous_table_fields INTO ls_previous_table_field. READ TABLE lt_current_table_fields WITH KEY fieldname = ls_previous_table_field-fieldname @@ -199,37 +198,34 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL_COMPAR IMPLEMENTATION. iv_msg = |Field { ls_previous_table_field-fieldname }: | & |Data element changed from { ls_previous_table_field-rollname } | & |to { ls_current_table_field-rollname }| - is_item = ls_item ). + is_item = ms_item ). ELSEIF ls_current_table_field-rollname IS NOT INITIAL. ii_log->add_info( iv_msg = |Field { ls_previous_table_field-fieldname }: | & |Data type changed from internal type | & |{ ls_previous_table_field-inttype }(length { ls_previous_table_field-intlen }) | & |to data element { ls_current_table_field-rollname }| - is_item = ls_item ). + is_item = ms_item ). ELSEIF ls_previous_table_field-rollname IS NOT INITIAL. ii_log->add_info( iv_msg = |Field { ls_previous_table_field-fieldname }: | & |Data type changed from date element { ls_previous_table_field-rollname } | & |to internal type | & |{ ls_current_table_field-inttype }(length { ls_current_table_field-intlen })| - is_item = ls_item ). + is_item = ms_item ). ENDIF. "TODO: perform several other checks, e.g. field length truncated, ... lv_inconsistent = abap_true. ENDIF. ELSE. ii_log->add_info( iv_msg = |Field { ls_previous_table_field-fieldname } removed| - is_item = ls_item ). + is_item = ms_item ). lv_inconsistent = abap_true. ENDIF. ENDLOOP. - IF lv_inconsistent = abap_true. - rv_message = |Database Table { ls_dd02v-tabname }: Fields were changed. This may lead to inconsistencies!|. - ENDIF. - IF NOT rv_message IS INITIAL. - rv_message = |Database Table { ls_dd02v-tabname }: { rv_message }|. + IF lv_inconsistent = abap_true. + rv_message = 'Fields were changed!'. ENDIF. ENDMETHOD. @@ -237,9 +233,13 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL_COMPAR IMPLEMENTATION. METHOD zif_abapgit_comparator~compare. + IF zcl_abapgit_objects=>exists( ms_item ) = abap_false. + RETURN. + ENDIF. + rs_result-text = validate( ii_remote_version = ii_remote - ii_local_version = mi_local + ii_local_version = ii_local ii_log = ii_log ). ENDMETHOD. diff --git a/src/objects/zcl_abapgit_objects.clas.abap b/src/objects/zcl_abapgit_objects.clas.abap index de2088479..afb5e7c52 100644 --- a/src/objects/zcl_abapgit_objects.clas.abap +++ b/src/objects/zcl_abapgit_objects.clas.abap @@ -120,14 +120,6 @@ CLASS zcl_abapgit_objects DEFINITION !iv_transport TYPE trkorr RAISING zcx_abapgit_exception . - CLASS-METHODS compare_remote_to_local - IMPORTING - !ii_object TYPE REF TO zif_abapgit_object - !it_remote TYPE zif_abapgit_git_definitions=>ty_files_tt - !is_result TYPE zif_abapgit_definitions=>ty_result - !ii_log TYPE REF TO zif_abapgit_log - RAISING - zcx_abapgit_exception . CLASS-METHODS deserialize_steps IMPORTING !it_steps TYPE zif_abapgit_objects=>ty_step_data_tt @@ -386,80 +378,6 @@ CLASS zcl_abapgit_objects IMPLEMENTATION. ENDMETHOD. - METHOD compare_remote_to_local. -* this method is used for comparing local with remote objects -* before pull, this is useful eg. when overwriting a TABL object. -* only the main XML file is used for comparison - - DATA: ls_remote_file TYPE zif_abapgit_git_definitions=>ty_file, - li_remote_version TYPE REF TO zif_abapgit_xml_input, - lv_count TYPE i, - ls_result TYPE zif_abapgit_comparator=>ty_result, - lv_answer TYPE string, - li_comparator TYPE REF TO zif_abapgit_comparator, - ls_item TYPE zif_abapgit_definitions=>ty_item. - - FIND ALL OCCURRENCES OF '.' IN is_result-filename MATCH COUNT lv_count. - - IF is_result-filename CS '.XML' AND lv_count = 2. - IF ii_object->exists( ) = abap_false. - RETURN. - ENDIF. - - READ TABLE it_remote WITH KEY file - COMPONENTS filename = is_result-filename INTO ls_remote_file. - IF sy-subrc <> 0. "if file does not exist in remote, we don't need to validate - RETURN. - ENDIF. - - li_comparator = ii_object->get_comparator( ). - IF NOT li_comparator IS BOUND. - RETURN. - ENDIF. - - CREATE OBJECT li_remote_version - TYPE zcl_abapgit_xml_input - EXPORTING - iv_xml = zcl_abapgit_convert=>xstring_to_string_utf8( ls_remote_file-data ) - iv_filename = ls_remote_file-filename. - - ls_result = li_comparator->compare( ii_remote = li_remote_version - ii_log = ii_log ). - IF ls_result-text IS INITIAL. - RETURN. - ENDIF. - - "log comparison result - ls_item-obj_type = is_result-obj_type. - ls_item-obj_name = is_result-obj_name. - ii_log->add_warning( iv_msg = ls_result-text - is_item = ls_item ). - - "continue or abort? - IF zcl_abapgit_ui_factory=>get_frontend_services( )->gui_is_available( ) = abap_true. - lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm( - iv_titlebar = 'Warning' - iv_text_question = ls_result-text - iv_text_button_1 = 'Pull Anyway' - iv_icon_button_1 = 'ICON_OKAY' - iv_text_button_2 = 'Cancel' - iv_icon_button_2 = 'ICON_CANCEL' - iv_default_button = '2' - iv_display_cancel_button = abap_false ). - - IF lv_answer = '2'. - zcx_abapgit_exception=>raise( |Deserialization for object { is_result-obj_name } | & - |(type { is_result-obj_type }) aborted by user| ). - ENDIF. - ELSE. - zcx_abapgit_exception=>raise( |Deserialization for object { is_result-obj_name } | & - |(type { is_result-obj_type }) aborted, user decision required| ). - ENDIF. - ENDIF. - - ENDMETHOD. - - METHOD create_object. DATA: lv_class_name TYPE string, @@ -803,12 +721,6 @@ CLASS zcl_abapgit_objects IMPLEMENTATION. io_files = lo_files io_i18n_params = lo_i18n_params ). - compare_remote_to_local( - ii_object = li_obj - it_remote = lt_remote - is_result = - ii_log = ii_log ). - "get required steps for deserialize the object lt_steps_id = li_obj->get_deserialize_steps( ). diff --git a/src/objects/zif_abapgit_comparator.intf.abap b/src/objects/zif_abapgit_comparator.intf.abap index 3cdfda38b..5856e4805 100644 --- a/src/objects/zif_abapgit_comparator.intf.abap +++ b/src/objects/zif_abapgit_comparator.intf.abap @@ -9,6 +9,7 @@ INTERFACE zif_abapgit_comparator METHODS compare IMPORTING + !ii_local TYPE REF TO zif_abapgit_xml_input !ii_remote TYPE REF TO zif_abapgit_xml_input !ii_log TYPE REF TO zif_abapgit_log RETURNING diff --git a/src/objects/zif_abapgit_objects.intf.abap b/src/objects/zif_abapgit_objects.intf.abap index e20f4bd19..0218ba397 100644 --- a/src/objects/zif_abapgit_objects.intf.abap +++ b/src/objects/zif_abapgit_objects.intf.abap @@ -43,6 +43,7 @@ INTERFACE zif_abapgit_objects PUBLIC. delete TYPE i VALUE 4, delete_add TYPE i VALUE 5, packmove TYPE i VALUE 6, + data_loss TYPE i VALUE 7, END OF c_deserialize_action. ENDINTERFACE. diff --git a/src/persist/zcl_abapgit_persist_settings.clas.abap b/src/persist/zcl_abapgit_persist_settings.clas.abap index 125dc3af9..7c9a1b55e 100644 --- a/src/persist/zcl_abapgit_persist_settings.clas.abap +++ b/src/persist/zcl_abapgit_persist_settings.clas.abap @@ -14,7 +14,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_PERSIST_SETTINGS IMPLEMENTATION. +CLASS zcl_abapgit_persist_settings IMPLEMENTATION. METHOD zif_abapgit_persist_settings~modify. @@ -32,7 +32,7 @@ CLASS ZCL_ABAPGIT_PERSIST_SETTINGS IMPLEMENTATION. ls_user_settings = io_settings->get_user_settings( ). - zcl_abapgit_persistence_user=>get_instance( )->set_settings( ls_user_settings ). + zcl_abapgit_persist_factory=>get_user( )->set_settings( ls_user_settings ). " Settings have been modified: Update Buffered Settings IF mo_settings IS BOUND. @@ -61,7 +61,7 @@ CLASS ZCL_ABAPGIT_PERSIST_SETTINGS IMPLEMENTATION. iv_type = zcl_abapgit_persistence_db=>c_type_settings iv_value = '' ) ). - ro_settings->set_user_settings( zcl_abapgit_persistence_user=>get_instance( )->get_settings( ) ). + ro_settings->set_user_settings( zcl_abapgit_persist_factory=>get_user( )->get_settings( ) ). CATCH zcx_abapgit_not_found zcx_abapgit_exception. diff --git a/src/persist/zcl_abapgit_persistence_user.clas.abap b/src/persist/zcl_abapgit_persistence_user.clas.abap index 57155926b..9169b1221 100644 --- a/src/persist/zcl_abapgit_persistence_user.clas.abap +++ b/src/persist/zcl_abapgit_persistence_user.clas.abap @@ -7,13 +7,6 @@ CLASS zcl_abapgit_persistence_user DEFINITION INTERFACES zif_abapgit_persist_user . - CLASS-METHODS get_instance - IMPORTING - !iv_user TYPE sy-uname DEFAULT sy-uname - RETURNING - VALUE(ri_user) TYPE REF TO zif_abapgit_persist_user - RAISING - zcx_abapgit_exception . METHODS constructor IMPORTING !iv_user TYPE sy-uname DEFAULT sy-uname. @@ -48,7 +41,6 @@ CLASS zcl_abapgit_persistence_user DEFINITION DATA mv_user TYPE sy-uname . DATA ms_user TYPE ty_user. - CLASS-DATA gi_current_user TYPE REF TO zif_abapgit_persist_user . METHODS from_xml IMPORTING @@ -107,22 +99,6 @@ CLASS zcl_abapgit_persistence_user IMPLEMENTATION. ENDMETHOD. - METHOD get_instance. - - IF iv_user = sy-uname ##USER_OK. - IF gi_current_user IS NOT BOUND. - CREATE OBJECT gi_current_user TYPE zcl_abapgit_persistence_user. - ENDIF. - ri_user = gi_current_user. - ELSE. - CREATE OBJECT ri_user TYPE zcl_abapgit_persistence_user - EXPORTING - iv_user = iv_user. - ENDIF. - - ENDMETHOD. - - METHOD read. DATA: lv_xml TYPE string. diff --git a/src/persist/zcl_abapgit_persistence_user.clas.testclasses.abap b/src/persist/zcl_abapgit_persistence_user.clas.testclasses.abap index 87701c368..5e12df4b8 100644 --- a/src/persist/zcl_abapgit_persistence_user.clas.testclasses.abap +++ b/src/persist/zcl_abapgit_persistence_user.clas.testclasses.abap @@ -27,12 +27,12 @@ CLASS ltcl_user IMPLEMENTATION. DATA: lv_user TYPE string. - mi_user = zcl_abapgit_persistence_user=>get_instance( c_abap_user ). + mi_user = zcl_abapgit_persist_factory=>get_user( c_abap_user ). mi_user->set_default_git_user_name( c_git_user ). FREE mi_user. - mi_user = zcl_abapgit_persistence_user=>get_instance( c_abap_user ). + mi_user = zcl_abapgit_persist_factory=>get_user( c_abap_user ). lv_user = mi_user->get_default_git_user_name( ). cl_abap_unit_assert=>assert_equals( @@ -52,12 +52,12 @@ CLASS ltcl_user IMPLEMENTATION. RETURN. " can't test ENDIF. - mi_user = zcl_abapgit_persistence_user=>get_instance( c_abap_user ). + mi_user = zcl_abapgit_persist_factory=>get_user( c_abap_user ). mi_user->set_repo_show( lv_repo_key ). FREE mi_user. - mi_user = zcl_abapgit_persistence_user=>get_instance( c_abap_user ). + mi_user = zcl_abapgit_persist_factory=>get_user( c_abap_user ). lv_key = mi_user->get_repo_show( ). cl_abap_unit_assert=>assert_equals( @@ -70,13 +70,13 @@ CLASS ltcl_user IMPLEMENTATION. DATA: lv_login TYPE string. - mi_user = zcl_abapgit_persistence_user=>get_instance( c_abap_user ). + mi_user = zcl_abapgit_persist_factory=>get_user( c_abap_user ). mi_user->set_repo_login( iv_url = c_repo_url iv_login = c_git_user ). FREE mi_user. - mi_user = zcl_abapgit_persistence_user=>get_instance( c_abap_user ). + mi_user = zcl_abapgit_persist_factory=>get_user( c_abap_user ). lv_login = mi_user->get_repo_login( c_repo_url ). cl_abap_unit_assert=>assert_equals( @@ -91,12 +91,12 @@ CLASS ltcl_user IMPLEMENTATION. ls_settings-show_default_repo = abap_true. - mi_user = zcl_abapgit_persistence_user=>get_instance( c_abap_user ). + mi_user = zcl_abapgit_persist_factory=>get_user( c_abap_user ). mi_user->set_settings( ls_settings ). FREE mi_user. - mi_user = zcl_abapgit_persistence_user=>get_instance( c_abap_user ). + mi_user = zcl_abapgit_persist_factory=>get_user( c_abap_user ). ls_settings = mi_user->get_settings( ). cl_abap_unit_assert=>assert_equals( diff --git a/src/repo/utils/zcl_abapgit_repo_news.clas.abap b/src/repo/utils/zcl_abapgit_repo_news.clas.abap index 46e4a72bb..cbad4dfbb 100644 --- a/src/repo/utils/zcl_abapgit_repo_news.clas.abap +++ b/src/repo/utils/zcl_abapgit_repo_news.clas.abap @@ -146,7 +146,7 @@ CLASS zcl_abapgit_repo_news IMPLEMENTATION. RETURN. ENDIF. - lv_last_seen = zcl_abapgit_persistence_user=>get_instance( )->get_repo_last_change_seen( lv_url ). + lv_last_seen = zcl_abapgit_persist_factory=>get_user( )->get_repo_last_change_seen( lv_url ). TRY. " Find changelog lt_remote = ii_repo->get_files_remote( ). @@ -170,7 +170,7 @@ CLASS zcl_abapgit_repo_news IMPLEMENTATION. ENDLOOP. IF ro_instance IS BOUND AND lv_last_seen <> ro_instance->latest_version( ). - zcl_abapgit_persistence_user=>get_instance( )->set_repo_last_change_seen( + zcl_abapgit_persist_factory=>get_user( )->set_repo_last_change_seen( iv_url = lv_url iv_version = ro_instance->latest_version( ) ). ENDIF. diff --git a/src/repo/zcl_abapgit_repo_srv.clas.abap b/src/repo/zcl_abapgit_repo_srv.clas.abap index 1a13e46fa..817c0961b 100644 --- a/src/repo/zcl_abapgit_repo_srv.clas.abap +++ b/src/repo/zcl_abapgit_repo_srv.clas.abap @@ -178,7 +178,7 @@ CLASS zcl_abapgit_repo_srv IMPLEMENTATION. FIELD-SYMBOLS: LIKE LINE OF lt_list. lo_repo_db = zcl_abapgit_persist_factory=>get_repo( ). - lt_user_favorites = zcl_abapgit_persistence_user=>get_instance( )->get_favorites( ). + lt_user_favorites = zcl_abapgit_persist_factory=>get_user( )->get_favorites( ). lt_list = lo_repo_db->list_by_keys( lt_user_favorites ). SORT lt_list BY package. @@ -330,8 +330,8 @@ CLASS zcl_abapgit_repo_srv IMPLEMENTATION. zcl_abapgit_persist_factory=>get_repo_cs( )->delete( ii_repo->get_key( ) ). " If favorite, remove it - IF zcl_abapgit_persistence_user=>get_instance( )->is_favorite_repo( ii_repo->get_key( ) ) = abap_true. - zcl_abapgit_persistence_user=>get_instance( )->toggle_favorite( ii_repo->get_key( ) ). + IF zcl_abapgit_persist_factory=>get_user( )->is_favorite_repo( ii_repo->get_key( ) ) = abap_true. + zcl_abapgit_persist_factory=>get_user( )->toggle_favorite( ii_repo->get_key( ) ). ENDIF. DELETE TABLE mt_list FROM ii_repo. @@ -532,7 +532,7 @@ CLASS zcl_abapgit_repo_srv IMPLEMENTATION. DATA lt_user_favorites TYPE zif_abapgit_persist_user=>ty_favorites. DATA li_repo TYPE REF TO zif_abapgit_repo. - lt_user_favorites = zcl_abapgit_persistence_user=>get_instance( )->get_favorites( ). + lt_user_favorites = zcl_abapgit_persist_factory=>get_user( )->get_favorites( ). SORT lt_user_favorites BY table_line. IF mv_init = abap_false OR mv_only_favorites = abap_false. diff --git a/src/ui/lib/zcl_abapgit_gui_chunk_lib.clas.abap b/src/ui/lib/zcl_abapgit_gui_chunk_lib.clas.abap index a658ee6f7..e7ffdf3a7 100644 --- a/src/ui/lib/zcl_abapgit_gui_chunk_lib.clas.abap +++ b/src/ui/lib/zcl_abapgit_gui_chunk_lib.clas.abap @@ -1013,7 +1013,7 @@ CLASS zcl_abapgit_gui_chunk_lib IMPLEMENTATION. ri_html->add( '' ). " Fav - IF abap_true = zcl_abapgit_persistence_user=>get_instance( )->is_favorite_repo( ii_repo->get_key( ) ). + IF abap_true = zcl_abapgit_persist_factory=>get_user( )->is_favorite_repo( ii_repo->get_key( ) ). lv_icon = 'star/blue'. ELSE. lv_icon = 'star/grey'. diff --git a/src/ui/pages/zcl_abapgit_gui_page_commit.clas.abap b/src/ui/pages/zcl_abapgit_gui_page_commit.clas.abap index 387954a76..1f592b0af 100644 --- a/src/ui/pages/zcl_abapgit_gui_page_commit.clas.abap +++ b/src/ui/pages/zcl_abapgit_gui_page_commit.clas.abap @@ -233,7 +233,7 @@ CLASS zcl_abapgit_gui_page_commit IMPLEMENTATION. DATA li_user TYPE REF TO zif_abapgit_persist_user. - li_user = zcl_abapgit_persistence_user=>get_instance( ). + li_user = zcl_abapgit_persist_factory=>get_user( ). rv_email = li_user->get_repo_git_user_email( mi_repo_online->get_url( ) ). IF rv_email IS INITIAL. @@ -251,7 +251,7 @@ CLASS zcl_abapgit_gui_page_commit IMPLEMENTATION. DATA li_user TYPE REF TO zif_abapgit_persist_user. - li_user = zcl_abapgit_persistence_user=>get_instance( ). + li_user = zcl_abapgit_persist_factory=>get_user( ). rv_user = li_user->get_repo_git_user_name( mi_repo_online->get_url( ) ). IF rv_user IS INITIAL. diff --git a/src/ui/pages/zcl_abapgit_gui_page_diff_base.clas.abap b/src/ui/pages/zcl_abapgit_gui_page_diff_base.clas.abap index c9556f017..bd4001320 100644 --- a/src/ui/pages/zcl_abapgit_gui_page_diff_base.clas.abap +++ b/src/ui/pages/zcl_abapgit_gui_page_diff_base.clas.abap @@ -620,7 +620,7 @@ CLASS zcl_abapgit_gui_page_diff_base IMPLEMENTATION. DATA: lv_ts TYPE timestamp. super->constructor( ). - mv_unified = zcl_abapgit_persistence_user=>get_instance( )->get_diff_unified( ). + mv_unified = zcl_abapgit_persist_factory=>get_user( )->get_diff_unified( ). mv_repo_key = iv_key. mi_repo = zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). @@ -654,7 +654,7 @@ CLASS zcl_abapgit_gui_page_diff_base IMPLEMENTATION. METHOD get_page_layout. TRY. - IF zcl_abapgit_persistence_user=>get_instance( )->get_diff_unified( ) = abap_true. + IF zcl_abapgit_persist_factory=>get_user( )->get_diff_unified( ) = abap_true. rv_page_layout = zcl_abapgit_gui_page=>c_page_layout-centered. ELSE. rv_page_layout = zcl_abapgit_gui_page=>c_page_layout-full_width. @@ -1294,7 +1294,7 @@ CLASS zcl_abapgit_gui_page_diff_base IMPLEMENTATION. CASE ii_event->mv_action. WHEN c_actions-toggle_unified. " Toggle file display - mv_unified = zcl_abapgit_persistence_user=>get_instance( )->toggle_diff_unified( ). + mv_unified = zcl_abapgit_persist_factory=>get_user( )->toggle_diff_unified( ). rs_handled-page = zcl_abapgit_gui_page_hoc=>create( iv_page_title = 'Diff' diff --git a/src/ui/pages/zcl_abapgit_gui_page_repo_over.clas.abap b/src/ui/pages/zcl_abapgit_gui_page_repo_over.clas.abap index a98250d5a..90c84ec12 100644 --- a/src/ui/pages/zcl_abapgit_gui_page_repo_over.clas.abap +++ b/src/ui/pages/zcl_abapgit_gui_page_repo_over.clas.abap @@ -347,7 +347,7 @@ CLASS zcl_abapgit_gui_page_repo_over IMPLEMENTATION. super->constructor( ). - ms_list_settings = zcl_abapgit_persistence_user=>get_instance( )->get_list_settings( ). + ms_list_settings = zcl_abapgit_persist_factory=>get_user( )->get_list_settings( ). " Overwrite setting IF iv_only_favorites = abap_true. @@ -382,7 +382,7 @@ CLASS zcl_abapgit_gui_page_repo_over IMPLEMENTATION. CLEAR ls_overview. - ls_overview-favorite = zcl_abapgit_persistence_user=>get_instance( + ls_overview-favorite = zcl_abapgit_persist_factory=>get_user( )->is_favorite_repo( ->ms_data-key ). ls_overview-offline = ->ms_data-offline. ls_overview-key = ->ms_data-key. @@ -840,7 +840,7 @@ CLASS zcl_abapgit_gui_page_repo_over IMPLEMENTATION. METHOD save_settings. - zcl_abapgit_persistence_user=>get_instance( )->set_list_settings( ms_list_settings ). + zcl_abapgit_persist_factory=>get_user( )->set_list_settings( ms_list_settings ). ENDMETHOD. @@ -885,7 +885,7 @@ CLASS zcl_abapgit_gui_page_repo_over IMPLEMENTATION. CASE ii_event->mv_action. WHEN c_action-select. - zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( lv_key ). + zcl_abapgit_persist_factory=>get_user( )->set_repo_show( lv_key ). TRY. zcl_abapgit_repo_srv=>get_instance( )->get( lv_key )->refresh( ). diff --git a/src/ui/pages/zcl_abapgit_gui_page_repo_view.clas.abap b/src/ui/pages/zcl_abapgit_gui_page_repo_view.clas.abap index 377a5b866..6d8647462 100644 --- a/src/ui/pages/zcl_abapgit_gui_page_repo_view.clas.abap +++ b/src/ui/pages/zcl_abapgit_gui_page_repo_view.clas.abap @@ -611,7 +611,7 @@ CLASS zcl_abapgit_gui_page_repo_view IMPLEMENTATION. super->constructor( ). TRY. - lo_persistence_user = zcl_abapgit_persistence_user=>get_instance( ). + lo_persistence_user = zcl_abapgit_persist_factory=>get_user( ). mv_key = iv_key. mi_repo = zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). @@ -632,7 +632,7 @@ CLASS zcl_abapgit_gui_page_repo_view IMPLEMENTATION. CATCH zcx_abapgit_exception INTO lx_error. " Reset 'last shown repo' so next start will go to repo overview " and allow troubleshooting of issue - zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( || ). + zcl_abapgit_persist_factory=>get_user( )->set_repo_show( || ). RAISE EXCEPTION lx_error. ENDTRY. @@ -1102,7 +1102,7 @@ CLASS zcl_abapgit_gui_page_repo_view IMPLEMENTATION. rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page. WHEN c_actions-toggle_hide_files. " Toggle file display - mv_hide_files = zcl_abapgit_persistence_user=>get_instance( )->toggle_hide_files( ). + mv_hide_files = zcl_abapgit_persist_factory=>get_user( )->toggle_hide_files( ). rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. WHEN c_actions-change_dir. " Change dir @@ -1113,16 +1113,16 @@ CLASS zcl_abapgit_gui_page_repo_view IMPLEMENTATION. rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. WHEN c_actions-toggle_folders. " Toggle folder view - mv_show_folders = zcl_abapgit_persistence_user=>get_instance( )->toggle_show_folders( ). + mv_show_folders = zcl_abapgit_persist_factory=>get_user( )->toggle_show_folders( ). mv_cur_dir = '/'. " Root rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. WHEN c_actions-toggle_changes. " Toggle changes only view - mv_changes_only = zcl_abapgit_persistence_user=>get_instance( )->toggle_changes_only( ). + mv_changes_only = zcl_abapgit_persist_factory=>get_user( )->toggle_changes_only( ). rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. WHEN c_actions-toggle_diff_first. - mv_diff_first = zcl_abapgit_persistence_user=>get_instance( )->set_diff_first( + mv_diff_first = zcl_abapgit_persist_factory=>get_user( )->set_diff_first( boolc( mv_diff_first = abap_false ) ). rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. @@ -1131,13 +1131,13 @@ CLASS zcl_abapgit_gui_page_repo_view IMPLEMENTATION. rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. WHEN zif_abapgit_definitions=>c_action-change_order_by. - mv_order_by = zcl_abapgit_persistence_user=>get_instance( )->set_order_by( + mv_order_by = zcl_abapgit_persist_factory=>get_user( )->set_order_by( ii_event->query( )->get( 'ORDERBY' ) ). - mv_order_descending = zcl_abapgit_persistence_user=>get_instance( )->set_order_descending( abap_false ). + mv_order_descending = zcl_abapgit_persist_factory=>get_user( )->set_order_descending( abap_false ). rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. WHEN zif_abapgit_definitions=>c_action-direction. - mv_order_descending = zcl_abapgit_persistence_user=>get_instance( )->set_order_descending( + mv_order_descending = zcl_abapgit_persist_factory=>get_user( )->set_order_descending( boolc( ii_event->query( )->get( 'DIRECTION' ) = 'DESCENDING' ) ). rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. @@ -1393,7 +1393,7 @@ CLASS zcl_abapgit_gui_page_repo_view IMPLEMENTATION. CATCH zcx_abapgit_exception INTO lx_error. " Reset 'last shown repo' so next start will go to repo overview " and allow troubleshooting of issue - zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( || ). + zcl_abapgit_persist_factory=>get_user( )->set_repo_show( || ). RAISE EXCEPTION lx_error. ENDTRY. diff --git a/src/ui/pages/zcl_abapgit_gui_page_tags.clas.abap b/src/ui/pages/zcl_abapgit_gui_page_tags.clas.abap index b97f4079b..c2d12ffcc 100644 --- a/src/ui/pages/zcl_abapgit_gui_page_tags.clas.abap +++ b/src/ui/pages/zcl_abapgit_gui_page_tags.clas.abap @@ -229,7 +229,7 @@ CLASS zcl_abapgit_gui_page_tags IMPLEMENTATION. DATA li_user TYPE REF TO zif_abapgit_persist_user. - li_user = zcl_abapgit_persistence_user=>get_instance( ). + li_user = zcl_abapgit_persist_factory=>get_user( ). rv_email = li_user->get_repo_git_user_email( mi_repo_online->get_url( ) ). IF rv_email IS INITIAL. @@ -247,7 +247,7 @@ CLASS zcl_abapgit_gui_page_tags IMPLEMENTATION. DATA li_user TYPE REF TO zif_abapgit_persist_user. - li_user = zcl_abapgit_persistence_user=>get_instance( ). + li_user = zcl_abapgit_persist_factory=>get_user( ). rv_user = li_user->get_repo_git_user_name( mi_repo_online->get_url( ) ). IF rv_user IS INITIAL. diff --git a/src/ui/routing/zcl_abapgit_gui_router.clas.abap b/src/ui/routing/zcl_abapgit_gui_router.clas.abap index 12ac9b754..d634e7bb0 100644 --- a/src/ui/routing/zcl_abapgit_gui_router.clas.abap +++ b/src/ui/routing/zcl_abapgit_gui_router.clas.abap @@ -258,7 +258,7 @@ CLASS zcl_abapgit_gui_router IMPLEMENTATION. CASE ii_event->mv_action. WHEN zif_abapgit_definitions=>c_action-go_home. " Go Home - lv_last_repo_key = zcl_abapgit_persistence_user=>get_instance( )->get_repo_show( ). + lv_last_repo_key = zcl_abapgit_persist_factory=>get_user( )->get_repo_show( ). IF lv_last_repo_key IS NOT INITIAL. rs_handled-page = zcl_abapgit_gui_page_repo_view=>create( lv_last_repo_key ). diff --git a/src/ui/routing/zcl_abapgit_services_git.clas.abap b/src/ui/routing/zcl_abapgit_services_git.clas.abap index 1ee6193b9..0cfbe56ac 100644 --- a/src/ui/routing/zcl_abapgit_services_git.clas.abap +++ b/src/ui/routing/zcl_abapgit_services_git.clas.abap @@ -57,7 +57,7 @@ CLASS zcl_abapgit_services_git IMPLEMENTATION. DATA: ls_comment TYPE zif_abapgit_git_definitions=>ty_comment, li_user TYPE REF TO zif_abapgit_persist_user. - li_user = zcl_abapgit_persistence_user=>get_instance( ). + li_user = zcl_abapgit_persist_factory=>get_user( ). li_user->set_repo_git_user_name( iv_url = ii_repo_online->get_url( ) iv_username = is_commit-committer_name ). li_user->set_repo_git_user_email( iv_url = ii_repo_online->get_url( ) diff --git a/src/ui/routing/zcl_abapgit_services_repo.clas.abap b/src/ui/routing/zcl_abapgit_services_repo.clas.abap index f1ba5bc58..41a7ce46d 100644 --- a/src/ui/routing/zcl_abapgit_services_repo.clas.abap +++ b/src/ui/routing/zcl_abapgit_services_repo.clas.abap @@ -106,6 +106,13 @@ CLASS zcl_abapgit_services_repo DEFINITION !ct_overwrite TYPE zif_abapgit_definitions=>ty_overwrite_tt RAISING zcx_abapgit_exception . + CLASS-METHODS popup_data_loss_overwrite + IMPORTING + !it_overwrite TYPE zif_abapgit_definitions=>ty_overwrite_tt + CHANGING + !ct_data_loss TYPE zif_abapgit_definitions=>ty_overwrite_tt + RAISING + zcx_abapgit_exception . CLASS-METHODS popup_package_overwrite CHANGING !ct_overwrite TYPE zif_abapgit_definitions=>ty_overwrite_tt @@ -390,7 +397,7 @@ CLASS zcl_abapgit_services_repo IMPLEMENTATION. toggle_favorite( ri_repo->get_key( ) ). " Set default repo for user - zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( ri_repo->get_key( ) ). + zcl_abapgit_persist_factory=>get_user( )->set_repo_show( ri_repo->get_key( ) ). COMMIT WORK AND WAIT. @@ -432,7 +439,7 @@ CLASS zcl_abapgit_services_repo IMPLEMENTATION. toggle_favorite( li_repo->get_key( ) ). " Set default repo for user - zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( li_repo->get_key( ) ). + zcl_abapgit_persist_factory=>get_user( )->set_repo_show( li_repo->get_key( ) ). COMMIT WORK AND WAIT. @@ -441,6 +448,69 @@ CLASS zcl_abapgit_services_repo IMPLEMENTATION. ENDMETHOD. + METHOD popup_data_loss_overwrite. + + DATA: lt_columns TYPE zif_abapgit_popups=>ty_alv_column_tt, + lt_selected LIKE ct_data_loss, + li_popups TYPE REF TO zif_abapgit_popups. + DATA lt_preselected_rows TYPE zif_abapgit_popups=>ty_rows. + + FIELD-SYMBOLS: LIKE LINE OF it_overwrite, + LIKE LINE OF ct_data_loss, + TYPE zif_abapgit_popups=>ty_alv_column. + + LOOP AT it_overwrite ASSIGNING WHERE decision <> zif_abapgit_definitions=>c_yes. + DELETE ct_data_loss WHERE obj_type = -obj_type AND obj_name = -obj_name. + ENDLOOP. + + IF lines( ct_data_loss ) = 0. + RETURN. + ENDIF. + + APPEND INITIAL LINE TO lt_columns ASSIGNING . + -name = 'OBJ_TYPE'. + APPEND INITIAL LINE TO lt_columns ASSIGNING . + -name = 'OBJ_NAME'. + APPEND INITIAL LINE TO lt_columns ASSIGNING . + -name = 'ICON'. + -text = 'Action'. + -show_icon = abap_true. + -length = 5. + APPEND INITIAL LINE TO lt_columns ASSIGNING . + -name = 'TEXT'. + -text = 'Description'. + + LOOP AT ct_data_loss ASSIGNING WHERE decision = zif_abapgit_definitions=>c_yes. + INSERT sy-tabix INTO TABLE lt_preselected_rows. + ENDLOOP. + + li_popups = zcl_abapgit_ui_factory=>get_popups( ). + li_popups->popup_to_select_from_list( + EXPORTING + it_list = ct_data_loss + iv_header_text = |Changes to the following objects could lead to DATA LOSS!| + && | Select the objects which should be changed to the remote version, anyway.| + iv_select_column_text = 'Overwrite?' + it_columns_to_display = lt_columns + it_preselected_rows = lt_preselected_rows + IMPORTING + et_list = lt_selected ). + + LOOP AT ct_data_loss ASSIGNING . + READ TABLE lt_selected WITH TABLE KEY object_type_and_name + COMPONENTS obj_type = -obj_type + obj_name = -obj_name + TRANSPORTING NO FIELDS. + IF sy-subrc = 0. + -decision = zif_abapgit_definitions=>c_yes. + ELSE. + -decision = zif_abapgit_definitions=>c_no. + ENDIF. + ENDLOOP. + + ENDMETHOD. + + METHOD popup_decisions. DATA: @@ -479,6 +549,13 @@ CLASS zcl_abapgit_services_repo IMPLEMENTATION. ENDIF. popup_objects_overwrite( CHANGING ct_overwrite = lt_decision ). + + popup_data_loss_overwrite( + EXPORTING + it_overwrite = lt_decision + CHANGING + ct_data_loss = cs_checks-data_loss ). + popup_package_overwrite( CHANGING ct_overwrite = cs_checks-warning_package ). IF cs_checks-transport-required = abap_true AND cs_checks-transport-transport IS INITIAL. @@ -831,7 +908,7 @@ CLASS zcl_abapgit_services_repo IMPLEMENTATION. METHOD toggle_favorite. - zcl_abapgit_persistence_user=>get_instance( )->toggle_favorite( iv_key ). + zcl_abapgit_persist_factory=>get_user( )->toggle_favorite( iv_key ). ENDMETHOD. diff --git a/src/ui/zabapgit_js_common.w3mi.data.js b/src/ui/zabapgit_js_common.w3mi.data.js index 52269b0c7..45d369765 100644 --- a/src/ui/zabapgit_js_common.w3mi.data.js +++ b/src/ui/zabapgit_js_common.w3mi.data.js @@ -254,7 +254,7 @@ function RepoOverViewHelper(opts) { this.focusFilterKey = opts.focusFilterKey; } this.setHooks(); - this.pageId = "RepoOverViewHelperState"; // constant is OK for this case + this.pageId = (opts && opts.pageId) ? opts.pageId : "RepoOverViewHelperState"; this.isDetailsDisplayed = false; this.isOnlyFavoritesDisplayed = false; this.detailCssClass = findStyleSheetByName(".repo-overview .ro-detail"); diff --git a/src/ui/zcl_abapgit_gui_hotkey_ctl.clas.abap b/src/ui/zcl_abapgit_gui_hotkey_ctl.clas.abap index a397dc975..3d8f819c2 100644 --- a/src/ui/zcl_abapgit_gui_hotkey_ctl.clas.abap +++ b/src/ui/zcl_abapgit_gui_hotkey_ctl.clas.abap @@ -36,14 +36,14 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GUI_HOTKEY_CTL IMPLEMENTATION. +CLASS zcl_abapgit_gui_hotkey_ctl IMPLEMENTATION. METHOD constructor. super->constructor( ). - ms_user_settings = zcl_abapgit_persistence_user=>get_instance( )->get_settings( ). + ms_user_settings = zcl_abapgit_persist_factory=>get_user( )->get_settings( ). ENDMETHOD. @@ -165,7 +165,7 @@ CLASS ZCL_ABAPGIT_GUI_HOTKEY_CTL IMPLEMENTATION. ENDLOOP. " render link hints activation key - ls_user_settings = zcl_abapgit_persistence_user=>get_instance( )->get_settings( ). + ls_user_settings = zcl_abapgit_persist_factory=>get_user( )->get_settings( ). IF ls_user_settings-link_hints_enabled = abap_true. ri_html->add( |
  • | && |{ ls_user_settings-link_hint_key }| diff --git a/src/zabapgit_forms.prog.abap b/src/zabapgit_forms.prog.abap index 4df679b6e..907f614b5 100644 --- a/src/zabapgit_forms.prog.abap +++ b/src/zabapgit_forms.prog.abap @@ -35,7 +35,7 @@ CLASS lcl_startup IMPLEMENTATION. ls_settings TYPE zif_abapgit_definitions=>ty_s_user_settings, li_user_persistence TYPE REF TO zif_abapgit_persist_user. - li_user_persistence = zcl_abapgit_persistence_user=>get_instance( ). + li_user_persistence = zcl_abapgit_persist_factory=>get_user( ). ls_settings = li_user_persistence->get_settings( ). @@ -72,7 +72,7 @@ CLASS lcl_startup IMPLEMENTATION. IF zcl_abapgit_persist_factory=>get_settings( )->read( )->get_show_default_repo( ) = abap_false. " Don't show the last seen repo at startup - zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( || ). + zcl_abapgit_persist_factory=>get_user( )->set_repo_show( || ). ENDIF. " We have three special cases for gui startup @@ -88,7 +88,7 @@ CLASS lcl_startup IMPLEMENTATION. IF lv_repo_key IS NOT INITIAL. SET PARAMETER ID zif_abapgit_definitions=>c_spagpa_param_repo_key FIELD '' ##EXISTS. - zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( lv_repo_key ). + zcl_abapgit_persist_factory=>get_user( )->set_repo_show( lv_repo_key ). ELSEIF lv_package IS NOT INITIAL. @@ -144,7 +144,7 @@ CLASS lcl_startup IMPLEMENTATION. ENDLOOP. IF li_repo IS BOUND. - zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( li_repo->get_key( ) ). + zcl_abapgit_persist_factory=>get_user( )->set_repo_show( li_repo->get_key( ) ). ENDIF. ENDMETHOD. diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index 3efdfc247..9fd937dd1 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -78,6 +78,7 @@ INTERFACE zif_abapgit_definitions BEGIN OF ty_deserialize_checks, overwrite TYPE ty_overwrite_tt, warning_package TYPE ty_overwrite_tt, + data_loss TYPE ty_overwrite_tt, requirements TYPE ty_requirements, dependencies TYPE ty_dependencies, transport TYPE ty_transport,