From 9b22d879a0e3e282514148505e721c2517262679 Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 13 May 2018 07:30:28 +0000 Subject: [PATCH 001/136] set default starting folder to src, close #1372 --- src/zcl_abapgit_dot_abapgit.clas.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zcl_abapgit_dot_abapgit.clas.abap b/src/zcl_abapgit_dot_abapgit.clas.abap index ce4124391..8f6273029 100644 --- a/src/zcl_abapgit_dot_abapgit.clas.abap +++ b/src/zcl_abapgit_dot_abapgit.clas.abap @@ -106,7 +106,7 @@ CLASS ZCL_ABAPGIT_DOT_ABAPGIT IMPLEMENTATION. ls_data-master_language = sy-langu. - ls_data-starting_folder = '/'. + ls_data-starting_folder = '/src/'. ls_data-folder_logic = zif_abapgit_dot_abapgit=>c_folder_logic-prefix. APPEND '/.gitignore' TO ls_data-ignore. From bd0a6ff34a1c5777d28db0ac1d1b6edd15a1ddf8 Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 13 May 2018 08:43:06 +0000 Subject: [PATCH 002/136] fix cancel in select from list popup #1050 --- src/ui/zcl_abapgit_popups.clas.abap | 68 ++++++++++++---------- src/ui/zcl_abapgit_services_repo.clas.abap | 4 +- 2 files changed, 40 insertions(+), 32 deletions(-) diff --git a/src/ui/zcl_abapgit_popups.clas.abap b/src/ui/zcl_abapgit_popups.clas.abap index 272a3dbe6..04fa85196 100644 --- a/src/ui/zcl_abapgit_popups.clas.abap +++ b/src/ui/zcl_abapgit_popups.clas.abap @@ -132,6 +132,7 @@ CLASS zcl_abapgit_popups DEFINITION EXPORTING VALUE(et_list) TYPE STANDARD TABLE RAISING + zcx_abapgit_cancel zcx_abapgit_exception . CLASS-METHODS branch_popup_callback IMPORTING @@ -166,6 +167,7 @@ CLASS zcl_abapgit_popups DEFINITION CONSTANTS c_fieldname_selected TYPE lvc_fname VALUE `SELECTED` ##NO_TEXT. CLASS-DATA go_select_list_popup TYPE REF TO cl_salv_table . CLASS-DATA gr_table TYPE REF TO data . + CLASS-DATA gv_cancel TYPE abap_bool . CLASS-DATA go_table_descr TYPE REF TO cl_abap_tabledescr . CLASS-METHODS add_field @@ -204,7 +206,7 @@ ENDCLASS. -CLASS zcl_abapgit_popups IMPLEMENTATION. +CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. METHOD add_field. @@ -601,11 +603,13 @@ CLASS zcl_abapgit_popups IMPLEMENTATION. CASE e_salv_function. WHEN 'O.K.'. + gv_cancel = abap_false. go_select_list_popup->close_screen( ). WHEN 'ABR'. "Canceled: clear list to overwrite nothing CLEAR . + gv_cancel = abap_true. go_select_list_popup->close_screen( ). WHEN 'SALL'. @@ -1049,9 +1053,13 @@ CLASS zcl_abapgit_popups IMPLEMENTATION. go_select_list_popup->display( ). CATCH cx_salv_msg. - zcx_abapgit_exception=>raise( 'Error from POPUP_SELECT_OBJ_OVERWRITE' ). + zcx_abapgit_exception=>raise( 'Error from POPUP_TO_SELECT_FROM_LIST' ). ENDTRY. + IF gv_cancel = abap_true. + RAISE EXCEPTION TYPE zcx_abapgit_cancel. + ENDIF. + get_selected_rows( IMPORTING et_list = et_list ). @@ -1083,6 +1091,34 @@ CLASS zcl_abapgit_popups IMPLEMENTATION. ENDMETHOD. + METHOD popup_transport_request. + + DATA: lt_e071 TYPE STANDARD TABLE OF e071, + lt_e071k TYPE STANDARD TABLE OF e071k. + + CALL FUNCTION 'TRINT_ORDER_CHOICE' + IMPORTING + we_order = rv_transport + TABLES + wt_e071 = lt_e071 + wt_e071k = lt_e071k + EXCEPTIONS + no_correction_selected = 1 + display_mode = 2 + object_append_error = 3 + recursive_call = 4 + wrong_order_type = 5 + OTHERS = 6. + + IF sy-subrc = 1. + RAISE EXCEPTION TYPE zcx_abapgit_cancel. + ELSEIF sy-subrc > 1. + zcx_abapgit_exception=>raise( |Error from TRINT_ORDER_CHOICE { sy-subrc }| ). + ENDIF. + + ENDMETHOD. + + METHOD repo_new_offline. DATA: lv_returncode TYPE c, @@ -1436,32 +1472,4 @@ CLASS zcl_abapgit_popups IMPLEMENTATION. ENDIF. ENDMETHOD. - - METHOD popup_transport_request. - - DATA: lt_e071 TYPE STANDARD TABLE OF e071, - lt_e071k TYPE STANDARD TABLE OF e071k. - - CALL FUNCTION 'TRINT_ORDER_CHOICE' - IMPORTING - we_order = rv_transport - TABLES - wt_e071 = lt_e071 - wt_e071k = lt_e071k - EXCEPTIONS - no_correction_selected = 1 - display_mode = 2 - object_append_error = 3 - recursive_call = 4 - wrong_order_type = 5 - OTHERS = 6. - - IF sy-subrc = 1. - RAISE EXCEPTION TYPE zcx_abapgit_cancel. - ELSEIF sy-subrc > 1. - zcx_abapgit_exception=>raise( |Error from TRINT_ORDER_CHOICE { sy-subrc }| ). - ENDIF. - - ENDMETHOD. - ENDCLASS. diff --git a/src/ui/zcl_abapgit_services_repo.clas.abap b/src/ui/zcl_abapgit_services_repo.clas.abap index 208fd0831..d06af1ade 100644 --- a/src/ui/zcl_abapgit_services_repo.clas.abap +++ b/src/ui/zcl_abapgit_services_repo.clas.abap @@ -85,7 +85,8 @@ CLASS zcl_abapgit_services_repo DEFINITION CHANGING !ct_overwrite TYPE zif_abapgit_definitions=>ty_overwrite_tt RAISING - zcx_abapgit_exception . + zcx_abapgit_exception + zcx_abapgit_cancel . CLASS-METHODS popup_package_overwrite CHANGING !ct_overwrite TYPE zif_abapgit_definitions=>ty_overwrite_tt @@ -220,7 +221,6 @@ CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION. it_columns_to_display = lt_columns IMPORTING et_list = lt_selected ). -* todo, it should be possible for the user to click cancel in the popup LOOP AT ct_overwrite ASSIGNING . READ TABLE lt_selected WITH KEY From cd78d6e8e05876603a76e155ec3a98f9726fce47 Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 13 May 2018 09:34:33 +0000 Subject: [PATCH 003/136] Moving an object should be a deletion #1378 --- src/zcl_abapgit_file_status.clas.abap | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/zcl_abapgit_file_status.clas.abap b/src/zcl_abapgit_file_status.clas.abap index 644181617..2a636b9ce 100644 --- a/src/zcl_abapgit_file_status.clas.abap +++ b/src/zcl_abapgit_file_status.clas.abap @@ -190,6 +190,7 @@ CLASS ZCL_ABAPGIT_FILE_STATUS IMPLEMENTATION. lt_items TYPE zif_abapgit_definitions=>ty_items_tt, ls_item LIKE LINE OF lt_items, lv_is_xml TYPE abap_bool, + lt_super TYPE zif_abapgit_sap_package=>ty_devclass_tt, lt_items_idx TYPE zif_abapgit_definitions=>ty_items_ts, lt_state_idx TYPE zif_abapgit_definitions=>ty_file_signatures_ts. " Sorted by path+filename @@ -238,6 +239,16 @@ CLASS ZCL_ABAPGIT_FILE_STATUS IMPLEMENTATION. ls_item-devclass = zcl_abapgit_tadir=>get_object_package( iv_object = ls_item-obj_type iv_obj_name = ls_item-obj_name ). + + IF NOT ls_item-devclass IS INITIAL. +* make sure the package is under the repo main package + lt_super = zcl_abapgit_sap_package=>get( iv_devclass )->list_superpackages( ). + READ TABLE lt_super WITH KEY table_line = ls_item-devclass TRANSPORTING NO FIELDS. + IF sy-subrc <> 0. + CLEAR ls_item-devclass. + ENDIF. + ENDIF. + APPEND ls_item TO lt_items. ENDLOOP. From d17280539600d7ac911f406f09513e314b3b3833 Mon Sep 17 00:00:00 2001 From: Johannes Konings Date: Sun, 13 May 2018 12:11:22 +0200 Subject: [PATCH 004/136] ZCL_ABAPGIT_SETTINGS: fixe naming convention https://github.com/larshp/abapGit/issues/1132 --- src/zcl_abapgit_settings.clas.abap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/zcl_abapgit_settings.clas.abap b/src/zcl_abapgit_settings.clas.abap index 1439e2dad..84fc31d1a 100644 --- a/src/zcl_abapgit_settings.clas.abap +++ b/src/zcl_abapgit_settings.clas.abap @@ -60,7 +60,7 @@ CLASS zcl_abapgit_settings DEFINITION PUBLIC CREATE PUBLIC. VALUE(rv_length) TYPE i, get_settings_xml RETURNING - VALUE(ev_settings_xml) TYPE string + VALUE(rv_settings_xml) TYPE string RAISING zcx_abapgit_exception, get_user_settings @@ -153,7 +153,7 @@ CLASS zcl_abapgit_settings IMPLEMENTATION. lo_output->add( iv_name = zcl_abapgit_persistence_db=>c_type_settings ig_data = ms_settings ). - ev_settings_xml = lo_output->render( ). + rv_settings_xml = lo_output->render( ). ENDMETHOD. From 1a153009273f3110f56292a484ec966f5a0db7c6 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Sun, 13 May 2018 11:00:04 +0000 Subject: [PATCH 005/136] change assert to exception for invalid folder log. --- src/zcl_abapgit_folder_logic.clas.abap | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/zcl_abapgit_folder_logic.clas.abap b/src/zcl_abapgit_folder_logic.clas.abap index b3e732029..6e62c7fa5 100644 --- a/src/zcl_abapgit_folder_logic.clas.abap +++ b/src/zcl_abapgit_folder_logic.clas.abap @@ -27,15 +27,16 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_FOLDER_LOGIC IMPLEMENTATION. +CLASS zcl_abapgit_folder_logic IMPLEMENTATION. METHOD package_to_path. - DATA: lv_len TYPE i, - lv_path TYPE string, - lv_message TYPE string, - lv_parentcl TYPE tdevc-parentcl. + DATA: lv_len TYPE i, + lv_path TYPE string, + lv_message TYPE string, + lv_parentcl TYPE tdevc-parentcl, + lv_folder_logic TYPE string. IF iv_top = iv_package. rv_path = io_dot->get_starting_folder( ). @@ -45,7 +46,8 @@ CLASS ZCL_ABAPGIT_FOLDER_LOGIC IMPLEMENTATION. IF lv_parentcl IS INITIAL. zcx_abapgit_exception=>raise( |error, expected parent package, { iv_package }| ). ELSE. - CASE io_dot->get_folder_logic( ). + lv_folder_logic = io_dot->get_folder_logic( ). + CASE lv_folder_logic. WHEN zif_abapgit_dot_abapgit=>c_folder_logic-full. lv_len = 0. IF iv_package(1) = '$'. @@ -63,7 +65,7 @@ CLASS ZCL_ABAPGIT_FOLDER_LOGIC IMPLEMENTATION. zcx_abapgit_exception=>raise( lv_message ). ENDIF. WHEN OTHERS. - ASSERT 0 = 1. + zcx_abapgit_exception=>raise( |Invalid folder logic: { lv_folder_logic }| ). ENDCASE. lv_path = iv_package+lv_len. From b4956a6ce83dc940db4bfded9d907322c6391938 Mon Sep 17 00:00:00 2001 From: Jakub Filak Date: Mon, 14 May 2018 10:18:49 +0200 Subject: [PATCH 006/136] DDLS: fix a syntax error on ABAP <7.4 Introduced in 2f9e46421b7010812cff57ab0ff5a3c3547de13d Reported as https://github.com/larshp/abapGit/commit/2f9e46421b7010812cff57ab0ff5a3c3547de13d#r28962636 Thank you, @testitorleaveit --- src/objects/zcl_abapgit_object_ddls.clas.abap | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/objects/zcl_abapgit_object_ddls.clas.abap b/src/objects/zcl_abapgit_object_ddls.clas.abap index a271011dd..2a45a3586 100644 --- a/src/objects/zcl_abapgit_object_ddls.clas.abap +++ b/src/objects/zcl_abapgit_object_ddls.clas.abap @@ -254,7 +254,8 @@ CLASS ZCL_ABAPGIT_OBJECT_DDLS IMPLEMENTATION. lt_clr_comps TYPE STANDARD TABLE OF fieldname WITH DEFAULT KEY. FIELD-SYMBOLS: TYPE any, - TYPE any. + TYPE any, + LIKE LINE OF lt_clr_comps. CREATE DATA lr_data TYPE ('DDDDLSRCV'). @@ -281,7 +282,7 @@ CLASS ZCL_ABAPGIT_OBJECT_DDLS IMPLEMENTATION. APPEND 'ACTFLAG' TO lt_clr_comps. APPEND 'CHGFLAG' TO lt_clr_comps. - LOOP AT lt_clr_comps ASSIGNING field-symbol(). + LOOP AT lt_clr_comps ASSIGNING . ASSIGN COMPONENT OF STRUCTURE TO . ASSERT sy-subrc = 0. CLEAR . From 11256b44e2d7c3eebe00a4879be0cd19194a320c Mon Sep 17 00:00:00 2001 From: Christian G#nter Date: Mon, 14 May 2018 10:14:07 +0000 Subject: [PATCH 007/136] DOMA: revert 82ece0f --- src/objects/zcl_abapgit_object_doma.clas.abap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/objects/zcl_abapgit_object_doma.clas.abap b/src/objects/zcl_abapgit_object_doma.clas.abap index 1a3cd1101..73138e40d 100644 --- a/src/objects/zcl_abapgit_object_doma.clas.abap +++ b/src/objects/zcl_abapgit_object_doma.clas.abap @@ -36,7 +36,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_OBJECT_DOMA IMPLEMENTATION. +CLASS zcl_abapgit_object_doma IMPLEMENTATION. METHOD deserialize_texts. @@ -210,7 +210,7 @@ CLASS ZCL_ABAPGIT_OBJECT_DOMA IMPLEMENTATION. no_ask = abap_true objname = lv_objname objtype = 'D' - no_ask_delete_append = abap_true +* no_ask_delete_append = abap_true parameter not available in lower NW versions EXCEPTIONS not_executed = 1 object_not_found = 2 From 98ee4fdde5ea666f0be63ae4434ed7c04ebd23a5 Mon Sep 17 00:00:00 2001 From: Christian G#nter Date: Mon, 14 May 2018 10:54:06 +0000 Subject: [PATCH 008/136] DOMA: catch cx_sy_dyn_call_param_not_found --- src/objects/zcl_abapgit_object_doma.clas.abap | 51 ++++++++++++++----- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/src/objects/zcl_abapgit_object_doma.clas.abap b/src/objects/zcl_abapgit_object_doma.clas.abap index 73138e40d..b5b78ef93 100644 --- a/src/objects/zcl_abapgit_object_doma.clas.abap +++ b/src/objects/zcl_abapgit_object_doma.clas.abap @@ -205,20 +205,43 @@ CLASS zcl_abapgit_object_doma IMPLEMENTATION. lv_objname = ms_item-obj_name. - CALL FUNCTION 'RS_DD_DELETE_OBJ' - EXPORTING - no_ask = abap_true - objname = lv_objname - objtype = 'D' -* no_ask_delete_append = abap_true parameter not available in lower NW versions - EXCEPTIONS - not_executed = 1 - object_not_found = 2 - object_not_specified = 3 - permission_failure = 4. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'error from RS_DD_DELETE_OBJ, DOMA' ). - ENDIF. + TRY. + CALL FUNCTION 'RS_DD_DELETE_OBJ' + EXPORTING + no_ask = abap_true + objname = lv_objname + objtype = 'D' + no_ask_delete_append = abap_true + EXCEPTIONS + not_executed = 1 + object_not_found = 2 + object_not_specified = 3 + permission_failure = 4. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( 'error from RS_DD_DELETE_OBJ, DOMA' ). + ENDIF. + + CATCH cx_sy_dyn_call_param_not_found. + + TRY. + CALL FUNCTION 'RS_DD_DELETE_OBJ' + EXPORTING + no_ask = abap_true + objname = lv_objname + objtype = 'D' +* no_ask_delete_append = abap_true parameter not available in lower NW versions + EXCEPTIONS + not_executed = 1 + object_not_found = 2 + object_not_specified = 3 + permission_failure = 4. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( 'error from RS_DD_DELETE_OBJ, DOMA' ). + ENDIF. + + ENDTRY. + + ENDTRY. ENDMETHOD. "delete From 8b864df0d09c5b82c2785c583e9c4c724f90d21a Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Mon, 14 May 2018 13:09:55 +0200 Subject: [PATCH 009/136] Package to zip: check if package exists --- src/zcl_abapgit_zip.clas.abap | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/zcl_abapgit_zip.clas.abap b/src/zcl_abapgit_zip.clas.abap index 2560c0703..0b6aadcf1 100644 --- a/src/zcl_abapgit_zip.clas.abap +++ b/src/zcl_abapgit_zip.clas.abap @@ -52,7 +52,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_ZIP IMPLEMENTATION. +CLASS zcl_abapgit_zip IMPLEMENTATION. METHOD encode_files. @@ -78,12 +78,19 @@ CLASS ZCL_ABAPGIT_ZIP IMPLEMENTATION. METHOD export. - DATA: lo_log TYPE REF TO zcl_abapgit_log, - lt_zip TYPE zif_abapgit_definitions=>ty_files_item_tt. + DATA: lo_log TYPE REF TO zcl_abapgit_log, + lt_zip TYPE zif_abapgit_definitions=>ty_files_item_tt, + lv_package TYPE devclass. CREATE OBJECT lo_log. + lv_package = io_repo->get_package( ). + + IF zcl_abapgit_sap_package=>get( lv_package )->exists( ) = abap_false. + zcx_abapgit_exception=>raise( |Package { lv_package } doesn't exist| ). + ENDIF. + lt_zip = io_repo->get_files_local( io_log = lo_log it_filter = it_filter ). From 542e290450c7935381e4824bd5e7bc640e1bc1b2 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Sun, 13 May 2018 09:52:42 +0000 Subject: [PATCH 010/136] Log: show ALV popup --- src/utils/zcl_abapgit_log.clas.abap | 106 +++++++++++++++++++++++----- 1 file changed, 87 insertions(+), 19 deletions(-) diff --git a/src/utils/zcl_abapgit_log.clas.abap b/src/utils/zcl_abapgit_log.clas.abap index b42c19062..30b7668ac 100644 --- a/src/utils/zcl_abapgit_log.clas.abap +++ b/src/utils/zcl_abapgit_log.clas.abap @@ -22,15 +22,27 @@ CLASS zcl_abapgit_log DEFINITION PUBLIC CREATE PUBLIC. msg TYPE string, type TYPE symsgty, rc TYPE balsort, - END OF ty_log. + END OF ty_log, + BEGIN OF ty_log_out, + type TYPE icon_d, + msg TYPE string, + END OF ty_log_out, + tty_log_out TYPE STANDARD TABLE OF ty_log_out + WITH NON-UNIQUE DEFAULT KEY. + DATA: mt_log TYPE STANDARD TABLE OF ty_log WITH DEFAULT KEY. + METHODS: + prepare_log_for_display + RETURNING + VALUE(rt_log_out) TYPE zcl_abapgit_log=>tty_log_out. + ENDCLASS. -CLASS ZCL_ABAPGIT_LOG IMPLEMENTATION. +CLASS zcl_abapgit_log IMPLEMENTATION. METHOD add. @@ -61,28 +73,84 @@ CLASS ZCL_ABAPGIT_LOG IMPLEMENTATION. ENDMETHOD. + METHOD prepare_log_for_display. + + DATA: ls_log TYPE ty_log_out. + + FIELD-SYMBOLS: TYPE ty_log. + + LOOP AT mt_log ASSIGNING . + + CLEAR: ls_log. + + ls_log-msg = -msg. + + CASE -type. + WHEN 'E' OR 'A' OR 'X'. + ls_log-type = icon_led_red. + WHEN 'W'. + ls_log-type = icon_led_yellow. + WHEN 'I' OR 'S'. + ls_log-type = icon_led_green. + WHEN OTHERS. + ls_log-type = icon_led_inactive. + ENDCASE. + + INSERT ls_log INTO TABLE rt_log_out. + + ENDLOOP. + + ENDMETHOD. + + METHOD show. -* only supports showing 4 errors, but I guess this is okay -* alternatively refactor to use method TO_HTML instead - DATA: ls_log1 LIKE LINE OF mt_log, - ls_log2 LIKE LINE OF mt_log, - ls_log3 LIKE LINE OF mt_log, - ls_log4 LIKE LINE OF mt_log. + DATA: lt_log TYPE tty_log_out, + lo_alv TYPE REF TO cl_salv_table, + lx_error TYPE REF TO cx_salv_error, + lo_form_header TYPE REF TO cl_salv_form_header_info, + lo_columns TYPE REF TO cl_salv_columns_table, + lo_column TYPE REF TO cl_salv_column, + lo_functions TYPE REF TO cl_salv_functions_list. + lt_log = prepare_log_for_display( ). - READ TABLE mt_log INDEX 1 INTO ls_log1. - READ TABLE mt_log INDEX 2 INTO ls_log2. - READ TABLE mt_log INDEX 3 INTO ls_log3. - READ TABLE mt_log INDEX 4 INTO ls_log4. + TRY. + cl_salv_table=>factory( + IMPORTING + r_salv_table = lo_alv + CHANGING + t_table = lt_log ). - CALL FUNCTION 'POPUP_TO_INFORM' - EXPORTING - titel = 'Log' - txt1 = ls_log1-msg - txt2 = ls_log2-msg - txt3 = ls_log3-msg - txt4 = ls_log4-msg. + lo_functions = lo_alv->get_functions( ). + lo_functions->set_all( ). + + lo_columns = lo_alv->get_columns( ). + + lo_columns->set_optimize( ). + + lo_column = lo_columns->get_column( |TYPE| ). + lo_column->set_medium_text( |Type| ). + + lo_column = lo_columns->get_column( |MSG| ). + lo_column->set_medium_text( |Message| ). + + lo_alv->set_screen_popup( start_column = 10 + end_column = 120 + start_line = 4 + end_line = 20 ). + + CREATE OBJECT lo_form_header + EXPORTING + text = |Log|. + + lo_alv->set_top_of_list( lo_form_header ). + + lo_alv->display( ). + + CATCH cx_salv_error INTO lx_error. + MESSAGE lx_error TYPE 'S' DISPLAY LIKE 'E'. + ENDTRY. ENDMETHOD. From e27cf4c452fb50cff9db066f3908c940c8a920cb Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Mon, 14 May 2018 20:57:11 +0200 Subject: [PATCH 011/136] IDOC serialization --- src/objects/zcl_abapgit_object_idoc.clas.abap | 228 ++++++++++++++++++ src/objects/zcl_abapgit_object_idoc.clas.xml | 18 ++ 2 files changed, 246 insertions(+) create mode 100644 src/objects/zcl_abapgit_object_idoc.clas.abap create mode 100644 src/objects/zcl_abapgit_object_idoc.clas.xml diff --git a/src/objects/zcl_abapgit_object_idoc.clas.abap b/src/objects/zcl_abapgit_object_idoc.clas.abap new file mode 100644 index 000000000..7ffc7b4fb --- /dev/null +++ b/src/objects/zcl_abapgit_object_idoc.clas.abap @@ -0,0 +1,228 @@ +CLASS zcl_abapgit_object_idoc DEFINITION PUBLIC INHERITING FROM zcl_abapgit_objects_super FINAL. + + PUBLIC SECTION. + INTERFACES zif_abapgit_object. + ALIASES mo_files FOR zif_abapgit_object~mo_files. + METHODS: + constructor + IMPORTING + is_item TYPE zif_abapgit_definitions=>ty_item + iv_language TYPE spras. + + PRIVATE SECTION. + TYPES: + BEGIN OF ty_idoc, + attributes TYPE edi_iapi01, + t_syntax TYPE STANDARD TABLE OF edi_iapi02 WITH NON-UNIQUE DEFAULT KEY, + END OF ty_idoc. + + DATA: + mv_idoctyp TYPE edi_iapi00-idoctyp. + +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_OBJECT_IDOC IMPLEMENTATION. + + + METHOD constructor. + + super->constructor( is_item = is_item + iv_language = iv_language ). + + mv_idoctyp = ms_item-obj_name. + + ENDMETHOD. + + + METHOD zif_abapgit_object~changed_by. + + DATA: ls_attributes TYPE edi_iapi01. + + CALL FUNCTION 'IDOCTYPE_READ' + EXPORTING + pi_idoctyp = mv_idoctyp + IMPORTING + pe_attributes = ls_attributes + EXCEPTIONS + object_not_found = 1 + db_error = 2 + no_authority = 3 + OTHERS = 4. + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise_t100( ). + ENDIF. + + rv_user = ls_attributes-plast. + + ENDMETHOD. + + + METHOD zif_abapgit_object~compare_to_remote_version. + CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. + ENDMETHOD. + + + METHOD zif_abapgit_object~delete. + + CALL FUNCTION 'IDOCTYPE_DELETE' + EXPORTING + pi_idoctyp = mv_idoctyp + EXCEPTIONS + object_not_found = 1 + lock_error = 2 + action_not_possible = 3 + transport_error = 4 + db_error = 5 + no_authority = 6 + OTHERS = 7. + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise_t100( ). + ENDIF. + + ENDMETHOD. + + + METHOD zif_abapgit_object~deserialize. + + DATA: ls_idoc TYPE ty_idoc, + ls_attributes TYPE edi_iapi05. + + io_xml->read( + EXPORTING + iv_name = 'IDOC' + CHANGING + cg_data = ls_idoc ). + + MOVE-CORRESPONDING ls_idoc-attributes TO ls_attributes. + + CALL FUNCTION 'IDOCTYPE_CREATE' + EXPORTING + pi_idoctyp = mv_idoctyp + pi_devclass = iv_package + pi_attributes = ls_attributes + TABLES + pt_syntax = ls_idoc-t_syntax + EXCEPTIONS + object_not_found = 1 + object_exists = 2 + action_not_possible = 3 + syntax_error = 4 + segment_error = 5 + transport_error = 6 + db_error = 7 + no_authority = 8 + OTHERS = 9. + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise_t100( ). + ENDIF. + + ENDMETHOD. + + + METHOD zif_abapgit_object~exists. + + CALL FUNCTION 'IDOCTYPE_READ' + EXPORTING + pi_idoctyp = mv_idoctyp + EXCEPTIONS + object_not_found = 1 + db_error = 2 + no_authority = 3 + OTHERS = 4. + + rv_bool = boolc( sy-subrc = 0 ). + + ENDMETHOD. + + + METHOD zif_abapgit_object~get_metadata. + rs_metadata = get_metadata( ). + ENDMETHOD. + + + METHOD zif_abapgit_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. + + + METHOD zif_abapgit_object~jump. + + DATA: lt_bdcdata TYPE TABLE OF bdcdata. + + FIELD-SYMBOLS: LIKE LINE OF lt_bdcdata. + + APPEND INITIAL LINE TO lt_bdcdata ASSIGNING . + -program = 'SAPMSED5'. + -dynpro = '0010'. + -dynbegin = abap_true. + + APPEND INITIAL LINE TO lt_bdcdata ASSIGNING . + -fnam = 'SED5STRUC-OBJECT'. + -fval = ms_item-obj_name. + + APPEND INITIAL LINE TO lt_bdcdata ASSIGNING . + -fnam = 'SED5STRUC-SELECT_ORG'. + -fval = abap_true. + + APPEND INITIAL LINE TO lt_bdcdata ASSIGNING . + -fnam = 'BDC_OKCODE'. + -fval = '=DISP'. + + CALL FUNCTION 'ABAP4_CALL_TRANSACTION' + STARTING NEW TASK 'GIT' + EXPORTING + tcode = 'WE30' + mode_val = 'E' + TABLES + using_tab = lt_bdcdata + EXCEPTIONS + system_failure = 1 + communication_failure = 2 + resource_failure = 3 + OTHERS = 4. + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise_t100( ). + ENDIF. + + ENDMETHOD. + + + METHOD zif_abapgit_object~serialize. + + DATA: ls_idoc TYPE ty_idoc. + + CALL FUNCTION 'IDOCTYPE_READ' + EXPORTING + pi_idoctyp = mv_idoctyp + IMPORTING + pe_attributes = ls_idoc-attributes + TABLES + pt_syntax = ls_idoc-t_syntax + EXCEPTIONS + object_not_found = 1 + db_error = 2 + no_authority = 3 + OTHERS = 4. + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise_t100( ). + ENDIF. + + CLEAR: ls_idoc-attributes-devc, + ls_idoc-attributes-plast, + ls_idoc-attributes-credate, + ls_idoc-attributes-cretime, + ls_idoc-attributes-ldate, + ls_idoc-attributes-ltime. + + io_xml->add( iv_name = 'IDOC' + ig_data = ls_idoc ). + + ENDMETHOD. +ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_idoc.clas.xml b/src/objects/zcl_abapgit_object_idoc.clas.xml new file mode 100644 index 000000000..246aa12f2 --- /dev/null +++ b/src/objects/zcl_abapgit_object_idoc.clas.xml @@ -0,0 +1,18 @@ + + + + + + ZCL_ABAPGIT_OBJECT_IDOC + 1 + E + 2 + 1 + X + X + X + X + + + + From c57d07851e1b3f3bb2b4024e97824582ca5dd969 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Mon, 14 May 2018 21:40:46 +0200 Subject: [PATCH 012/136] IEXT serialization --- src/objects/zcl_abapgit_object_iext.clas.abap | 225 ++++++++++++++++++ src/objects/zcl_abapgit_object_iext.clas.xml | 18 ++ src/zcl_abapgit_dependencies.clas.abap | 4 + 3 files changed, 247 insertions(+) create mode 100644 src/objects/zcl_abapgit_object_iext.clas.abap create mode 100644 src/objects/zcl_abapgit_object_iext.clas.xml diff --git a/src/objects/zcl_abapgit_object_iext.clas.abap b/src/objects/zcl_abapgit_object_iext.clas.abap new file mode 100644 index 000000000..af3d3b8fa --- /dev/null +++ b/src/objects/zcl_abapgit_object_iext.clas.abap @@ -0,0 +1,225 @@ +CLASS zcl_abapgit_object_iext DEFINITION PUBLIC INHERITING FROM zcl_abapgit_objects_super FINAL. + + PUBLIC SECTION. + INTERFACES zif_abapgit_object. + ALIASES mo_files FOR zif_abapgit_object~mo_files. + METHODS: + constructor + IMPORTING + is_item TYPE zif_abapgit_definitions=>ty_item + iv_language TYPE spras. + + PRIVATE SECTION. + TYPES: + BEGIN OF ty_extention, + attributes TYPE edi_iapi01, + t_syntax TYPE STANDARD TABLE OF edi_iapi03 WITH NON-UNIQUE DEFAULT KEY, + END OF ty_extention. + + DATA: + mv_extension TYPE edi_cimtyp. + +ENDCLASS. + + + +CLASS zcl_abapgit_object_iext IMPLEMENTATION. + + + METHOD constructor. + + super->constructor( is_item = is_item + iv_language = iv_language ). + + mv_extension = ms_item-obj_name. + + ENDMETHOD. + + + METHOD zif_abapgit_object~changed_by. + + DATA: ls_attributes TYPE edi_iapi01. + + CALL FUNCTION 'EXTTYPE_READ' + EXPORTING + pi_cimtyp = mv_extension + IMPORTING + pe_attributes = ls_attributes + EXCEPTIONS + object_not_found = 1 + db_error = 2 + no_authority = 3 + OTHERS = 4. + + rv_user = ls_attributes-plast. + + ENDMETHOD. + + + METHOD zif_abapgit_object~compare_to_remote_version. + CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. + ENDMETHOD. + + + METHOD zif_abapgit_object~delete. + + CALL FUNCTION 'EXTTYPE_DELETE' + EXPORTING + pi_cimtyp = mv_extension + EXCEPTIONS + object_not_found = 1 + lock_error = 2 + action_not_possible = 3 + transport_error = 4 + db_error = 5 + no_authority = 6 + OTHERS = 7. + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise_t100( ). + ENDIF. + + ENDMETHOD. + + + METHOD zif_abapgit_object~deserialize. + + DATA: ls_extension TYPE ty_extention, + ls_attributes TYPE edi_iapi05. + + io_xml->read( + EXPORTING + iv_name = 'IEXT' + CHANGING + cg_data = ls_extension ). + + MOVE-CORRESPONDING ls_extension-attributes TO ls_attributes. + + CALL FUNCTION 'EXTTYPE_CREATE' + EXPORTING + pi_cimtyp = mv_extension + pi_devclass = iv_package + pi_attributes = ls_attributes + TABLES + pt_syntax = ls_extension-t_syntax + EXCEPTIONS + object_not_found = 1 + object_exists = 2 + action_not_possible = 3 + syntax_error = 4 + segment_error = 5 + transport_error = 6 + db_error = 7 + no_authority = 8 + OTHERS = 9. + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise_t100( ). + ENDIF. + + ENDMETHOD. + + + METHOD zif_abapgit_object~exists. + + CALL FUNCTION 'EXTTYPE_READ' + EXPORTING + pi_cimtyp = mv_extension + EXCEPTIONS + object_not_found = 1 + db_error = 2 + no_authority = 3 + OTHERS = 4. + + rv_bool = boolc( sy-subrc = 0 ). + + ENDMETHOD. + + + METHOD zif_abapgit_object~get_metadata. + rs_metadata = get_metadata( ). + ENDMETHOD. + + + METHOD zif_abapgit_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. + + + METHOD zif_abapgit_object~jump. + + DATA: lt_bdcdata TYPE TABLE OF bdcdata. + + FIELD-SYMBOLS: LIKE LINE OF lt_bdcdata. + + APPEND INITIAL LINE TO lt_bdcdata ASSIGNING . + -program = 'SAPMSED5'. + -dynpro = '0010'. + -dynbegin = abap_true. + + APPEND INITIAL LINE TO lt_bdcdata ASSIGNING . + -fnam = 'SED5STRUC-OBJECT'. + -fval = ms_item-obj_name. + + APPEND INITIAL LINE TO lt_bdcdata ASSIGNING . + -fnam = 'SED5STRUC-SELECT_EXT'. + -fval = abap_true. + + APPEND INITIAL LINE TO lt_bdcdata ASSIGNING . + -fnam = 'BDC_OKCODE'. + -fval = '=DISP'. + + CALL FUNCTION 'ABAP4_CALL_TRANSACTION' + STARTING NEW TASK 'GIT' + EXPORTING + tcode = 'WE30' + mode_val = 'E' + TABLES + using_tab = lt_bdcdata + EXCEPTIONS + system_failure = 1 + communication_failure = 2 + resource_failure = 3 + OTHERS = 4. + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise_t100( ). + ENDIF. + + ENDMETHOD. + + + METHOD zif_abapgit_object~serialize. + + DATA: ls_extension TYPE ty_extention. + + CALL FUNCTION 'EXTTYPE_READ' + EXPORTING + pi_cimtyp = mv_extension + IMPORTING + pe_attributes = ls_extension-attributes + TABLES + pt_syntax = ls_extension-t_syntax + EXCEPTIONS + object_not_found = 1 + db_error = 2 + no_authority = 3 + OTHERS = 4. + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise_t100( ). + ENDIF. + + CLEAR: ls_extension-attributes-devc, + ls_extension-attributes-plast, + ls_extension-attributes-credate, + ls_extension-attributes-cretime, + ls_extension-attributes-ldate, + ls_extension-attributes-ltime. + + io_xml->add( iv_name = 'IEXT' + ig_data = ls_extension ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_iext.clas.xml b/src/objects/zcl_abapgit_object_iext.clas.xml new file mode 100644 index 000000000..92d5409f6 --- /dev/null +++ b/src/objects/zcl_abapgit_object_iext.clas.xml @@ -0,0 +1,18 @@ + + + + + + ZCL_ABAPGIT_OBJECT_IEXT + 1 + E + 2 + 1 + X + X + X + X + + + + diff --git a/src/zcl_abapgit_dependencies.clas.abap b/src/zcl_abapgit_dependencies.clas.abap index b2bae70b9..3131f6d8e 100644 --- a/src/zcl_abapgit_dependencies.clas.abap +++ b/src/zcl_abapgit_dependencies.clas.abap @@ -127,6 +127,10 @@ CLASS ZCL_ABAPGIT_DEPENDENCIES IMPLEMENTATION. ELSE. -korrnum = '1000'. ENDIF. + WHEN 'IDOC'. + -korrnum = '2000'. + WHEN 'IEXT'. + -korrnum = '1500'. WHEN OTHERS. -korrnum = '1000'. ENDCASE. From 5b3e22c2412f44070378b5558429dae8e171a03e Mon Sep 17 00:00:00 2001 From: larshp Date: Sat, 19 May 2018 07:31:11 +0000 Subject: [PATCH 013/136] v1.67.0 --- src/zif_abapgit_definitions.intf.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index d4429fb51..27a980792 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -291,7 +291,7 @@ INTERFACE zif_abapgit_definitions PUBLIC. END OF ty_s_user_settings. CONSTANTS gc_xml_version TYPE string VALUE 'v1.0.0' ##NO_TEXT. - CONSTANTS gc_abap_version TYPE string VALUE 'v1.66.0' ##NO_TEXT. + CONSTANTS gc_abap_version TYPE string VALUE 'v1.67.0' ##NO_TEXT. CONSTANTS: BEGIN OF gc_type, commit TYPE zif_abapgit_definitions=>ty_type VALUE 'commit', "#EC NOTEXT From b04afb2f486f68a5be37a38d67fc9059cd062ae0 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sat, 19 May 2018 09:34:39 +0200 Subject: [PATCH 014/136] v1.67.0 --- changelog.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/changelog.txt b/changelog.txt index 028b9863c..c0afbe858 100644 --- a/changelog.txt +++ b/changelog.txt @@ -8,6 +8,18 @@ Legend + : added - : removed +2018-05-19 v1.67.0 +------------------ ++ IDOC support ++ IEXT support +* DOMA deletion downport +* ALV popup +* DDLS downport +! default starting folder changed to "/src/" +* Author regex fixed in branch overview +! DDLS clear additional fields +! Moving an object outside main package shows up as deletion + 2018-05-11 v1.66.0 ------------------ ! Clone without pull, user has to choose pull after creating online repo From 7bc8585d4bf33e37732adf10289568499a99d0b0 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sat, 19 May 2018 10:17:41 +0200 Subject: [PATCH 015/136] docs: IEXT + IDOC supported --- docs/ref-supported.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/ref-supported.md b/docs/ref-supported.md index 03d10d4c7..7fcd157a6 100644 --- a/docs/ref-supported.md +++ b/docs/ref-supported.md @@ -44,6 +44,8 @@ IAMU | Language-Independent IAC Binary Data | Yes IARP | Parameters of IAC Language Resource | Yes IASP | Parameters of an IAC service | Yes IATU | Language-Independent IAC Templates | Yes +IDOC | IDoc Type | Yes +IEXT | Enhancement | Yes IWPR | Gateway Business Suite Enablement - Service Builder Project | [#75](https://github.com/larshp/abapGit/issues/75) JOBD | Technical Job Definition | Yes LPDC | Launchpad short texts | [#107](https://github.com/larshp/abapGit/issues/107) From db1f729487122d20142ff682aa15eefb94d7de98 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Tue, 22 May 2018 16:17:34 +0000 Subject: [PATCH 016/136] replace commit work with commit work and wait --- src/ui/zcl_abapgit_services_git.clas.abap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ui/zcl_abapgit_services_git.clas.abap b/src/ui/zcl_abapgit_services_git.clas.abap index 9ad6bd5dd..7e263cc7e 100644 --- a/src/ui/zcl_abapgit_services_git.clas.abap +++ b/src/ui/zcl_abapgit_services_git.clas.abap @@ -82,7 +82,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_SERVICES_GIT IMPLEMENTATION. +CLASS zcl_abapgit_services_git IMPLEMENTATION. METHOD commit. @@ -351,7 +351,7 @@ CLASS ZCL_ABAPGIT_SERVICES_GIT IMPLEMENTATION. lo_repo->set_branch_name( ls_branch-name ). - COMMIT WORK. + COMMIT WORK AND WAIT. zcl_abapgit_services_repo=>gui_deserialize( lo_repo ). From 2c80628de3b7fa4bfae377a91f55df8318cfe5cd Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Sat, 26 May 2018 20:53:38 +0200 Subject: [PATCH 017/136] implement annotated tags --- src/git/zcl_abapgit_git_branch_list.clas.abap | 62 +++- src/git/zcl_abapgit_git_pack.clas.abap | 114 +++++- ...zcl_abapgit_git_pack.clas.testclasses.abap | 57 +++ src/git/zcl_abapgit_git_porcelain.clas.abap | 111 ++++-- src/git/zcl_abapgit_git_transport.clas.abap | 4 +- src/git/zcl_abapgit_tag.clas.abap | 10 +- .../zcl_abapgit_gui_page_boverview.clas.abap | 17 +- src/ui/zcl_abapgit_gui_page_tag.clas.abap | 254 +++++++++++++ src/ui/zcl_abapgit_gui_page_tag.clas.xml | 19 + src/ui/zcl_abapgit_gui_router.clas.abap | 9 +- .../zcl_abapgit_html_action_utils.clas.abap | 37 +- src/ui/zcl_abapgit_popups.clas.abap | 214 +---------- src/ui/zcl_abapgit_services_git.clas.abap | 74 +--- src/ui/zcl_abapgit_tag_popups.clas.abap | 336 ++++++++++++++++++ src/ui/zcl_abapgit_tag_popups.clas.xml | 19 + src/zcl_abapgit_branch_overview.clas.abap | 225 ++++++++---- src/zcl_abapgit_branch_overview.clas.xml | 1 - src/zif_abapgit_definitions.intf.abap | 23 +- 18 files changed, 1187 insertions(+), 399 deletions(-) create mode 100644 src/ui/zcl_abapgit_gui_page_tag.clas.abap create mode 100644 src/ui/zcl_abapgit_gui_page_tag.clas.xml create mode 100644 src/ui/zcl_abapgit_tag_popups.clas.abap create mode 100644 src/ui/zcl_abapgit_tag_popups.clas.xml diff --git a/src/git/zcl_abapgit_git_branch_list.clas.abap b/src/git/zcl_abapgit_git_branch_list.clas.abap index e5b685323..d1dbd5b1b 100644 --- a/src/git/zcl_abapgit_git_branch_list.clas.abap +++ b/src/git/zcl_abapgit_git_branch_list.clas.abap @@ -30,9 +30,9 @@ CLASS zcl_abapgit_git_branch_list DEFINITION zcx_abapgit_exception . METHODS get_tags_only " For potential future use RETURNING - VALUE(rt_branches) TYPE zif_abapgit_definitions=>ty_git_branch_list_tt + VALUE(rt_tags) TYPE zif_abapgit_definitions=>ty_git_branch_list_tt RAISING - zcx_abapgit_exception . + zcx_abapgit_exception. CLASS-METHODS is_ignored IMPORTING !iv_branch_name TYPE clike @@ -45,9 +45,11 @@ CLASS zcl_abapgit_git_branch_list DEFINITION VALUE(rv_display_name) TYPE string . CLASS-METHODS get_type IMPORTING - !iv_branch_name TYPE clike + !iv_branch_name TYPE clike + it_result TYPE stringtab OPTIONAL + iv_current_row_index TYPE sytabix OPTIONAL RETURNING - VALUE(rv_type) TYPE zif_abapgit_definitions=>ty_git_branch_type . + VALUE(rv_type) TYPE zif_abapgit_definitions=>ty_git_branch_type . CLASS-METHODS complete_heads_branch_name IMPORTING !iv_branch_name TYPE clike @@ -80,7 +82,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GIT_BRANCH_LIST IMPLEMENTATION. +CLASS zcl_abapgit_git_branch_list IMPLEMENTATION. METHOD complete_heads_branch_name. @@ -157,15 +159,21 @@ CLASS ZCL_ABAPGIT_GIT_BRANCH_LIST IMPLEMENTATION. METHOD get_tags_only. FIELD-SYMBOLS LIKE LINE OF mt_branches. - LOOP AT mt_branches ASSIGNING . - IF -type = zif_abapgit_definitions=>c_git_branch_type-tag. - APPEND TO rt_branches. - ENDIF. + LOOP AT mt_branches ASSIGNING + WHERE type = zif_abapgit_definitions=>c_git_branch_type-lightweight_tag + OR type = zif_abapgit_definitions=>c_git_branch_type-annotated_tag. + APPEND TO rt_tags. ENDLOOP. + ENDMETHOD. "get_tags_only METHOD get_type. + + DATA: lv_annotated_tag_with_suffix TYPE string. + + FIELD-SYMBOLS: TYPE LINE OF stringtab. + rv_type = zif_abapgit_definitions=>c_git_branch_type-other. IF iv_branch_name CP 'refs/heads/*' OR iv_branch_name = zif_abapgit_definitions=>c_head_name. @@ -174,7 +182,17 @@ CLASS ZCL_ABAPGIT_GIT_BRANCH_LIST IMPLEMENTATION. ENDIF. IF iv_branch_name CP 'refs/tags/*'. - rv_type = zif_abapgit_definitions=>c_git_branch_type-tag. + + lv_annotated_tag_with_suffix = iv_branch_name && '^{}'. + + READ TABLE it_result ASSIGNING + INDEX iv_current_row_index + 1. + IF sy-subrc = 0 AND CP '*' && lv_annotated_tag_with_suffix. + rv_type = zif_abapgit_definitions=>c_git_branch_type-annotated_tag. + ELSE. + rv_type = zif_abapgit_definitions=>c_git_branch_type-lightweight_tag. + ENDIF. + ENDIF. ENDMETHOD. "get_type @@ -193,6 +211,10 @@ CLASS ZCL_ABAPGIT_GIT_BRANCH_LIST IMPLEMENTATION. rv_ignore = abap_true. ENDIF. + IF iv_branch_name CP 'refs/tags/*^{}'. " 2nd ref of annotated tag + rv_ignore = abap_true. + ENDIF. + ENDMETHOD. "is_ignored @@ -206,12 +228,13 @@ CLASS ZCL_ABAPGIT_GIT_BRANCH_LIST IMPLEMENTATION. METHOD parse_branch_list. - DATA: lt_result TYPE TABLE OF string, - lv_hash TYPE zif_abapgit_definitions=>ty_sha1, - lv_name TYPE string, - lv_head_params TYPE string, - lv_char TYPE c, - lv_data LIKE LINE OF lt_result. + DATA: lt_result TYPE TABLE OF string, + lv_hash TYPE zif_abapgit_definitions=>ty_sha1, + lv_name TYPE string, + lv_head_params TYPE string, + lv_char TYPE c, + lv_data LIKE LINE OF lt_result, + lv_current_row_index TYPE syst-tabix. FIELD-SYMBOLS: LIKE LINE OF et_list. @@ -220,6 +243,9 @@ CLASS ZCL_ABAPGIT_GIT_BRANCH_LIST IMPLEMENTATION. SPLIT iv_data AT zif_abapgit_definitions=>gc_newline INTO TABLE lt_result. LOOP AT lt_result INTO lv_data. + + lv_current_row_index = sy-tabix. + IF sy-tabix = 1. CONTINUE. " current loop ELSEIF sy-tabix = 2 AND strlen( lv_data ) > 49. @@ -245,7 +271,9 @@ CLASS ZCL_ABAPGIT_GIT_BRANCH_LIST IMPLEMENTATION. -sha1 = lv_hash. -name = lv_name. -display_name = get_display_name( lv_name ). - -type = get_type( lv_name ). + -type = get_type( iv_branch_name = lv_name + it_result = lt_result + iv_current_row_index = lv_current_row_index ). IF -name = zif_abapgit_definitions=>c_head_name OR -name = ev_head_symref. -is_head = abap_true. ENDIF. diff --git a/src/git/zcl_abapgit_git_pack.clas.abap b/src/git/zcl_abapgit_git_pack.clas.abap index 69cf36342..f425b439d 100644 --- a/src/git/zcl_abapgit_git_pack.clas.abap +++ b/src/git/zcl_abapgit_git_pack.clas.abap @@ -20,7 +20,16 @@ CLASS zcl_abapgit_git_pack DEFINITION author TYPE string, committer TYPE string, body TYPE string, - END OF ty_commit . + END OF ty_commit, + BEGIN OF ty_tag, + object TYPE string, + type TYPE string, + tag TYPE string, + tagger_name TYPE string, + tagger_email TYPE string, + message TYPE string, + body TYPE string, + END OF ty_tag . TYPES: BEGIN OF ty_adler32, sha1 TYPE zif_abapgit_definitions=>ty_sha1, @@ -48,6 +57,13 @@ CLASS zcl_abapgit_git_pack DEFINITION VALUE(rs_commit) TYPE ty_commit RAISING zcx_abapgit_exception . + CLASS-METHODS decode_tag + IMPORTING + !iv_data TYPE xstring + RETURNING + VALUE(rs_tag) TYPE ty_tag + RAISING + zcx_abapgit_exception . CLASS-METHODS encode IMPORTING !it_objects TYPE zif_abapgit_definitions=>ty_objects_tt @@ -62,9 +78,16 @@ CLASS zcl_abapgit_git_pack DEFINITION VALUE(rv_data) TYPE xstring . CLASS-METHODS encode_commit IMPORTING - !is_commit TYPE ty_commit + is_commit TYPE ty_commit RETURNING VALUE(rv_data) TYPE xstring . + CLASS-METHODS encode_tag + IMPORTING + is_tag TYPE zcl_abapgit_git_pack=>ty_tag + RETURNING + VALUE(rv_data) TYPE xstring + RAISING + zcx_abapgit_exception. PRIVATE SECTION. CONSTANTS: @@ -128,7 +151,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GIT_PACK IMPLEMENTATION. +CLASS zcl_abapgit_git_pack IMPLEMENTATION. METHOD decode. @@ -336,6 +359,68 @@ CLASS ZCL_ABAPGIT_GIT_PACK IMPLEMENTATION. ENDMETHOD. "decode_deltas + METHOD decode_tag. + + DATA: lv_string TYPE string, + lv_word TYPE string, + lv_length TYPE i, + lv_trash TYPE string ##NEEDED, + lt_string TYPE TABLE OF string. + + FIELD-SYMBOLS: LIKE LINE OF lt_string. + + + lv_string = zcl_abapgit_convert=>xstring_to_string_utf8( iv_data ). + + SPLIT lv_string AT zif_abapgit_definitions=>gc_newline INTO TABLE lt_string. + + LOOP AT lt_string ASSIGNING . + + SPLIT AT space INTO lv_word lv_trash. + + CASE lv_word. + WHEN 'object'. + rs_tag-object = lv_trash. + WHEN 'type'. + rs_tag-type = lv_trash. + WHEN 'tag'. + rs_tag-tag = lv_trash. + WHEN 'tagger'. + + FIND FIRST OCCURRENCE OF REGEX `(.*)<(.*)>` + IN lv_trash + SUBMATCHES rs_tag-tagger_name + rs_tag-tagger_email. + + rs_tag-tagger_name = condense( rs_tag-tagger_name ). + + WHEN ''. + " ignore blank lines + CONTINUE. + WHEN OTHERS. + + " these are the non empty line which don't start with a key word + " the first one is the message, the rest are cumulated to the body + + IF rs_tag-message IS INITIAL. + rs_tag-message = . + ELSE. + + IF rs_tag-body IS NOT INITIAL. + rs_tag-body = rs_tag-body && zif_abapgit_definitions=>gc_newline. + ENDIF. + + rs_tag-body = rs_tag-body && . + + ENDIF. + + ENDCASE. + + ENDLOOP. + + ENDMETHOD. + + METHOD decode_tree. CONSTANTS: lc_sha_length TYPE i VALUE 20, @@ -757,6 +842,8 @@ CLASS ZCL_ABAPGIT_GIT_PACK IMPLEMENTATION. lv_type = 32. WHEN zif_abapgit_definitions=>gc_type-blob. lv_type = 48. + WHEN zif_abapgit_definitions=>gc_type-tag. + lv_type = 64. WHEN zif_abapgit_definitions=>gc_type-ref_d. lv_type = 112. WHEN OTHERS. @@ -839,4 +926,25 @@ CLASS ZCL_ABAPGIT_GIT_PACK IMPLEMENTATION. zcx_abapgit_exception=>raise( 'Wrong Adler checksum' ). ENDIF. ENDMETHOD. + + METHOD encode_tag. + + DATA: lv_string TYPE string, + lv_tmp TYPE string, + lv_time TYPE zcl_abapgit_time=>ty_unixtime. + + lv_time = zcl_abapgit_time=>get( ). + + lv_string = |object { is_tag-object }{ zif_abapgit_definitions=>gc_newline }| + && |type { is_tag-type }{ zif_abapgit_definitions=>gc_newline }| + && |tag { zcl_abapgit_tag=>remove_tag_prefix( is_tag-tag ) }{ zif_abapgit_definitions=>gc_newline }| + && |tagger { is_tag-tagger_name } <{ is_tag-tagger_email }> { lv_time }| + && |{ zif_abapgit_definitions=>gc_newline }| + && |{ zif_abapgit_definitions=>gc_newline }| + && |{ is_tag-message }|. + + rv_data = zcl_abapgit_convert=>string_to_xstring_utf8( lv_string ). + + ENDMETHOD. + ENDCLASS. diff --git a/src/git/zcl_abapgit_git_pack.clas.testclasses.abap b/src/git/zcl_abapgit_git_pack.clas.testclasses.abap index 8e0be7314..41c9861d4 100644 --- a/src/git/zcl_abapgit_git_pack.clas.testclasses.abap +++ b/src/git/zcl_abapgit_git_pack.clas.testclasses.abap @@ -567,3 +567,60 @@ CLASS ltcl_git_pack_decode_commit IMPLEMENTATION. ENDMETHOD. ENDCLASS. + +CLASS ltcl_tag DEFINITION FINAL FOR TESTING + DURATION SHORT + RISK LEVEL HARMLESS. + + PRIVATE SECTION. + METHODS: + decode_tag FOR TESTING RAISING cx_static_check. +ENDCLASS. + + +CLASS ltcl_tag IMPLEMENTATION. + + METHOD decode_tag. + + DATA: lv_test_data TYPE string, + lv_xstring TYPE xstring, + ls_tag TYPE zcl_abapgit_git_pack=>ty_tag. + + lv_test_data = |object 175f9a21b15a9012c97a3dd15aea6d74d4204b6b\n| + && |type commit\n| + && |tag tag_1\n| + && |tagger Christian Guenter 1526718052 +0000\n| + && |\n| + && |This is an annotated tag\n|. + + lv_xstring = zcl_abapgit_convert=>string_to_xstring_utf8( lv_test_data ). + + ls_tag = zcl_abapgit_git_pack=>decode_tag( lv_xstring ). + + cl_abap_unit_assert=>assert_equals( + exp = |175f9a21b15a9012c97a3dd15aea6d74d4204b6b| + act = ls_tag-object ). + + cl_abap_unit_assert=>assert_equals( + exp = 'commit' + act = ls_tag-type ). + + cl_abap_unit_assert=>assert_equals( + exp = 'tag_1' + act = ls_tag-tag ). + + cl_abap_unit_assert=>assert_equals( + exp = 'Christian Guenter' + act = ls_tag-tagger_name ). + + cl_abap_unit_assert=>assert_equals( + exp = 'christianguenter@googlemail.com' + act = ls_tag-tagger_email ). + + cl_abap_unit_assert=>assert_equals( + exp = 'This is an annotated tag' + act = ls_tag-message ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/git/zcl_abapgit_git_porcelain.clas.abap b/src/git/zcl_abapgit_git_porcelain.clas.abap index f66a86ce9..1138cd359 100644 --- a/src/git/zcl_abapgit_git_porcelain.clas.abap +++ b/src/git/zcl_abapgit_git_porcelain.clas.abap @@ -32,9 +32,10 @@ CLASS zcl_abapgit_git_porcelain DEFINITION zcx_abapgit_exception . CLASS-METHODS create_tag IMPORTING - !io_repo TYPE REF TO zcl_abapgit_repo_online - !iv_name TYPE string - !iv_from TYPE zif_abapgit_definitions=>ty_sha1 + !io_repo TYPE REF TO zcl_abapgit_repo_online + is_tag TYPE zif_abapgit_definitions=>ty_git_tag + RETURNING + VALUE(rv_created_tag_type) TYPE zif_abapgit_definitions=>ty_git_branch_type RAISING zcx_abapgit_exception . CLASS-METHODS delete_branch @@ -46,7 +47,7 @@ CLASS zcl_abapgit_git_porcelain DEFINITION CLASS-METHODS delete_tag IMPORTING !io_repo TYPE REF TO zcl_abapgit_repo_online - !is_tag TYPE zif_abapgit_definitions=>ty_git_branch + !is_tag TYPE zif_abapgit_definitions=>ty_git_tag RAISING zcx_abapgit_exception . CLASS-METHODS full_tree @@ -56,9 +57,9 @@ CLASS zcl_abapgit_git_porcelain DEFINITION RETURNING VALUE(rt_expanded) TYPE zif_abapgit_definitions=>ty_expanded_tt RAISING - zcx_abapgit_exception . - PRIVATE SECTION. + zcx_abapgit_exception. + PRIVATE SECTION. TYPES: BEGIN OF ty_tree, path TYPE string, data TYPE xstring, @@ -100,7 +101,7 @@ CLASS zcl_abapgit_git_porcelain DEFINITION RETURNING VALUE(rt_expanded) TYPE zif_abapgit_definitions=>ty_expanded_tt RAISING zcx_abapgit_exception. - CLASS-METHODS receive_pack + CLASS-METHODS receive_pack_push IMPORTING is_comment TYPE zif_abapgit_definitions=>ty_comment io_repo TYPE REF TO zcl_abapgit_repo_online it_trees TYPE ty_trees_tt @@ -108,11 +109,16 @@ CLASS zcl_abapgit_git_porcelain DEFINITION io_stage TYPE REF TO zcl_abapgit_stage RETURNING VALUE(rv_branch) TYPE zif_abapgit_definitions=>ty_sha1 RAISING zcx_abapgit_exception. + + CLASS-METHODS receive_pack_create_tag + IMPORTING is_tag TYPE zif_abapgit_definitions=>ty_git_tag + io_repo TYPE REF TO zcl_abapgit_repo_online + RAISING zcx_abapgit_exception. ENDCLASS. -CLASS ZCL_ABAPGIT_GIT_PORCELAIN IMPLEMENTATION. +CLASS zcl_abapgit_git_porcelain IMPLEMENTATION. METHOD build_trees. @@ -202,20 +208,36 @@ CLASS ZCL_ABAPGIT_GIT_PORCELAIN IMPLEMENTATION. DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, lv_pack TYPE xstring. - IF iv_name CS ` `. + IF is_tag-name CS ` `. zcx_abapgit_exception=>raise( 'Tag name cannot contain blank spaces' ). ENDIF. + " It the message is filled we must create an annotated tag. + " Otherwise a lightweight tag is created + IF is_tag-message IS NOT INITIAL. + + receive_pack_create_tag( + is_tag = is_tag + io_repo = io_repo ). + + rv_created_tag_type = zif_abapgit_definitions=>c_git_branch_type-annotated_tag. + + ELSE. + * "client MUST send an empty packfile" * https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L514 - lv_pack = zcl_abapgit_git_pack=>encode( lt_objects ). + lv_pack = zcl_abapgit_git_pack=>encode( lt_objects ). - zcl_abapgit_git_transport=>receive_pack( - iv_url = io_repo->get_url( ) - iv_old = c_zero - iv_new = iv_from - iv_branch_name = iv_name - iv_pack = lv_pack ). + zcl_abapgit_git_transport=>receive_pack( + iv_url = io_repo->get_url( ) + iv_old = c_zero + iv_new = io_repo->get_sha1_local( ) + iv_branch_name = is_tag-name + iv_pack = lv_pack ). + + rv_created_tag_type = zif_abapgit_definitions=>c_git_branch_type-lightweight_tag. + + ENDIF. ENDMETHOD. @@ -435,16 +457,16 @@ CLASS ZCL_ABAPGIT_GIT_PORCELAIN IMPLEMENTATION. lt_trees = build_trees( lt_expanded ). - ev_branch = receive_pack( is_comment = is_comment - io_repo = io_repo - it_trees = lt_trees - it_blobs = lt_blobs - io_stage = io_stage ). + ev_branch = receive_pack_push( is_comment = is_comment + io_repo = io_repo + it_trees = lt_trees + it_blobs = lt_blobs + io_stage = io_stage ). ENDMETHOD. "push - METHOD receive_pack. + METHOD receive_pack_push. DATA: lv_time TYPE zcl_abapgit_time=>ty_unixtime, lv_commit TYPE xstring, @@ -630,4 +652,49 @@ CLASS ZCL_ABAPGIT_GIT_PORCELAIN IMPLEMENTATION. ENDLOOP. ENDMETHOD. + + METHOD receive_pack_create_tag. + + DATA: lv_tag TYPE xstring, + lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, + lv_pack TYPE xstring, + lt_files TYPE zif_abapgit_definitions=>ty_files_tt, + ls_object LIKE LINE OF lt_objects, + ls_tag TYPE zcl_abapgit_git_pack=>ty_tag, + lv_new_tag_sha1 TYPE zif_abapgit_definitions=>ty_sha1. + +* new tag + ls_tag-object = is_tag-sha1. + ls_tag-type = zif_abapgit_definitions=>gc_type-commit. + ls_tag-tag = is_tag-name. + ls_tag-tagger_name = is_tag-tagger_name. + ls_tag-tagger_email = is_tag-tagger_email. + ls_tag-message = is_tag-message + && |{ zif_abapgit_definitions=>gc_newline }| + && |{ zif_abapgit_definitions=>gc_newline }| + && is_tag-body. + + lv_tag = zcl_abapgit_git_pack=>encode_tag( ls_tag ). + + lv_new_tag_sha1 = zcl_abapgit_hash=>sha1( + iv_type = zif_abapgit_definitions=>gc_type-tag + iv_data = lv_tag ). + + CLEAR ls_object. + ls_object-sha1 = lv_new_tag_sha1. + ls_object-type = zif_abapgit_definitions=>gc_type-tag. + ls_object-data = lv_tag. + APPEND ls_object TO lt_objects. + + lv_pack = zcl_abapgit_git_pack=>encode( lt_objects ). + + zcl_abapgit_git_transport=>receive_pack( + iv_url = io_repo->get_url( ) + iv_old = c_zero + iv_new = lv_new_tag_sha1 + iv_branch_name = is_tag-name + iv_pack = lv_pack ). + + ENDMETHOD. + ENDCLASS. diff --git a/src/git/zcl_abapgit_git_transport.clas.abap b/src/git/zcl_abapgit_git_transport.clas.abap index a26eeba8e..ba543a624 100644 --- a/src/git/zcl_abapgit_git_transport.clas.abap +++ b/src/git/zcl_abapgit_git_transport.clas.abap @@ -57,7 +57,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GIT_TRANSPORT IMPLEMENTATION. +CLASS zcl_abapgit_git_transport IMPLEMENTATION. METHOD branches. @@ -209,6 +209,8 @@ CLASS ZCL_ABAPGIT_GIT_TRANSPORT IMPLEMENTATION. zcx_abapgit_exception=>raise( 'funny refname' ). ELSEIF lv_string CP '*failed to update ref*'. zcx_abapgit_exception=>raise( 'failed to update ref' ). + ELSEIF lv_string CP '*missing necessary objects*'. + zcx_abapgit_exception=>raise( 'missing necessary objects' ). ENDIF. ENDMETHOD. "receive_pack diff --git a/src/git/zcl_abapgit_tag.clas.abap b/src/git/zcl_abapgit_tag.clas.abap index 1b00d7328..5baf6eb8c 100644 --- a/src/git/zcl_abapgit_tag.clas.abap +++ b/src/git/zcl_abapgit_tag.clas.abap @@ -7,21 +7,22 @@ CLASS zcl_abapgit_tag DEFINITION CLASS-METHODS: add_tag_prefix IMPORTING - !iv_text TYPE csequence + iv_text TYPE csequence RETURNING VALUE(rv_text) TYPE string, remove_tag_prefix IMPORTING - !iv_text TYPE string + iv_text TYPE string RETURNING - VALUE(rv_text) TYPE string . + VALUE(rv_text) TYPE string. ENDCLASS. -CLASS zcl_abapgit_tag IMPLEMENTATION. +CLASS ZCL_ABAPGIT_TAG IMPLEMENTATION. + METHOD add_tag_prefix. @@ -39,5 +40,4 @@ CLASS zcl_abapgit_tag IMPLEMENTATION. WITH ''. ENDMETHOD. - ENDCLASS. diff --git a/src/ui/zcl_abapgit_gui_page_boverview.clas.abap b/src/ui/zcl_abapgit_gui_page_boverview.clas.abap index cf5cc6bed..73ee2dc42 100644 --- a/src/ui/zcl_abapgit_gui_page_boverview.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_boverview.clas.abap @@ -14,9 +14,10 @@ CLASS zcl_abapgit_gui_page_boverview DEFINITION METHODS render_content REDEFINITION. PRIVATE SECTION. - DATA: mo_repo TYPE REF TO zcl_abapgit_repo_online, - mv_compress TYPE abap_bool VALUE abap_false, - mt_commits TYPE zif_abapgit_definitions=>ty_commit_tt. + DATA: mo_repo TYPE REF TO zcl_abapgit_repo_online, + mv_compress TYPE abap_bool VALUE abap_false, + mt_commits TYPE zif_abapgit_definitions=>ty_commit_tt, + mo_branch_overview TYPE REF TO zcl_abapgit_branch_overview. CONSTANTS: BEGIN OF c_actions, uncompress TYPE string VALUE 'uncompress' ##NO_TEXT, @@ -58,7 +59,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GUI_PAGE_BOVERVIEW IMPLEMENTATION. +CLASS zcl_abapgit_gui_page_boverview IMPLEMENTATION. METHOD body. @@ -234,7 +235,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_BOVERVIEW IMPLEMENTATION. CREATE OBJECT ro_html. - lt_branches = zcl_abapgit_branch_overview=>get_branches( ). + lt_branches = mo_branch_overview->get_branches( ). ro_html->add( || ). + + ro_html->add( '' ). + ro_html->add( '' ). + + ro_html->add( '' ). + ro_html->add( '' ). + + ENDMETHOD. "render_form + + + METHOD render_menu. + + DATA lo_toolbar TYPE REF TO zcl_abapgit_html_toolbar. + + CREATE OBJECT ro_html. + CREATE OBJECT lo_toolbar. + + lo_toolbar->add( iv_act = 'submitFormById(''commit_form'');' + iv_txt = 'Create' + iv_typ = zif_abapgit_definitions=>gc_action_type-onclick + iv_opt = zif_abapgit_definitions=>gc_html_opt-strong ) ##NO_TEXT. + + lo_toolbar->add( iv_act = c_action-commit_cancel + iv_txt = 'Cancel' + iv_opt = zif_abapgit_definitions=>gc_html_opt-cancel ) ##NO_TEXT. + + ro_html->add( '
' ). + ro_html->add( lo_toolbar->render( ) ). + ro_html->add( '
' ). + + ENDMETHOD. "render_menu + + + METHOD render_text_input. + + DATA lv_attrs TYPE string. + + CREATE OBJECT ro_html. + + IF iv_value IS NOT INITIAL. + lv_attrs = | value="{ iv_value }"|. + ENDIF. + + IF iv_max_length IS NOT INITIAL. + lv_attrs = | maxlength="{ iv_max_length }"|. + ENDIF. + + ro_html->add( '
' ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( '
' ). + + ENDMETHOD. " render_text_input + + + METHOD scripts. + + CREATE OBJECT ro_html. + ro_html->add( 'setInitialFocus("tag_name");' ). + + ENDMETHOD. "scripts + + + METHOD zif_abapgit_gui_page~on_event. + + CASE iv_action. + WHEN c_action-commit_post. + + create_tag( it_postdata ). + + ev_state = zif_abapgit_definitions=>gc_event_state-go_back. + + WHEN c_action-commit_cancel. + ev_state = zif_abapgit_definitions=>gc_event_state-go_back. + ENDCASE. + + ENDMETHOD. + + METHOD create_tag. + + DATA: + ls_tag TYPE zif_abapgit_definitions=>ty_git_tag, + lx_error TYPE REF TO zcx_abapgit_exception, + lv_text TYPE string, + lv_tag_type TYPE zif_abapgit_definitions=>ty_git_branch_type. + + zcl_abapgit_html_action_utils=>parse_tag_request( + EXPORTING it_postdata = it_postdata + IMPORTING es_fields = ls_tag ). + + ls_tag-name = zcl_abapgit_tag=>add_tag_prefix( ls_tag-name ). + ASSERT ls_tag-name CP 'refs/tags/+*'. + + TRY. + lv_tag_type = zcl_abapgit_git_porcelain=>create_tag( io_repo = mo_repo_online + is_tag = ls_tag ). + + CATCH zcx_abapgit_exception INTO lx_error. + zcx_abapgit_exception=>raise( |Cannot create tag { ls_tag-name }. Error: '{ lx_error->get_text( ) }'| ). + ENDTRY. + + IF lv_tag_type = zif_abapgit_definitions=>c_git_branch_type-lightweight_tag. + lv_text = |Lightweight tag { zcl_abapgit_tag=>remove_tag_prefix( ls_tag-name ) } created| ##NO_TEXT. + ELSE. + lv_text = |Annotated tag { zcl_abapgit_tag=>remove_tag_prefix( ls_tag-name ) } created| ##NO_TEXT. + ENDIF. + + MESSAGE lv_text TYPE 'S'. + + ENDMETHOD. + +ENDCLASS. diff --git a/src/ui/zcl_abapgit_gui_page_tag.clas.xml b/src/ui/zcl_abapgit_gui_page_tag.clas.xml new file mode 100644 index 000000000..024b24410 --- /dev/null +++ b/src/ui/zcl_abapgit_gui_page_tag.clas.xml @@ -0,0 +1,19 @@ + + + + + + ZCL_ABAPGIT_GUI_PAGE_TAG + 1 + E + GUI - Commit page + 2 + 1 + X + X + X + X + + + + diff --git a/src/ui/zcl_abapgit_gui_router.clas.abap b/src/ui/zcl_abapgit_gui_router.clas.abap index 9a8b540e5..0aa4260d5 100644 --- a/src/ui/zcl_abapgit_gui_router.clas.abap +++ b/src/ui/zcl_abapgit_gui_router.clas.abap @@ -44,7 +44,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION. +CLASS zcl_abapgit_gui_router IMPLEMENTATION. METHOD get_page_background. @@ -341,9 +341,10 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION. zcl_abapgit_services_git=>tag_overview( lv_key ). ev_state = zif_abapgit_definitions=>gc_event_state-re_render. WHEN zif_abapgit_definitions=>gc_action-git_tag_create. " GIT Tag create - zcl_abapgit_services_git=>create_tag( lv_key ). - zcl_abapgit_services_repo=>refresh( lv_key ). - ev_state = zif_abapgit_definitions=>gc_event_state-re_render. + CREATE OBJECT ei_page TYPE zcl_abapgit_gui_page_tag + 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-git_tag_delete. " GIT Tag create zcl_abapgit_services_git=>delete_tag( lv_key ). zcl_abapgit_services_repo=>refresh( lv_key ). diff --git a/src/ui/zcl_abapgit_html_action_utils.clas.abap b/src/ui/zcl_abapgit_html_action_utils.clas.abap index 85d834712..824c61c4e 100644 --- a/src/ui/zcl_abapgit_html_action_utils.clas.abap +++ b/src/ui/zcl_abapgit_html_action_utils.clas.abap @@ -96,6 +96,11 @@ CLASS zcl_abapgit_html_action_utils DEFINITION !it_postdata TYPE cnht_post_data_tab EXPORTING !es_fields TYPE any . + CLASS-METHODS parse_tag_request + IMPORTING + !it_postdata TYPE cnht_post_data_tab + EXPORTING + !es_fields TYPE any . CLASS-METHODS decode_bg_update IMPORTING !iv_getdata TYPE clike @@ -118,7 +123,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_HTML_ACTION_UTILS IMPLEMENTATION. +CLASS zcl_abapgit_html_action_utils IMPLEMENTATION. METHOD add_field. @@ -430,4 +435,34 @@ CLASS ZCL_ABAPGIT_HTML_ACTION_UTILS IMPLEMENTATION. REPLACE ALL OCCURRENCES OF '%3F' IN rv_string WITH '?'. ENDMETHOD. + + METHOD parse_tag_request. + + CONSTANTS: lc_replace TYPE string VALUE '<>'. + + DATA: lv_string TYPE string, + lt_fields TYPE tihttpnvp. + + FIELD-SYMBOLS TYPE string. + + CLEAR es_fields. + + CONCATENATE LINES OF it_postdata INTO lv_string. + REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>gc_crlf IN lv_string WITH lc_replace. + REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>gc_newline IN lv_string WITH lc_replace. + lt_fields = parse_fields_upper_case_name( lv_string ). + + get_field( EXPORTING name = 'SHA1' it = lt_fields CHANGING cv = es_fields ). + get_field( EXPORTING name = 'NAME' it = lt_fields CHANGING cv = es_fields ). + get_field( EXPORTING name = 'TAGGER_NAME' it = lt_fields CHANGING cv = es_fields ). + get_field( EXPORTING name = 'TAGGER_EMAIL' it = lt_fields CHANGING cv = es_fields ). + get_field( EXPORTING name = 'MESSAGE' it = lt_fields CHANGING cv = es_fields ). + get_field( EXPORTING name = 'BODY' it = lt_fields CHANGING cv = es_fields ). + + ASSIGN COMPONENT 'BODY' OF STRUCTURE es_fields TO . + ASSERT IS ASSIGNED. + REPLACE ALL OCCURRENCES OF lc_replace IN WITH zif_abapgit_definitions=>gc_newline. + + ENDMETHOD. + ENDCLASS. diff --git a/src/ui/zcl_abapgit_popups.clas.abap b/src/ui/zcl_abapgit_popups.clas.abap index 04fa85196..9b36ba999 100644 --- a/src/ui/zcl_abapgit_popups.clas.abap +++ b/src/ui/zcl_abapgit_popups.clas.abap @@ -37,15 +37,7 @@ CLASS zcl_abapgit_popups DEFINITION !ev_cancel TYPE abap_bool RAISING zcx_abapgit_exception . - CLASS-METHODS create_tag_popup - IMPORTING - !iv_sha1 TYPE zif_abapgit_definitions=>ty_sha1 - EXPORTING - !ev_name TYPE string - !ev_sha1 TYPE zif_abapgit_definitions=>ty_sha1 - !ev_cancel TYPE abap_bool - RAISING - zcx_abapgit_exception . + CLASS-METHODS run_page_class_popup EXPORTING !ev_name TYPE string @@ -66,14 +58,8 @@ CLASS zcl_abapgit_popups DEFINITION VALUE(rs_branch) TYPE zif_abapgit_definitions=>ty_git_branch RAISING zcx_abapgit_exception . - CLASS-METHODS tag_list_popup - IMPORTING - !iv_url TYPE string - !iv_select_mode TYPE abap_bool DEFAULT abap_true - RETURNING - VALUE(rs_tag) TYPE zif_abapgit_definitions=>ty_git_branch - RAISING - zcx_abapgit_exception . + + CLASS-METHODS repo_popup IMPORTING !iv_url TYPE string @@ -162,7 +148,7 @@ CLASS zcl_abapgit_popups DEFINITION PRIVATE SECTION. TYPES: - ty_sval_tt TYPE STANDARD TABLE OF sval WITH DEFAULT KEY . + ty_sval_tt TYPE STANDARD TABLE OF sval WITH DEFAULT KEY. CONSTANTS c_fieldname_selected TYPE lvc_fname VALUE `SELECTED` ##NO_TEXT. CLASS-DATA go_select_list_popup TYPE REF TO cl_salv_table . @@ -197,11 +183,12 @@ CLASS zcl_abapgit_popups DEFINITION !e_salv_function . CLASS-METHODS extract_field_values IMPORTING - !it_fields TYPE ty_sval_tt + it_fields TYPE ty_sval_tt EXPORTING - !ev_url TYPE abaptxt255-line - !ev_package TYPE tdevc-devclass - !ev_branch TYPE textl-line . + ev_url TYPE abaptxt255-line + ev_package TYPE tdevc-devclass + ev_branch TYPE textl-line . + ENDCLASS. @@ -473,75 +460,6 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. ENDMETHOD. - METHOD create_tag_popup. - - DATA: lv_answer TYPE c LENGTH 1, - lt_fields TYPE TABLE OF sval, - lv_exit_while_loop TYPE abap_bool. - - FIELD-SYMBOLS: LIKE LINE OF lt_fields. - - CLEAR: ev_name, ev_cancel, ev_sha1. - - add_field( EXPORTING iv_tabname = 'TBDTPPT' - iv_fieldname = 'P_TEXT' - iv_fieldtext = 'SHA' - iv_value = iv_sha1 - iv_obligatory = abap_true - CHANGING ct_fields = lt_fields ). - - add_field( EXPORTING iv_tabname = 'TEXTL' - iv_fieldname = 'LINE' - iv_fieldtext = 'Name' - iv_obligatory = abap_true - CHANGING ct_fields = lt_fields ). - - WHILE lv_exit_while_loop = abap_false. - - CALL FUNCTION 'POPUP_GET_VALUES' - EXPORTING - popup_title = 'Create tag' - IMPORTING - returncode = lv_answer - TABLES - fields = lt_fields - EXCEPTIONS - error_in_fields = 1 - OTHERS = 2 ##NO_TEXT. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'error from POPUP_GET_VALUES' ). - ENDIF. - - IF lv_answer = 'A'. - ev_cancel = abap_true. - RETURN. - ENDIF. - - READ TABLE lt_fields WITH KEY fieldname = 'P_TEXT' - ASSIGNING . - ASSERT sy-subrc = 0. - - ev_sha1 = -value. - - READ TABLE lt_fields WITH KEY fieldname = 'LINE' - ASSIGNING . - ASSERT sy-subrc = 0. - - IF condense( -value ) CS ` `. - CLEAR: lv_exit_while_loop. - MESSAGE 'Tag name cannot contain blank spaces' TYPE 'S' DISPLAY LIKE 'E'. - CONTINUE. - ENDIF. - - ev_name = zcl_abapgit_tag=>add_tag_prefix( -value ). - - lv_exit_while_loop = abap_true. - - ENDWHILE. - - ENDMETHOD. - - METHOD extract_field_values. FIELD-SYMBOLS: LIKE LINE OF it_fields. @@ -1358,118 +1276,4 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. ENDIF. ENDMETHOD. "run_page_class_popup - - - METHOD tag_list_popup. - - DATA: lo_branches TYPE REF TO zcl_abapgit_git_branch_list, - lt_tags TYPE zif_abapgit_definitions=>ty_git_branch_list_tt, - lv_answer TYPE c LENGTH 1, - lt_selection TYPE TABLE OF spopli, - lv_name_with_prefix TYPE string, - lo_alv TYPE REF TO cl_salv_table, - lo_table_header TYPE REF TO cl_salv_form_text, - lo_columns TYPE REF TO cl_salv_columns_table, - lx_alv TYPE REF TO cx_salv_error. - - FIELD-SYMBOLS: LIKE LINE OF lt_selection, - LIKE LINE OF lt_tags. - - lo_branches = zcl_abapgit_git_transport=>branches( iv_url ). - lt_tags = lo_branches->get_tags_only( ). - - IF lines( lt_tags ) = 0. - zcx_abapgit_exception=>raise( `There are no tags for this repository` ). - ENDIF. - - IF iv_select_mode = abap_true. - - LOOP AT lt_tags ASSIGNING . - - INSERT INITIAL LINE INTO lt_selection INDEX 1 ASSIGNING . - -varoption = zcl_abapgit_tag=>remove_tag_prefix( -name ). - - ENDLOOP. - - CALL FUNCTION 'POPUP_TO_DECIDE_LIST' - EXPORTING - textline1 = 'Select tag' - titel = 'Select tag' - start_col = 30 - start_row = 5 - IMPORTING - answer = lv_answer - TABLES - t_spopli = lt_selection - EXCEPTIONS - not_enough_answers = 1 - too_much_answers = 2 - too_much_marks = 3 - OTHERS = 4. "#EC NOTEXT - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'Error from POPUP_TO_DECIDE_LIST' ). - ENDIF. - - IF lv_answer = 'A'. " cancel - RETURN. - ENDIF. - - READ TABLE lt_selection ASSIGNING WITH KEY selflag = abap_true. - ASSERT sy-subrc = 0. - - lv_name_with_prefix = zcl_abapgit_tag=>add_tag_prefix( -varoption ). - - READ TABLE lt_tags ASSIGNING WITH KEY name = lv_name_with_prefix. - ASSERT sy-subrc = 0. - - rs_tag = . - - ELSE. - - LOOP AT lt_tags ASSIGNING . - - -name = zcl_abapgit_tag=>remove_tag_prefix( -name ). - - ENDLOOP. - - TRY. - cl_salv_table=>factory( - IMPORTING - r_salv_table = lo_alv - CHANGING - t_table = lt_tags ). - - lo_columns = lo_alv->get_columns( ). - - lo_columns->get_column( `TYPE` )->set_technical( ). - lo_columns->get_column( `IS_HEAD` )->set_technical( ). - lo_columns->get_column( `DISPLAY_NAME` )->set_technical( ). - - lo_columns->get_column( `SHA1` )->set_output_length( 30 ). - lo_columns->get_column( `SHA1` )->set_medium_text( 'SHA' ). - - lo_columns->get_column( `NAME` )->set_medium_text( 'Tag name' ). - - lo_columns->set_optimize( ). - - lo_alv->set_screen_popup( start_column = 5 - end_column = 70 - start_line = 5 - end_line = 25 ). - - CREATE OBJECT lo_table_header - EXPORTING - text = `Tags`. - - lo_alv->set_top_of_list( lo_table_header ). - - lo_alv->display( ). - - CATCH cx_salv_error INTO lx_alv. - zcx_abapgit_exception=>raise( lx_alv->get_text( ) ). - ENDTRY. - - ENDIF. - - ENDMETHOD. ENDCLASS. diff --git a/src/ui/zcl_abapgit_services_git.clas.abap b/src/ui/zcl_abapgit_services_git.clas.abap index 7e263cc7e..02aa17187 100644 --- a/src/ui/zcl_abapgit_services_git.clas.abap +++ b/src/ui/zcl_abapgit_services_git.clas.abap @@ -4,7 +4,6 @@ CLASS zcl_abapgit_services_git DEFINITION CREATE PUBLIC . PUBLIC SECTION. - TYPES: BEGIN OF ty_commit_fields, repo_key TYPE zif_abapgit_persistence=>ty_repo-key, @@ -14,7 +13,7 @@ CLASS zcl_abapgit_services_git DEFINITION author_email TYPE string, comment TYPE string, body TYPE string, - END OF ty_commit_fields . + END OF ty_commit_fields. CLASS-METHODS pull IMPORTING @@ -46,12 +45,7 @@ CLASS zcl_abapgit_services_git DEFINITION RAISING zcx_abapgit_exception zcx_abapgit_cancel . - CLASS-METHODS create_tag - IMPORTING - !iv_key TYPE zif_abapgit_persistence=>ty_repo-key - RAISING - zcx_abapgit_exception - zcx_abapgit_cancel . + CLASS-METHODS delete_tag IMPORTING !iv_key TYPE zif_abapgit_persistence=>ty_repo-key @@ -77,7 +71,8 @@ CLASS zcl_abapgit_services_git DEFINITION !io_stage TYPE REF TO zcl_abapgit_stage RAISING zcx_abapgit_exception - zcx_abapgit_cancel . + zcx_abapgit_cancel. + ENDCLASS. @@ -157,55 +152,6 @@ CLASS zcl_abapgit_services_git IMPLEMENTATION. ENDMETHOD. - METHOD create_tag. - - " Here we create a 'lightweight' tag. Which means that - " the tag only contains the commit checksum but no meta data - " - " Later we probably want to add also 'annotated' tags. - " Which include more detailed information besides the commit. Like message, date and the tagger - " - " https://git-scm.com/book/en/v2/Git-Basics-Tagging - - DATA: lv_name TYPE string, - lv_cancel TYPE abap_bool, - lx_error TYPE REF TO zcx_abapgit_exception, - lv_text TYPE string, - lo_repo TYPE REF TO zcl_abapgit_repo_online, - lv_sha1 TYPE zif_abapgit_definitions=>ty_sha1. - - lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). - - zcl_abapgit_popups=>create_tag_popup( - EXPORTING - iv_sha1 = lo_repo->get_sha1_local( ) - IMPORTING - ev_name = lv_name - ev_sha1 = lv_sha1 - ev_cancel = lv_cancel ). - - IF lv_cancel = abap_true. - RAISE EXCEPTION TYPE zcx_abapgit_cancel. - ENDIF. - - ASSERT lv_name CP 'refs/tags/+*'. - - TRY. - zcl_abapgit_git_porcelain=>create_tag( io_repo = lo_repo - iv_name = lv_name - iv_from = lv_sha1 ). - - CATCH zcx_abapgit_exception INTO lx_error. - zcx_abapgit_exception=>raise( |Cannot create tag { lv_name }. Error: '{ lx_error->get_text( ) }'| ). - ENDTRY. - - lv_text = |Tag { zcl_abapgit_tag=>remove_tag_prefix( lv_name ) } created| ##NO_TEXT. - - MESSAGE lv_text TYPE 'S'. - - ENDMETHOD. - - METHOD delete_branch. DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, @@ -237,12 +183,12 @@ CLASS zcl_abapgit_services_git IMPLEMENTATION. METHOD delete_tag. DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, - ls_tag TYPE zif_abapgit_definitions=>ty_git_branch, + ls_tag TYPE zif_abapgit_definitions=>ty_git_tag, lv_text TYPE string. lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). - ls_tag = zcl_abapgit_popups=>tag_list_popup( lo_repo->get_url( ) ). + ls_tag = zcl_abapgit_tag_popups=>tag_select_popup( lo_repo ). IF ls_tag IS INITIAL. RAISE EXCEPTION TYPE zcx_abapgit_cancel. ENDIF. @@ -361,11 +307,11 @@ CLASS zcl_abapgit_services_git IMPLEMENTATION. METHOD switch_tag. DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, - ls_tag TYPE zif_abapgit_definitions=>ty_git_branch. + ls_tag TYPE zif_abapgit_definitions=>ty_git_tag. lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). - ls_tag = zcl_abapgit_popups=>tag_list_popup( lo_repo->get_url( ) ). + ls_tag = zcl_abapgit_tag_popups=>tag_select_popup( lo_repo ). IF ls_tag IS INITIAL. RAISE EXCEPTION TYPE zcx_abapgit_cancel. ENDIF. @@ -385,8 +331,8 @@ CLASS zcl_abapgit_services_git IMPLEMENTATION. lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). - zcl_abapgit_popups=>tag_list_popup( iv_url = lo_repo->get_url( ) - iv_select_mode = abap_false ). + zcl_abapgit_tag_popups=>tag_list_popup( io_repo = lo_repo ). ENDMETHOD. + ENDCLASS. diff --git a/src/ui/zcl_abapgit_tag_popups.clas.abap b/src/ui/zcl_abapgit_tag_popups.clas.abap new file mode 100644 index 000000000..162cace75 --- /dev/null +++ b/src/ui/zcl_abapgit_tag_popups.clas.abap @@ -0,0 +1,336 @@ +CLASS zcl_abapgit_tag_popups DEFINITION + PUBLIC + FINAL + CREATE PUBLIC. + + PUBLIC SECTION. + + CLASS-METHODS: + tag_list_popup + IMPORTING + io_repo TYPE REF TO zcl_abapgit_repo_online + RETURNING + VALUE(rs_tag) TYPE zif_abapgit_definitions=>ty_git_tag + RAISING + zcx_abapgit_exception, + + tag_select_popup + IMPORTING + io_repo TYPE REF TO zcl_abapgit_repo_online + RETURNING + VALUE(rs_tag) TYPE zif_abapgit_definitions=>ty_git_tag + RAISING + zcx_abapgit_exception . + + PRIVATE SECTION. + TYPES: + BEGIN OF ty_tag_out. + INCLUDE TYPE zif_abapgit_definitions=>ty_git_tag. + TYPES: body_icon TYPE icon_d, + END OF ty_tag_out, + tty_tag_out TYPE STANDARD TABLE OF ty_tag_out + WITH NON-UNIQUE DEFAULT KEY. + + CLASS-DATA: + mt_tags TYPE tty_tag_out, + mo_docking_container TYPE REF TO cl_gui_docking_container, + mo_text_control TYPE REF TO cl_gui_textedit. + + CLASS-METHODS: + on_double_click FOR EVENT double_click OF cl_salv_events_table + IMPORTING row column, + + prepare_tags_for_display + IMPORTING + it_tags TYPE zif_abapgit_definitions=>ty_git_tag_list_tt + RETURNING + VALUE(rt_tags_out) TYPE zcl_abapgit_tag_popups=>tty_tag_out, + + clean_up, + + show_docking_container_with + IMPORTING + iv_text TYPE string. + +ENDCLASS. + + + +CLASS zcl_abapgit_tag_popups IMPLEMENTATION. + + + METHOD on_double_click. + + FIELD-SYMBOLS: TYPE zcl_abapgit_tag_popups=>ty_tag_out. + + READ TABLE mt_tags ASSIGNING + INDEX row. + IF sy-subrc <> 0 OR -body IS INITIAL. + RETURN. + ENDIF. + + show_docking_container_with( -body ). + + ENDMETHOD. + + + METHOD prepare_tags_for_display. + + DATA: ls_tag_out LIKE LINE OF rt_tags_out. + + FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_git_tag. + + LOOP AT it_tags ASSIGNING . + + CLEAR: ls_tag_out. + + MOVE-CORRESPONDING TO ls_tag_out. + + ls_tag_out-name = zcl_abapgit_tag=>remove_tag_prefix( ls_tag_out-name ). + + IF ls_tag_out-body IS NOT INITIAL. + ls_tag_out-body_icon = |{ icon_display_text }|. + ENDIF. + + INSERT ls_tag_out INTO TABLE rt_tags_out. + + ENDLOOP. + + ENDMETHOD. + + + METHOD tag_list_popup. + + DATA: lo_alv TYPE REF TO cl_salv_table, + lo_table_header TYPE REF TO cl_salv_form_header_info, + lo_columns TYPE REF TO cl_salv_columns_table, + lx_alv TYPE REF TO cx_salv_error, + lt_tags TYPE zif_abapgit_definitions=>ty_git_tag_list_tt, + lo_event TYPE REF TO cl_salv_events_table. + + CLEAR: mt_tags. + + lt_tags = zcl_abapgit_branch_overview=>run( io_repo = io_repo )->get_tags( ). + + IF lines( lt_tags ) = 0. + zcx_abapgit_exception=>raise( `There are no tags for this repository` ). + ENDIF. + + mt_tags = prepare_tags_for_display( lt_tags ). + + TRY. + cl_salv_table=>factory( + IMPORTING + r_salv_table = lo_alv + CHANGING + t_table = mt_tags ). + + lo_columns = lo_alv->get_columns( ). + + lo_columns->get_column( `TYPE` )->set_technical( ). + lo_columns->get_column( `DISPLAY_NAME` )->set_technical( ). + lo_columns->get_column( `BODY` )->set_technical( ). + + lo_columns->get_column( `NAME` )->set_medium_text( 'Tag name' ). + lo_columns->set_column_position( columnname = 'NAME' + position = 1 ). + + lo_columns->get_column( `TAGGER_NAME` )->set_medium_text( 'Tagger' ). + lo_columns->set_column_position( columnname = 'TAGGER_NAME' + position = 2 ). + + lo_columns->get_column( `TAGGER_EMAIL` )->set_medium_text( 'Tagger E-Mail' ). + lo_columns->set_column_position( columnname = 'TAGGER_EMAIL' + position = 3 ). + + lo_columns->get_column( `MESSAGE` )->set_medium_text( 'Tag message' ). + lo_columns->set_column_position( columnname = 'MESSAGE' + position = 4 ). + + lo_columns->get_column( `BODY_ICON` )->set_medium_text( 'Body' ). + lo_columns->get_column( `BODY_ICON` )->set_output_length( 4 ). + lo_columns->set_column_position( columnname = 'BODY_ICON' + position = 5 ). + + lo_columns->get_column( `SHA1` )->set_output_length( 15 ). + lo_columns->get_column( `SHA1` )->set_medium_text( 'SHA' ). + lo_columns->set_column_position( columnname = 'SHA1' + position = 6 ). + + lo_columns->get_column( `OBJECT` )->set_output_length( 15 ). + lo_columns->get_column( `OBJECT` )->set_medium_text( 'Object' ). + lo_columns->set_column_position( columnname = 'OBJECT' + position = 7 ). + + lo_columns->set_optimize( ). + + lo_alv->set_screen_popup( start_column = 7 + end_column = 200 + start_line = 1 + end_line = 25 ). + + CREATE OBJECT lo_table_header + EXPORTING + text = `Tags`. + + lo_alv->set_top_of_list( lo_table_header ). + + lo_event = lo_alv->get_event( ). + + SET HANDLER on_double_click FOR lo_event. + + lo_alv->display( ). + + CATCH cx_salv_error INTO lx_alv. + zcx_abapgit_exception=>raise( lx_alv->get_text( ) ). + ENDTRY. + + clean_up( ). + + ENDMETHOD. + + + METHOD tag_select_popup. + + DATA: lt_tags TYPE zif_abapgit_definitions=>ty_git_tag_list_tt, + lv_answer TYPE c LENGTH 1, + lt_selection TYPE TABLE OF spopli, + lv_name_with_prefix TYPE string. + + FIELD-SYMBOLS: LIKE LINE OF lt_selection, + LIKE LINE OF lt_tags. + + lt_tags = zcl_abapgit_branch_overview=>run( io_repo = io_repo )->get_tags( ). + + IF lines( lt_tags ) = 0. + zcx_abapgit_exception=>raise( `There are no tags for this repository` ). + ENDIF. + + LOOP AT lt_tags ASSIGNING . + + INSERT INITIAL LINE INTO lt_selection INDEX 1 ASSIGNING . + -varoption = zcl_abapgit_tag=>remove_tag_prefix( -name ). + + ENDLOOP. + + CALL FUNCTION 'POPUP_TO_DECIDE_LIST' + EXPORTING + textline1 = 'Select tag' + titel = 'Select tag' + start_col = 30 + start_row = 5 + IMPORTING + answer = lv_answer + TABLES + t_spopli = lt_selection + EXCEPTIONS + not_enough_answers = 1 + too_much_answers = 2 + too_much_marks = 3 + OTHERS = 4. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( 'Error from POPUP_TO_DECIDE_LIST' ). + ENDIF. + + IF lv_answer = 'A'. + RETURN. + ENDIF. + + READ TABLE lt_selection ASSIGNING WITH KEY selflag = abap_true. + ASSERT sy-subrc = 0. + + lv_name_with_prefix = zcl_abapgit_tag=>add_tag_prefix( -varoption ). + + READ TABLE lt_tags ASSIGNING WITH KEY name = lv_name_with_prefix. + ASSERT sy-subrc = 0. + + rs_tag = . + + ENDMETHOD. + + METHOD clean_up. + + IF mo_text_control IS BOUND. + + mo_text_control->finalize( ). + mo_text_control->free( + EXCEPTIONS + cntl_error = 1 + cntl_system_error = 2 + OTHERS = 3 ). + ASSERT sy-subrc = 0. + + CLEAR: mo_text_control. + + ENDIF. + + IF mo_docking_container IS BOUND. + + mo_docking_container->finalize( ). + mo_docking_container->free( + EXCEPTIONS + cntl_error = 1 + cntl_system_error = 2 + OTHERS = 3 ). + ASSERT sy-subrc = 0. + + CLEAR: mo_docking_container. + + ENDIF. + + ENDMETHOD. + + + METHOD show_docking_container_with. + + IF mo_docking_container IS NOT BOUND. + + CREATE OBJECT mo_docking_container + EXPORTING + side = cl_gui_docking_container=>dock_at_bottom + extension = 120 + EXCEPTIONS + cntl_error = 1 + cntl_system_error = 2 + create_error = 3 + lifetime_error = 4 + lifetime_dynpro_dynpro_link = 5 + OTHERS = 6. + ASSERT sy-subrc = 0. + + ENDIF. + + IF mo_text_control IS NOT BOUND. + CREATE OBJECT mo_text_control + EXPORTING + parent = mo_docking_container + EXCEPTIONS + error_cntl_create = 1 + error_cntl_init = 2 + error_cntl_link = 3 + error_dp_create = 4 + gui_type_not_supported = 5 + OTHERS = 6. + ASSERT sy-subrc = 0. + + mo_text_control->set_readonly_mode( + EXCEPTIONS + error_cntl_call_method = 1 + invalid_parameter = 2 + OTHERS = 3 ). + ASSERT sy-subrc = 0. + + ENDIF. + + mo_text_control->set_textstream( + EXPORTING + text = iv_text + EXCEPTIONS + error_cntl_call_method = 1 + not_supported_by_gui = 2 + OTHERS = 3 ). + ASSERT sy-subrc = 0. + + ENDMETHOD. + +ENDCLASS. diff --git a/src/ui/zcl_abapgit_tag_popups.clas.xml b/src/ui/zcl_abapgit_tag_popups.clas.xml new file mode 100644 index 000000000..927a080f1 --- /dev/null +++ b/src/ui/zcl_abapgit_tag_popups.clas.xml @@ -0,0 +1,19 @@ + + + + + + ZCL_ABAPGIT_TAG_POPUPS + 1 + E + Popups + 2 + 1 + X + X + X + X + + + + diff --git a/src/zcl_abapgit_branch_overview.clas.abap b/src/zcl_abapgit_branch_overview.clas.abap index 04f4afd7a..8d58672cd 100644 --- a/src/zcl_abapgit_branch_overview.clas.abap +++ b/src/zcl_abapgit_branch_overview.clas.abap @@ -1,24 +1,40 @@ -CLASS zcl_abapgit_branch_overview DEFINITION PUBLIC FINAL CREATE PUBLIC. +CLASS zcl_abapgit_branch_overview DEFINITION PUBLIC FINAL CREATE PRIVATE. PUBLIC SECTION. CLASS-METHODS: run - IMPORTING io_repo TYPE REF TO zcl_abapgit_repo_online - RETURNING VALUE(rt_commits) TYPE zif_abapgit_definitions=>ty_commit_tt + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo_online + RETURNING VALUE(ro_branch_overview) TYPE REF TO zcl_abapgit_branch_overview RAISING zcx_abapgit_exception. - CLASS-METHODS: compress - IMPORTING it_commits TYPE zif_abapgit_definitions=>ty_commit_tt - RETURNING VALUE(rt_commits) TYPE zif_abapgit_definitions=>ty_commit_tt - RAISING zcx_abapgit_exception. - CLASS-METHODS: get_branches - RETURNING VALUE(rt_branches) TYPE zif_abapgit_definitions=>ty_git_branch_list_tt. + METHODS: + constructor + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo_online + RAISING zcx_abapgit_exception, + + get_branches + RETURNING VALUE(rt_branches) TYPE zif_abapgit_definitions=>ty_git_branch_list_tt, + + get_tags + RETURNING VALUE(rt_tags) TYPE zif_abapgit_definitions=>ty_git_tag_list_tt, + + get_commits + RETURNING + VALUE(rt_commits) TYPE zif_abapgit_definitions=>ty_commit_tt, + + compress + IMPORTING it_commits TYPE zif_abapgit_definitions=>ty_commit_tt + RETURNING VALUE(rt_commits) TYPE zif_abapgit_definitions=>ty_commit_tt + RAISING zcx_abapgit_exception. + PRIVATE SECTION. - - CLASS-METHODS: + METHODS: parse_commits IMPORTING it_objects TYPE zif_abapgit_definitions=>ty_objects_tt RAISING zcx_abapgit_exception, + parse_annotated_tags + IMPORTING it_objects TYPE zif_abapgit_definitions=>ty_objects_tt + RAISING zcx_abapgit_exception, determine_branch RAISING zcx_abapgit_exception, determine_merges @@ -32,15 +48,17 @@ CLASS zcl_abapgit_branch_overview DEFINITION PUBLIC FINAL CREATE PUBLIC. determine_tags RAISING zcx_abapgit_exception. - CLASS-DATA: - gt_branches TYPE zif_abapgit_definitions=>ty_git_branch_list_tt, - gt_commits TYPE TABLE OF zif_abapgit_definitions=>ty_commit, - gt_tags TYPE zif_abapgit_definitions=>ty_git_branch_list_tt. + DATA: + mo_repo TYPE REF TO zcl_abapgit_repo_online, + mt_branches TYPE zif_abapgit_definitions=>ty_git_branch_list_tt, + mt_commits TYPE TABLE OF zif_abapgit_definitions=>ty_commit, + mt_tags TYPE zif_abapgit_definitions=>ty_git_tag_list_tt. + ENDCLASS. -CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. +CLASS zcl_abapgit_branch_overview IMPLEMENTATION. METHOD compress. @@ -64,13 +82,13 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. lv_name TYPE string, lt_temp LIKE it_commits. - FIELD-SYMBOLS: LIKE LINE OF gt_branches, + FIELD-SYMBOLS: LIKE LINE OF mt_branches, LIKE LINE OF rt_commits, LIKE LINE OF lt_temp, LIKE LINE OF it_commits. - LOOP AT gt_branches ASSIGNING . + LOOP AT mt_branches ASSIGNING . CLEAR lt_temp. lv_name = -name+11. @@ -105,31 +123,56 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. ENDMETHOD. + METHOD constructor. + + DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt. + + mo_repo = io_repo. + + CLEAR mt_branches. + CLEAR mt_commits. + + lt_objects = get_git_objects( io_repo ). + parse_commits( lt_objects ). + parse_annotated_tags( lt_objects ). + + CLEAR lt_objects. + + determine_branch( ). + determine_merges( ). + determine_tags( ). + fixes( ). + + SORT mt_commits BY time ASCENDING. + + ENDMETHOD. + + METHOD determine_branch. CONSTANTS: lc_head TYPE string VALUE 'HEAD'. DATA: lv_name TYPE string. - FIELD-SYMBOLS: LIKE LINE OF gt_branches, - LIKE LINE OF gt_branches, - LIKE LINE OF gt_commits, + FIELD-SYMBOLS: LIKE LINE OF mt_branches, + LIKE LINE OF mt_branches, + LIKE LINE OF mt_commits, LIKE LINE OF -create. * exchange HEAD, and make sure the branch determination starts with the HEAD branch - READ TABLE gt_branches ASSIGNING WITH KEY name = lc_head. + READ TABLE mt_branches ASSIGNING WITH KEY name = lc_head. ASSERT sy-subrc = 0. - LOOP AT gt_branches ASSIGNING + LOOP AT mt_branches ASSIGNING WHERE sha1 = -sha1 AND name <> lc_head. -name = -name. - DELETE gt_branches INDEX sy-tabix. + DELETE mt_branches INDEX sy-tabix. EXIT. ENDLOOP. - LOOP AT gt_branches ASSIGNING . + LOOP AT mt_branches ASSIGNING . lv_name = -name+11. - READ TABLE gt_commits ASSIGNING WITH KEY sha1 = -sha1. + READ TABLE mt_commits ASSIGNING WITH KEY sha1 = -sha1. ASSERT sy-subrc = 0. DO. @@ -145,7 +188,7 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. IF -parent1 IS INITIAL. EXIT. ELSE. - READ TABLE gt_commits ASSIGNING + READ TABLE mt_commits ASSIGNING WITH KEY sha1 = -parent1. ASSERT sy-subrc = 0. ENDIF. @@ -158,24 +201,24 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. METHOD determine_merges. - FIELD-SYMBOLS: LIKE LINE OF gt_commits, - LIKE LINE OF gt_commits. + FIELD-SYMBOLS: LIKE LINE OF mt_commits, + LIKE LINE OF mt_commits. * important: start with the newest first and propagate branches - SORT gt_commits BY time DESCENDING. + SORT mt_commits BY time DESCENDING. - LOOP AT gt_commits ASSIGNING WHERE NOT parent2 IS INITIAL. + LOOP AT mt_commits ASSIGNING WHERE NOT parent2 IS INITIAL. ASSERT NOT -branch IS INITIAL. - READ TABLE gt_commits ASSIGNING WITH KEY sha1 = -parent2. + READ TABLE mt_commits ASSIGNING WITH KEY sha1 = -parent2. IF sy-subrc = 0. -merge = -branch. * orphaned, branch has been deleted after merge WHILE -branch IS INITIAL. -branch = -branch. - READ TABLE gt_commits ASSIGNING WITH KEY sha1 = -parent1. + READ TABLE mt_commits ASSIGNING WITH KEY sha1 = -parent1. IF sy-subrc <> 0. EXIT. ENDIF. @@ -190,13 +233,19 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. DATA: lv_tag TYPE LINE OF zif_abapgit_definitions=>ty_commit-tags. - FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_git_branch, - TYPE zif_abapgit_definitions=>ty_commit. + FIELD-SYMBOLS: LIKE LINE OF mt_tags, + LIKE LINE OF mt_commits. - LOOP AT gt_tags ASSIGNING . + LOOP AT mt_tags ASSIGNING . + + IF -type = zif_abapgit_definitions=>c_git_branch_type-lightweight_tag. + READ TABLE mt_commits WITH KEY sha1 = -sha1 + ASSIGNING . + ELSEIF -type = zif_abapgit_definitions=>c_git_branch_type-annotated_tag. + READ TABLE mt_commits WITH KEY sha1 = -object + ASSIGNING . + ENDIF. - READ TABLE gt_commits WITH KEY sha1 = -sha1 - ASSIGNING . CHECK sy-subrc = 0. lv_tag = zcl_abapgit_tag=>remove_tag_prefix( -name ). @@ -209,10 +258,10 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. METHOD fixes. - FIELD-SYMBOLS: LIKE LINE OF gt_commits. + FIELD-SYMBOLS: LIKE LINE OF mt_commits. - LOOP AT gt_commits ASSIGNING WHERE NOT merge IS INITIAL. + LOOP AT mt_commits ASSIGNING WHERE NOT merge IS INITIAL. * commits from old branches IF -branch = -merge. CLEAR -merge. @@ -223,15 +272,24 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. METHOD get_branches. - rt_branches = gt_branches. + rt_branches = mt_branches. + ENDMETHOD. + + + METHOD get_commits. + rt_commits = mt_commits. ENDMETHOD. METHOD get_git_objects. - DATA: lo_branch_list TYPE REF TO zcl_abapgit_git_branch_list, - lo_progress TYPE REF TO zcl_abapgit_progress. + DATA: lo_branch_list TYPE REF TO zcl_abapgit_git_branch_list, + lo_progress TYPE REF TO zcl_abapgit_progress, + lt_branches_and_tags TYPE zif_abapgit_definitions=>ty_git_branch_list_tt, + lt_tags TYPE zif_abapgit_definitions=>ty_git_branch_list_tt, + ls_tag LIKE LINE OF mt_tags. + FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_git_branch. CREATE OBJECT lo_progress EXPORTING @@ -248,15 +306,23 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. lo_branch_list = zcl_abapgit_git_transport=>branches( io_repo->get_url( ) ). - gt_branches = lo_branch_list->get_branches_only( ). - gt_tags = lo_branch_list->get_tags_only( ). + mt_branches = lo_branch_list->get_branches_only( ). + INSERT LINES OF mt_branches INTO TABLE lt_branches_and_tags. + + lt_tags = lo_branch_list->get_tags_only( ). + INSERT LINES OF lt_tags INTO TABLE lt_branches_and_tags. + + LOOP AT lt_tags ASSIGNING . + MOVE-CORRESPONDING TO ls_tag. + INSERT ls_tag INTO TABLE mt_tags. + ENDLOOP. zcl_abapgit_git_transport=>upload_pack( EXPORTING iv_url = io_repo->get_url( ) iv_branch_name = io_repo->get_branch_name( ) iv_deepen = abap_false - it_branches = gt_branches + it_branches = lt_branches_and_tags IMPORTING et_objects = rt_objects ). @@ -265,9 +331,50 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. ENDMETHOD. + METHOD get_tags. + + rt_tags = mt_tags. + + ENDMETHOD. + + + METHOD parse_annotated_tags. + + DATA: ls_raw TYPE zcl_abapgit_git_pack=>ty_tag, + ls_tag LIKE LINE OF mt_tags. + + FIELD-SYMBOLS: LIKE LINE OF it_objects, + LIKE LINE OF mt_tags. + + LOOP AT it_objects ASSIGNING WHERE type = zif_abapgit_definitions=>gc_type-tag. + + ls_raw = zcl_abapgit_git_pack=>decode_tag( -data ). + + CLEAR ls_tag. + ls_tag-sha1 = -sha1. + + READ TABLE mt_tags ASSIGNING + WITH KEY sha1 = -sha1. + ASSERT sy-subrc = 0. + + -name = |refs/tags/{ ls_raw-tag }|. + -sha1 = -sha1. + -object = ls_raw-object. + -type = zif_abapgit_definitions=>c_git_branch_type-annotated_tag. + -display_name = ls_raw-tag. + -tagger_name = ls_raw-tagger_name. + -tagger_email = ls_raw-tagger_email. + -message = ls_raw-message. + -body = ls_raw-body. + + ENDLOOP. + + ENDMETHOD. + + METHOD parse_commits. - DATA: ls_commit LIKE LINE OF gt_commits, + DATA: ls_commit LIKE LINE OF mt_commits, lv_trash TYPE string ##NEEDED, ls_raw TYPE zcl_abapgit_git_pack=>ty_commit. @@ -291,7 +398,7 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. ls_commit-email ls_commit-time ##NO_TEXT. ASSERT sy-subrc = 0. - APPEND ls_commit TO gt_commits. + APPEND ls_commit TO mt_commits. ENDLOOP. @@ -300,24 +407,10 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. METHOD run. - DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt. - - - CLEAR gt_branches. - CLEAR gt_commits. - - lt_objects = get_git_objects( io_repo ). - parse_commits( lt_objects ). - CLEAR lt_objects. - - determine_branch( ). - determine_merges( ). - determine_tags( ). - fixes( ). - - SORT gt_commits BY time ASCENDING. - - rt_commits = gt_commits. + CREATE OBJECT ro_branch_overview + EXPORTING + io_repo = io_repo. ENDMETHOD. + ENDCLASS. diff --git a/src/zcl_abapgit_branch_overview.clas.xml b/src/zcl_abapgit_branch_overview.clas.xml index 469461e4d..bbc259bfc 100644 --- a/src/zcl_abapgit_branch_overview.clas.xml +++ b/src/zcl_abapgit_branch_overview.clas.xml @@ -7,7 +7,6 @@ 1 E Branch Overview - 2 1 X X diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index 27a980792..bced1331e 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -43,11 +43,28 @@ INTERFACE zif_abapgit_definitions PUBLIC. TYPES: ty_git_branch_list_tt TYPE STANDARD TABLE OF ty_git_branch WITH DEFAULT KEY . + TYPES: + BEGIN OF ty_git_tag, + sha1 TYPE zif_abapgit_definitions=>ty_sha1, + object TYPE zif_abapgit_definitions=>ty_sha1, + name TYPE string, + type TYPE ty_git_branch_type, + display_name TYPE string, + tagger_name TYPE string, + tagger_email TYPE string, + message TYPE string, + body TYPE string, + END OF ty_git_tag . + TYPES: + ty_git_tag_list_tt TYPE STANDARD TABLE OF ty_git_tag WITH DEFAULT KEY . + + CONSTANTS: BEGIN OF c_git_branch_type, - branch TYPE ty_git_branch_type VALUE 'HD', - tag TYPE ty_git_branch_type VALUE 'TG', - other TYPE ty_git_branch_type VALUE 'ZZ', + branch TYPE ty_git_branch_type VALUE 'HD', + lightweight_tag TYPE ty_git_branch_type VALUE 'TG', + annotated_tag TYPE ty_git_branch_type VALUE 'AT', + other TYPE ty_git_branch_type VALUE 'ZZ', END OF c_git_branch_type . CONSTANTS c_head_name TYPE string VALUE 'HEAD' ##NO_TEXT. From 174f9eafa7e2910b564854f67f30b1d0b12fb06f Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sun, 27 May 2018 12:52:38 +0200 Subject: [PATCH 018/136] Update CONTRIBUTING.md --- CONTRIBUTING.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8203c7f88..37f0a5eb1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -35,13 +35,13 @@ https://guides.github.com/activities/contributing-to-open-source/ 1: Install the development version of abapGit by cloning the repository using an online repository, or downloading the zip file and installing it using an offline repository. -2: The abapGit report installed in your system will now consist of multiple includes +2: The abapGit report installed in your system will now consist of multiple classes -3: Do the required changes to includes and/or main program +3: Do the required changes to classes and/or main program -4: Create the pull request with the changes to the includes +4: Create the pull request with the changes -5: After the pull request is merged, abapmerge will automatically run to build the non-include version of abapGit. +5: After the pull request is merged, abapmerge will automatically run to build the report version of abapGit. Every time a commit is pushed to the master branch, https://travis-ci.org/ will be triggered to perform the build. It will use [abapmerge](https://github.com/larshp/abapmerge) to merge all the includes into a single file, the build can be downloaded from https://raw.githubusercontent.com/abapGit/build/master/zabapgit.abap From 4faaa25131aae86f619608566574358104f4011f Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sun, 27 May 2018 15:48:36 +0200 Subject: [PATCH 019/136] docs: update SSL test program test both github.com and api.github.com api.github.com is used when pushing code back to github, via the 2FA framework --- docs/other-test-ssl.md | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/docs/other-test-ssl.md b/docs/other-test-ssl.md index 709b5bde5..e4f00dfdf 100644 --- a/docs/other-test-ssl.md +++ b/docs/other-test-ssl.md @@ -11,21 +11,34 @@ REPORT zabapgit_test_ssl. * See https://github.com/larshp/abapGit/ -PARAMETERS: p_url TYPE swc_value DEFAULT 'https://github.com', - p_proxy TYPE string, - p_pxport TYPE string. +PARAMETERS: p_url1 TYPE swc_value DEFAULT 'https://github.com', + p_url2 TYPE swc_value DEFAULT 'https://api.github.com'. +* api.github.com is used when pushing code back to github + +SELECTION-SCREEN BEGIN OF BLOCK proxy WITH FRAME. +* proxy settings, fill if your system is behind a proxy +PARAMETERS: p_proxy TYPE string, + p_pxport TYPE string, + p_puser TYPE string, + p_ppwd TYPE string. +SELECTION-SCREEN END OF BLOCK proxy. START-OF-SELECTION. - PERFORM run. + PERFORM run USING p_url1. + PERFORM run USING p_url2. -FORM run. +FORM run USING iv_url TYPE swc_value. DATA: lv_code TYPE i, lv_url TYPE string, li_client TYPE REF TO if_http_client, lv_error_message TYPE string. - lv_url = p_url. + IF iv_url IS INITIAL. + RETURN. + ENDIF. + + lv_url = iv_url. cl_http_client=>create_by_url( EXPORTING url = lv_url @@ -35,11 +48,12 @@ FORM run. IMPORTING client = li_client ). -* enter username and password for proxy authentication if needed -* li_client->authenticate( -* proxy_authentication = abap_true -* username = '' -* password = '' ). + IF NOT p_puser IS INITIAL. + li_client->authenticate( + proxy_authentication = abap_true + username = p_puser + password = p_ppwd ). + ENDIF. li_client->send( ). li_client->receive( @@ -62,10 +76,10 @@ FORM run. * if SSL Handshake fails, make sure to also check https://launchpad.support.sap.com/#/notes/510007 li_client->response->get_status( - IMPORTING - code = lv_code ). + IMPORTING + code = lv_code ). IF lv_code = 200. - WRITE: / 'Success, it works'. + WRITE: / lv_url, ': ok'. ELSE. WRITE: / 'Error', lv_code. ENDIF. From 9431a2415643ed33125709c907386d94b4f69de8 Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 27 May 2018 13:54:08 +0000 Subject: [PATCH 020/136] api.github.com SSL error, add comment --- src/http/zcl_abapgit_2fa_github_auth.clas.abap | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/http/zcl_abapgit_2fa_github_auth.clas.abap b/src/http/zcl_abapgit_2fa_github_auth.clas.abap index 8b68c6d56..53334a652 100644 --- a/src/http/zcl_abapgit_2fa_github_auth.clas.abap +++ b/src/http/zcl_abapgit_2fa_github_auth.clas.abap @@ -60,7 +60,7 @@ ENDCLASS. -CLASS zcl_abapgit_2fa_github_auth IMPLEMENTATION. +CLASS ZCL_ABAPGIT_2FA_GITHUB_AUTH IMPLEMENTATION. METHOD constructor. @@ -336,6 +336,8 @@ CLASS zcl_abapgit_2fa_github_auth IMPLEMENTATION. li_client->receive( EXCEPTIONS OTHERS = 1 ). IF sy-subrc <> 0. +* if the code fails here with a SSL error, make sure STRUST is setup to +* work with https://api.github.com raise_comm_error_from_sy( ). ENDIF. From 0aecdf7255684e109ba5cbaa37c59a90face7c53 Mon Sep 17 00:00:00 2001 From: WolfTreak <39445408+WolfTreak@users.noreply.github.com> Date: Sun, 27 May 2018 16:20:43 +0200 Subject: [PATCH 021/136] Possible solution to zabapgit merge functionality to resolve conflicts (#1407) * Merging per Textfile * Add files via upload * Delete WolfTreak_ABAPGIT_Merging * Refactoring vom Coding, Darstellung verbessert * Merging page changed and also merging class extended to instance and conflict methods added * Refactoring for Travis * Refactoring for Travis * Escaping of merged content functions now correct --- src/ui/zcl_abapgit_gui_page_merge.clas.abap | 117 ++-- src/ui/zcl_abapgit_gui_page_merge.clas.xml | 8 + .../zcl_abapgit_gui_page_merge_res.clas.abap | 583 ++++++++++++++++++ .../zcl_abapgit_gui_page_merge_res.clas.xml | 45 ++ src/zcl_abapgit_merge.clas.abap | 350 ++++++++--- src/zcl_abapgit_merge.clas.xml | 14 + src/zif_abapgit_definitions.intf.abap | 12 + 7 files changed, 985 insertions(+), 144 deletions(-) create mode 100644 src/ui/zcl_abapgit_gui_page_merge_res.clas.abap create mode 100644 src/ui/zcl_abapgit_gui_page_merge_res.clas.xml diff --git a/src/ui/zcl_abapgit_gui_page_merge.clas.abap b/src/ui/zcl_abapgit_gui_page_merge.clas.abap index 563b353dd..bf88b8990 100644 --- a/src/ui/zcl_abapgit_gui_page_merge.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_merge.clas.abap @@ -1,31 +1,39 @@ CLASS zcl_abapgit_gui_page_merge DEFINITION PUBLIC + INHERITING FROM zcl_abapgit_gui_page FINAL - CREATE PUBLIC INHERITING FROM zcl_abapgit_gui_page. + CREATE PUBLIC . PUBLIC SECTION. - METHODS: - constructor - IMPORTING io_repo TYPE REF TO zcl_abapgit_repo_online - iv_source TYPE string - iv_target TYPE string - RAISING zcx_abapgit_exception, - zif_abapgit_gui_page~on_event REDEFINITION. + METHODS constructor + IMPORTING + !io_repo TYPE REF TO zcl_abapgit_repo_online + !iv_source TYPE string + !iv_target TYPE string + RAISING + zcx_abapgit_exception . + + METHODS zif_abapgit_gui_page~on_event + REDEFINITION. PROTECTED SECTION. METHODS render_content REDEFINITION. PRIVATE SECTION. - DATA: mo_repo TYPE REF TO zcl_abapgit_repo_online, - ms_merge TYPE zif_abapgit_definitions=>ty_merge. - CONSTANTS: BEGIN OF c_actions, - merge TYPE string VALUE 'merge' ##NO_TEXT, - END OF c_actions. + DATA mo_repo TYPE REF TO zcl_abapgit_repo_online . + DATA mo_merge TYPE REF TO zcl_abapgit_merge . + CONSTANTS: + BEGIN OF c_actions, + merge TYPE string VALUE 'merge' ##NO_TEXT, + res_conflicts TYPE string VALUE 'res_conflicts' ##NO_TEXT, + END OF c_actions . - METHODS: - build_menu - RETURNING VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar. + METHODS build_menu + IMPORTING + VALUE(iv_with_conflict) TYPE boolean OPTIONAL + RETURNING + VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar . ENDCLASS. @@ -37,7 +45,11 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MERGE IMPLEMENTATION. CREATE OBJECT ro_menu. - ro_menu->add( iv_txt = 'Merge' iv_act = c_actions-merge ) ##NO_TEXT. + ro_menu->add( iv_txt = 'Merge' iv_act = c_actions-merge iv_cur = abap_false ) ##NO_TEXT. + + IF iv_with_conflict EQ abap_true. + ro_menu->add( iv_txt = 'Resolve Conflicts' iv_act = c_actions-res_conflicts ) ##NO_TEXT. + ENDIF. ENDMETHOD. @@ -45,15 +57,18 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MERGE IMPLEMENTATION. METHOD constructor. super->constructor( ). - ms_control-page_title = 'MERGE'. - ms_control-page_menu = build_menu( ). mo_repo = io_repo. - ms_merge = zcl_abapgit_merge=>run( - io_repo = io_repo - iv_source = iv_source - iv_target = iv_target ). + CREATE OBJECT mo_merge + EXPORTING + io_repo = io_repo + iv_source_branch = iv_source + iv_target_branch = iv_target. + mo_merge->run( ). + + ms_control-page_title = 'MERGE'. + ms_control-page_menu = build_menu( iv_with_conflict = mo_merge->has_conflicts( ) ). ENDMETHOD. @@ -78,12 +93,17 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MERGE IMPLEMENTATION. ENDIF. END-OF-DEFINITION. - DATA: lt_files LIKE ms_merge-stree, - ls_result LIKE LINE OF ms_merge-result. + DATA: ls_merge TYPE zif_abapgit_definitions=>ty_merge, + lt_files LIKE ls_merge-stree, + ls_result LIKE LINE OF ls_merge-result. FIELD-SYMBOLS: LIKE LINE OF lt_files, LIKE LINE OF lt_files. + ls_merge = mo_merge->get_result( ). + + "If now exists no conflicts anymore, conflicts button should disappear + ms_control-page_menu = build_menu( iv_with_conflict = mo_merge->has_conflicts( ) ). CREATE OBJECT ro_html. @@ -95,27 +115,27 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MERGE IMPLEMENTATION. ro_html->add( '' ). ro_html->add( '' ). - ro_html->add( '' ). + ro_html->add( '' ). ro_html->add( '' ). ro_html->add( '' ). - ro_html->add( '' ). + ro_html->add( '' ). ro_html->add( '' ). ro_html->add( '' ). - ro_html->add( '' ). + ro_html->add( '' ). ro_html->add( '' ). ro_html->add( '
Source:Source' ). - ro_html->add( ms_merge-source-name ). + ro_html->add( ls_merge-source-name ). ro_html->add( '
Target:Target' ). - ro_html->add( ms_merge-target-name ). + ro_html->add( ls_merge-target-name ). ro_html->add( '
Ancestor:Ancestor' ). - ro_html->add( ms_merge-common-commit ). + ro_html->add( ls_merge-common-commit ). ro_html->add( '
' ). ro_html->add( '
' ). - APPEND LINES OF ms_merge-stree TO lt_files. - APPEND LINES OF ms_merge-ttree TO lt_files. - APPEND LINES OF ms_merge-ctree TO lt_files. + APPEND LINES OF ls_merge-stree TO lt_files. + APPEND LINES OF ls_merge-ttree TO lt_files. + APPEND LINES OF ls_merge-ctree TO lt_files. SORT lt_files BY path DESCENDING name ASCENDING. DELETE ADJACENT DUPLICATES FROM lt_files COMPARING path name. @@ -132,20 +152,20 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MERGE IMPLEMENTATION. ro_html->add( '' ). LOOP AT lt_files ASSIGNING . CLEAR ls_result. - READ TABLE ms_merge-result INTO ls_result + READ TABLE ls_merge-result INTO ls_result WITH KEY path = -path name = -name. ro_html->add( '' ). - _show_file ms_merge-stree. - _show_file ms_merge-ttree. - _show_file ms_merge-ctree. - _show_file ms_merge-result. + _show_file ls_merge-stree. + _show_file ls_merge-ttree. + _show_file ls_merge-ctree. + _show_file ls_merge-result. ro_html->add( '' ). ENDLOOP. ro_html->add( '' ). ro_html->add( '
' ). ro_html->add( '' ). - ro_html->add( ms_merge-conflict ). + ro_html->add( ls_merge-conflict ). ro_html->add( '' ). ro_html->add( '' ). @@ -156,15 +176,28 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MERGE IMPLEMENTATION. CASE iv_action. WHEN c_actions-merge. - IF ms_merge-stage->count( ) = 0. + IF mo_merge->has_conflicts( ) EQ abap_true. + zcx_abapgit_exception=>raise( 'conflicts exists' ). + ENDIF. + + IF mo_merge->get_result( )-stage->count( ) EQ 0. zcx_abapgit_exception=>raise( 'nothing to merge' ). ENDIF. CREATE OBJECT ei_page TYPE zcl_abapgit_gui_page_commit EXPORTING io_repo = mo_repo - io_stage = ms_merge-stage. + io_stage = mo_merge->get_result( )-stage. ev_state = zif_abapgit_definitions=>gc_event_state-new_page. + + WHEN c_actions-res_conflicts. + CREATE OBJECT ei_page TYPE zcl_abapgit_gui_page_merge_res + EXPORTING + io_repo = mo_repo + io_merge_page = me + io_merge = mo_merge. + ev_state = zif_abapgit_definitions=>gc_event_state-new_page. + ENDCASE. ENDMETHOD. diff --git a/src/ui/zcl_abapgit_gui_page_merge.clas.xml b/src/ui/zcl_abapgit_gui_page_merge.clas.xml index 4a0726f7a..ca88d2e5f 100644 --- a/src/ui/zcl_abapgit_gui_page_merge.clas.xml +++ b/src/ui/zcl_abapgit_gui_page_merge.clas.xml @@ -14,6 +14,14 @@ X X + + + ZCL_ABAPGIT_GUI_PAGE_MERGE + MO_MERGE + E + Merge logic + + diff --git a/src/ui/zcl_abapgit_gui_page_merge_res.clas.abap b/src/ui/zcl_abapgit_gui_page_merge_res.clas.abap new file mode 100644 index 000000000..87fa95729 --- /dev/null +++ b/src/ui/zcl_abapgit_gui_page_merge_res.clas.abap @@ -0,0 +1,583 @@ +CLASS zcl_abapgit_gui_page_merge_res DEFINITION + PUBLIC + INHERITING FROM zcl_abapgit_gui_page + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS constructor + IMPORTING + !io_repo TYPE REF TO zcl_abapgit_repo_online + !io_merge_page TYPE REF TO zcl_abapgit_gui_page_merge + !io_merge TYPE REF TO zcl_abapgit_merge + RAISING + zcx_abapgit_exception . + + METHODS zif_abapgit_gui_page~on_event + REDEFINITION . + PROTECTED SECTION. + METHODS render_content REDEFINITION. + + PRIVATE SECTION. + + TYPES: + BEGIN OF ty_file_diff, + path TYPE string, + filename TYPE string, + lstate TYPE char1, + rstate TYPE char1, + fstate TYPE char1, " FILE state - Abstraction for shorter ifs + o_diff TYPE REF TO zcl_abapgit_diff, + changed_by TYPE xubname, + type TYPE string, + END OF ty_file_diff . + TYPES: + tt_file_diff TYPE STANDARD TABLE OF ty_file_diff . + + CONSTANTS: + BEGIN OF c_actions, + toggle_mode TYPE string VALUE 'toggle_mode' ##NO_TEXT, + apply_merge TYPE string VALUE 'apply_merge' ##NO_TEXT, + apply_source TYPE string VALUE 'apply_source' ##NO_TEXT, + apply_target TYPE string VALUE 'apply_target' ##NO_TEXT, + cancel TYPE string VALUE 'cancel' ##NO_TEXT, + END OF c_actions . + CONSTANTS: + BEGIN OF c_merge_mode, + selection TYPE string VALUE 'selection' ##NO_TEXT, + merge TYPE string VALUE 'merge' ##NO_TEXT, + END OF c_merge_mode . + DATA mo_merge TYPE REF TO zcl_abapgit_merge . + DATA mo_merge_page TYPE REF TO zcl_abapgit_gui_page_merge . + DATA mo_repo TYPE REF TO zcl_abapgit_repo_online . + DATA ms_diff_file TYPE ty_file_diff . + DATA mv_current_conflict_index TYPE sytabix . + DATA mv_merge_mode TYPE string . + DATA mt_conflicts TYPE zif_abapgit_definitions=>tt_merge_conflict . + + METHODS apply_merged_content + IMPORTING + !it_postdata TYPE cnht_post_data_tab + RAISING + zcx_abapgit_exception . + METHODS build_menu + IMPORTING + VALUE(iv_with_conflict) TYPE boolean OPTIONAL + RETURNING + VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar . + METHODS is_binary + IMPORTING + !iv_d1 TYPE xstring + !iv_d2 TYPE xstring + RETURNING + VALUE(rv_yes) TYPE abap_bool . + METHODS render_beacon + IMPORTING + !is_diff_line TYPE zif_abapgit_definitions=>ty_diff + !is_diff TYPE ty_file_diff + RETURNING + VALUE(ro_html) TYPE REF TO zcl_abapgit_html . + METHODS render_diff + IMPORTING + !is_diff TYPE ty_file_diff + RETURNING + VALUE(ro_html) TYPE REF TO zcl_abapgit_html + RAISING + zcx_abapgit_exception . + METHODS render_diff_head + IMPORTING + !is_diff TYPE ty_file_diff + RETURNING + VALUE(ro_html) TYPE REF TO zcl_abapgit_html . + METHODS render_lines + IMPORTING + !is_diff TYPE ty_file_diff + RETURNING + VALUE(ro_html) TYPE REF TO zcl_abapgit_html . + METHODS render_line_split + IMPORTING + !is_diff_line TYPE zif_abapgit_definitions=>ty_diff + !iv_fstate TYPE char1 + RETURNING + VALUE(ro_html) TYPE REF TO zcl_abapgit_html . + METHODS render_table_head + RETURNING + VALUE(ro_html) TYPE REF TO zcl_abapgit_html . + METHODS resolve_diff + RAISING + zcx_abapgit_exception . + METHODS toggle_merge_mode . +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_GUI_PAGE_MERGE_RES IMPLEMENTATION. + + + METHOD apply_merged_content. + + CONSTANTS: lc_replace TYPE string VALUE '<>'. + + DATA: BEGIN OF filedata, + merge_content TYPE string, + END OF filedata. + + DATA: lv_string TYPE string, + lt_fields TYPE tihttpnvp, + lv_new_file_content TYPE xstring. + + FIELD-SYMBOLS: LIKE LINE OF it_postdata, + TYPE zif_abapgit_definitions=>ty_merge_conflict. + + LOOP AT it_postdata ASSIGNING . + lv_string = |{ lv_string }{ }|. + ENDLOOP. + REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>gc_crlf IN lv_string WITH lc_replace. + REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>gc_newline IN lv_string WITH lc_replace. + + lt_fields = zcl_abapgit_html_action_utils=>parse_fields_upper_case_name( lv_string ). + zcl_abapgit_html_action_utils=>get_field( EXPORTING name = 'MERGE_CONTENT' + it = lt_fields + CHANGING cv = filedata ). + filedata-merge_content = cl_http_utility=>unescape_url( escaped = filedata-merge_content ). + REPLACE ALL OCCURRENCES OF lc_replace IN filedata-merge_content WITH zif_abapgit_definitions=>gc_newline. + + lv_new_file_content = zcl_abapgit_convert=>string_to_xstring_utf8( iv_string = filedata-merge_content ). + + READ TABLE mt_conflicts ASSIGNING INDEX mv_current_conflict_index. + -result_sha1 = zcl_abapgit_hash=>sha1( iv_type = zif_abapgit_definitions=>gc_type-blob + iv_data = lv_new_file_content ). + -result_data = lv_new_file_content. + mo_merge->resolve_conflict( is_conflict = ). + + ENDMETHOD. + + + METHOD build_menu. + + CREATE OBJECT ro_menu. + ro_menu->add( iv_txt = 'Toggle merge mode' iv_act = c_actions-toggle_mode ) ##NO_TEXT. + ro_menu->add( iv_txt = 'Cancel' iv_act = c_actions-cancel ) ##NO_TEXT. + + ENDMETHOD. + + + METHOD constructor. + + super->constructor( ). + + mo_repo = io_repo. + ms_control-page_title = 'Resolve Conflicts'. + ms_control-page_menu = build_menu( ). + + mo_merge_page = io_merge_page. + mo_merge = io_merge. + mv_merge_mode = c_merge_mode-selection. + mv_current_conflict_index = 1. + mt_conflicts = io_merge->get_conflicts( ). + + ENDMETHOD. + + + METHOD is_binary. + + DATA: lv_len TYPE i, + lv_idx TYPE i, + lv_x TYPE x. + + FIELD-SYMBOLS LIKE iv_d1. + + + IF iv_d1 IS NOT INITIAL. " One of them might be new and so empty + ASSIGN iv_d1 TO . + ELSE. + ASSIGN iv_d2 TO . + ENDIF. + + lv_len = xstrlen( ). + IF lv_len = 0. + RETURN. + ENDIF. + + IF lv_len > 100. + lv_len = 100. + ENDIF. + + " Simple char range test + " stackoverflow.com/questions/277521/how-to-identify-the-file-content-as-ascii-or-binary + DO lv_len TIMES. " I'm sure there is more efficient way ... + lv_idx = sy-index - 1. + lv_x = +lv_idx(1). + + IF NOT ( lv_x BETWEEN 9 AND 13 OR lv_x BETWEEN 32 AND 126 ). + rv_yes = abap_true. + EXIT. + ENDIF. + ENDDO. + + ENDMETHOD. " is_binary. + + + METHOD render_beacon. + + DATA: lv_beacon TYPE string. + + CREATE OBJECT ro_html. + + IF is_diff_line-beacon > 0. + READ TABLE is_diff-o_diff->mt_beacons INTO lv_beacon INDEX is_diff_line-beacon. + ELSE. + lv_beacon = '---'. + ENDIF. + + + ro_html->add( '' ). + ro_html->add( '' ). + + ro_html->add( '' ). + ro_html->add( |@@ { is_diff_line-new_num } @@ { lv_beacon }| ). + + ro_html->add( '' ). + ro_html->add( '' ). + + ENDMETHOD. " render_beacon. + + + METHOD render_content. + + resolve_diff( ). + IF ms_diff_file IS INITIAL. + zcx_abapgit_exception=>raise( 'no conflict found' ). + ENDIF. + + CREATE OBJECT ro_html. + ro_html->add( |
| ). + ro_html->add( render_diff( ms_diff_file ) ). + ro_html->add( '
' ). + + ENDMETHOD. "render_content + + + METHOD render_diff. + + DATA: lv_target_content TYPE string. + FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_merge_conflict. + + CREATE OBJECT ro_html. + + ro_html->add( |
| ). "#EC NOTEXT + ro_html->add( render_diff_head( is_diff ) ). + + " Content + IF is_diff-type <> 'binary'. + + IF mv_merge_mode EQ c_merge_mode-selection. + ro_html->add( '
' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( render_table_head( ) ). + ro_html->add( render_lines( is_diff ) ). + ro_html->add( '
' ). "#EC NOTEXT + ro_html->add( '
' ). "#EC NOTEXT + ELSE. + + "Table for Div-Table and textarea + ro_html->add( '
' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( ' ' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '
CodeMerge - ' ). "#EC NOTEXT + ro_html->add_a( iv_act = 'submitFormById(''merge_form'');' "#EC NOTEXT + iv_txt = 'Apply' + iv_typ = zif_abapgit_definitions=>gc_action_type-onclick + iv_opt = zif_abapgit_definitions=>gc_html_opt-strong ). + ro_html->add( '
' ). + + "Diff-Table of source and target file + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( render_table_head( ) ). + ro_html->add( render_lines( is_diff ) ). + ro_html->add( '
' ). "#EC NOTEXT + + READ TABLE mt_conflicts ASSIGNING INDEX mv_current_conflict_index. + IF sy-subrc EQ 0. + lv_target_content = zcl_abapgit_convert=>xstring_to_string_utf8( -target_data ). + lv_target_content = escape( val = lv_target_content format = cl_abap_format=>e_html_text ). + ENDIF. + + ro_html->add( '
' ). "#EC NOTEXT + ro_html->add( '
' ). + ro_html->add( |
add( |method="post" action="sapevent:apply_merge">| ). + ro_html->add( || ). + ro_html->add( '' ). + ro_html->add( '
' ). "#EC NOTEXT + ro_html->add( '
' ). "#EC NOTEXT + ro_html->add( '
' ). "#EC NOTEXT + ro_html->add( '
' ). "#EC NOTEXT + ENDIF. + ELSE. + ro_html->add( '
' ). "#EC NOTEXT + ro_html->add( 'The content seems to be binary.' ). "#EC NOTEXT + ro_html->add( 'Cannot display as diff.' ). "#EC NOTEXT + ro_html->add( '
' ). "#EC NOTEXT + ENDIF. + + ro_html->add( '
' ). "#EC NOTEXT + + ENDMETHOD. " render_diff + + + METHOD render_diff_head. + + DATA: ls_stats TYPE zif_abapgit_definitions=>ty_count. + + CREATE OBJECT ro_html. + + ro_html->add( '
' ). "#EC NOTEXT + + IF is_diff-type <> 'binary' AND is_diff-o_diff IS NOT INITIAL. + ls_stats = is_diff-o_diff->stats( ). + ro_html->add( |+ { ls_stats-insert }| ). + ro_html->add( |- { ls_stats-delete }| ). + ro_html->add( |~ { ls_stats-update }| ). + ENDIF. + + ro_html->add( |{ is_diff-filename }| ). "#EC NOTEXT + ro_html->add( '
' ). "#EC NOTEXT + + ENDMETHOD. + + + METHOD render_lines. + + DATA: lo_highlighter TYPE REF TO zcl_abapgit_syntax_highlighter, + lt_diffs TYPE zif_abapgit_definitions=>ty_diffs_tt, + lv_insert_nav TYPE abap_bool. + + FIELD-SYMBOLS LIKE LINE OF lt_diffs. + + lo_highlighter = zcl_abapgit_syntax_highlighter=>create( is_diff-filename ). + CREATE OBJECT ro_html. + + lt_diffs = is_diff-o_diff->get( ). + + LOOP AT lt_diffs ASSIGNING . + IF -short = abap_false. + lv_insert_nav = abap_true. + CONTINUE. + ENDIF. + + IF lv_insert_nav = abap_true. " Insert separator line with navigation + ro_html->add( render_beacon( is_diff_line = is_diff = is_diff ) ). + lv_insert_nav = abap_false. + ENDIF. + + IF lo_highlighter IS BOUND. + -new = lo_highlighter->process_line( -new ). + -old = lo_highlighter->process_line( -old ). + ELSE. + -new = escape( val = -new format = cl_abap_format=>e_html_attr ). + -old = escape( val = -old format = cl_abap_format=>e_html_attr ). + ENDIF. + + CONDENSE -new_num. "get rid of leading spaces + CONDENSE -old_num. + + ro_html->add( render_line_split( is_diff_line = + iv_fstate = is_diff-fstate ) ). + + ENDLOOP. + + ENDMETHOD. "render_lines + + + METHOD render_line_split. + + DATA: lv_new TYPE string, + lv_old TYPE string, + lv_merge TYPE string, + lv_mark TYPE string, + lv_bg TYPE string. + + CREATE OBJECT ro_html. + + " New line + lv_mark = ` `. + IF is_diff_line-result = zif_abapgit_definitions=>c_diff-update. + lv_bg = ' diff_upd'. + lv_mark = `~`. + ELSEIF is_diff_line-result = zif_abapgit_definitions=>c_diff-insert. + lv_bg = ' diff_ins'. + lv_mark = `+`. + ENDIF. + lv_new = || + && |{ lv_mark }{ is_diff_line-new }|. + + " Old line + CLEAR lv_bg. + lv_mark = ` `. + IF is_diff_line-result = zif_abapgit_definitions=>c_diff-update. + lv_bg = ' diff_upd'. + lv_mark = `~`. + ELSEIF is_diff_line-result = zif_abapgit_definitions=>c_diff-delete. + lv_bg = ' diff_del'. + lv_mark = `-`. + ENDIF. + lv_old = || + && |{ lv_mark }{ is_diff_line-old }|. + + " render line, inverse sides if remote is newer + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( lv_old ). " Target + ro_html->add( lv_new ). " Source + ro_html->add( '' ). "#EC NOTEXT + + ENDMETHOD. "render_line_split + + + METHOD render_table_head. + + CREATE OBJECT ro_html. + IF mv_merge_mode EQ c_merge_mode-selection. + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '
' ). "#EC NOTEXT + ro_html->add( 'Target - ' && mo_merge->get_target_branch( ) && ' - ' ). "#EC NOTEXT + ro_html->add_a( iv_act = 'submitFormById(''target_form'');' "#EC NOTEXT + iv_txt = 'Apply' + iv_typ = zif_abapgit_definitions=>gc_action_type-onclick + iv_opt = zif_abapgit_definitions=>gc_html_opt-strong ). + ro_html->add( ' ' ). "#EC NOTEXT + ro_html->add( '
' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '
' ). "#EC NOTEXT + ro_html->add( 'Source - ' && mo_merge->get_source_branch( ) &&' - ' ). "#EC NOTEXT + ro_html->add_a( iv_act = 'submitFormById(''source_form'');' "#EC NOTEXT + iv_txt = 'Apply' + iv_typ = zif_abapgit_definitions=>gc_action_type-onclick + iv_opt = zif_abapgit_definitions=>gc_html_opt-strong ). + ro_html->add( ' ' ). "#EC NOTEXT + ro_html->add( '
' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ELSE. + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( 'Target - ' && mo_merge->get_target_branch( ) &&' ' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( 'Source - ' && mo_merge->get_source_branch( ) &&' ' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ENDIF. + + ENDMETHOD. " render_table_head. + + + METHOD resolve_diff. + + DATA: lv_offs TYPE i. + FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_merge_conflict. + + CLEAR ms_diff_file. + + READ TABLE mt_conflicts ASSIGNING INDEX mv_current_conflict_index. + IF sy-subrc NE 0. + RETURN. + ENDIF. + + ms_diff_file-path = -path. + ms_diff_file-filename = -filename. + ms_diff_file-type = reverse( -filename ). + + FIND FIRST OCCURRENCE OF '.' IN ms_diff_file-type MATCH OFFSET lv_offs. + ms_diff_file-type = reverse( substring( val = ms_diff_file-type len = lv_offs ) ). + IF ms_diff_file-type <> 'xml' AND ms_diff_file-type <> 'abap'. + ms_diff_file-type = 'other'. + ENDIF. + + IF ms_diff_file-type = 'other' + AND is_binary( iv_d1 = -source_data iv_d2 = -target_data ) = abap_true. + ms_diff_file-type = 'binary'. + ENDIF. + + IF ms_diff_file-type <> 'binary'. + CREATE OBJECT ms_diff_file-o_diff + EXPORTING + iv_new = -source_data + iv_old = -target_data. + ENDIF. + + ENDMETHOD. + + + METHOD toggle_merge_mode. + + IF mv_merge_mode EQ c_merge_mode-selection. + mv_merge_mode = c_merge_mode-merge. + ELSE. + mv_merge_mode = c_merge_mode-selection. + ENDIF. + + ENDMETHOD. + + + METHOD zif_abapgit_gui_page~on_event. + + FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_merge_conflict. + + CASE iv_action. + WHEN c_actions-apply_merge + OR c_actions-apply_source + OR c_actions-apply_target + OR c_actions-cancel. + + CASE iv_action. + WHEN c_actions-apply_merge. + apply_merged_content( it_postdata = it_postdata ). + + WHEN c_actions-apply_source. + READ TABLE mt_conflicts ASSIGNING INDEX mv_current_conflict_index. + -result_sha1 = -source_sha1. + -result_data = -source_data. + mo_merge->resolve_conflict( is_conflict = ). + + WHEN c_actions-apply_target. + READ TABLE mt_conflicts ASSIGNING INDEX mv_current_conflict_index. + -result_sha1 = -target_sha1. + -result_data = -target_data. + mo_merge->resolve_conflict( is_conflict = ). + + ENDCASE. + + mv_current_conflict_index = mv_current_conflict_index + 1. + IF mv_current_conflict_index > lines( mt_conflicts ). + CLEAR mv_current_conflict_index. + ENDIF. + + IF mv_current_conflict_index IS NOT INITIAL. + ev_state = zif_abapgit_definitions=>gc_event_state-re_render. + ELSE. + ei_page = mo_merge_page. + ev_state = zif_abapgit_definitions=>gc_event_state-go_back. + ENDIF. + + WHEN c_actions-toggle_mode. + toggle_merge_mode( ). + ev_state = zif_abapgit_definitions=>gc_event_state-re_render. + + ENDCASE. + + ENDMETHOD. +ENDCLASS. diff --git a/src/ui/zcl_abapgit_gui_page_merge_res.clas.xml b/src/ui/zcl_abapgit_gui_page_merge_res.clas.xml new file mode 100644 index 000000000..ee6d9a501 --- /dev/null +++ b/src/ui/zcl_abapgit_gui_page_merge_res.clas.xml @@ -0,0 +1,45 @@ + + + + + + ZCL_ABAPGIT_GUI_PAGE_MERGE_RES + 1 + E + GUI - Resolving Conflicts page + 2 + 1 + X + X + X + X + + + + ZCL_ABAPGIT_GUI_PAGE_MERGE_RES + MO_MERGE + E + Merge logic + + + ZCL_ABAPGIT_GUI_PAGE_MERGE_RES + MO_MERGE_PAGE + E + GUI - Merging page + + + ZCL_ABAPGIT_GUI_PAGE_MERGE_RES + MO_REPO + E + Online Repository + + + ZCL_ABAPGIT_GUI_PAGE_MERGE_RES + MV_CURRENT_CONFLICT_INDEX + E + Row Index of Internal Tables + + + + + diff --git a/src/zcl_abapgit_merge.clas.abap b/src/zcl_abapgit_merge.clas.abap index c33f10774..14fb52563 100644 --- a/src/zcl_abapgit_merge.clas.abap +++ b/src/zcl_abapgit_merge.clas.abap @@ -1,37 +1,78 @@ -CLASS zcl_abapgit_merge DEFINITION PUBLIC FINAL CREATE PUBLIC. +CLASS zcl_abapgit_merge DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . PUBLIC SECTION. - CLASS-METHODS: - run - IMPORTING io_repo TYPE REF TO zcl_abapgit_repo_online - iv_source TYPE string - iv_target TYPE string - RETURNING VALUE(rs_merge) TYPE zif_abapgit_definitions=>ty_merge - RAISING zcx_abapgit_exception. + + METHODS constructor + IMPORTING + !io_repo TYPE REF TO zcl_abapgit_repo_online + !iv_source_branch TYPE string + !iv_target_branch TYPE string + RAISING + zcx_abapgit_exception . + METHODS get_conflicts + RETURNING + VALUE(rt_conflicts) TYPE zif_abapgit_definitions=>tt_merge_conflict . + METHODS get_result + RETURNING + VALUE(rs_merge) TYPE zif_abapgit_definitions=>ty_merge . + METHODS get_source_branch + RETURNING + VALUE(rv_source_branch) TYPE string . + METHODS get_target_branch + RETURNING + VALUE(rv_target_branch) TYPE string . + METHODS has_conflicts + RETURNING + VALUE(rv_conflicts_exists) TYPE boolean . + METHODS resolve_conflict + IMPORTING + !is_conflict TYPE zif_abapgit_definitions=>ty_merge_conflict + RAISING + zcx_abapgit_exception . + METHODS run + RAISING + zcx_abapgit_exception . PRIVATE SECTION. - CLASS-DATA: gs_merge TYPE zif_abapgit_definitions=>ty_merge, - gt_objects TYPE zif_abapgit_definitions=>ty_objects_tt. - TYPES: ty_ancestor_tt TYPE STANDARD TABLE OF zif_abapgit_definitions=>ty_ancestor WITH DEFAULT KEY. + TYPES: + ty_ancestor_tt TYPE STANDARD TABLE OF zif_abapgit_definitions=>ty_ancestor WITH DEFAULT KEY . - CLASS-METHODS: - all_files - RETURNING VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_expanded_tt, - calculate_result - RAISING zcx_abapgit_exception, - find_ancestors - IMPORTING iv_commit TYPE zif_abapgit_definitions=>ty_sha1 - RETURNING VALUE(rt_ancestors) TYPE ty_ancestor_tt - RAISING zcx_abapgit_exception, - find_first_common - IMPORTING it_list1 TYPE ty_ancestor_tt - it_list2 TYPE ty_ancestor_tt - RETURNING VALUE(rs_common) TYPE zif_abapgit_definitions=>ty_ancestor - RAISING zcx_abapgit_exception, - fetch_git - IMPORTING iv_source TYPE string - iv_target TYPE string - RAISING zcx_abapgit_exception. + DATA mo_repo TYPE REF TO zcl_abapgit_repo_online . + DATA ms_merge TYPE zif_abapgit_definitions=>ty_merge . + DATA mt_conflicts TYPE zif_abapgit_definitions=>tt_merge_conflict . + DATA mt_objects TYPE zif_abapgit_definitions=>ty_objects_tt . + DATA mv_source_branch TYPE string . + DATA mv_target_branch TYPE string . + + METHODS all_files + RETURNING + VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_expanded_tt . + METHODS calculate_result + RAISING + zcx_abapgit_exception . + METHODS fetch_git + RETURNING + VALUE(rt_objects) TYPE zif_abapgit_definitions=>ty_objects_tt + RAISING + zcx_abapgit_exception . + METHODS find_ancestors + IMPORTING + !iv_commit TYPE zif_abapgit_definitions=>ty_sha1 + RETURNING + VALUE(rt_ancestors) TYPE ty_ancestor_tt + RAISING + zcx_abapgit_exception . + METHODS find_first_common + IMPORTING + !it_list1 TYPE ty_ancestor_tt + !it_list2 TYPE ty_ancestor_tt + RETURNING + VALUE(rs_common) TYPE zif_abapgit_definitions=>ty_ancestor + RAISING + zcx_abapgit_exception . ENDCLASS. @@ -41,9 +82,9 @@ CLASS ZCL_ABAPGIT_MERGE IMPLEMENTATION. METHOD all_files. - APPEND LINES OF gs_merge-stree TO rt_files. - APPEND LINES OF gs_merge-ttree TO rt_files. - APPEND LINES OF gs_merge-ctree TO rt_files. + APPEND LINES OF ms_merge-stree TO rt_files. + APPEND LINES OF ms_merge-ttree TO rt_files. + APPEND LINES OF ms_merge-ctree TO rt_files. SORT rt_files BY path DESCENDING name ASCENDING. DELETE ADJACENT DUPLICATES FROM rt_files COMPARING path name. @@ -53,12 +94,12 @@ CLASS ZCL_ABAPGIT_MERGE IMPLEMENTATION. METHOD calculate_result. DEFINE _from_source. - READ TABLE gt_objects ASSIGNING + READ TABLE mt_objects ASSIGNING WITH KEY type = zif_abapgit_definitions=>gc_type-blob sha1 = -sha1. ASSERT sy-subrc = 0. - gs_merge-stage->add( iv_path = -path + ms_merge-stage->add( iv_path = -path iv_filename = -name iv_data = -data ). END-OF-DEFINITION. @@ -68,21 +109,21 @@ CLASS ZCL_ABAPGIT_MERGE IMPLEMENTATION. lv_found_target TYPE abap_bool, lv_found_common TYPE abap_bool. - FIELD-SYMBOLS: LIKE LINE OF lt_files, - LIKE LINE OF lt_files, - LIKE LINE OF lt_files, - LIKE LINE OF lt_files, - LIKE LINE OF gs_merge-result, - LIKE LINE OF gt_objects. - + FIELD-SYMBOLS: LIKE LINE OF lt_files, + LIKE LINE OF lt_files, + LIKE LINE OF lt_files, + LIKE LINE OF lt_files, + LIKE LINE OF ms_merge-result, + LIKE LINE OF mt_objects, + LIKE LINE OF mt_conflicts. lt_files = all_files( ). - CREATE OBJECT gs_merge-stage + CREATE OBJECT ms_merge-stage EXPORTING - iv_branch_name = gs_merge-target-name - iv_branch_sha1 = gs_merge-target-sha1 - iv_merge_source = gs_merge-source-sha1. + iv_branch_name = ms_merge-target-name + iv_branch_sha1 = ms_merge-target-sha1 + iv_merge_source = ms_merge-source-sha1. LOOP AT lt_files ASSIGNING . @@ -90,11 +131,11 @@ CLASS ZCL_ABAPGIT_MERGE IMPLEMENTATION. UNASSIGN . UNASSIGN . - READ TABLE gs_merge-stree ASSIGNING + READ TABLE ms_merge-stree ASSIGNING WITH KEY path = -path name = -name. "#EC CI_SUBRC - READ TABLE gs_merge-ttree ASSIGNING + READ TABLE ms_merge-ttree ASSIGNING WITH KEY path = -path name = -name. "#EC CI_SUBRC - READ TABLE gs_merge-ctree ASSIGNING + READ TABLE ms_merge-ctree ASSIGNING WITH KEY path = -path name = -name. "#EC CI_SUBRC lv_found_source = boolc( IS ASSIGNED ). @@ -109,7 +150,7 @@ CLASS ZCL_ABAPGIT_MERGE IMPLEMENTATION. AND lv_found_common = abap_true AND -sha1 = -sha1. * deleted in source, skip - gs_merge-stage->rm( iv_path = -path + ms_merge-stage->rm( iv_path = -path iv_filename = -name ). CONTINUE. ELSEIF lv_found_target = abap_false @@ -119,7 +160,7 @@ CLASS ZCL_ABAPGIT_MERGE IMPLEMENTATION. CONTINUE. ENDIF. - APPEND INITIAL LINE TO gs_merge-result ASSIGNING . + APPEND INITIAL LINE TO ms_merge-result ASSIGNING . -path = -path. -name = -name. @@ -135,15 +176,32 @@ CLASS ZCL_ABAPGIT_MERGE IMPLEMENTATION. AND -sha1 = -sha1. * added in source and target -sha1 = -sha1. + ELSEIF lv_found_common = abap_false + AND -sha1 <> -sha1. + + INSERT INITIAL LINE INTO TABLE mt_conflicts ASSIGNING . + -path = -path. + -filename = -name. + -source_sha1 = -sha1. + READ TABLE mt_objects ASSIGNING WITH KEY type = zif_abapgit_definitions=>gc_type-blob + sha1 = -sha1. + -source_data = -data. + + -target_sha1 = -sha1. + READ TABLE mt_objects ASSIGNING WITH KEY type = zif_abapgit_definitions=>gc_type-blob + sha1 = -sha1. + -target_data = -data. + +* added in source and target, but different, merge conflict must be resolved + ms_merge-conflict = |{ -name } merge conflict|. + CONTINUE. ENDIF. IF lv_found_source = abap_false - OR lv_found_target = abap_false - OR lv_found_common = abap_false. - CLEAR gs_merge-result. - gs_merge-conflict = |{ -name - } merge conflict, not found anywhere|. - RETURN. + OR lv_found_target = abap_false + OR lv_found_common = abap_false. + ms_merge-conflict = |{ -name } merge conflict, not found anywhere|. + CONTINUE. ENDIF. IF -sha1 = -sha1. @@ -158,40 +216,62 @@ CLASS ZCL_ABAPGIT_MERGE IMPLEMENTATION. -sha1 = -sha1. ELSE. * changed in source and target, conflict - CLEAR gs_merge-result. - gs_merge-conflict = |{ -name - } merge conflict, changed in source and target branch|. - RETURN. - ENDIF. +* conflict must be resolved before merge + INSERT INITIAL LINE INTO TABLE mt_conflicts ASSIGNING . + -path = -path. + -filename = -name. + -source_sha1 = -sha1. + READ TABLE mt_objects ASSIGNING WITH KEY type = zif_abapgit_definitions=>gc_type-blob + sha1 = -sha1. + -source_data = -data. + -target_sha1 = -sha1. + READ TABLE mt_objects ASSIGNING WITH KEY type = zif_abapgit_definitions=>gc_type-blob + sha1 = -sha1. + -target_data = -data. + + ms_merge-conflict = |{ -name } merge conflict, changed in source and target branch|. + ENDIF. ENDLOOP. ENDMETHOD. + METHOD constructor. + + IF iv_source_branch EQ iv_target_branch. + zcx_abapgit_exception=>raise( 'source = target' ). + ENDIF. + + mo_repo = io_repo. + mv_source_branch = iv_source_branch. + mv_target_branch = iv_target_branch. + + ENDMETHOD. + + METHOD fetch_git. DATA: lo_branch_list TYPE REF TO zcl_abapgit_git_branch_list, lt_upload TYPE zif_abapgit_definitions=>ty_git_branch_list_tt. + lo_branch_list = zcl_abapgit_git_transport=>branches( ms_merge-repo->get_url( ) ). + ms_merge-source = lo_branch_list->find_by_name( + zcl_abapgit_git_branch_list=>complete_heads_branch_name( mv_source_branch ) ). + ms_merge-target = lo_branch_list->find_by_name( + zcl_abapgit_git_branch_list=>complete_heads_branch_name( mv_target_branch ) ). - lo_branch_list = zcl_abapgit_git_transport=>branches( gs_merge-repo->get_url( ) ). - gs_merge-source = lo_branch_list->find_by_name( - zcl_abapgit_git_branch_list=>complete_heads_branch_name( iv_source ) ). - gs_merge-target = lo_branch_list->find_by_name( - zcl_abapgit_git_branch_list=>complete_heads_branch_name( iv_target ) ). - - APPEND gs_merge-source TO lt_upload. - APPEND gs_merge-target TO lt_upload. + APPEND ms_merge-source TO lt_upload. + APPEND ms_merge-target TO lt_upload. zcl_abapgit_git_transport=>upload_pack( EXPORTING - iv_url = gs_merge-repo->get_url( ) - iv_branch_name = gs_merge-repo->get_branch_name( ) + iv_url = ms_merge-repo->get_url( ) + iv_branch_name = ms_merge-repo->get_branch_name( ) iv_deepen = abap_false it_branches = lt_upload IMPORTING - et_objects = gt_objects ). + et_objects = rt_objects ). ENDMETHOD. @@ -212,13 +292,13 @@ CLASS ZCL_ABAPGIT_MERGE IMPLEMENTATION. lv_commit LIKE LINE OF lt_visit. FIELD-SYMBOLS: LIKE LINE OF rt_ancestors, - LIKE LINE OF gt_objects. + LIKE LINE OF mt_objects. APPEND iv_commit TO lt_visit. LOOP AT lt_visit INTO lv_commit. - READ TABLE gt_objects ASSIGNING + READ TABLE mt_objects ASSIGNING WITH KEY type = zif_abapgit_definitions=>gc_type-commit sha1 = lv_commit. ASSERT sy-subrc = 0. @@ -231,9 +311,11 @@ CLASS ZCL_ABAPGIT_MERGE IMPLEMENTATION. -commit = lv_commit. -tree = ls_commit-tree. -body = ls_commit-body. - FIND REGEX zif_abapgit_definitions=>gc_author_regex IN ls_commit-author - SUBMATCHES -time ##NO_TEXT. - ASSERT sy-subrc = 0. + -time = ls_commit-author. + + "Strip Author entry of all but the time component + REPLACE ALL OCCURRENCES OF REGEX '[a-zA-Z<>@.-]*' IN -time WITH ''. + CONDENSE -time. ENDLOOP. SORT rt_ancestors BY time DESCENDING. @@ -246,7 +328,6 @@ CLASS ZCL_ABAPGIT_MERGE IMPLEMENTATION. FIELD-SYMBOLS: LIKE LINE OF it_list1, LIKE LINE OF it_list2. - LOOP AT it_list1 ASSIGNING . LOOP AT it_list2 ASSIGNING . IF -tree = -tree. @@ -261,42 +342,107 @@ CLASS ZCL_ABAPGIT_MERGE IMPLEMENTATION. ENDMETHOD. + METHOD get_conflicts. + + rt_conflicts = mt_conflicts. + + ENDMETHOD. + + + METHOD get_result. + + rs_merge = ms_merge. + + ENDMETHOD. + + + METHOD get_source_branch. + + rv_source_branch = mv_source_branch. + + ENDMETHOD. + + + METHOD get_target_branch. + + rv_target_branch = mv_target_branch. + + ENDMETHOD. + + + METHOD has_conflicts. + + IF lines( mt_conflicts ) > 0. + rv_conflicts_exists = abap_true. + ELSE. + rv_conflicts_exists = abap_false. + ENDIF. + + ENDMETHOD. + + + METHOD resolve_conflict. + + FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_merge_conflict, + LIKE LINE OF ms_merge-result. + + IF is_conflict-result_sha1 IS NOT INITIAL + AND is_conflict-result_data IS NOT INITIAL. + READ TABLE mt_conflicts ASSIGNING WITH KEY path = is_conflict-path + filename = is_conflict-filename. + IF sy-subrc EQ 0. + READ TABLE ms_merge-result ASSIGNING WITH KEY path = is_conflict-path + name = is_conflict-filename. + IF sy-subrc EQ 0. + -sha1 = is_conflict-result_sha1. + + ms_merge-stage->add( iv_path = -path + iv_filename = -filename + iv_data = is_conflict-result_data ). + + DELETE mt_conflicts WHERE path EQ is_conflict-path + AND filename EQ is_conflict-filename. + ENDIF. + + READ TABLE ms_merge-result ASSIGNING WITH KEY sha1 = space. + IF sy-subrc EQ 0. + ms_merge-conflict = |{ -name } merge conflict, changed in source and target branch|. + ELSE. + CLEAR ms_merge-conflict. + ENDIF. + ENDIF. + ENDIF. + + ENDMETHOD. + + METHOD run. DATA: lt_asource TYPE ty_ancestor_tt, lt_atarget TYPE ty_ancestor_tt. + CLEAR: ms_merge, mt_objects, mt_conflicts. - IF iv_source = iv_target. - zcx_abapgit_exception=>raise( 'source = target' ). - ENDIF. + ms_merge-repo = mo_repo. + mt_objects = fetch_git( ). - CLEAR gs_merge. + lt_asource = find_ancestors( ms_merge-source-sha1 ). + lt_atarget = find_ancestors( ms_merge-target-sha1 ). - gs_merge-repo = io_repo. - - fetch_git( iv_source = iv_source - iv_target = iv_target ). - - lt_asource = find_ancestors( gs_merge-source-sha1 ). - lt_atarget = find_ancestors( gs_merge-target-sha1 ). - - gs_merge-common = find_first_common( it_list1 = lt_asource + ms_merge-common = find_first_common( it_list1 = lt_asource it_list2 = lt_atarget ). - gs_merge-stree = zcl_abapgit_git_porcelain=>full_tree( - it_objects = gt_objects - iv_branch = gs_merge-source-sha1 ). - gs_merge-ttree = zcl_abapgit_git_porcelain=>full_tree( - it_objects = gt_objects - iv_branch = gs_merge-target-sha1 ). - gs_merge-ctree = zcl_abapgit_git_porcelain=>full_tree( - it_objects = gt_objects - iv_branch = gs_merge-common-commit ). + ms_merge-stree = zcl_abapgit_git_porcelain=>full_tree( + it_objects = mt_objects + iv_branch = ms_merge-source-sha1 ). + ms_merge-ttree = zcl_abapgit_git_porcelain=>full_tree( + it_objects = mt_objects + iv_branch = ms_merge-target-sha1 ). + ms_merge-ctree = zcl_abapgit_git_porcelain=>full_tree( + it_objects = mt_objects + iv_branch = ms_merge-common-commit ). calculate_result( ). - rs_merge = gs_merge. - ENDMETHOD. ENDCLASS. diff --git a/src/zcl_abapgit_merge.clas.xml b/src/zcl_abapgit_merge.clas.xml index 9d5433be3..174d6efe0 100644 --- a/src/zcl_abapgit_merge.clas.xml +++ b/src/zcl_abapgit_merge.clas.xml @@ -14,6 +14,20 @@ X X + + + ZCL_ABAPGIT_MERGE + CONSTRUCTOR + E + CONSTRUCTOR + + + ZCL_ABAPGIT_MERGE + MO_REPO + E + Online Repository + + diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index 27a980792..7469bb532 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -272,6 +272,18 @@ INTERFACE zif_abapgit_definitions PUBLIC. conflict TYPE string, END OF ty_merge. + TYPES: BEGIN OF ty_merge_conflict, + path TYPE string, + filename TYPE string, + source_sha1 TYPE zif_abapgit_definitions=>ty_sha1, + source_data TYPE xstring, + target_sha1 TYPE zif_abapgit_definitions=>ty_sha1, + target_data TYPE xstring, + result_sha1 TYPE zif_abapgit_definitions=>ty_sha1, + result_data TYPE xstring, + END OF ty_merge_conflict, + tt_merge_conflict TYPE STANDARD TABLE OF ty_merge_conflict WITH DEFAULT KEY. + TYPES: BEGIN OF ty_repo_item, obj_type TYPE tadir-object, obj_name TYPE tadir-obj_name, From 998d89b314fb5d037dc3b043d8ff191854ad44d0 Mon Sep 17 00:00:00 2001 From: Johannes Konings Date: Sun, 27 May 2018 16:28:48 +0200 Subject: [PATCH 022/136] docs: contributing to abapGit #1402 (#1420) * link to the section in docs.abapgit.org https://github.com/larshp/abapGit/issues/1402 * add doc page contributing to abapGit https://github.com/larshp/abapGit/issues/1402 * Contributing to abapGit section other https://github.com/larshp/abapGit/issues/1402 * moved to others https://github.com/larshp/abapGit/issues/1402 * link changed to section other https://github.com/larshp/abapGit/issues/1402 --- CONTRIBUTING.md | 14 +------------- docs/other-contributing-abapGit.md | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 13 deletions(-) create mode 100644 docs/other-contributing-abapGit.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 37f0a5eb1..94aa79043 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -33,16 +33,4 @@ https://guides.github.com/activities/contributing-to-open-source/ ## Building/Creating a PR -1: Install the development version of abapGit by cloning the repository using an online repository, or downloading the zip file and installing it using an offline repository. - -2: The abapGit report installed in your system will now consist of multiple classes - -3: Do the required changes to classes and/or main program - -4: Create the pull request with the changes - -5: After the pull request is merged, abapmerge will automatically run to build the report version of abapGit. - -Every time a commit is pushed to the master branch, https://travis-ci.org/ will be triggered to perform the build. It will use [abapmerge](https://github.com/larshp/abapmerge) to merge all the includes into a single file, the build can be downloaded from https://raw.githubusercontent.com/abapGit/build/master/zabapgit.abap - -Alternatively, use the GitHub webinterface to change the files and submit a pull request. +Building/Creating a PR is described here: http://docs.abapgit.org/other-contributing-abapGit.html diff --git a/docs/other-contributing-abapGit.md b/docs/other-contributing-abapGit.md new file mode 100644 index 000000000..057b2a6df --- /dev/null +++ b/docs/other-contributing-abapGit.md @@ -0,0 +1,21 @@ +--- +title: Contributing to abapGit +category: other +order: 90 +--- + +******************************* + +1: Install the development version of abapGit by cloning the repository using an online repository, or downloading the zip file and installing it using an offline repository. + +2: The abapGit report installed in your system will now consist of multiple classes + +3: Do the required changes to classes and/or main program + +4: Create the pull request with the changes + +5: After the pull request is merged, abapmerge will automatically run to build the report version of abapGit. + +Every time a commit is pushed to the master branch, https://travis-ci.org/ will be triggered to perform the build. It will use [abapmerge](https://github.com/larshp/abapmerge) to merge all the includes into a single file, the build can be downloaded from https://raw.githubusercontent.com/abapGit/build/master/zabapgit.abap + +Alternatively, use the GitHub webinterface to change the files and submit a pull request. From 1ff3debbbc0d89c0faa8e8f36b1c02f5c6d9ee57 Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 27 May 2018 15:05:02 +0000 Subject: [PATCH 023/136] v1.68.0 --- src/zif_abapgit_definitions.intf.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index c31a78b3d..508265d3b 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -320,7 +320,7 @@ INTERFACE zif_abapgit_definitions PUBLIC. END OF ty_s_user_settings. CONSTANTS gc_xml_version TYPE string VALUE 'v1.0.0' ##NO_TEXT. - CONSTANTS gc_abap_version TYPE string VALUE 'v1.67.0' ##NO_TEXT. + CONSTANTS gc_abap_version TYPE string VALUE 'v1.68.0' ##NO_TEXT. CONSTANTS: BEGIN OF gc_type, commit TYPE zif_abapgit_definitions=>ty_type VALUE 'commit', "#EC NOTEXT From 440c7eb4b30ebeb27976e512d5c95f13429e3453 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sun, 27 May 2018 17:06:58 +0200 Subject: [PATCH 024/136] v1.68.0 --- changelog.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/changelog.txt b/changelog.txt index c0afbe858..210aeaf70 100644 --- a/changelog.txt +++ b/changelog.txt @@ -8,6 +8,12 @@ Legend + : added - : removed +2018-05-27 v1.68.0 +------------------ ++ Resolve conflicts functionallity/UI (beta) ++ Annotated tags +* Locking problems fixed(?) + 2018-05-19 v1.67.0 ------------------ + IDOC support From 039eb1e1fa53aa98c32ee88df7a4a5b18a03a2fd Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Mon, 28 May 2018 06:37:14 +0000 Subject: [PATCH 025/136] move parse_tag_request to page --- src/ui/zcl_abapgit_gui_page_tag.clas.abap | 46 +++++++++++++++++-- .../zcl_abapgit_html_action_utils.clas.abap | 34 -------------- 2 files changed, 41 insertions(+), 39 deletions(-) diff --git a/src/ui/zcl_abapgit_gui_page_tag.clas.abap b/src/ui/zcl_abapgit_gui_page_tag.clas.abap index 9d3459292..e73e80e16 100644 --- a/src/ui/zcl_abapgit_gui_page_tag.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_tag.clas.abap @@ -12,6 +12,7 @@ CLASS zcl_abapgit_gui_page_tag DEFINITION PUBLIC FINAL constructor IMPORTING io_repo TYPE REF TO zcl_abapgit_repo RAISING zcx_abapgit_exception, + zif_abapgit_gui_page~on_event REDEFINITION. PROTECTED SECTION. @@ -25,20 +26,25 @@ CLASS zcl_abapgit_gui_page_tag DEFINITION PUBLIC FINAL METHODS: render_menu RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html, + render_form RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html RAISING zcx_abapgit_exception, + render_text_input IMPORTING iv_name TYPE string iv_label TYPE string iv_value TYPE string OPTIONAL iv_max_length TYPE string OPTIONAL RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html, + create_tag - IMPORTING - it_postdata TYPE cnht_post_data_tab - RAISING - zcx_abapgit_exception. + IMPORTING it_postdata TYPE cnht_post_data_tab + RAISING zcx_abapgit_exception, + + parse_tag_request + IMPORTING !it_postdata TYPE cnht_post_data_tab + EXPORTING !es_fields TYPE any. ENDCLASS. @@ -226,7 +232,7 @@ CLASS zcl_abapgit_gui_page_tag IMPLEMENTATION. lv_text TYPE string, lv_tag_type TYPE zif_abapgit_definitions=>ty_git_branch_type. - zcl_abapgit_html_action_utils=>parse_tag_request( + parse_tag_request( EXPORTING it_postdata = it_postdata IMPORTING es_fields = ls_tag ). @@ -251,4 +257,34 @@ CLASS zcl_abapgit_gui_page_tag IMPLEMENTATION. ENDMETHOD. + + METHOD parse_tag_request. + + CONSTANTS: lc_replace TYPE string VALUE '<>'. + + DATA: lv_string TYPE string, + lt_fields TYPE tihttpnvp. + + FIELD-SYMBOLS TYPE string. + + CLEAR es_fields. + + CONCATENATE LINES OF it_postdata INTO lv_string. + REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>gc_crlf IN lv_string WITH lc_replace. + REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>gc_newline IN lv_string WITH lc_replace. + lt_fields = zcl_abapgit_html_action_utils=>parse_fields_upper_case_name( lv_string ). + + zcl_abapgit_html_action_utils=>get_field( EXPORTING name = 'SHA1' it = lt_fields CHANGING cv = es_fields ). + zcl_abapgit_html_action_utils=>get_field( EXPORTING name = 'NAME' it = lt_fields CHANGING cv = es_fields ). + zcl_abapgit_html_action_utils=>get_field( EXPORTING name = 'TAGGER_NAME' it = lt_fields CHANGING cv = es_fields ). + zcl_abapgit_html_action_utils=>get_field( EXPORTING name = 'TAGGER_EMAIL' it = lt_fields CHANGING cv = es_fields ). + zcl_abapgit_html_action_utils=>get_field( EXPORTING name = 'MESSAGE' it = lt_fields CHANGING cv = es_fields ). + zcl_abapgit_html_action_utils=>get_field( EXPORTING name = 'BODY' it = lt_fields CHANGING cv = es_fields ). + + ASSIGN COMPONENT 'BODY' OF STRUCTURE es_fields TO . + ASSERT IS ASSIGNED. + REPLACE ALL OCCURRENCES OF lc_replace IN WITH zif_abapgit_definitions=>gc_newline. + + ENDMETHOD. + ENDCLASS. diff --git a/src/ui/zcl_abapgit_html_action_utils.clas.abap b/src/ui/zcl_abapgit_html_action_utils.clas.abap index 824c61c4e..6c9e74991 100644 --- a/src/ui/zcl_abapgit_html_action_utils.clas.abap +++ b/src/ui/zcl_abapgit_html_action_utils.clas.abap @@ -96,11 +96,6 @@ CLASS zcl_abapgit_html_action_utils DEFINITION !it_postdata TYPE cnht_post_data_tab EXPORTING !es_fields TYPE any . - CLASS-METHODS parse_tag_request - IMPORTING - !it_postdata TYPE cnht_post_data_tab - EXPORTING - !es_fields TYPE any . CLASS-METHODS decode_bg_update IMPORTING !iv_getdata TYPE clike @@ -436,33 +431,4 @@ CLASS zcl_abapgit_html_action_utils IMPLEMENTATION. ENDMETHOD. - METHOD parse_tag_request. - - CONSTANTS: lc_replace TYPE string VALUE '<>'. - - DATA: lv_string TYPE string, - lt_fields TYPE tihttpnvp. - - FIELD-SYMBOLS TYPE string. - - CLEAR es_fields. - - CONCATENATE LINES OF it_postdata INTO lv_string. - REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>gc_crlf IN lv_string WITH lc_replace. - REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>gc_newline IN lv_string WITH lc_replace. - lt_fields = parse_fields_upper_case_name( lv_string ). - - get_field( EXPORTING name = 'SHA1' it = lt_fields CHANGING cv = es_fields ). - get_field( EXPORTING name = 'NAME' it = lt_fields CHANGING cv = es_fields ). - get_field( EXPORTING name = 'TAGGER_NAME' it = lt_fields CHANGING cv = es_fields ). - get_field( EXPORTING name = 'TAGGER_EMAIL' it = lt_fields CHANGING cv = es_fields ). - get_field( EXPORTING name = 'MESSAGE' it = lt_fields CHANGING cv = es_fields ). - get_field( EXPORTING name = 'BODY' it = lt_fields CHANGING cv = es_fields ). - - ASSIGN COMPONENT 'BODY' OF STRUCTURE es_fields TO . - ASSERT IS ASSIGNED. - REPLACE ALL OCCURRENCES OF lc_replace IN WITH zif_abapgit_definitions=>gc_newline. - - ENDMETHOD. - ENDCLASS. From fdd90aac0195c026d49c3a11facfb0e5bb16c37a Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Tue, 29 May 2018 15:57:27 +0200 Subject: [PATCH 026/136] docs: ssl, minor change --- docs/guide-ssl-setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-ssl-setup.md b/docs/guide-ssl-setup.md index 14cd749c3..6dec76144 100644 --- a/docs/guide-ssl-setup.md +++ b/docs/guide-ssl-setup.md @@ -45,7 +45,7 @@ On [Feburary 22nd](https://githubengineering.com/crypto-removal-notice/), GitHub See [SAP note 510007](https://launchpad.support.sap.com/#/notes/510007), section 7, for information on how to configure SSL. -Add parameters +Add profile parameters: ``` ssl/client_ciphersuites = 150:PFS:HIGH::EC_P256:EC_HIGH ssl/ciphersuites = 135:PFS:HIGH::EC_P256:EC_HIGH From 3587ff8d39b2391b4036a9adca90896879a67ebf Mon Sep 17 00:00:00 2001 From: ThomasPloski <39330834+ThomasPloski@users.noreply.github.com> Date: Wed, 30 May 2018 08:11:33 +0200 Subject: [PATCH 027/136] Delivery class of database table zabapgit changed Delivery class L offers a table design w/o client field information --- src/persist/zcl_abapgit_persist_migrate.clas.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/persist/zcl_abapgit_persist_migrate.clas.abap b/src/persist/zcl_abapgit_persist_migrate.clas.abap index 525d39388..d0a5e26db 100644 --- a/src/persist/zcl_abapgit_persist_migrate.clas.abap +++ b/src/persist/zcl_abapgit_persist_migrate.clas.abap @@ -293,7 +293,7 @@ CLASS zcl_abapgit_persist_migrate IMPLEMENTATION. ls_dd02v-ddlanguage = zif_abapgit_definitions=>gc_english. ls_dd02v-tabclass = 'TRANSP'. ls_dd02v-ddtext = c_text. - ls_dd02v-contflag = 'A'. + ls_dd02v-contflag = 'L'. ls_dd02v-exclass = '1'. ls_dd09l-tabname = zcl_abapgit_persistence_db=>c_tabname. From c7224bdc26910cddfa7c41900b2f167435d32237 Mon Sep 17 00:00:00 2001 From: juancarlosrodriguezf <37382510+juancarlosrodriguezf@users.noreply.github.com> Date: Thu, 31 May 2018 14:54:13 +0200 Subject: [PATCH 028/136] Error of duplicity because SPRAS is case sensitive Old code generate error of duplicity because SPRAS is case sensitive, but the name of files not. New code use the 2-caracteres code for language. Examples (T002): SPRAS: 'C' -> LAISO: CS -> 'Czech' SPRAS: 'c' -> LAISO: CA -> 'Catalan' --- src/objects/zcl_abapgit_object_form.clas.abap | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/objects/zcl_abapgit_object_form.clas.abap b/src/objects/zcl_abapgit_object_form.clas.abap index 202675ef9..8fb11250f 100644 --- a/src/objects/zcl_abapgit_object_form.clas.abap +++ b/src/objects/zcl_abapgit_object_form.clas.abap @@ -254,7 +254,17 @@ CLASS zcl_abapgit_object_form IMPLEMENTATION. ENDMETHOD. METHOD _build_extra_from_header. - r_result = c_objectname_tdlines && '_' && ls_header-tdspras. + + DATA: lv_tdspras type laiso. + + CALL FUNCTION 'CONVERSION_EXIT_ISOLA_OUTPUT' + EXPORTING + input = ls_header-tdspras + IMPORTING + output = lv_tdspras. + + r_result = c_objectname_tdlines && '_' && lv_tdspras. + ENDMETHOD. METHOD _get_last_changes. From 387b8b9cc24ffbed2a8827fd5533be180c9ebda4 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Sat, 2 Jun 2018 07:02:50 +0000 Subject: [PATCH 029/136] fix xml syntax for sole closing tag --- src/syntax/zcl_abapgit_syntax_xml.clas.abap | 21 ++++---- ...l_abapgit_syntax_xml.clas.testclasses.abap | 52 +++++++++++++++++++ src/syntax/zcl_abapgit_syntax_xml.clas.xml | 1 + 3 files changed, 64 insertions(+), 10 deletions(-) create mode 100644 src/syntax/zcl_abapgit_syntax_xml.clas.testclasses.abap diff --git a/src/syntax/zcl_abapgit_syntax_xml.clas.abap b/src/syntax/zcl_abapgit_syntax_xml.clas.abap index 3826dfc51..016bb32df 100644 --- a/src/syntax/zcl_abapgit_syntax_xml.clas.abap +++ b/src/syntax/zcl_abapgit_syntax_xml.clas.abap @@ -5,27 +5,26 @@ CLASS zcl_abapgit_syntax_xml DEFINITION PUBLIC SECTION. - METHODS constructor. - CONSTANTS: BEGIN OF c_css, xml_tag TYPE string VALUE 'xml_tag', "#EC NOTEXT attr TYPE string VALUE 'attr', "#EC NOTEXT attr_val TYPE string VALUE 'attr_val', "#EC NOTEXT - END OF c_css, - + END OF c_css . + CONSTANTS: BEGIN OF c_token, xml_tag TYPE c VALUE 'X', "#EC NOTEXT attr TYPE c VALUE 'A', "#EC NOTEXT attr_val TYPE c VALUE 'V', "#EC NOTEXT - END OF c_token, - + END OF c_token . + CONSTANTS: BEGIN OF c_regex, xml_tag TYPE string VALUE '[<>]', "#EC NOTEXT attr TYPE string VALUE '\s[-a-z:_0-9]+\s*(?==)', "#EC NOTEXT attr_val TYPE string VALUE '["''][^''"]+[''"]', "#EC NOTEXT - END OF c_regex. + END OF c_regex . + METHODS constructor . PROTECTED SECTION. METHODS order_matches REDEFINITION. @@ -34,7 +33,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_SYNTAX_XML IMPLEMENTATION. +CLASS zcl_abapgit_syntax_xml IMPLEMENTATION. METHOD constructor. @@ -91,8 +90,10 @@ CLASS ZCL_ABAPGIT_SYNTAX_XML IMPLEMENTATION. " Adjust length and offset of closing tag ELSEIF -text_tag = '>' AND lv_prev_token <> c_token-xml_tag. lv_state = 'C'. - -length = -offset - -offset - -length + -length. - -offset = -offset + -length. + IF IS ASSIGNED. + -length = -offset - -offset - -length + -length. + -offset = -offset + -length. + ENDIF. ELSE. lv_state = 'O'. ENDIF. diff --git a/src/syntax/zcl_abapgit_syntax_xml.clas.testclasses.abap b/src/syntax/zcl_abapgit_syntax_xml.clas.testclasses.abap new file mode 100644 index 000000000..1cbe4d33d --- /dev/null +++ b/src/syntax/zcl_abapgit_syntax_xml.clas.testclasses.abap @@ -0,0 +1,52 @@ +*"* use this source file for your ABAP unit test classes + +CLASS abapgit_syntax_xml DEFINITION FINAL FOR TESTING + DURATION SHORT + RISK LEVEL HARMLESS. + + PRIVATE SECTION. + DATA: + mo_cut TYPE REF TO zcl_abapgit_syntax_xml. + + METHODS: + setup, + sole_closing_xml_tag FOR TESTING RAISING cx_static_check, + complete_xml_tag FOR TESTING RAISING cx_static_check, + complete_xml_tag_with_closing FOR TESTING RAISING cx_static_check. + +ENDCLASS. + + +CLASS abapgit_syntax_xml IMPLEMENTATION. + + METHOD setup. + + CREATE OBJECT mo_cut. + + ENDMETHOD. + + METHOD sole_closing_xml_tag. + + cl_abap_unit_assert=>assert_equals( + exp = |>| + act = mo_cut->process_line( |>| ) ). + + ENDMETHOD. + + METHOD complete_xml_tag. + + cl_abap_unit_assert=>assert_equals( + exp = |<tag>| + act = mo_cut->process_line( || ) ). + + ENDMETHOD. + + METHOD complete_xml_tag_with_closing. + + cl_abap_unit_assert=>assert_equals( + exp = |<tag/>| + act = mo_cut->process_line( || ) ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/syntax/zcl_abapgit_syntax_xml.clas.xml b/src/syntax/zcl_abapgit_syntax_xml.clas.xml index 52e9764b1..5b887d9de 100644 --- a/src/syntax/zcl_abapgit_syntax_xml.clas.xml +++ b/src/syntax/zcl_abapgit_syntax_xml.clas.xml @@ -12,6 +12,7 @@ X X X + X From ca0b2039407716c766bcc8034e32f000b3494706 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Sat, 2 Jun 2018 07:10:29 +0000 Subject: [PATCH 030/136] XSLT fix changed by --- src/objects/zcl_abapgit_object_xslt.clas.abap | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/objects/zcl_abapgit_object_xslt.clas.abap b/src/objects/zcl_abapgit_object_xslt.clas.abap index c5ebc6af8..a04554b90 100644 --- a/src/objects/zcl_abapgit_object_xslt.clas.abap +++ b/src/objects/zcl_abapgit_object_xslt.clas.abap @@ -19,7 +19,25 @@ CLASS zcl_abapgit_object_xslt IMPLEMENTATION. ENDMETHOD. "zif_abapgit_object~has_changed_since METHOD zif_abapgit_object~changed_by. - rv_user = c_user_unknown. " todo + + DATA: lo_xslt TYPE REF TO cl_o2_api_xsltdesc, + ls_attributes TYPE o2xsltattr. + + lo_xslt = get( ). + lo_xslt->get_attributes( + RECEIVING + p_attributes = ls_attributes + EXCEPTIONS + object_invalid = 1 + xsltdesc_deleted = 2 + OTHERS = 3 ). + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise_t100( ). + ENDIF. + + rv_user = ls_attributes-changedby. + ENDMETHOD. METHOD get. From 49e6f1051f9fb4164736d7e6ca57f50b93d98360 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sat, 2 Jun 2018 11:26:25 +0200 Subject: [PATCH 031/136] docs, SUCU --- docs/ref-supported.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/ref-supported.md b/docs/ref-supported.md index 7fcd157a6..5038ea7be 100644 --- a/docs/ref-supported.md +++ b/docs/ref-supported.md @@ -74,6 +74,7 @@ SMIM | Info Object from the MIME Repository | Yes SOTS | All Concepts (OTR) of a Package - Long Texts | [#792](https://github.com/larshp/abapGit/issues/792) SPLO | Format Types | Yes SPRX | Proxy Object | [#87](https://github.com/larshp/abapGit/issues/87) +SUCU | Authorization Groups (TBRG_AUTH) | [#1434](https://github.com/larshp/abapGit/issues/1434) SRFC | RFC Service | Yes SSFO | SAP Smart Form | Yes SSST | SAP Smart Style | Yes From d4a96b28f7f1681cc64518fb48f211d2a2d2d393 Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 3 Jun 2018 10:33:33 +0000 Subject: [PATCH 032/136] v1.68.1 --- src/zif_abapgit_definitions.intf.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index 508265d3b..46217dbd2 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -320,7 +320,7 @@ INTERFACE zif_abapgit_definitions PUBLIC. END OF ty_s_user_settings. CONSTANTS gc_xml_version TYPE string VALUE 'v1.0.0' ##NO_TEXT. - CONSTANTS gc_abap_version TYPE string VALUE 'v1.68.0' ##NO_TEXT. + CONSTANTS gc_abap_version TYPE string VALUE 'v1.68.1' ##NO_TEXT. CONSTANTS: BEGIN OF gc_type, commit TYPE zif_abapgit_definitions=>ty_type VALUE 'commit', "#EC NOTEXT From b2d7d63fcb7c2bc724c37b1845fec617c5e59174 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sun, 3 Jun 2018 12:34:14 +0200 Subject: [PATCH 033/136] v1.68.1 --- changelog.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/changelog.txt b/changelog.txt index 210aeaf70..2567bb61e 100644 --- a/changelog.txt +++ b/changelog.txt @@ -8,6 +8,12 @@ Legend + : added - : removed +2018-06-03 v1.68.1 +------------------ +* XSLT fix changed_by +* Fix dump in XML syntax highlighter +* Delivery class of database table changed + 2018-05-27 v1.68.0 ------------------ + Resolve conflicts functionallity/UI (beta) From 9cecd077dadb50161b395be80567679437d93396 Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 3 Jun 2018 12:35:50 +0000 Subject: [PATCH 034/136] testclass: fix syntax warning, implement method --- src/zcl_abapgit_folder_logic.clas.testclasses.abap | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/zcl_abapgit_folder_logic.clas.testclasses.abap b/src/zcl_abapgit_folder_logic.clas.testclasses.abap index 0f772a100..de6360707 100644 --- a/src/zcl_abapgit_folder_logic.clas.testclasses.abap +++ b/src/zcl_abapgit_folder_logic.clas.testclasses.abap @@ -196,6 +196,10 @@ CLASS ltcl_folder_logic_namespaces IMPLEMENTATION. RETURN. ENDMETHOD. + METHOD zif_abapgit_sap_package~are_changes_recorded_in_tr_req. + RETURN. + ENDMETHOD. + METHOD zif_abapgit_sap_package~read_parent. rv_parentcl = c_top. ENDMETHOD. From 9dc998261f23413599cced6cb4af5e88c06a6a3f Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sun, 3 Jun 2018 15:39:17 +0200 Subject: [PATCH 035/136] docs: SSL test program, show full error message --- docs/other-test-ssl.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/other-test-ssl.md b/docs/other-test-ssl.md index e4f00dfdf..d75ad9c0b 100644 --- a/docs/other-test-ssl.md +++ b/docs/other-test-ssl.md @@ -25,6 +25,7 @@ SELECTION-SCREEN END OF BLOCK proxy. START-OF-SELECTION. PERFORM run USING p_url1. + WRITE: /, '----', /. PERFORM run USING p_url2. FORM run USING iv_url TYPE swc_value. @@ -32,6 +33,7 @@ FORM run USING iv_url TYPE swc_value. DATA: lv_code TYPE i, lv_url TYPE string, li_client TYPE REF TO if_http_client, + lt_errors TYPE TABLE OF string, lv_error_message TYPE string. IF iv_url IS INITIAL. @@ -63,12 +65,15 @@ FORM run USING iv_url TYPE swc_value. http_processing_failed = 3 OTHERS = 4 ). IF sy-subrc <> 0. - WRITE: / 'Error Number', sy-subrc. + WRITE: / 'Error Number', sy-subrc, /. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. li_client->get_last_error( IMPORTING message = lv_error_message ). - WRITE: / `Error message: ` && lv_error_message. + SPLIT lv_error_message AT cl_abap_char_utilities=>newline INTO TABLE lt_errors. + LOOP AT lt_errors INTO lv_error_message. + WRITE: / lv_error_message. + ENDLOOP. WRITE: / 'Also check transaction SMICM -> Goto -> Trace File -> Display End'. RETURN. ENDIF. From 71787d74f0f52f859cb8f690127fa13240eb1898 Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 3 Jun 2018 14:14:19 +0000 Subject: [PATCH 036/136] evaluate 2FA implementations alphabetically #1443 --- src/http/zcl_abapgit_2fa_auth_registry.clas.abap | 1 + 1 file changed, 1 insertion(+) diff --git a/src/http/zcl_abapgit_2fa_auth_registry.clas.abap b/src/http/zcl_abapgit_2fa_auth_registry.clas.abap index 0b88673c6..247d7e358 100644 --- a/src/http/zcl_abapgit_2fa_auth_registry.clas.abap +++ b/src/http/zcl_abapgit_2fa_auth_registry.clas.abap @@ -62,6 +62,7 @@ CLASS ZCL_ABAPGIT_2FA_AUTH_REGISTRY IMPLEMENTATION. TRY. lo_class ?= cl_oo_class=>get_instance( 'ZCL_ABAPGIT_2FA_AUTH_BASE' ). lt_sub = lo_class->get_subclasses( ). + SORT lt_sub BY clsname ASCENDING AS TEXT. LOOP AT lt_sub INTO ls_sub. CREATE OBJECT li_authenticator TYPE (ls_sub-clsname). INSERT li_authenticator INTO TABLE gt_registered_authenticators. From d5e9506d51762e97ce2eb3dcdb430b541ec5b0ec Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Mon, 4 Jun 2018 07:08:49 +0000 Subject: [PATCH 037/136] ECATT: remove empty attributes --- src/objects/zcl_abapgit_object_ecatt_super.clas.abap | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/objects/zcl_abapgit_object_ecatt_super.clas.abap b/src/objects/zcl_abapgit_object_ecatt_super.clas.abap index 5ffe039a3..473d79b0b 100644 --- a/src/objects/zcl_abapgit_object_ecatt_super.clas.abap +++ b/src/objects/zcl_abapgit_object_ecatt_super.clas.abap @@ -144,12 +144,9 @@ CLASS zcl_abapgit_object_ecatt_super IMPLEMENTATION. lv_object_type = get_object_type( ). lo_element = ci_document->find_from_name( |{ lv_object_type }| ). - lo_element->set_attribute( name = |SAPRL| - value = || ). - lo_element->set_attribute( name = |DOWNLOADDATE| - value = || ). - lo_element->set_attribute( name = |DOWNLOADTIME| - value = || ). + lo_element->remove_attribute( |SAPRL| ). + lo_element->remove_attribute( |DOWNLOADDATE| ). + lo_element->remove_attribute( |DOWNLOADTIME| ). ENDMETHOD. From 6812fd56f60fe44c5d704850d7c2972a846bb11a Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Mon, 4 Jun 2018 07:02:15 +0000 Subject: [PATCH 038/136] fix format empty xml attributes --- src/syntax/zcl_abapgit_syntax_xml.clas.abap | 2 +- ...cl_abapgit_syntax_xml.clas.testclasses.abap | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/syntax/zcl_abapgit_syntax_xml.clas.abap b/src/syntax/zcl_abapgit_syntax_xml.clas.abap index 016bb32df..4dec77e2a 100644 --- a/src/syntax/zcl_abapgit_syntax_xml.clas.abap +++ b/src/syntax/zcl_abapgit_syntax_xml.clas.abap @@ -21,7 +21,7 @@ CLASS zcl_abapgit_syntax_xml DEFINITION BEGIN OF c_regex, xml_tag TYPE string VALUE '[<>]', "#EC NOTEXT attr TYPE string VALUE '\s[-a-z:_0-9]+\s*(?==)', "#EC NOTEXT - attr_val TYPE string VALUE '["''][^''"]+[''"]', "#EC NOTEXT + attr_val TYPE string VALUE '["''][^''"]*[''"]', "#EC NOTEXT END OF c_regex . METHODS constructor . diff --git a/src/syntax/zcl_abapgit_syntax_xml.clas.testclasses.abap b/src/syntax/zcl_abapgit_syntax_xml.clas.testclasses.abap index 1cbe4d33d..11209fc4d 100644 --- a/src/syntax/zcl_abapgit_syntax_xml.clas.testclasses.abap +++ b/src/syntax/zcl_abapgit_syntax_xml.clas.testclasses.abap @@ -12,7 +12,8 @@ CLASS abapgit_syntax_xml DEFINITION FINAL FOR TESTING setup, sole_closing_xml_tag FOR TESTING RAISING cx_static_check, complete_xml_tag FOR TESTING RAISING cx_static_check, - complete_xml_tag_with_closing FOR TESTING RAISING cx_static_check. + complete_xml_tag_with_closing FOR TESTING RAISING cx_static_check, + empty_attributes FOR TESTING RAISING cx_static_check. ENDCLASS. @@ -49,4 +50,19 @@ CLASS abapgit_syntax_xml IMPLEMENTATION. ENDMETHOD. + METHOD empty_attributes. + + cl_abap_unit_assert=>assert_equals( + exp = |<ECTD| + && | SAPRL=| + && |"751"| + && | VERSION=| + && |"1.5"| + && | DOWNLOADDATE=""| + && | DOWNLOADTIME=""| + && |>| + act = mo_cut->process_line( || ) ). + + ENDMETHOD. + ENDCLASS. From 068cf963d9b5ab66d05dc7f4b0e029867beffd57 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Mon, 4 Jun 2018 15:10:49 +0200 Subject: [PATCH 039/136] ENHO: implement changed_by #1417 (#1436) --- src/objects/zcl_abapgit_object_enho.clas.abap | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/src/objects/zcl_abapgit_object_enho.clas.abap b/src/objects/zcl_abapgit_object_enho.clas.abap index c0c58b541..37cb6a774 100644 --- a/src/objects/zcl_abapgit_object_enho.clas.abap +++ b/src/objects/zcl_abapgit_object_enho.clas.abap @@ -28,8 +28,43 @@ CLASS zcl_abapgit_object_enho IMPLEMENTATION. ENDMETHOD. "zif_abapgit_object~get_metadata METHOD zif_abapgit_object~changed_by. - rv_user = c_user_unknown. " todo - ENDMETHOD. "zif_abapgit_object~changed_by + + DATA: lv_enh_id TYPE enhname, + li_enho TYPE REF TO zif_abapgit_object_enho, + lt_log TYPE enh_log_it, + li_log_obj TYPE REF TO if_enh_log, + ls_enhlog TYPE enhlog, + lv_lines TYPE i, + lt_enhlog TYPE STANDARD TABLE OF enhlog WITH DEFAULT KEY, + li_enh_tool TYPE REF TO if_enh_tool. + + + lv_enh_id = ms_item-obj_name. + TRY. + li_enh_tool = cl_enh_factory=>get_enhancement( + enhancement_id = lv_enh_id + bypassing_buffer = abap_true ). + CATCH cx_enh_root. + rv_user = c_user_unknown. + RETURN. + ENDTRY. + + lt_log = li_enh_tool->get_log( ). + + LOOP AT lt_log INTO li_log_obj. + ls_enhlog = li_log_obj->get_enhlog( ). + APPEND ls_enhlog TO lt_enhlog. + ENDLOOP. + + lv_lines = lines( lt_enhlog ). + READ TABLE lt_enhlog INTO ls_enhlog INDEX lv_lines. + IF sy-subrc = 0. + rv_user = ls_enhlog-loguser. + ELSE. + rv_user = c_user_unknown. + ENDIF. + + ENDMETHOD. METHOD zif_abapgit_object~exists. From f1c15b1e958c66d22c6d7ff1f27c03582fa3bc42 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Mon, 4 Jun 2018 15:11:23 +0200 Subject: [PATCH 040/136] fix TOBJ diffs, #1435 (#1437) --- src/objects/zcl_abapgit_object_tobj.clas.abap | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/objects/zcl_abapgit_object_tobj.clas.abap b/src/objects/zcl_abapgit_object_tobj.clas.abap index c0a68f2db..4c638c79f 100644 --- a/src/objects/zcl_abapgit_object_tobj.clas.abap +++ b/src/objects/zcl_abapgit_object_tobj.clas.abap @@ -193,6 +193,28 @@ CLASS zcl_abapgit_object_tobj IMPLEMENTATION. zcx_abapgit_exception=>raise( 'error from OBJ_GENERATE' ). ENDIF. + CALL FUNCTION 'OBJ_SET_IMPORTABLE' + EXPORTING + iv_objectname = ls_objh-objectname + iv_objecttype = ls_objh-objecttype + iv_importable = ls_objh-importable + EXCEPTIONS + object_not_defined = 1 + invalid = 2 + transport_error = 3 + object_enqueue_failed = 4 + OTHERS = 5. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( 'error from OBJ_SET_IMPORTABLE' ). + ENDIF. + +* fm OBJ_GENERATE takes the defaults from the DDIC object +* set OBJTRANSP directly, should be okay looking at the code in OBJ_SET_IMPORTABLE +* locking has been done in OBJ_SET_IMPORTABLE plus recording of transport + UPDATE objh SET objtransp = ls_objh-objtransp + WHERE objectname = ls_objh-objectname + AND objecttype = ls_objh-objecttype. + io_xml->read( EXPORTING iv_name = 'TOBJ' CHANGING cg_data = ls_tobj ). ls_tobj-tvdir-gendate = sy-datum. From 71bcc8afac869cba6288f4bb4e0ef47fcbb6943f Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Mon, 4 Jun 2018 15:11:41 +0200 Subject: [PATCH 041/136] CLAS: ignore deletion of non-existent objects (#1439) * CLAS: ignore deletion of non-existent objects --- src/objects/zcl_abapgit_oo_class.clas.abap | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/objects/zcl_abapgit_oo_class.clas.abap b/src/objects/zcl_abapgit_oo_class.clas.abap index bd5f58350..1a3325a3b 100644 --- a/src/objects/zcl_abapgit_oo_class.clas.abap +++ b/src/objects/zcl_abapgit_oo_class.clas.abap @@ -273,8 +273,12 @@ CLASS zcl_abapgit_oo_class IMPLEMENTATION. no_access = 4 other = 5 OTHERS = 6. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'Error from SEO_CLASS_DELETE_COMPLETE' ). + IF sy-subrc = 1. +* ignore deletion of objects that does not exist +* this can happen when the SXCI object is deleted before the implementing CLAS + RETURN. + ELSEIF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |Error from SEO_CLASS_DELETE_COMPLETE: { sy-subrc }| ). ENDIF. ENDMETHOD. From 10dbd74f57042284278bb6bcb048065d81a24441 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Mon, 4 Jun 2018 15:12:03 +0200 Subject: [PATCH 042/136] Minor changes (#1442) * remove try without catch * reduce nesting * reduce nesting * reduce line length --- src/objects/zcl_abapgit_object_doma.clas.abap | 33 +++++++------- .../zcl_abapgit_objects_program.clas.abap | 44 +++++++++---------- src/syntax/zcl_abapgit_syntax_abap.clas.abap | 9 ++-- ...l_abapgit_xml_output.clas.testclasses.abap | 3 +- 4 files changed, 42 insertions(+), 47 deletions(-) diff --git a/src/objects/zcl_abapgit_object_doma.clas.abap b/src/objects/zcl_abapgit_object_doma.clas.abap index b5b78ef93..77ab42d2c 100644 --- a/src/objects/zcl_abapgit_object_doma.clas.abap +++ b/src/objects/zcl_abapgit_object_doma.clas.abap @@ -36,7 +36,7 @@ ENDCLASS. -CLASS zcl_abapgit_object_doma IMPLEMENTATION. +CLASS ZCL_ABAPGIT_OBJECT_DOMA IMPLEMENTATION. METHOD deserialize_texts. @@ -223,23 +223,20 @@ CLASS zcl_abapgit_object_doma IMPLEMENTATION. CATCH cx_sy_dyn_call_param_not_found. - TRY. - CALL FUNCTION 'RS_DD_DELETE_OBJ' - EXPORTING - no_ask = abap_true - objname = lv_objname - objtype = 'D' -* no_ask_delete_append = abap_true parameter not available in lower NW versions - EXCEPTIONS - not_executed = 1 - object_not_found = 2 - object_not_specified = 3 - permission_failure = 4. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'error from RS_DD_DELETE_OBJ, DOMA' ). - ENDIF. - - ENDTRY. + CALL FUNCTION 'RS_DD_DELETE_OBJ' + EXPORTING + no_ask = abap_true + objname = lv_objname + objtype = 'D' +* no_ask_delete_append = abap_true parameter not available in lower NW versions + EXCEPTIONS + not_executed = 1 + object_not_found = 2 + object_not_specified = 3 + permission_failure = 4. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( 'error from RS_DD_DELETE_OBJ, DOMA' ). + ENDIF. ENDTRY. diff --git a/src/objects/zcl_abapgit_objects_program.clas.abap b/src/objects/zcl_abapgit_objects_program.clas.abap index 53aa54fb6..6bf6f5bfa 100644 --- a/src/objects/zcl_abapgit_objects_program.clas.abap +++ b/src/objects/zcl_abapgit_objects_program.clas.abap @@ -338,31 +338,29 @@ CLASS zcl_abapgit_objects_program IMPLEMENTATION. ENDIF. zcl_abapgit_language=>restore_login_language( ). - ELSE. + ELSEIF strlen( is_progdir-name ) > 30. * function module RPY_PROGRAM_INSERT cannot handle function group includes - IF strlen( is_progdir-name ) > 30. - " special treatment for extensions - " if the program name exceeds 30 characters it is not a usual - " ABAP program but might be some extension, which requires the internal - " addition EXTENSION TYPE, see - " http://help.sap.com/abapdocu_751/en/abapinsert_report_internal.htm#!ABAP_ADDITION_1@1@ - " This e.g. occurs in case of transportable Code Inspector variants (ending with ===VC) - INSERT REPORT is_progdir-name - FROM it_source - STATE 'I' - EXTENSION TYPE is_progdir-name+30. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'error from INSERT REPORT .. EXTENSION TYPE' ). - ENDIF. - ELSE. - INSERT REPORT is_progdir-name - FROM it_source - STATE 'I' - PROGRAM TYPE is_progdir-subc. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'error from INSERT REPORT' ). - ENDIF. + " special treatment for extensions + " if the program name exceeds 30 characters it is not a usual + " ABAP program but might be some extension, which requires the internal + " addition EXTENSION TYPE, see + " http://help.sap.com/abapdocu_751/en/abapinsert_report_internal.htm#!ABAP_ADDITION_1@1@ + " This e.g. occurs in case of transportable Code Inspector variants (ending with ===VC) + INSERT REPORT is_progdir-name + FROM it_source + STATE 'I' + EXTENSION TYPE is_progdir-name+30. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( 'error from INSERT REPORT .. EXTENSION TYPE' ). + ENDIF. + ELSE. + INSERT REPORT is_progdir-name + FROM it_source + STATE 'I' + PROGRAM TYPE is_progdir-subc. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( 'error from INSERT REPORT' ). ENDIF. ENDIF. diff --git a/src/syntax/zcl_abapgit_syntax_abap.clas.abap b/src/syntax/zcl_abapgit_syntax_abap.clas.abap index 069bc7910..3a09436e4 100644 --- a/src/syntax/zcl_abapgit_syntax_abap.clas.abap +++ b/src/syntax/zcl_abapgit_syntax_abap.clas.abap @@ -219,12 +219,11 @@ CLASS ZCL_ABAPGIT_SYNTAX_ABAP IMPLEMENTATION. CASE -token. WHEN c_token-keyword. - IF -offset > 0. + IF -offset > 0 + AND substring( val = iv_line off = ( -offset - 1 ) len = 1 ) CA '-<'. " Delete match if keyword is part of structure or field symbol - IF substring( val = iv_line off = ( -offset - 1 ) len = 1 ) CA '-<'. - DELETE ct_matches INDEX lv_index. - CONTINUE. - ENDIF. + DELETE ct_matches INDEX lv_index. + CONTINUE. ENDIF. WHEN c_token-comment. diff --git a/src/xml/zcl_abapgit_xml_output.clas.testclasses.abap b/src/xml/zcl_abapgit_xml_output.clas.testclasses.abap index 780dd5436..fd2265373 100644 --- a/src/xml/zcl_abapgit_xml_output.clas.testclasses.abap +++ b/src/xml/zcl_abapgit_xml_output.clas.testclasses.abap @@ -69,7 +69,8 @@ CLASS ltcl_xml_output IMPLEMENTATION. lv_value = '##' & ' #' & - ' # # 2# A# # # ##'. + ' # # 2# A' & + '# # # ##'. REPLACE ALL OCCURRENCES OF '#' IN lv_value WITH cl_abap_char_utilities=>newline. From ce79d2a841abe09672c5a4f46e72915302e1501f Mon Sep 17 00:00:00 2001 From: larshp Date: Mon, 4 Jun 2018 13:27:43 +0000 Subject: [PATCH 043/136] v1.68.2 --- src/zif_abapgit_definitions.intf.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index 46217dbd2..358c22e23 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -320,7 +320,7 @@ INTERFACE zif_abapgit_definitions PUBLIC. END OF ty_s_user_settings. CONSTANTS gc_xml_version TYPE string VALUE 'v1.0.0' ##NO_TEXT. - CONSTANTS gc_abap_version TYPE string VALUE 'v1.68.1' ##NO_TEXT. + CONSTANTS gc_abap_version TYPE string VALUE 'v1.68.2' ##NO_TEXT. CONSTANTS: BEGIN OF gc_type, commit TYPE zif_abapgit_definitions=>ty_type VALUE 'commit', "#EC NOTEXT From aaaf72cf75dd7fecf316d84e9f4e6abd3fe59863 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Mon, 4 Jun 2018 15:40:34 +0200 Subject: [PATCH 044/136] v1.68.2 --- changelog.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/changelog.txt b/changelog.txt index 2567bb61e..8eb6aa40a 100644 --- a/changelog.txt +++ b/changelog.txt @@ -8,6 +8,15 @@ Legend + : added - : removed +2018-06-04 v1.68.2 +------------------ +* CLAS ignore deltion of non-existent objects +* ENHO implement changed by +* fix TOBJ diffs +* fix error in XML syntax highlighter +* ECATT remove empty attributes +* evaluate 2FA implementations alphabetically + 2018-06-03 v1.68.1 ------------------ * XSLT fix changed_by From 353c1a15f21234b003aa6a8bf86e8907c7310d96 Mon Sep 17 00:00:00 2001 From: larshp Date: Tue, 5 Jun 2018 07:46:19 +0000 Subject: [PATCH 045/136] change agent #1432 example "git/2.0 (abapGit 1.68.0)" removed "v" in front of version number --- src/http/zcl_abapgit_http.clas.abap | 3 ++- src/zif_abapgit_definitions.intf.abap | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/http/zcl_abapgit_http.clas.abap b/src/http/zcl_abapgit_http.clas.abap index 62a866e35..1a31e2ef7 100644 --- a/src/http/zcl_abapgit_http.clas.abap +++ b/src/http/zcl_abapgit_http.clas.abap @@ -205,7 +205,8 @@ CLASS ZCL_ABAPGIT_HTTP IMPLEMENTATION. METHOD get_agent. * bitbucket require agent prefix = "git/" - rv_agent = 'git/abapGit-' && zif_abapgit_definitions=>gc_abap_version. +* also see https://github.com/larshp/abapGit/issues/1432 + rv_agent = |git/2.0 (abapGit { zif_abapgit_definitions=>gc_abap_version })|. ENDMETHOD. diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index 358c22e23..fe8a661a5 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -320,7 +320,7 @@ INTERFACE zif_abapgit_definitions PUBLIC. END OF ty_s_user_settings. CONSTANTS gc_xml_version TYPE string VALUE 'v1.0.0' ##NO_TEXT. - CONSTANTS gc_abap_version TYPE string VALUE 'v1.68.2' ##NO_TEXT. + CONSTANTS gc_abap_version TYPE string VALUE '1.68.2' ##NO_TEXT. CONSTANTS: BEGIN OF gc_type, commit TYPE zif_abapgit_definitions=>ty_type VALUE 'commit', "#EC NOTEXT From e71358f744f9ba79119bd751c1dee5b6214c86d2 Mon Sep 17 00:00:00 2001 From: Jakub Filak Date: Thu, 31 May 2018 11:24:38 +0200 Subject: [PATCH 046/136] tabl: ignore the unused field RESERVEDTE The short description contains "(unused)". For some strange reason, I saw that field set to D in one of our sandbox systems. Addresses the issue #1427. --- src/objects/zcl_abapgit_object_tabl.clas.abap | 1 + 1 file changed, 1 insertion(+) diff --git a/src/objects/zcl_abapgit_object_tabl.clas.abap b/src/objects/zcl_abapgit_object_tabl.clas.abap index c387d6f83..f5eff19b5 100644 --- a/src/objects/zcl_abapgit_object_tabl.clas.abap +++ b/src/objects/zcl_abapgit_object_tabl.clas.abap @@ -390,6 +390,7 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION. -dtelmaster, -logflag, -ddtext, + -reservedte, -reptext, -scrtext_s, -scrtext_m, From 319abf5b7b8fc12231f34fa7c9829c9c6f2c191a Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Tue, 29 May 2018 08:48:09 +0200 Subject: [PATCH 047/136] redesign create tag page --- src/git/zcl_abapgit_git_porcelain.clas.abap | 139 ++++++++++------- src/ui/zcl_abapgit_gui_page_tag.clas.abap | 158 +++++++++++++++----- src/zabapgit_css_common.w3mi.data.css | 5 + src/zabapgit_js_common.w3mi.data.js | 9 ++ 4 files changed, 220 insertions(+), 91 deletions(-) diff --git a/src/git/zcl_abapgit_git_porcelain.clas.abap b/src/git/zcl_abapgit_git_porcelain.clas.abap index 1138cd359..09e7bfe08 100644 --- a/src/git/zcl_abapgit_git_porcelain.clas.abap +++ b/src/git/zcl_abapgit_git_porcelain.clas.abap @@ -32,10 +32,8 @@ CLASS zcl_abapgit_git_porcelain DEFINITION zcx_abapgit_exception . CLASS-METHODS create_tag IMPORTING - !io_repo TYPE REF TO zcl_abapgit_repo_online - is_tag TYPE zif_abapgit_definitions=>ty_git_tag - RETURNING - VALUE(rv_created_tag_type) TYPE zif_abapgit_definitions=>ty_git_branch_type + !io_repo TYPE REF TO zcl_abapgit_repo_online + is_tag TYPE zif_abapgit_definitions=>ty_git_tag RAISING zcx_abapgit_exception . CLASS-METHODS delete_branch @@ -114,6 +112,21 @@ CLASS zcl_abapgit_git_porcelain DEFINITION IMPORTING is_tag TYPE zif_abapgit_definitions=>ty_git_tag io_repo TYPE REF TO zcl_abapgit_repo_online RAISING zcx_abapgit_exception. + + CLASS-METHODS create_annotated_tag + IMPORTING + is_tag TYPE zif_abapgit_definitions=>ty_git_tag + io_repo TYPE REF TO zcl_abapgit_repo_online + RAISING + zcx_abapgit_exception. + + CLASS-METHODS create_lightweight_tag + IMPORTING + is_tag TYPE zif_abapgit_definitions=>ty_git_tag + io_repo TYPE REF TO zcl_abapgit_repo_online + RAISING + zcx_abapgit_exception. + ENDCLASS. @@ -205,39 +218,28 @@ CLASS zcl_abapgit_git_porcelain IMPLEMENTATION. METHOD create_tag. - DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, - lv_pack TYPE xstring. - IF is_tag-name CS ` `. zcx_abapgit_exception=>raise( 'Tag name cannot contain blank spaces' ). ENDIF. - " It the message is filled we must create an annotated tag. - " Otherwise a lightweight tag is created - IF is_tag-message IS NOT INITIAL. + CASE is_tag-type. + WHEN zif_abapgit_definitions=>c_git_branch_type-annotated_tag. - receive_pack_create_tag( - is_tag = is_tag - io_repo = io_repo ). + create_annotated_tag( + is_tag = is_tag + io_repo = io_repo ). - rv_created_tag_type = zif_abapgit_definitions=>c_git_branch_type-annotated_tag. + WHEN zif_abapgit_definitions=>c_git_branch_type-lightweight_tag. - ELSE. + create_lightweight_tag( + is_tag = is_tag + io_repo = io_repo ). -* "client MUST send an empty packfile" -* https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L514 - lv_pack = zcl_abapgit_git_pack=>encode( lt_objects ). + WHEN OTHERS. - zcl_abapgit_git_transport=>receive_pack( - iv_url = io_repo->get_url( ) - iv_old = c_zero - iv_new = io_repo->get_sha1_local( ) - iv_branch_name = is_tag-name - iv_pack = lv_pack ). + zcx_abapgit_exception=>raise( |Invalid tag type: { is_tag-type }| ). - rv_created_tag_type = zif_abapgit_definitions=>c_git_branch_type-lightweight_tag. - - ENDIF. + ENDCASE. ENDMETHOD. @@ -466,6 +468,50 @@ CLASS zcl_abapgit_git_porcelain IMPLEMENTATION. ENDMETHOD. "push + METHOD receive_pack_create_tag. + + DATA: lv_tag TYPE xstring, + lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, + lv_pack TYPE xstring, + ls_object LIKE LINE OF lt_objects, + ls_tag TYPE zcl_abapgit_git_pack=>ty_tag, + lv_new_tag_sha1 TYPE zif_abapgit_definitions=>ty_sha1. + +* new tag + ls_tag-object = is_tag-sha1. + ls_tag-type = zif_abapgit_definitions=>gc_type-commit. + ls_tag-tag = is_tag-name. + ls_tag-tagger_name = is_tag-tagger_name. + ls_tag-tagger_email = is_tag-tagger_email. + ls_tag-message = is_tag-message + && |{ zif_abapgit_definitions=>gc_newline }| + && |{ zif_abapgit_definitions=>gc_newline }| + && is_tag-body. + + lv_tag = zcl_abapgit_git_pack=>encode_tag( ls_tag ). + + lv_new_tag_sha1 = zcl_abapgit_hash=>sha1( + iv_type = zif_abapgit_definitions=>gc_type-tag + iv_data = lv_tag ). + + CLEAR ls_object. + ls_object-sha1 = lv_new_tag_sha1. + ls_object-type = zif_abapgit_definitions=>gc_type-tag. + ls_object-data = lv_tag. + APPEND ls_object TO lt_objects. + + lv_pack = zcl_abapgit_git_pack=>encode( lt_objects ). + + zcl_abapgit_git_transport=>receive_pack( + iv_url = io_repo->get_url( ) + iv_old = c_zero + iv_new = lv_new_tag_sha1 + iv_branch_name = is_tag-name + iv_pack = lv_pack ). + + ENDMETHOD. + + METHOD receive_pack_push. DATA: lv_time TYPE zcl_abapgit_time=>ty_unixtime, @@ -653,45 +699,28 @@ CLASS zcl_abapgit_git_porcelain IMPLEMENTATION. ENDMETHOD. - METHOD receive_pack_create_tag. + METHOD create_annotated_tag. - DATA: lv_tag TYPE xstring, - lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, - lv_pack TYPE xstring, - lt_files TYPE zif_abapgit_definitions=>ty_files_tt, - ls_object LIKE LINE OF lt_objects, - ls_tag TYPE zcl_abapgit_git_pack=>ty_tag, - lv_new_tag_sha1 TYPE zif_abapgit_definitions=>ty_sha1. + receive_pack_create_tag( + is_tag = is_tag + io_repo = io_repo ). -* new tag - ls_tag-object = is_tag-sha1. - ls_tag-type = zif_abapgit_definitions=>gc_type-commit. - ls_tag-tag = is_tag-name. - ls_tag-tagger_name = is_tag-tagger_name. - ls_tag-tagger_email = is_tag-tagger_email. - ls_tag-message = is_tag-message - && |{ zif_abapgit_definitions=>gc_newline }| - && |{ zif_abapgit_definitions=>gc_newline }| - && is_tag-body. + ENDMETHOD. - lv_tag = zcl_abapgit_git_pack=>encode_tag( ls_tag ). - lv_new_tag_sha1 = zcl_abapgit_hash=>sha1( - iv_type = zif_abapgit_definitions=>gc_type-tag - iv_data = lv_tag ). + METHOD create_lightweight_tag. - CLEAR ls_object. - ls_object-sha1 = lv_new_tag_sha1. - ls_object-type = zif_abapgit_definitions=>gc_type-tag. - ls_object-data = lv_tag. - APPEND ls_object TO lt_objects. + DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, + lv_pack TYPE xstring. +* "client MUST send an empty packfile" +* https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L514 lv_pack = zcl_abapgit_git_pack=>encode( lt_objects ). zcl_abapgit_git_transport=>receive_pack( iv_url = io_repo->get_url( ) iv_old = c_zero - iv_new = lv_new_tag_sha1 + iv_new = io_repo->get_sha1_local( ) iv_branch_name = is_tag-name iv_pack = lv_pack ). diff --git a/src/ui/zcl_abapgit_gui_page_tag.clas.abap b/src/ui/zcl_abapgit_gui_page_tag.clas.abap index e73e80e16..fe2648b6e 100644 --- a/src/ui/zcl_abapgit_gui_page_tag.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_tag.clas.abap @@ -4,8 +4,9 @@ CLASS zcl_abapgit_gui_page_tag DEFINITION PUBLIC FINAL PUBLIC SECTION. CONSTANTS: BEGIN OF c_action, - commit_post TYPE string VALUE 'commit_post', - commit_cancel TYPE string VALUE 'commit_cancel', + commit_post TYPE string VALUE 'commit_post', + commit_cancel TYPE string VALUE 'commit_cancel', + change_tag_type TYPE string VALUE 'change_tag_type', END OF c_action. METHODS: @@ -21,7 +22,13 @@ CLASS zcl_abapgit_gui_page_tag DEFINITION PUBLIC FINAL scripts REDEFINITION. PRIVATE SECTION. - DATA: mo_repo_online TYPE REF TO zcl_abapgit_repo_online. + CONSTANTS: BEGIN OF co_tag_type, + lightweight TYPE string VALUE 'lightweight', + annotated TYPE string VALUE 'annotated', + END OF co_tag_type. + + DATA: mo_repo_online TYPE REF TO zcl_abapgit_repo_online, + mv_selected_type TYPE string. METHODS: render_menu @@ -43,8 +50,11 @@ CLASS zcl_abapgit_gui_page_tag DEFINITION PUBLIC FINAL RAISING zcx_abapgit_exception, parse_tag_request - IMPORTING !it_postdata TYPE cnht_post_data_tab - EXPORTING !es_fields TYPE any. + IMPORTING it_postdata TYPE cnht_post_data_tab + EXPORTING es_fields TYPE any, + parse_change_tag_type_request + IMPORTING + it_postdata TYPE cnht_post_data_tab. ENDCLASS. @@ -59,6 +69,8 @@ CLASS zcl_abapgit_gui_page_tag IMPLEMENTATION. mo_repo_online ?= io_repo. ms_control-page_title = 'TAG'. + mv_selected_type = co_tag_type-lightweight. + ENDMETHOD. @@ -83,7 +95,10 @@ CLASS zcl_abapgit_gui_page_tag IMPLEMENTATION. lv_email TYPE string, lv_s_param TYPE string, lo_settings TYPE REF TO zcl_abapgit_settings, - lv_body_size TYPE i. + lv_body_size TYPE i, + lt_type TYPE stringtab, + lv_selected TYPE string. + FIELD-SYMBOLS: LIKE LINE OF lt_type. lo_user = zcl_abapgit_persistence_user=>get_instance( ). @@ -107,13 +122,39 @@ CLASS zcl_abapgit_gui_page_tag IMPLEMENTATION. CREATE OBJECT ro_html. - ro_html->add( |

If comment and body are empty a lightweight tag will be created, | - && |otherwise an annotated tag.

| ). - ro_html->add( '
' ). - ro_html->add( '
add( '' ). + INSERT co_tag_type-lightweight + INTO TABLE lt_type. + + INSERT co_tag_type-annotated + INTO TABLE lt_type. + + ro_html->add( '
' ). + ro_html->add( 'Tag type ' ). + ro_html->add( '
' ). + ro_html->add( '
' ). + ro_html->add( render_text_input( iv_name = 'sha1' iv_label = 'SHA1' iv_value = mo_repo_online->get_sha1_local( ) ) ). @@ -121,31 +162,35 @@ CLASS zcl_abapgit_gui_page_tag IMPLEMENTATION. ro_html->add( render_text_input( iv_name = 'name' iv_label = 'tag name' ) ). - ro_html->add( render_text_input( iv_name = 'tagger_name' - iv_label = 'tagger name' - iv_value = lv_user ) ). + IF mv_selected_type = co_tag_type-annotated. - ro_html->add( render_text_input( iv_name = 'tagger_email' - iv_label = 'tagger e-mail' - iv_value = lv_email ) ). + ro_html->add( render_text_input( iv_name = 'tagger_name' + iv_label = 'tagger name' + iv_value = lv_user ) ). - lo_settings = zcl_abapgit_persist_settings=>get_instance( )->read( ). + ro_html->add( render_text_input( iv_name = 'tagger_email' + iv_label = 'tagger e-mail' + iv_value = lv_email ) ). - lv_s_param = lo_settings->get_commitmsg_comment_length( ). + lo_settings = zcl_abapgit_persist_settings=>get_instance( )->read( ). - ro_html->add( render_text_input( iv_name = 'message' - iv_label = 'message' - iv_max_length = lv_s_param ) ). + lv_s_param = lo_settings->get_commitmsg_comment_length( ). - ro_html->add( '
' ). - ro_html->add( '' ). + ro_html->add( render_text_input( iv_name = 'message' + iv_label = 'message' + iv_max_length = lv_s_param ) ). + + ro_html->add( '
' ). + ro_html->add( '' ). + + lv_body_size = lo_settings->get_commitmsg_body_size( ). + IF lv_body_size > lc_body_col_max. + lv_body_size = lc_body_col_max. + ENDIF. + ro_html->add( || ). - lv_body_size = lo_settings->get_commitmsg_body_size( ). - IF lv_body_size > lc_body_col_max. - lv_body_size = lc_body_col_max. ENDIF. - ro_html->add( || ). ro_html->add( '' ). ro_html->add( '
' ). @@ -218,6 +263,12 @@ CLASS zcl_abapgit_gui_page_tag IMPLEMENTATION. ev_state = zif_abapgit_definitions=>gc_event_state-go_back. + WHEN c_action-change_tag_type. + + parse_change_tag_type_request( it_postdata ). + + ev_state = zif_abapgit_definitions=>gc_event_state-re_render. + WHEN c_action-commit_cancel. ev_state = zif_abapgit_definitions=>gc_event_state-go_back. ENDCASE. @@ -227,29 +278,47 @@ CLASS zcl_abapgit_gui_page_tag IMPLEMENTATION. METHOD create_tag. DATA: - ls_tag TYPE zif_abapgit_definitions=>ty_git_tag, - lx_error TYPE REF TO zcx_abapgit_exception, - lv_text TYPE string, - lv_tag_type TYPE zif_abapgit_definitions=>ty_git_branch_type. + ls_tag TYPE zif_abapgit_definitions=>ty_git_tag, + lx_error TYPE REF TO zcx_abapgit_exception, + lv_text TYPE string. parse_tag_request( EXPORTING it_postdata = it_postdata IMPORTING es_fields = ls_tag ). + IF ls_tag-name IS INITIAL. + zcx_abapgit_exception=>raise( |Please supply a tag name| ). + ENDIF. + ls_tag-name = zcl_abapgit_tag=>add_tag_prefix( ls_tag-name ). ASSERT ls_tag-name CP 'refs/tags/+*'. + CASE mv_selected_type. + WHEN co_tag_type-lightweight. + + ls_tag-type = zif_abapgit_definitions=>c_git_branch_type-lightweight_tag. + + WHEN co_tag_type-annotated. + + ls_tag-type = zif_abapgit_definitions=>c_git_branch_type-annotated_tag. + + WHEN OTHERS. + + zcx_abapgit_exception=>raise( |Invalid tag type: { mv_selected_type }| ). + + ENDCASE. + TRY. - lv_tag_type = zcl_abapgit_git_porcelain=>create_tag( io_repo = mo_repo_online - is_tag = ls_tag ). + zcl_abapgit_git_porcelain=>create_tag( io_repo = mo_repo_online + is_tag = ls_tag ). CATCH zcx_abapgit_exception INTO lx_error. zcx_abapgit_exception=>raise( |Cannot create tag { ls_tag-name }. Error: '{ lx_error->get_text( ) }'| ). ENDTRY. - IF lv_tag_type = zif_abapgit_definitions=>c_git_branch_type-lightweight_tag. + IF ls_tag-type = zif_abapgit_definitions=>c_git_branch_type-lightweight_tag. lv_text = |Lightweight tag { zcl_abapgit_tag=>remove_tag_prefix( ls_tag-name ) } created| ##NO_TEXT. - ELSE. + ELSEIF ls_tag-type = zif_abapgit_definitions=>c_git_branch_type-annotated_tag. lv_text = |Annotated tag { zcl_abapgit_tag=>remove_tag_prefix( ls_tag-name ) } created| ##NO_TEXT. ENDIF. @@ -287,4 +356,21 @@ CLASS zcl_abapgit_gui_page_tag IMPLEMENTATION. ENDMETHOD. + + METHOD parse_change_tag_type_request. + + FIELD-SYMBOLS: TYPE cnht_post_data_line. + + READ TABLE it_postdata ASSIGNING + INDEX 1. + IF sy-subrc = 0. + FIND FIRST OCCURRENCE OF REGEX `type=(.*)` + IN + SUBMATCHES mv_selected_type. + ENDIF. + + mv_selected_type = condense( mv_selected_type ). + + ENDMETHOD. + ENDCLASS. diff --git a/src/zabapgit_css_common.w3mi.data.css b/src/zabapgit_css_common.w3mi.data.css index 3183a1cf7..968c72bbf 100644 --- a/src/zabapgit_css_common.w3mi.data.css +++ b/src/zabapgit_css_common.w3mi.data.css @@ -328,6 +328,11 @@ form.aligned-form label { vertical-align: middle; } +form.aligned-form select { + padding-right: 1em; + vertical-align: middle; +} + form.aligned-form span.sub-title { color: #BBB; font-size: smaller; diff --git a/src/zabapgit_js_common.w3mi.data.js b/src/zabapgit_js_common.w3mi.data.js index 6424ba1da..a2cff0744 100644 --- a/src/zabapgit_js_common.w3mi.data.js +++ b/src/zabapgit_js_common.w3mi.data.js @@ -118,6 +118,15 @@ function perfClear() { gPerf = []; } +/********************************************************** + * TAG PAGE Logic + **********************************************************/ +// somehow only functions on window are visible for the select tag +window.onTagTypeChange = function(oSelectObject){ + var sValue = oSelectObject.value; + submitSapeventForm({ 'type': sValue }, "change_tag_type", "post"); +} + /********************************************************** * STAGE PAGE Logic **********************************************************/ From aff81df37e4aed9b510d0b72992448eecc6406b4 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Wed, 6 Jun 2018 16:23:03 +0200 Subject: [PATCH 048/136] FUGR: force update of where-used #1441 (#1452) Updates the where-used after deletion for all includes --- src/objects/zcl_abapgit_object_fugr.clas.abap | 153 +++++++++++------- 1 file changed, 98 insertions(+), 55 deletions(-) diff --git a/src/objects/zcl_abapgit_object_fugr.clas.abap b/src/objects/zcl_abapgit_object_fugr.clas.abap index b956ca4ef..53591a7aa 100644 --- a/src/objects/zcl_abapgit_object_fugr.clas.abap +++ b/src/objects/zcl_abapgit_object_fugr.clas.abap @@ -5,68 +5,83 @@ CLASS zcl_abapgit_object_fugr DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje ALIASES mo_files FOR zif_abapgit_object~mo_files. PRIVATE SECTION. - TYPES: ty_rs38l_incl_tt TYPE STANDARD TABLE OF rs38l_incl WITH DEFAULT KEY. - TYPES: BEGIN OF ty_function, - funcname TYPE rs38l_fnam, - global_flag TYPE rs38l-global, - remote_call TYPE rs38l-remote, - update_task TYPE rs38l-utask, - short_text TYPE tftit-stext, - remote_basxml TYPE rs38l-basxml_enabled, - import TYPE STANDARD TABLE OF rsimp WITH DEFAULT KEY, - changing TYPE STANDARD TABLE OF rscha WITH DEFAULT KEY, - export TYPE STANDARD TABLE OF rsexp WITH DEFAULT KEY, - tables TYPE STANDARD TABLE OF rstbl WITH DEFAULT KEY, - exception TYPE STANDARD TABLE OF rsexc WITH DEFAULT KEY, - documentation TYPE STANDARD TABLE OF rsfdo WITH DEFAULT KEY, - exception_classes TYPE abap_bool, - END OF ty_function. - - TYPES: ty_function_tt TYPE STANDARD TABLE OF ty_function WITH DEFAULT KEY. + TYPES: + ty_rs38l_incl_tt TYPE STANDARD TABLE OF rs38l_incl WITH DEFAULT KEY . + TYPES: + BEGIN OF ty_function, + funcname TYPE rs38l_fnam, + global_flag TYPE rs38l-global, + remote_call TYPE rs38l-remote, + update_task TYPE rs38l-utask, + short_text TYPE tftit-stext, + remote_basxml TYPE rs38l-basxml_enabled, + import TYPE STANDARD TABLE OF rsimp WITH DEFAULT KEY, + changing TYPE STANDARD TABLE OF rscha WITH DEFAULT KEY, + export TYPE STANDARD TABLE OF rsexp WITH DEFAULT KEY, + tables TYPE STANDARD TABLE OF rstbl WITH DEFAULT KEY, + exception TYPE STANDARD TABLE OF rsexc WITH DEFAULT KEY, + documentation TYPE STANDARD TABLE OF rsfdo WITH DEFAULT KEY, + exception_classes TYPE abap_bool, + END OF ty_function . + TYPES: + ty_function_tt TYPE STANDARD TABLE OF ty_function WITH DEFAULT KEY . + METHODS update_where_used + IMPORTING + !it_includes TYPE rso_t_objnm . METHODS main_name - RETURNING VALUE(rv_program) TYPE program - RAISING zcx_abapgit_exception. - + RETURNING + VALUE(rv_program) TYPE program + RAISING + zcx_abapgit_exception . METHODS functions - RETURNING VALUE(rt_functab) TYPE ty_rs38l_incl_tt - RAISING zcx_abapgit_exception. - + RETURNING + VALUE(rt_functab) TYPE ty_rs38l_incl_tt + RAISING + zcx_abapgit_exception . METHODS includes - RETURNING VALUE(rt_includes) TYPE rso_t_objnm - RAISING zcx_abapgit_exception. - + RETURNING + VALUE(rt_includes) TYPE rso_t_objnm + RAISING + zcx_abapgit_exception . METHODS serialize_functions - RETURNING VALUE(rt_functions) TYPE ty_function_tt - RAISING zcx_abapgit_exception. - + RETURNING + VALUE(rt_functions) TYPE ty_function_tt + RAISING + zcx_abapgit_exception . METHODS deserialize_functions - IMPORTING it_functions TYPE ty_function_tt - RAISING zcx_abapgit_exception. - + IMPORTING + !it_functions TYPE ty_function_tt + RAISING + zcx_abapgit_exception . METHODS serialize_xml - IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_output - RAISING zcx_abapgit_exception. - + IMPORTING + !io_xml TYPE REF TO zcl_abapgit_xml_output + RAISING + zcx_abapgit_exception . METHODS deserialize_xml - IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_input - iv_package TYPE devclass - RAISING zcx_abapgit_exception. - + IMPORTING + !io_xml TYPE REF TO zcl_abapgit_xml_input + !iv_package TYPE devclass + RAISING + zcx_abapgit_exception . METHODS serialize_includes - RAISING zcx_abapgit_exception. - + RAISING + zcx_abapgit_exception . METHODS deserialize_includes - IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_input - iv_package TYPE devclass - RAISING zcx_abapgit_exception. - + IMPORTING + !io_xml TYPE REF TO zcl_abapgit_xml_input + !iv_package TYPE devclass + RAISING + zcx_abapgit_exception . METHODS are_exceptions_class_based - IMPORTING iv_function_name TYPE rs38l_fnam - RETURNING VALUE(rv_return) TYPE abap_bool - RAISING zcx_abapgit_exception. - + IMPORTING + !iv_function_name TYPE rs38l_fnam + RETURNING + VALUE(rv_return) TYPE abap_bool + RAISING + zcx_abapgit_exception . ENDCLASS. @@ -122,12 +137,12 @@ CLASS ZCL_ABAPGIT_OBJECT_FUGR IMPLEMENTATION. CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT' EXPORTING - complete_area = lv_area + complete_area = lv_area IMPORTING - namespace = lv_namespace - group = lv_group + namespace = lv_namespace + group = lv_group EXCEPTIONS - OTHERS = 12. + OTHERS = 12. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( 'error from FUNCTION_INCLUDE_SPLIT' ). @@ -559,6 +574,29 @@ CLASS ZCL_ABAPGIT_OBJECT_FUGR IMPLEMENTATION. ENDMETHOD. "serialize_xml + METHOD update_where_used. +* make extra sure the where-used list is updated after deletion +* Experienced some problems with the T00 include +* this method just tries to update everything + + DATA: lv_include LIKE LINE OF it_includes, + lo_cross TYPE REF TO cl_wb_crossreference. + + + LOOP AT it_includes INTO lv_include. + + CREATE OBJECT lo_cross + EXPORTING + p_name = lv_include + p_include = lv_include. + + lo_cross->index_actualize( ). + + ENDLOOP. + + ENDMETHOD. + + METHOD zif_abapgit_object~changed_by. TYPES: BEGIN OF ty_stamps, @@ -634,9 +672,12 @@ CLASS ZCL_ABAPGIT_OBJECT_FUGR IMPLEMENTATION. METHOD zif_abapgit_object~delete. - DATA: lv_area TYPE rs38l-area. + DATA: lv_area TYPE rs38l-area, + lt_includes TYPE rso_t_objnm. + lt_includes = includes( ). + lv_area = ms_item-obj_name. CALL FUNCTION 'RS_FUNCTION_POOL_DELETE' @@ -659,6 +700,8 @@ CLASS ZCL_ABAPGIT_OBJECT_FUGR IMPLEMENTATION. zcx_abapgit_exception=>raise( 'error from RS_FUNCTION_POOL_DELETE' ). ENDIF. + update_where_used( lt_includes ). + ENDMETHOD. "delete From 41344dec3a4dd76a63a39589ed3fd9aecc068b51 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Wed, 6 Jun 2018 16:23:23 +0200 Subject: [PATCH 049/136] news feature #1450 (#1453) now works for both "/abapGit" and "/abapGit.git" urls --- src/zcl_abapgit_news.clas.abap | 19 ++++++-- src/zcl_abapgit_news.clas.testclasses.abap | 55 ++++++++++++++++++++++ 2 files changed, 71 insertions(+), 3 deletions(-) diff --git a/src/zcl_abapgit_news.clas.abap b/src/zcl_abapgit_news.clas.abap index 32414abaf..a15c57e6c 100644 --- a/src/zcl_abapgit_news.clas.abap +++ b/src/zcl_abapgit_news.clas.abap @@ -47,6 +47,11 @@ CLASS zcl_abapgit_news DEFINITION DATA mv_lastseen_version TYPE string . DATA mv_latest_version TYPE string . + CLASS-METHODS is_relevant + IMPORTING + !iv_url TYPE string + RETURNING + VALUE(rv_relevant) TYPE abap_bool . METHODS latest_version RETURNING VALUE(rv_version) TYPE string . @@ -156,8 +161,7 @@ CLASS ZCL_ABAPGIT_NEWS IMPLEMENTATION. lo_repo_online ?= io_repo. lv_url = lo_repo_online->get_url( ). - " News announcement temporary restricted to abapGit only - IF lv_url NS '/abapGit.git'. " TODO refactor + IF is_relevant( lv_url ) = abap_false. RETURN. ENDIF. @@ -172,7 +176,6 @@ CLASS ZCL_ABAPGIT_NEWS IMPLEMENTATION. READ TABLE lt_remote ASSIGNING WITH KEY path = lc_log_path filename = lc_log_filename. - IF sy-subrc = 0. CREATE OBJECT ro_instance EXPORTING @@ -220,6 +223,16 @@ CLASS ZCL_ABAPGIT_NEWS IMPLEMENTATION. ENDMETHOD. "has_updates + METHOD is_relevant. + + " News announcement restricted to abapGit only + IF iv_url CS '/abapGit' OR iv_url CS '/abapGit.git'. + rv_relevant = abap_true. + ENDIF. + + ENDMETHOD. + + METHOD latest_version. rv_version = me->mv_latest_version. ENDMETHOD. "latest_version diff --git a/src/zcl_abapgit_news.clas.testclasses.abap b/src/zcl_abapgit_news.clas.testclasses.abap index 6a24ac07b..4b6fe23ec 100644 --- a/src/zcl_abapgit_news.clas.testclasses.abap +++ b/src/zcl_abapgit_news.clas.testclasses.abap @@ -1,5 +1,60 @@ *"* use this source file for your ABAP unit test classes +CLASS ltcl_relevant DEFINITION DEFERRED. +CLASS zcl_abapgit_news DEFINITION LOCAL FRIENDS ltcl_relevant. + +CLASS ltcl_relevant DEFINITION FINAL FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. + + PRIVATE SECTION. + + METHODS: + test01 FOR TESTING, + test02 FOR TESTING, + test03 FOR TESTING. + +ENDCLASS. + +CLASS ltcl_relevant IMPLEMENTATION. + + METHOD test01. + + DATA: lv_relevant TYPE abap_bool. + + lv_relevant = zcl_abapgit_news=>is_relevant( 'https://github.com/larshp/abapGit.git' ). + + cl_abap_unit_assert=>assert_equals( + act = lv_relevant + exp = abap_true ). + + ENDMETHOD. + + METHOD test02. + + DATA: lv_relevant TYPE abap_bool. + + lv_relevant = zcl_abapgit_news=>is_relevant( 'https://github.com/larshp/abapGit' ). + + cl_abap_unit_assert=>assert_equals( + act = lv_relevant + exp = abap_true ). + + ENDMETHOD. + + METHOD test03. + + DATA: lv_relevant TYPE abap_bool. + + lv_relevant = zcl_abapgit_news=>is_relevant( 'https://github.com/larshp/something' ). + + cl_abap_unit_assert=>assert_equals( + act = lv_relevant + exp = abap_false ). + + ENDMETHOD. + +ENDCLASS. + + CLASS ltcl_news DEFINITION DEFERRED. CLASS zcl_abapgit_news DEFINITION LOCAL FRIENDS ltcl_news. From 12c48ebb5087cbf3d8c183b19c2ef716ca864b4c Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Wed, 6 Jun 2018 16:23:36 +0200 Subject: [PATCH 050/136] fix dump #1457 (#1459) --- src/zcl_abapgit_file_status.clas.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zcl_abapgit_file_status.clas.abap b/src/zcl_abapgit_file_status.clas.abap index 2a636b9ce..d365390c1 100644 --- a/src/zcl_abapgit_file_status.clas.abap +++ b/src/zcl_abapgit_file_status.clas.abap @@ -242,7 +242,7 @@ CLASS ZCL_ABAPGIT_FILE_STATUS IMPLEMENTATION. IF NOT ls_item-devclass IS INITIAL. * make sure the package is under the repo main package - lt_super = zcl_abapgit_sap_package=>get( iv_devclass )->list_superpackages( ). + lt_super = zcl_abapgit_sap_package=>get( iv_devclass )->list_subpackages( ). READ TABLE lt_super WITH KEY table_line = ls_item-devclass TRANSPORTING NO FIELDS. IF sy-subrc <> 0. CLEAR ls_item-devclass. From ac70d2fedab257c2f834714dccb51d4b825f7264 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Wed, 6 Jun 2018 16:23:49 +0200 Subject: [PATCH 051/136] move development related information (#1454) --- docs/_config.yml | 13 +++++++-- docs/_includes/footer.html | 10 +++---- docs/_includes/head.html | 6 ++-- docs/_includes/header.html | 8 +++--- docs/_includes/navigation.html | 4 ++- docs/_layouts/development.html | 27 ++++++++++++++++++ docs/{ => assets}/highlight.css | 0 docs/{ => assets}/main.css | 0 .../_development/api.md} | 3 +- .../_development/contributing.md} | 1 - docs/collections/_development/docs.md | 10 +++++++ .../_development/file-formats.md} | 1 - docs/collections/_development/index.md | 8 ++++++ .../_development/technical-links.md} | 1 - docs/{ => img}/favicon.png | Bin docs/index.md | 1 - docs/other-external-libraries.md | 10 +++---- 17 files changed, 76 insertions(+), 27 deletions(-) create mode 100644 docs/_layouts/development.html rename docs/{ => assets}/highlight.css (100%) rename docs/{ => assets}/main.css (100%) rename docs/{other-api.md => collections/_development/api.md} (98%) rename docs/{other-contributing-abapGit.md => collections/_development/contributing.md} (98%) create mode 100644 docs/collections/_development/docs.md rename docs/{other-file-formats.md => collections/_development/file-formats.md} (97%) create mode 100644 docs/collections/_development/index.md rename docs/{other-technical-links.md => collections/_development/technical-links.md} (99%) rename docs/{ => img}/favicon.png (100%) diff --git a/docs/_config.yml b/docs/_config.yml index ddcd8aea4..7b538d7f5 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,8 +1,15 @@ title: abapGit documentation highlighter: rouge +collections_dir: collections +collections: + development: + output: true defaults: - - - scope: - path: "" # an empty string here means all files in the project + - scope: + path: "" values: layout: "default" + - scope: + path: "_development" + values: + layout: "development" diff --git a/docs/_includes/footer.html b/docs/_includes/footer.html index 42b73ac53..ab65ec216 100644 --- a/docs/_includes/footer.html +++ b/docs/_includes/footer.html @@ -1,8 +1,8 @@
- +
diff --git a/docs/_includes/head.html b/docs/_includes/head.html index 60ef1e9a9..0d8e062f8 100644 --- a/docs/_includes/head.html +++ b/docs/_includes/head.html @@ -1,8 +1,8 @@ - - - + + + {% if page.title %}{{ site.title }} - {{ page.title }}{% else %}{{ site.title }}{% endif %} diff --git a/docs/_includes/header.html b/docs/_includes/header.html index 1bda0a317..2539bced2 100644 --- a/docs/_includes/header.html +++ b/docs/_includes/header.html @@ -1,6 +1,6 @@
-
- - ► documentation -
+
+ + ► documentation +
diff --git a/docs/_includes/navigation.html b/docs/_includes/navigation.html index 9a6783e00..084b8f103 100644 --- a/docs/_includes/navigation.html +++ b/docs/_includes/navigation.html @@ -47,4 +47,6 @@
  • {{ doc.title }}
  • {% endif %} {% endfor %} - \ No newline at end of file + + +Development \ No newline at end of file diff --git a/docs/_layouts/development.html b/docs/_layouts/development.html new file mode 100644 index 000000000..6ddf3a74c --- /dev/null +++ b/docs/_layouts/development.html @@ -0,0 +1,27 @@ + + +{% include head.html %} + +{% include header.html %} +
    + + + +
    +

    {{ page.title }}

    +{{ content }} +
    +
    +{% include footer.html %} + + diff --git a/docs/highlight.css b/docs/assets/highlight.css similarity index 100% rename from docs/highlight.css rename to docs/assets/highlight.css diff --git a/docs/main.css b/docs/assets/main.css similarity index 100% rename from docs/main.css rename to docs/assets/main.css diff --git a/docs/other-api.md b/docs/collections/_development/api.md similarity index 98% rename from docs/other-api.md rename to docs/collections/_development/api.md index 50d587825..3d602dfdf 100644 --- a/docs/other-api.md +++ b/docs/collections/_development/api.md @@ -1,6 +1,5 @@ --- -title: abapGit API -category: other +title: API order: 80 --- diff --git a/docs/other-contributing-abapGit.md b/docs/collections/_development/contributing.md similarity index 98% rename from docs/other-contributing-abapGit.md rename to docs/collections/_development/contributing.md index 057b2a6df..4a9c1c214 100644 --- a/docs/other-contributing-abapGit.md +++ b/docs/collections/_development/contributing.md @@ -1,6 +1,5 @@ --- title: Contributing to abapGit -category: other order: 90 --- diff --git a/docs/collections/_development/docs.md b/docs/collections/_development/docs.md new file mode 100644 index 000000000..5ce05e82a --- /dev/null +++ b/docs/collections/_development/docs.md @@ -0,0 +1,10 @@ +--- +title: Documentation +order: 10 +--- + +Building /docs/ locally: + +`bundle install` + +`bundle exec jekyll serve --incremental --port $PORT --host $IP` \ No newline at end of file diff --git a/docs/other-file-formats.md b/docs/collections/_development/file-formats.md similarity index 97% rename from docs/other-file-formats.md rename to docs/collections/_development/file-formats.md index 9184178c6..782648de5 100644 --- a/docs/other-file-formats.md +++ b/docs/collections/_development/file-formats.md @@ -1,6 +1,5 @@ --- title: Object File Formats -category: other order: 40 --- diff --git a/docs/collections/_development/index.md b/docs/collections/_development/index.md new file mode 100644 index 000000000..71f267f41 --- /dev/null +++ b/docs/collections/_development/index.md @@ -0,0 +1,8 @@ +--- +title: Development +order: 10 +--- + +******************************* + +Development related information \ No newline at end of file diff --git a/docs/other-technical-links.md b/docs/collections/_development/technical-links.md similarity index 99% rename from docs/other-technical-links.md rename to docs/collections/_development/technical-links.md index d000851fa..df0f9c11a 100644 --- a/docs/other-technical-links.md +++ b/docs/collections/_development/technical-links.md @@ -1,6 +1,5 @@ --- title: Technical Links -category: other order: 50 --- diff --git a/docs/favicon.png b/docs/img/favicon.png similarity index 100% rename from docs/favicon.png rename to docs/img/favicon.png diff --git a/docs/index.md b/docs/index.md index 049f0a1d6..8d88ce121 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,7 +1,6 @@ --- title: Welcome --- - abapGit is a git client for ABAP developed in ABAP. It requires SAP BASIS version 702 or higher. Latest build: [zabapgit.abap](https://raw.githubusercontent.com/abapGit/build/master/zabapgit.abap) diff --git a/docs/other-external-libraries.md b/docs/other-external-libraries.md index ff9a21f19..0dece74c7 100644 --- a/docs/other-external-libraries.md +++ b/docs/other-external-libraries.md @@ -6,8 +6,8 @@ order: 45 abapGit uses a few external libraries, these are loaded via [cdnjs](https://cdnjs.com/about) -Library | License -:------------ | :------------ -[octicons](https://github.com/primer/octicons) 4.4.0 | MIT -[jquery](https://github.com/jquery/jquery) 3.2.1 | MIT -[gitgraph](https://github.com/nicoespeon/gitgraph.js) 1.2.3 | MIT +Library | Version | License +:------------ | :------------ | :------------ +[octicons](https://github.com/primer/octicons) | 4.4.0 | MIT +[jquery](https://github.com/jquery/jquery) | 3.2.1 | MIT +[gitgraph](https://github.com/nicoespeon/gitgraph.js) | 1.2.3 | MIT From 5baeaf070c6beabd90c4a3fb0244265273c0f705 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Wed, 6 Jun 2018 16:24:15 +0200 Subject: [PATCH 052/136] Minor changes (#1461) * remove double space after IF * remove accesses to table bodies * remove parameter name where possible * identical code in conditions --- .../zcl_abapgit_ecatt_sp_upload.clas.abap | 9 ++++----- .../zcl_abapgit_ecatt_val_obj_down.clas.abap | 7 +++++-- .../zcl_abapgit_ecatt_val_obj_upl.clas.abap | 12 +++++------ .../zcl_abapgit_object_clas_old.clas.abap | 16 +++++++-------- src/objects/zcl_abapgit_object_ddls.clas.abap | 3 +-- src/objects/zcl_abapgit_object_intf.clas.abap | 8 ++++---- src/objects/zcl_abapgit_object_prog.clas.abap | 2 +- .../zcl_abapgit_oo_serializer.clas.abap | 2 +- src/ui/zcl_abapgit_gui_page_diff.clas.abap | 20 ++++++++----------- src/ui/zcl_abapgit_gui_view_repo.clas.abap | 4 ++-- src/ui/zcl_abapgit_popups.clas.abap | 2 +- src/ui/zcl_abapgit_services_git.clas.abap | 5 ++--- ...l_abapgit_xml_output.clas.testclasses.abap | 4 ++-- src/zcl_abapgit_merge.clas.abap | 8 ++++---- src/zcl_abapgit_objects.clas.abap | 6 +++--- 15 files changed, 52 insertions(+), 56 deletions(-) diff --git a/src/objects/ecatt/zcl_abapgit_ecatt_sp_upload.clas.abap b/src/objects/ecatt/zcl_abapgit_ecatt_sp_upload.clas.abap index a68de83c1..912b4851e 100644 --- a/src/objects/ecatt/zcl_abapgit_ecatt_sp_upload.clas.abap +++ b/src/objects/ecatt/zcl_abapgit_ecatt_sp_upload.clas.abap @@ -28,7 +28,7 @@ ENDCLASS. -CLASS zcl_abapgit_ecatt_sp_upload IMPLEMENTATION. +CLASS ZCL_ABAPGIT_ECATT_SP_UPLOAD IMPLEMENTATION. METHOD get_ecatt_sp. @@ -46,8 +46,7 @@ CLASS zcl_abapgit_ecatt_sp_upload IMPLEMENTATION. FIELD-SYMBOLS: TYPE any. TRY. - li_section = template_over_all->find_from_name_ns( - name = 'START_PROFILE' ). + li_section = template_over_all->find_from_name_ns( 'START_PROFILE' ). IF NOT li_section IS INITIAL. CLASS cl_ixml DEFINITION LOAD . @@ -75,7 +74,7 @@ CLASS zcl_abapgit_ecatt_sp_upload IMPLEMENTATION. lv_exception_occurred = 'X'. ENDTRY. - IF lv_exception_occurred = 'X'. + IF lv_exception_occurred = 'X'. raise_upload_exception( previous = exception_to_raise ). ENDIF. ENDMETHOD. @@ -107,7 +106,7 @@ CLASS zcl_abapgit_ecatt_sp_upload IMPLEMENTATION. CHANGING ch_object = ch_object ). - upload_data_from_stream( im_xml_file = ch_object-filename ). + upload_data_from_stream( ch_object-filename ). CATCH cx_ecatt_apl INTO lx_ecatt. IF template_over_all IS INITIAL. diff --git a/src/objects/ecatt/zcl_abapgit_ecatt_val_obj_down.clas.abap b/src/objects/ecatt/zcl_abapgit_ecatt_val_obj_down.clas.abap index 8952cb60d..fbb2efdf6 100644 --- a/src/objects/ecatt/zcl_abapgit_ecatt_val_obj_down.clas.abap +++ b/src/objects/ecatt/zcl_abapgit_ecatt_val_obj_down.clas.abap @@ -46,7 +46,10 @@ CLASS zcl_abapgit_ecatt_val_obj_down DEFINITION ENDCLASS. -CLASS zcl_abapgit_ecatt_val_obj_down IMPLEMENTATION. + + +CLASS ZCL_ABAPGIT_ECATT_VAL_OBJ_DOWN IMPLEMENTATION. + METHOD download. @@ -90,7 +93,7 @@ CLASS zcl_abapgit_ecatt_val_obj_down IMPLEMENTATION. ENDIF. ENDLOOP. - set_variants_to_dom( im_params = ecatt_vo->params ). + set_variants_to_dom( ecatt_vo->params ). download_data( ). diff --git a/src/objects/ecatt/zcl_abapgit_ecatt_val_obj_upl.clas.abap b/src/objects/ecatt/zcl_abapgit_ecatt_val_obj_upl.clas.abap index 454325bb6..80cf596e2 100644 --- a/src/objects/ecatt/zcl_abapgit_ecatt_val_obj_upl.clas.abap +++ b/src/objects/ecatt/zcl_abapgit_ecatt_val_obj_upl.clas.abap @@ -47,7 +47,7 @@ ENDCLASS. -CLASS zcl_abapgit_ecatt_val_obj_upl IMPLEMENTATION. +CLASS ZCL_ABAPGIT_ECATT_VAL_OBJ_UPL IMPLEMENTATION. METHOD get_business_msgs_from_dom. @@ -90,7 +90,7 @@ CLASS zcl_abapgit_ecatt_val_obj_upl IMPLEMENTATION. lv_exception_occurred = 'X'. ENDTRY. - IF lv_exception_occurred = 'X'. + IF lv_exception_occurred = 'X'. raise_upload_exception( previous = exception_to_raise ). ENDIF. @@ -108,7 +108,7 @@ CLASS zcl_abapgit_ecatt_val_obj_upl IMPLEMENTATION. FIELD-SYMBOLS: TYPE any. - li_section = template_over_all->find_from_name_ns( name = 'IMPL_DET' ). + li_section = template_over_all->find_from_name_ns( 'IMPL_DET' ). IF NOT li_section IS INITIAL. CALL FUNCTION 'SDIXML_DOM_TO_DATA' @@ -137,7 +137,7 @@ CLASS zcl_abapgit_ecatt_val_obj_upl IMPLEMENTATION. lv_exception_occurred = 'X'. ENDTRY. - IF lv_exception_occurred = 'X'. + IF lv_exception_occurred = 'X'. raise_upload_exception( previous = exception_to_raise ). ENDIF. @@ -210,7 +210,7 @@ CLASS zcl_abapgit_ecatt_val_obj_upl IMPLEMENTATION. lv_exception_occurred = 'X'. ENDTRY. - IF lv_exception_occurred = 'X'. + IF lv_exception_occurred = 'X'. raise_upload_exception( previous = exception_to_raise ). ENDIF. @@ -244,7 +244,7 @@ CLASS zcl_abapgit_ecatt_val_obj_upl IMPLEMENTATION. CHANGING ch_object = ch_object ). - upload_data_from_stream( im_xml_file = ch_object-filename ). + upload_data_from_stream( ch_object-filename ). CATCH cx_ecatt_apl INTO ex. IF template_over_all IS INITIAL. RAISE EXCEPTION ex. diff --git a/src/objects/zcl_abapgit_object_clas_old.clas.abap b/src/objects/zcl_abapgit_object_clas_old.clas.abap index 88b35d428..4b898e2e5 100644 --- a/src/objects/zcl_abapgit_object_clas_old.clas.abap +++ b/src/objects/zcl_abapgit_object_clas_old.clas.abap @@ -114,7 +114,7 @@ CLASS ZCL_ABAPGIT_OBJECT_CLAS_OLD IMPLEMENTATION. io_xml->read( EXPORTING iv_name = 'LINES' CHANGING cg_data = lt_lines ). - IF lt_lines[] IS INITIAL. + IF lines( lt_lines ) = 0. RETURN. ENDIF. @@ -155,7 +155,7 @@ CLASS ZCL_ABAPGIT_OBJECT_CLAS_OLD IMPLEMENTATION. CHANGING cg_data = lt_tpool_ext ). lt_tpool = read_tpool( lt_tpool_ext ). - IF lt_tpool[] IS INITIAL. + IF lines( lt_tpool ) = 0. RETURN. ENDIF. @@ -186,7 +186,7 @@ CLASS ZCL_ABAPGIT_OBJECT_CLAS_OLD IMPLEMENTATION. zcl_abapgit_language=>set_current_language( mv_language ). TRY. - ls_vseoclass = mo_object_oriented_object_fct->get_class_properties( is_class_key = ls_clskey ). + ls_vseoclass = mo_object_oriented_object_fct->get_class_properties( ls_clskey ). CLEANUP. zcl_abapgit_language=>restore_login_language( ). @@ -308,7 +308,7 @@ CLASS ZCL_ABAPGIT_OBJECT_CLAS_OLD IMPLEMENTATION. DATA: ls_class_key TYPE seoclskey. ls_class_key-clsname = ms_item-obj_name. - rv_bool = mo_object_oriented_object_fct->exists( iv_object_name = ls_class_key ). + rv_bool = mo_object_oriented_object_fct->exists( ls_class_key ). ENDMETHOD. "zif_abapgit_object~exists @@ -374,7 +374,7 @@ CLASS ZCL_ABAPGIT_OBJECT_CLAS_OLD IMPLEMENTATION. lt_source = mo_object_oriented_object_fct->serialize_abap( is_class_key = ls_class_key iv_type = seop_ext_class_locals_def ). - IF NOT lt_source[] IS INITIAL. + IF lines( lt_source ) > 0. mo_files->add_abap( iv_extra = 'locals_def' it_abap = lt_source ). "#EC NOTEXT ENDIF. @@ -382,7 +382,7 @@ CLASS ZCL_ABAPGIT_OBJECT_CLAS_OLD IMPLEMENTATION. lt_source = mo_object_oriented_object_fct->serialize_abap( is_class_key = ls_class_key iv_type = seop_ext_class_locals_imp ). - IF NOT lt_source[] IS INITIAL. + IF lines( lt_source ) > 0. mo_files->add_abap( iv_extra = 'locals_imp' it_abap = lt_source ). "#EC NOTEXT ENDIF. @@ -392,7 +392,7 @@ CLASS ZCL_ABAPGIT_OBJECT_CLAS_OLD IMPLEMENTATION. iv_type = seop_ext_class_testclasses ). mv_skip_testclass = mo_object_oriented_object_fct->get_skip_test_classes( ). - IF NOT lt_source[] IS INITIAL AND mv_skip_testclass = abap_false. + IF lines( lt_source ) > 0 AND mv_skip_testclass = abap_false. mo_files->add_abap( iv_extra = 'testclasses' it_abap = lt_source ). "#EC NOTEXT ENDIF. @@ -400,7 +400,7 @@ CLASS ZCL_ABAPGIT_OBJECT_CLAS_OLD IMPLEMENTATION. lt_source = mo_object_oriented_object_fct->serialize_abap( is_class_key = ls_class_key iv_type = seop_ext_class_macros ). - IF NOT lt_source[] IS INITIAL. + IF lines( lt_source ) > 0. mo_files->add_abap( iv_extra = 'macros' it_abap = lt_source ). "#EC NOTEXT ENDIF. diff --git a/src/objects/zcl_abapgit_object_ddls.clas.abap b/src/objects/zcl_abapgit_object_ddls.clas.abap index 2a45a3586..ee96d359a 100644 --- a/src/objects/zcl_abapgit_object_ddls.clas.abap +++ b/src/objects/zcl_abapgit_object_ddls.clas.abap @@ -238,8 +238,7 @@ CLASS ZCL_ABAPGIT_OBJECT_DDLS IMPLEMENTATION. CASE lv_ddtypekind. WHEN 'STOB'. - - me->open_adt_stob( iv_ddls_name = ms_item-obj_name ). + me->open_adt_stob( ms_item-obj_name ). WHEN OTHERS. zcx_abapgit_exception=>raise( 'DDLS Jump Error' ). ENDCASE. diff --git a/src/objects/zcl_abapgit_object_intf.clas.abap b/src/objects/zcl_abapgit_object_intf.clas.abap index 2c9ee3d3c..74377a4e4 100644 --- a/src/objects/zcl_abapgit_object_intf.clas.abap +++ b/src/objects/zcl_abapgit_object_intf.clas.abap @@ -34,7 +34,7 @@ CLASS ZCL_ABAPGIT_OBJECT_INTF IMPLEMENTATION. super->constructor( is_item = is_item iv_language = iv_language ). - mo_object_oriented_object_fct = zcl_abapgit_oo_factory=>make( iv_object_type = ms_item-obj_type ). + mo_object_oriented_object_fct = zcl_abapgit_oo_factory=>make( ms_item-obj_type ). ENDMETHOD. @@ -67,7 +67,7 @@ CLASS ZCL_ABAPGIT_OBJECT_INTF IMPLEMENTATION. is_key = ls_clskey it_descriptions = lt_descriptions ). - mo_object_oriented_object_fct->add_to_activation_list( is_item = ms_item ). + mo_object_oriented_object_fct->add_to_activation_list( ms_item ). ENDMETHOD. @@ -79,7 +79,7 @@ CLASS ZCL_ABAPGIT_OBJECT_INTF IMPLEMENTATION. io_xml->read( EXPORTING iv_name = 'LINES' CHANGING cg_data = lt_lines ). - IF lt_lines[] IS INITIAL. + IF lines( lt_lines ) = 0. RETURN. ENDIF. @@ -194,7 +194,7 @@ CLASS ZCL_ABAPGIT_OBJECT_INTF IMPLEMENTATION. ls_class_key-clsname = ms_item-obj_name. - rv_bool = mo_object_oriented_object_fct->exists( iv_object_name = ls_class_key ). + rv_bool = mo_object_oriented_object_fct->exists( ls_class_key ). IF rv_bool = abap_true. SELECT SINGLE category FROM seoclassdf INTO lv_category diff --git a/src/objects/zcl_abapgit_object_prog.clas.abap b/src/objects/zcl_abapgit_object_prog.clas.abap index e4a6870c3..8ca4f4392 100644 --- a/src/objects/zcl_abapgit_object_prog.clas.abap +++ b/src/objects/zcl_abapgit_object_prog.clas.abap @@ -148,7 +148,7 @@ CLASS ZCL_ABAPGIT_OBJECT_PROG IMPLEMENTATION. io_xml->read( EXPORTING iv_name = 'DYNPROS' CHANGING cg_data = lt_dynpros ). - deserialize_dynpros( it_dynpros = lt_dynpros ). + deserialize_dynpros( lt_dynpros ). io_xml->read( EXPORTING iv_name = 'CUA' CHANGING cg_data = ls_cua ). diff --git a/src/objects/zcl_abapgit_oo_serializer.clas.abap b/src/objects/zcl_abapgit_oo_serializer.clas.abap index c275b200a..96027c894 100644 --- a/src/objects/zcl_abapgit_oo_serializer.clas.abap +++ b/src/objects/zcl_abapgit_oo_serializer.clas.abap @@ -153,7 +153,7 @@ CLASS ZCL_ABAPGIT_OO_SERIALIZER IMPLEMENTATION. ENDIF. ENDLOOP. IF lv_found = abap_false. - CLEAR ct_source[]. + CLEAR ct_source. ENDIF. ENDMETHOD. "reduce diff --git a/src/ui/zcl_abapgit_gui_page_diff.clas.abap b/src/ui/zcl_abapgit_gui_page_diff.clas.abap index 1194c9779..56f9deecd 100644 --- a/src/ui/zcl_abapgit_gui_page_diff.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_diff.clas.abap @@ -355,12 +355,11 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_DIFF IMPLEMENTATION. ro_html->add( '' ). ro_html->add( '' ). + ro_html->add( '' ). IF mv_unified = abap_true. - ro_html->add( '' ). ro_html->add( '' ). ro_html->add( |@@ { is_diff_line-new_num } @@ { lv_beacon }| ). ELSE. - ro_html->add( '' ). ro_html->add( |@@ { is_diff_line-new_num } @@ { lv_beacon }| ). ENDIF. @@ -412,13 +411,12 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_DIFF IMPLEMENTATION. ro_html->add( render_table_head( ) ). ro_html->add( render_lines( is_diff ) ). ro_html->add( '' ). "#EC NOTEXT - ro_html->add( '
    ' ). "#EC NOTEXT ELSE. ro_html->add( '
    ' ). "#EC NOTEXT ro_html->add( 'The content seems to be binary.' ). "#EC NOTEXT ro_html->add( 'Cannot display as diff.' ). "#EC NOTEXT - ro_html->add( '
    ' ). "#EC NOTEXT ENDIF. + ro_html->add( '
    ' ). "#EC NOTEXT ro_html->add( '
    ' ). "#EC NOTEXT @@ -613,25 +611,23 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_DIFF IMPLEMENTATION. CREATE OBJECT ro_html. + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + IF mv_unified = abap_true. - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT ro_html->add( 'old' ). "#EC NOTEXT ro_html->add( 'new' ). "#EC NOTEXT ro_html->add( 'code' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT ELSE. - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT ro_html->add( '' ). "#EC NOTEXT ro_html->add( 'LOCAL' ). "#EC NOTEXT ro_html->add( '' ). "#EC NOTEXT ro_html->add( 'REMOTE' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT ENDIF. + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ENDMETHOD. " render_table_head. diff --git a/src/ui/zcl_abapgit_gui_view_repo.clas.abap b/src/ui/zcl_abapgit_gui_view_repo.clas.abap index 3408e8639..22d7fc326 100644 --- a/src/ui/zcl_abapgit_gui_view_repo.clas.abap +++ b/src/ui/zcl_abapgit_gui_view_repo.clas.abap @@ -388,10 +388,10 @@ CLASS ZCL_ABAPGIT_GUI_VIEW_REPO IMPLEMENTATION. ro_html->add( |{ get_item_icon( is_item ) }| ). IF is_item-is_dir = abap_true. " Subdir - lv_link = build_dir_jump_link( iv_path = is_item-path ). + lv_link = build_dir_jump_link( is_item-path ). ro_html->add( |{ lv_link }| ). ELSE. - lv_link = build_obj_jump_link( is_item = is_item ). + lv_link = build_obj_jump_link( is_item ). ro_html->add( |{ is_item-obj_type }| ). ro_html->add( |{ lv_link }| ). ENDIF. diff --git a/src/ui/zcl_abapgit_popups.clas.abap b/src/ui/zcl_abapgit_popups.clas.abap index 9b36ba999..2f7003742 100644 --- a/src/ui/zcl_abapgit_popups.clas.abap +++ b/src/ui/zcl_abapgit_popups.clas.abap @@ -916,7 +916,7 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. CLEAR: et_list. - create_new_table( it_list = it_list ). + create_new_table( it_list ). ASSIGN gr_table->* TO . ASSERT sy-subrc = 0. diff --git a/src/ui/zcl_abapgit_services_git.clas.abap b/src/ui/zcl_abapgit_services_git.clas.abap index 02aa17187..f26b90675 100644 --- a/src/ui/zcl_abapgit_services_git.clas.abap +++ b/src/ui/zcl_abapgit_services_git.clas.abap @@ -77,7 +77,7 @@ ENDCLASS. -CLASS zcl_abapgit_services_git IMPLEMENTATION. +CLASS ZCL_ABAPGIT_SERVICES_GIT IMPLEMENTATION. METHOD commit. @@ -331,8 +331,7 @@ CLASS zcl_abapgit_services_git IMPLEMENTATION. lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). - zcl_abapgit_tag_popups=>tag_list_popup( io_repo = lo_repo ). + zcl_abapgit_tag_popups=>tag_list_popup( lo_repo ). ENDMETHOD. - ENDCLASS. diff --git a/src/xml/zcl_abapgit_xml_output.clas.testclasses.abap b/src/xml/zcl_abapgit_xml_output.clas.testclasses.abap index fd2265373..e193ecb6c 100644 --- a/src/xml/zcl_abapgit_xml_output.clas.testclasses.abap +++ b/src/xml/zcl_abapgit_xml_output.clas.testclasses.abap @@ -41,10 +41,10 @@ CLASS ltcl_xml_output IMPLEMENTATION. lo_output->add( iv_name = 'DATA' ig_data = ls_input ). - li_xml_element = lo_output->mi_xml_doc->find_from_name( name = 'FOO' ). + li_xml_element = lo_output->mi_xml_doc->find_from_name( 'FOO' ). lv_value = li_xml_element->get_value( ). ls_result-foo = lv_value. - li_xml_element = lo_output->mi_xml_doc->find_from_name( name = 'BAR' ). + li_xml_element = lo_output->mi_xml_doc->find_from_name( 'BAR' ). lv_value = li_xml_element->get_value( ). ls_result-bar = lv_value. diff --git a/src/zcl_abapgit_merge.clas.abap b/src/zcl_abapgit_merge.clas.abap index 14fb52563..0ae4c8fc2 100644 --- a/src/zcl_abapgit_merge.clas.abap +++ b/src/zcl_abapgit_merge.clas.abap @@ -386,8 +386,8 @@ CLASS ZCL_ABAPGIT_MERGE IMPLEMENTATION. FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_merge_conflict, LIKE LINE OF ms_merge-result. - IF is_conflict-result_sha1 IS NOT INITIAL - AND is_conflict-result_data IS NOT INITIAL. + IF is_conflict-result_sha1 IS NOT INITIAL + AND is_conflict-result_data IS NOT INITIAL. READ TABLE mt_conflicts ASSIGNING WITH KEY path = is_conflict-path filename = is_conflict-filename. IF sy-subrc EQ 0. @@ -397,8 +397,8 @@ CLASS ZCL_ABAPGIT_MERGE IMPLEMENTATION. -sha1 = is_conflict-result_sha1. ms_merge-stage->add( iv_path = -path - iv_filename = -filename - iv_data = is_conflict-result_data ). + iv_filename = -filename + iv_data = is_conflict-result_data ). DELETE mt_conflicts WHERE path EQ is_conflict-path AND filename EQ is_conflict-filename. diff --git a/src/zcl_abapgit_objects.clas.abap b/src/zcl_abapgit_objects.clas.abap index aa7d7a15d..3ec8f6bd2 100644 --- a/src/zcl_abapgit_objects.clas.abap +++ b/src/zcl_abapgit_objects.clas.abap @@ -179,7 +179,7 @@ ENDCLASS. -CLASS zcl_abapgit_objects IMPLEMENTATION. +CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION. METHOD changed_by. @@ -224,7 +224,7 @@ CLASS zcl_abapgit_objects IMPLEMENTATION. DATA: lt_files TYPE zif_abapgit_definitions=>ty_files_tt. - lt_files[] = it_files[]. + lt_files = it_files. SORT lt_files BY path ASCENDING filename ASCENDING. DELETE ADJACENT DUPLICATES FROM lt_files COMPARING path filename. IF lines( lt_files ) <> lines( it_files ). @@ -349,7 +349,7 @@ CLASS zcl_abapgit_objects IMPLEMENTATION. FIELD-SYMBOLS: LIKE LINE OF it_tadir. - lt_tadir[] = it_tadir[]. + lt_tadir = it_tadir. zcl_abapgit_dependencies=>resolve( CHANGING ct_tadir = lt_tadir ). From 61fb07bffc0fe179e2bc575a3e8a1bbf8fbb811f Mon Sep 17 00:00:00 2001 From: larshp Date: Wed, 6 Jun 2018 14:44:22 +0000 Subject: [PATCH 053/136] 1.68.3 --- src/zif_abapgit_definitions.intf.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index fe8a661a5..45b468fe5 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -320,7 +320,7 @@ INTERFACE zif_abapgit_definitions PUBLIC. END OF ty_s_user_settings. CONSTANTS gc_xml_version TYPE string VALUE 'v1.0.0' ##NO_TEXT. - CONSTANTS gc_abap_version TYPE string VALUE '1.68.2' ##NO_TEXT. + CONSTANTS gc_abap_version TYPE string VALUE '1.68.3' ##NO_TEXT. CONSTANTS: BEGIN OF gc_type, commit TYPE zif_abapgit_definitions=>ty_type VALUE 'commit', "#EC NOTEXT From d6f77810f5f82293dc0d135644ba480263f25397 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Wed, 6 Jun 2018 16:55:12 +0200 Subject: [PATCH 054/136] v1.68.3 --- changelog.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/changelog.txt b/changelog.txt index 8eb6aa40a..7e27eef4b 100644 --- a/changelog.txt +++ b/changelog.txt @@ -8,6 +8,15 @@ Legend + : added - : removed +2018-06-06 v1.68.3 +------------------ +* fix dump when objects are moved +* abapGit news feature now works in more cases +* FUGR force update of where-used +* tag page redesigned +* TABL, clear field RESERVEDTE +* http agent changed + 2018-06-04 v1.68.2 ------------------ * CLAS ignore deltion of non-existent objects From e738322783317534afac5269fe59cdaf116ec216 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Wed, 6 Jun 2018 17:11:04 +0200 Subject: [PATCH 055/136] docs, SCP1 --- docs/ref-supported.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/ref-supported.md b/docs/ref-supported.md index 5038ea7be..34d0b644b 100644 --- a/docs/ref-supported.md +++ b/docs/ref-supported.md @@ -59,6 +59,7 @@ PRAG | Pragma in ABAP Source Code | Yes PROG | Program | Yes SAMC | ABAP Messaging Channels | Yes SAPC | ABAP Push Channels | Yes +SCP1 | BC Set or Customizing Profile | [#1004](https://github.com/larshp/abapGit/issues/1004) SFBF | Business Function + Assignment | Yes SFBS | Business Function Set + Assignment | Yes SFPF | Form Object: Form | Yes From 38eef6717a93ed5c07784769c82be97fe8918e22 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Thu, 7 Jun 2018 10:57:40 +0200 Subject: [PATCH 056/136] docs: information about docs --- docs/collections/_development/docs.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/collections/_development/docs.md b/docs/collections/_development/docs.md index 5ce05e82a..00f4fe631 100644 --- a/docs/collections/_development/docs.md +++ b/docs/collections/_development/docs.md @@ -1,10 +1,14 @@ --- -title: Documentation +title: docs order: 10 --- +abapGit uses github pages for documentation, https://help.github.com/articles/what-is-github-pages/ + +All pages are generated statically using https://jekyllrb.com/ + Building /docs/ locally: `bundle install` -`bundle exec jekyll serve --incremental --port $PORT --host $IP` \ No newline at end of file +`bundle exec jekyll serve --incremental --port $PORT --host $IP` From 41d09125d4a63d30e66f748ddf3775197ee74392 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Wed, 6 Jun 2018 19:13:54 +0000 Subject: [PATCH 057/136] set new remote: supply remote SHA1 --- src/zcl_abapgit_repo_online.clas.abap | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/zcl_abapgit_repo_online.clas.abap b/src/zcl_abapgit_repo_online.clas.abap index f51a29480..77495e5b1 100644 --- a/src/zcl_abapgit_repo_online.clas.abap +++ b/src/zcl_abapgit_repo_online.clas.abap @@ -451,6 +451,10 @@ CLASS zcl_abapgit_repo_online IMPLEMENTATION. iv_head_branch = '' iv_sha1 = '' ). + " If the SHA1 is empty, it's not possible to create tags or branches. + " Therefore we update the local SHA1 with the new remote SHA1 + set( iv_sha1 = get_sha1_remote( ) ). + ENDMETHOD. "set_new_remote From 6ca5ab4459de7eacf65bac0ca864a5f66f55c195 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Thu, 7 Jun 2018 11:04:53 +0200 Subject: [PATCH 058/136] docs: supported, mention customizing --- docs/ref-supported.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/ref-supported.md b/docs/ref-supported.md index 34d0b644b..66349791c 100644 --- a/docs/ref-supported.md +++ b/docs/ref-supported.md @@ -102,4 +102,6 @@ WEBI | Virtual End Point | Yes XINX | Extension Index | Yes XSLT | Transformation | Yes +Support for customizing planned, see [#1004](https://github.com/larshp/abapGit/issues/1004) + Also see [https://github.com/larshp/abapGit-Plugins](https://github.com/larshp/abapGit-Plugins) From 857947b03d194efd6cfc813818c426187492bf52 Mon Sep 17 00:00:00 2001 From: juancarlosrodriguezf <37382510+juancarlosrodriguezf@users.noreply.github.com> Date: Thu, 7 Jun 2018 12:02:24 +0200 Subject: [PATCH 059/136] Use the 2-character code for language. Downwards compatibility. Check first the new 2-character file name, if fail, use the old name. --- src/objects/zcl_abapgit_object_form.clas.abap | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/objects/zcl_abapgit_object_form.clas.abap b/src/objects/zcl_abapgit_object_form.clas.abap index 8fb11250f..d81505bb3 100644 --- a/src/objects/zcl_abapgit_object_form.clas.abap +++ b/src/objects/zcl_abapgit_object_form.clas.abap @@ -39,6 +39,12 @@ CLASS zcl_abapgit_object_form DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje RETURNING VALUE(r_result) TYPE string. + METHODS _build_extra_from_header_old + IMPORTING + ls_header TYPE tys_form_header + RETURNING + VALUE(r_result) TYPE string. + METHODS _save_form IMPORTING it_lines TYPE zcl_abapgit_object_form=>tyt_lines @@ -267,6 +273,10 @@ CLASS zcl_abapgit_object_form IMPLEMENTATION. ENDMETHOD. + METHOD _build_extra_from_header_old. + r_result = c_objectname_tdlines && '_' && ls_header-tdspras. + ENDMETHOD. + METHOD _get_last_changes. DATA: lv_form_name TYPE thead-tdform. @@ -317,9 +327,17 @@ CLASS zcl_abapgit_object_form IMPLEMENTATION. DATA lv_string TYPE string. DATA lo_xml TYPE REF TO zcl_abapgit_xml_input. - lv_string = mo_files->read_string( iv_extra = - _build_extra_from_header( is_form_data-form_header ) - iv_ext = c_extension_xml ). + TRY. + lv_string = mo_files->read_string( iv_extra = + _build_extra_from_header( is_form_data-form_header ) + iv_ext = c_extension_xml ). + CATCH zcx_abapgit_exception. + + lv_string = mo_files->read_string( iv_extra = + _build_extra_from_header_old( is_form_data-form_header ) + iv_ext = c_extension_xml ). + + ENDTRY. CREATE OBJECT lo_xml EXPORTING iv_xml = lv_string. lo_xml->read( EXPORTING iv_name = c_objectname_tdlines From 17b808c8a54c046b002ec8be71bc899773b0d689 Mon Sep 17 00:00:00 2001 From: Jakub Filak Date: Thu, 7 Jun 2018 14:08:33 +0000 Subject: [PATCH 060/136] Mass activation: re-check DDIC objs in transport DDLS objects are not cheked in a transport in their deserialize method. The parallel activation does not call RS_WORKING_OBJECTS_ACTIVATE which checks in the activated object in a transport. Therefor, DDLS objecst are never checked in a transport when the parallel activation is in place (the option experimental features is enabled - which is enabled by default on all our systems). I wanted to use TRINT_OBJECTS_CHECK_AND_INSERT because this function is used by ADT: CL_WB_ADT_REST_RESOURCE~post CL_WB_ADT_REST_RESOURCE_DATA ~if_wb_adt_rest_resource_data~get_transport_key CL_WB_OBJECT~get_transport_key -> PGMID%3DR3TR, OBJTYPE%3DDDLS CL_WB_ADT_REST_RESOURCE~lock CL_WB_ADT_REST_RESOURCE~check_obj_in_transport_request CL_ADT_CTS_MANAGEMENT~check_objects_in_request CL_ADT_CTS_MANAGEMENT~LCL_DB_PERSISTENCE~check_objects CALL FUNCTION CTS_WBO_API_CHECK_OBJECTS CALL FUNCTION TRINT_WBO_IMPL_CHECK_OBJECTS SAPLCTS_WBO_API_IMPL / LCTS_WBO_API_IMPLF06 / FORM CALL_OBJECTS_CHECK_AND_INSERT CALL FUNCTION TRINT_OBJECTS_CHECK_AND_INSERT But it is not enough to call this function, hence, I use RS_CORR_INSERT which was mentioned by @larshp in our slack conversation. The function internally use calls TRINT_OBJECTS_CHECK_AND_INSERT. I tested this patch with modification of a CDS view and also with adding a new CDS view. Closes #1466 --- .../zcl_abapgit_objects_activation.clas.abap | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/objects/zcl_abapgit_objects_activation.clas.abap b/src/objects/zcl_abapgit_objects_activation.clas.abap index 14f5e3bab..d52b18082 100644 --- a/src/objects/zcl_abapgit_objects_activation.clas.abap +++ b/src/objects/zcl_abapgit_objects_activation.clas.abap @@ -77,7 +77,8 @@ CLASS ZCL_ABAPGIT_OBJECTS_ACTIVATION IMPLEMENTATION. lv_rc TYPE sy-subrc, lt_deltab TYPE STANDARD TABLE OF dcdeltb, lt_action_tab TYPE STANDARD TABLE OF dctablres, - lv_logname TYPE ddmass-logname. + lv_logname TYPE ddmass-logname, + lv_errmsg(255) TYPE c. FIELD-SYMBOLS: LIKE LINE OF gt_objects. @@ -87,6 +88,24 @@ CLASS ZCL_ABAPGIT_OBJECTS_ACTIVATION IMPLEMENTATION. ls_gentab-type = -object. INSERT ls_gentab INTO TABLE lt_gentab. + CALL FUNCTION 'RS_CORR_INSERT' + EXPORTING + object = -obj_name + object_class = -object + global_lock = abap_true + EXCEPTIONS + cancelled = 1 + permission_failure = 2 + unknown_objectclass = 3 + OTHERS = 4. + + IF sy-subrc <> 0. + CONCATENATE 'error from RS_CORR_INSERT for' -object -obj_name + INTO lv_errmsg SEPARATED BY space. + + zcx_abapgit_exception=>raise( lv_errmsg ). + ENDIF. + ENDLOOP. IF lt_gentab IS NOT INITIAL. From c32306f54c2f7f792f4743c360a824cb212a56ae Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Thu, 7 Jun 2018 17:01:14 +0000 Subject: [PATCH 061/136] deactivate pull after switching branches --- src/ui/zcl_abapgit_services_git.clas.abap | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/ui/zcl_abapgit_services_git.clas.abap b/src/ui/zcl_abapgit_services_git.clas.abap index f26b90675..95058b3ce 100644 --- a/src/ui/zcl_abapgit_services_git.clas.abap +++ b/src/ui/zcl_abapgit_services_git.clas.abap @@ -77,7 +77,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_SERVICES_GIT IMPLEMENTATION. +CLASS zcl_abapgit_services_git IMPLEMENTATION. METHOD commit. @@ -299,8 +299,6 @@ CLASS ZCL_ABAPGIT_SERVICES_GIT IMPLEMENTATION. COMMIT WORK AND WAIT. - zcl_abapgit_services_repo=>gui_deserialize( lo_repo ). - ENDMETHOD. @@ -320,8 +318,6 @@ CLASS ZCL_ABAPGIT_SERVICES_GIT IMPLEMENTATION. COMMIT WORK. - zcl_abapgit_services_repo=>gui_deserialize( lo_repo ). - ENDMETHOD. From 8074aa32729a4c838d6e89d8eabbda05e3945a18 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Thu, 7 Jun 2018 17:30:43 +0000 Subject: [PATCH 062/136] COMMIT WORK AND WAIT after switching tags --- src/ui/zcl_abapgit_services_git.clas.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/zcl_abapgit_services_git.clas.abap b/src/ui/zcl_abapgit_services_git.clas.abap index f26b90675..8b9e26aa6 100644 --- a/src/ui/zcl_abapgit_services_git.clas.abap +++ b/src/ui/zcl_abapgit_services_git.clas.abap @@ -318,7 +318,7 @@ CLASS ZCL_ABAPGIT_SERVICES_GIT IMPLEMENTATION. lo_repo->set_branch_name( ls_tag-name ). - COMMIT WORK. + COMMIT WORK AND WAIT. zcl_abapgit_services_repo=>gui_deserialize( lo_repo ). From 6afa45c5edc51297b88474dbb2551be2ef782102 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Thu, 7 Jun 2018 18:49:49 +0000 Subject: [PATCH 063/136] fix checkout annotated tags --- src/git/zcl_abapgit_git_branch_list.clas.abap | 46 +++++++++++++++---- src/zcl_abapgit_branch_overview.clas.abap | 6 ++- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/git/zcl_abapgit_git_branch_list.clas.abap b/src/git/zcl_abapgit_git_branch_list.clas.abap index d1dbd5b1b..c3e05cfa3 100644 --- a/src/git/zcl_abapgit_git_branch_list.clas.abap +++ b/src/git/zcl_abapgit_git_branch_list.clas.abap @@ -64,6 +64,13 @@ CLASS zcl_abapgit_git_branch_list DEFINITION DATA mt_branches TYPE zif_abapgit_definitions=>ty_git_branch_list_tt . DATA mv_head_symref TYPE string . + METHODS find_tag_by_name + IMPORTING + iv_branch_name TYPE string + RETURNING + VALUE(rs_branch) TYPE zif_abapgit_definitions=>ty_git_branch + RAISING + zcx_abapgit_exception. CLASS-METHODS parse_branch_list IMPORTING @@ -108,10 +115,16 @@ CLASS zcl_abapgit_git_branch_list IMPLEMENTATION. zcx_abapgit_exception=>raise( 'Branch name empty' ). ENDIF. - READ TABLE mt_branches INTO rs_branch - WITH KEY name = iv_branch_name. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'Branch not found' ). + IF iv_branch_name CP |refs/tags/*|. + rs_branch = find_tag_by_name( iv_branch_name ). + ELSE. + + READ TABLE mt_branches INTO rs_branch + WITH KEY name = iv_branch_name. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( 'Branch not found' ). + ENDIF. + ENDIF. ENDMETHOD. "find_by_name @@ -211,10 +224,6 @@ CLASS zcl_abapgit_git_branch_list IMPLEMENTATION. rv_ignore = abap_true. ENDIF. - IF iv_branch_name CP 'refs/tags/*^{}'. " 2nd ref of annotated tag - rv_ignore = abap_true. - ENDIF. - ENDMETHOD. "is_ignored @@ -294,4 +303,25 @@ CLASS zcl_abapgit_git_branch_list IMPLEMENTATION. ENDIF. ENDMETHOD. "parse_head_params + + METHOD find_tag_by_name. + + DATA: lv_branch_name TYPE string. + + lv_branch_name = iv_branch_name && '^{}'. + + READ TABLE mt_branches INTO rs_branch + WITH KEY name = lv_branch_name. + IF sy-subrc <> 0. + + READ TABLE mt_branches INTO rs_branch + WITH KEY name = iv_branch_name. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( 'Branch not found' ). + ENDIF. + + ENDIF. + + ENDMETHOD. + ENDCLASS. diff --git a/src/zcl_abapgit_branch_overview.clas.abap b/src/zcl_abapgit_branch_overview.clas.abap index 8d58672cd..e87e6cc53 100644 --- a/src/zcl_abapgit_branch_overview.clas.abap +++ b/src/zcl_abapgit_branch_overview.clas.abap @@ -313,6 +313,11 @@ CLASS zcl_abapgit_branch_overview IMPLEMENTATION. INSERT LINES OF lt_tags INTO TABLE lt_branches_and_tags. LOOP AT lt_tags ASSIGNING . + + IF -name CP '*^{}'. + CONTINUE. + ENDIF. + MOVE-CORRESPONDING TO ls_tag. INSERT ls_tag INTO TABLE mt_tags. ENDLOOP. @@ -412,5 +417,4 @@ CLASS zcl_abapgit_branch_overview IMPLEMENTATION. io_repo = io_repo. ENDMETHOD. - ENDCLASS. From 8ddeacade5cc103f7e6cda2a8ae4a17817b41de8 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Thu, 7 Jun 2018 19:28:45 +0000 Subject: [PATCH 064/136] fix gui show changes only --- src/ui/zcl_abapgit_gui_view_repo.clas.abap | 16 ++++++++++++---- src/zcl_abapgit_repo_content_list.clas.abap | 13 +------------ 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/ui/zcl_abapgit_gui_view_repo.clas.abap b/src/ui/zcl_abapgit_gui_view_repo.clas.abap index 22d7fc326..f41fc2c4d 100644 --- a/src/ui/zcl_abapgit_gui_view_repo.clas.abap +++ b/src/ui/zcl_abapgit_gui_view_repo.clas.abap @@ -81,7 +81,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GUI_VIEW_REPO IMPLEMENTATION. +CLASS zcl_abapgit_gui_view_repo IMPLEMENTATION. METHOD build_dir_jump_link. @@ -340,9 +340,17 @@ CLASS ZCL_ABAPGIT_GUI_VIEW_REPO IMPLEMENTATION. METHOD render_empty_package. - rv_html = '' - && '
    Empty package
    ' - && '' ##NO_TEXT. + DATA: lv_text TYPE string. + + IF mv_changes_only = abap_true. + lv_text = |No changes|. + ELSE. + lv_text = |Empty package|. + ENDIF. + + rv_html = || + && |
    { lv_text }
    | + && ||. ENDMETHOD. "render_empty_package diff --git a/src/zcl_abapgit_repo_content_list.clas.abap b/src/zcl_abapgit_repo_content_list.clas.abap index cdeb6e2a2..6ab245a2e 100644 --- a/src/zcl_abapgit_repo_content_list.clas.abap +++ b/src/zcl_abapgit_repo_content_list.clas.abap @@ -183,18 +183,7 @@ CLASS ZCL_ABAPGIT_REPO_CONTENT_LIST IMPLEMENTATION. METHOD filter_changes. - DATA lt_repo_temp LIKE ct_repo_items. - - FIELD-SYMBOLS LIKE LINE OF ct_repo_items. - - LOOP AT ct_repo_items ASSIGNING . - CHECK -changes > 0. - APPEND TO lt_repo_temp. - ENDLOOP. - - IF lines( lt_repo_temp ) > 0. " Prevent showing empty package if no changes, show all - ct_repo_items = lt_repo_temp. - ENDIF. + DELETE ct_repo_items WHERE changes = 0. ENDMETHOD. "filter_changes From 806fbe1a69c91f1fa67dec75295b06343b4ac335 Mon Sep 17 00:00:00 2001 From: larshp Date: Sat, 9 Jun 2018 09:54:20 +0000 Subject: [PATCH 065/136] 1.69.0 --- src/zif_abapgit_definitions.intf.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index 45b468fe5..5404d74fe 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -320,7 +320,7 @@ INTERFACE zif_abapgit_definitions PUBLIC. END OF ty_s_user_settings. CONSTANTS gc_xml_version TYPE string VALUE 'v1.0.0' ##NO_TEXT. - CONSTANTS gc_abap_version TYPE string VALUE '1.68.3' ##NO_TEXT. + CONSTANTS gc_abap_version TYPE string VALUE '1.69.0' ##NO_TEXT. CONSTANTS: BEGIN OF gc_type, commit TYPE zif_abapgit_definitions=>ty_type VALUE 'commit', "#EC NOTEXT From c4993dedb600b67a0b4f61d18d2beaff8e9f7755 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sat, 9 Jun 2018 11:56:22 +0200 Subject: [PATCH 066/136] v1.69.0 --- changelog.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/changelog.txt b/changelog.txt index 7e27eef4b..4c02165f2 100644 --- a/changelog.txt +++ b/changelog.txt @@ -8,6 +8,13 @@ Legend + : added - : removed +2018-06-09 v1.69.0 +------------------ +! FORM serialization, filenames changed +* fix gui show changes only +* fix checkout annotated tags +* set new remote: supply remote SHA1 + 2018-06-06 v1.68.3 ------------------ * fix dump when objects are moved From f18e2f74f96e61566b5532391b8a7eff232c303b Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sat, 9 Jun 2018 13:13:59 +0200 Subject: [PATCH 067/136] docs: remove jquery #1479 --- docs/other-external-libraries.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/other-external-libraries.md b/docs/other-external-libraries.md index 0dece74c7..680e98177 100644 --- a/docs/other-external-libraries.md +++ b/docs/other-external-libraries.md @@ -9,5 +9,4 @@ abapGit uses a few external libraries, these are loaded via [cdnjs](https://cdnj Library | Version | License :------------ | :------------ | :------------ [octicons](https://github.com/primer/octicons) | 4.4.0 | MIT -[jquery](https://github.com/jquery/jquery) | 3.2.1 | MIT [gitgraph](https://github.com/nicoespeon/gitgraph.js) | 1.2.3 | MIT From dcf423bc095bef9fd959b269db421b6bbbc4fff1 Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 10 Jun 2018 06:24:13 +0000 Subject: [PATCH 068/136] main package is also part of repo #1477 --- src/zcl_abapgit_file_status.clas.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zcl_abapgit_file_status.clas.abap b/src/zcl_abapgit_file_status.clas.abap index d365390c1..d0507ba86 100644 --- a/src/zcl_abapgit_file_status.clas.abap +++ b/src/zcl_abapgit_file_status.clas.abap @@ -240,7 +240,7 @@ CLASS ZCL_ABAPGIT_FILE_STATUS IMPLEMENTATION. iv_object = ls_item-obj_type iv_obj_name = ls_item-obj_name ). - IF NOT ls_item-devclass IS INITIAL. + IF NOT ls_item-devclass IS INITIAL AND iv_devclass <> ls_item-devclass. * make sure the package is under the repo main package lt_super = zcl_abapgit_sap_package=>get( iv_devclass )->list_subpackages( ). READ TABLE lt_super WITH KEY table_line = ls_item-devclass TRANSPORTING NO FIELDS. From c7179ed509d96a8629eacac53064b8894295e720 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Sun, 10 Jun 2018 10:59:00 +0200 Subject: [PATCH 069/136] new exit: change_tadir --- src/zcl_abapgit_exit.clas.abap | 16 +++++++++++++++- src/zcl_abapgit_tadir.clas.abap | 8 +++++++- src/zif_abapgit_exit.intf.abap | 7 ++++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/zcl_abapgit_exit.clas.abap b/src/zcl_abapgit_exit.clas.abap index be01f560a..c7b939ecd 100644 --- a/src/zcl_abapgit_exit.clas.abap +++ b/src/zcl_abapgit_exit.clas.abap @@ -14,7 +14,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_EXIT IMPLEMENTATION. +CLASS zcl_abapgit_exit IMPLEMENTATION. METHOD get_instance. @@ -101,4 +101,18 @@ CLASS ZCL_ABAPGIT_EXIT IMPLEMENTATION. ENDTRY. ENDMETHOD. + + METHOD zif_abapgit_exit~change_tadir. + + TRY. + gi_exit->change_tadir( + EXPORTING + iv_package = iv_package + CHANGING + ct_tadir = ct_tadir ). + CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method. + ENDTRY. + + ENDMETHOD. + ENDCLASS. diff --git a/src/zcl_abapgit_tadir.clas.abap b/src/zcl_abapgit_tadir.clas.abap index 8bd411707..c43dbb9d4 100644 --- a/src/zcl_abapgit_tadir.clas.abap +++ b/src/zcl_abapgit_tadir.clas.abap @@ -65,7 +65,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_TADIR IMPLEMENTATION. +CLASS zcl_abapgit_tadir IMPLEMENTATION. METHOD build. @@ -247,6 +247,12 @@ CLASS ZCL_ABAPGIT_TADIR IMPLEMENTATION. iv_only_local_objects = iv_only_local_objects io_log = io_log ). + zcl_abapgit_exit=>get_instance( )->change_tadir( + EXPORTING + iv_package = iv_package + CHANGING + ct_tadir = rt_tadir ). + rt_tadir = check_exists( rt_tadir ). ENDMETHOD. "read diff --git a/src/zif_abapgit_exit.intf.abap b/src/zif_abapgit_exit.intf.abap index 7a7d530eb..85431499b 100644 --- a/src/zif_abapgit_exit.intf.abap +++ b/src/zif_abapgit_exit.intf.abap @@ -19,6 +19,11 @@ INTERFACE zif_abapgit_exit PUBLIC. CHANGING c_proxy_authentication TYPE abap_bool, http_client IMPORTING - ii_client TYPE REF TO if_http_client. + ii_client TYPE REF TO if_http_client, + change_tadir + IMPORTING + iv_package TYPE devclass + CHANGING + ct_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt. ENDINTERFACE. From 4219c6d1627b30ea3c2f3d8904d952770efa36e9 Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 10 Jun 2018 11:45:39 +0000 Subject: [PATCH 070/136] cl_aunit_assert is obsolete --- ...it_html_action_utils.clas.testclasses.abap | 12 ++- .../zcl_abapgit_path.clas.testclasses.abap | 87 ++++++++++--------- ..._abapgit_file_status.clas.testclasses.abap | 51 +++++++---- 3 files changed, 91 insertions(+), 59 deletions(-) diff --git a/src/ui/zcl_abapgit_html_action_utils.clas.testclasses.abap b/src/ui/zcl_abapgit_html_action_utils.clas.testclasses.abap index 54d52d166..67b8a0317 100644 --- a/src/ui/zcl_abapgit_html_action_utils.clas.testclasses.abap +++ b/src/ui/zcl_abapgit_html_action_utils.clas.testclasses.abap @@ -1,6 +1,5 @@ CLASS ltcl_html_action_utils DEFINITION FOR TESTING RISK LEVEL HARMLESS - DURATION SHORT FINAL - INHERITING FROM cl_aunit_assert. + DURATION SHORT FINAL. PUBLIC SECTION. @@ -76,7 +75,9 @@ CLASS ltcl_html_action_utils IMPLEMENTATION. zcl_abapgit_html_action_utils=>add_field( EXPORTING name = 'VALUE' iv = ls_field CHANGING ct = lt_fields ). - assert_equals( act = lt_fields exp = lt_answer ). + cl_abap_unit_assert=>assert_equals( + act = lt_fields + exp = lt_answer ). ENDMETHOD. "add_field @@ -97,7 +98,10 @@ CLASS ltcl_html_action_utils IMPLEMENTATION. ls_answer-name = 'TEST'. ls_answer-value = 'TEST'. - assert_equals( act = ls_field exp = ls_answer ). " Both field are filled! + + cl_abap_unit_assert=>assert_equals( + act = ls_field + exp = ls_answer ). " Both field are filled! ENDMETHOD. "get_field diff --git a/src/utils/zcl_abapgit_path.clas.testclasses.abap b/src/utils/zcl_abapgit_path.clas.testclasses.abap index 47c102e1c..679233bea 100644 --- a/src/utils/zcl_abapgit_path.clas.testclasses.abap +++ b/src/utils/zcl_abapgit_path.clas.testclasses.abap @@ -1,8 +1,7 @@ CLASS ltcl_path DEFINITION FOR TESTING DURATION SHORT - RISK LEVEL HARMLESS - INHERITING FROM cl_aunit_assert. + RISK LEVEL HARMLESS. PUBLIC SECTION. METHODS is_root FOR TESTING. @@ -18,10 +17,21 @@ CLASS ltcl_path IMPLEMENTATION. METHOD is_root. - assert_equals( exp = abap_true act = zcl_abapgit_path=>is_root( '/' ) ). - assert_equals( exp = abap_false act = zcl_abapgit_path=>is_root( '' ) ). - assert_equals( exp = abap_false act = zcl_abapgit_path=>is_root( 'somedir' ) ). - assert_equals( exp = abap_false act = zcl_abapgit_path=>is_root( '/somedir' ) ). + cl_abap_unit_assert=>assert_equals( + exp = abap_true + act = zcl_abapgit_path=>is_root( '/' ) ). + + cl_abap_unit_assert=>assert_equals( + exp = abap_false + act = zcl_abapgit_path=>is_root( '' ) ). + + cl_abap_unit_assert=>assert_equals( + exp = abap_false + act = zcl_abapgit_path=>is_root( 'somedir' ) ). + + cl_abap_unit_assert=>assert_equals( + exp = abap_false + act = zcl_abapgit_path=>is_root( '/somedir' ) ). ENDMETHOD. @@ -33,38 +43,38 @@ CLASS ltcl_path IMPLEMENTATION. zcl_abapgit_path=>split_file_location( EXPORTING iv_fullpath = '' IMPORTING ev_path = lv_path ev_filename = lv_name ). - assert_equals( act = lv_path exp = '' ). - assert_equals( act = lv_name exp = '' ). + cl_abap_unit_assert=>assert_equals( act = lv_path exp = '' ). + cl_abap_unit_assert=>assert_equals( act = lv_name exp = '' ). zcl_abapgit_path=>split_file_location( EXPORTING iv_fullpath = 'somefile' IMPORTING ev_path = lv_path ev_filename = lv_name ). - assert_equals( act = lv_path exp = '' ). - assert_equals( act = lv_name exp = 'somefile' ). + cl_abap_unit_assert=>assert_equals( act = lv_path exp = '' ). + cl_abap_unit_assert=>assert_equals( act = lv_name exp = 'somefile' ). zcl_abapgit_path=>split_file_location( EXPORTING iv_fullpath = '/' IMPORTING ev_path = lv_path ev_filename = lv_name ). - assert_equals( act = lv_path exp = '/' ). - assert_equals( act = lv_name exp = '' ). + cl_abap_unit_assert=>assert_equals( act = lv_path exp = '/' ). + cl_abap_unit_assert=>assert_equals( act = lv_name exp = '' ). zcl_abapgit_path=>split_file_location( EXPORTING iv_fullpath = '/somefile' IMPORTING ev_path = lv_path ev_filename = lv_name ). - assert_equals( act = lv_path exp = '/' ). - assert_equals( act = lv_name exp = 'somefile' ). + cl_abap_unit_assert=>assert_equals( act = lv_path exp = '/' ). + cl_abap_unit_assert=>assert_equals( act = lv_name exp = 'somefile' ). zcl_abapgit_path=>split_file_location( EXPORTING iv_fullpath = '/somedir/' IMPORTING ev_path = lv_path ev_filename = lv_name ). - assert_equals( act = lv_path exp = '/somedir/' ). - assert_equals( act = lv_name exp = '' ). + cl_abap_unit_assert=>assert_equals( act = lv_path exp = '/somedir/' ). + cl_abap_unit_assert=>assert_equals( act = lv_name exp = '' ). zcl_abapgit_path=>split_file_location( EXPORTING iv_fullpath = '/somedir/somefile' IMPORTING ev_path = lv_path ev_filename = lv_name ). - assert_equals( act = lv_path exp = '/somedir/' ). - assert_equals( act = lv_name exp = 'somefile' ). + cl_abap_unit_assert=>assert_equals( act = lv_path exp = '/somedir/' ). + cl_abap_unit_assert=>assert_equals( act = lv_name exp = 'somefile' ). ENDMETHOD. @@ -75,27 +85,27 @@ CLASS ltcl_path IMPLEMENTATION. lv_yes = zcl_abapgit_path=>is_subdir( iv_path = '/dir/subdir' iv_parent = '/dir' ). - assert_equals( act = lv_yes exp = abap_true ). + cl_abap_unit_assert=>assert_equals( act = lv_yes exp = abap_true ). lv_yes = zcl_abapgit_path=>is_subdir( iv_path = '/dir/subdir' iv_parent = '/dir/' ). - assert_equals( act = lv_yes exp = abap_true ). + cl_abap_unit_assert=>assert_equals( act = lv_yes exp = abap_true ). lv_yes = zcl_abapgit_path=>is_subdir( iv_path = '/another' iv_parent = '/dir' ). - assert_equals( act = lv_yes exp = abap_false ). + cl_abap_unit_assert=>assert_equals( act = lv_yes exp = abap_false ). lv_yes = zcl_abapgit_path=>is_subdir( iv_path = '/dir' iv_parent = '/dir' ). - assert_equals( act = lv_yes exp = abap_false ). + cl_abap_unit_assert=>assert_equals( act = lv_yes exp = abap_false ). lv_yes = zcl_abapgit_path=>is_subdir( iv_path = '/dir' iv_parent = '/' ). - assert_equals( act = lv_yes exp = abap_true ). + cl_abap_unit_assert=>assert_equals( act = lv_yes exp = abap_true ). lv_yes = zcl_abapgit_path=>is_subdir( iv_path = '/dir2' iv_parent = '/dir' ). - assert_equals( act = lv_yes exp = abap_false ). + cl_abap_unit_assert=>assert_equals( act = lv_yes exp = abap_false ). ENDMETHOD. @@ -105,32 +115,31 @@ CLASS ltcl_path IMPLEMENTATION. lv_path = zcl_abapgit_path=>change_dir( iv_cur_dir = '' iv_cd = '' ). - assert_equals( act = lv_path exp = '' ). + cl_abap_unit_assert=>assert_equals( act = lv_path exp = '' ). lv_path = zcl_abapgit_path=>change_dir( iv_cur_dir = '/dir' iv_cd = '' ). - assert_equals( act = lv_path exp = '/dir' ). + cl_abap_unit_assert=>assert_equals( act = lv_path exp = '/dir' ). lv_path = zcl_abapgit_path=>change_dir( iv_cur_dir = '/dir' iv_cd = '.' ). - assert_equals( act = lv_path exp = '/dir' ). + cl_abap_unit_assert=>assert_equals( act = lv_path exp = '/dir' ). lv_path = zcl_abapgit_path=>change_dir( iv_cur_dir = '/dir' iv_cd = '..' ). - assert_equals( act = lv_path exp = '/' ). + cl_abap_unit_assert=>assert_equals( act = lv_path exp = '/' ). lv_path = zcl_abapgit_path=>change_dir( iv_cur_dir = '/dir/sub' iv_cd = '..' ). - assert_equals( act = lv_path exp = '/dir/' ). + cl_abap_unit_assert=>assert_equals( act = lv_path exp = '/dir/' ). lv_path = zcl_abapgit_path=>change_dir( iv_cur_dir = '/dir/' iv_cd = 'sub' ). - assert_equals( act = lv_path exp = '/dir/sub' ). + cl_abap_unit_assert=>assert_equals( act = lv_path exp = '/dir/sub' ). lv_path = zcl_abapgit_path=>change_dir( iv_cur_dir = '/dir' iv_cd = 'sub' ). - assert_equals( act = lv_path exp = '/dir/sub' ). - + cl_abap_unit_assert=>assert_equals( act = lv_path exp = '/dir/sub' ). ENDMETHOD. @@ -139,26 +148,26 @@ CLASS ltcl_path IMPLEMENTATION. DATA lv_filename TYPE string. lv_filename = zcl_abapgit_path=>get_filename_from_syspath( 'file.txt' ). - assert_equals( act = lv_filename exp = 'file.txt' ). + cl_abap_unit_assert=>assert_equals( act = lv_filename exp = 'file.txt' ). lv_filename = zcl_abapgit_path=>get_filename_from_syspath( 'c:\dir\file.txt' ). - assert_equals( act = lv_filename exp = 'file.txt' ). + cl_abap_unit_assert=>assert_equals( act = lv_filename exp = 'file.txt' ). lv_filename = zcl_abapgit_path=>get_filename_from_syspath( 'c:\file.txt' ). - assert_equals( act = lv_filename exp = 'file.txt' ). + cl_abap_unit_assert=>assert_equals( act = lv_filename exp = 'file.txt' ). lv_filename = zcl_abapgit_path=>get_filename_from_syspath( '/dir/file.txt' ). - assert_equals( act = lv_filename exp = 'file.txt' ). + cl_abap_unit_assert=>assert_equals( act = lv_filename exp = 'file.txt' ). lv_filename = zcl_abapgit_path=>get_filename_from_syspath( '/file.txt' ). - assert_equals( act = lv_filename exp = 'file.txt' ). + cl_abap_unit_assert=>assert_equals( act = lv_filename exp = 'file.txt' ). lv_filename = zcl_abapgit_path=>get_filename_from_syspath( '\\server$\file.txt' ). - assert_equals( act = lv_filename exp = 'file.txt' ). + cl_abap_unit_assert=>assert_equals( act = lv_filename exp = 'file.txt' ). lv_filename = zcl_abapgit_path=>get_filename_from_syspath( 'C:\foo\bar\moo.boo\dev\qas\_blah\goog\muuh\sap\hello\world\lorem\ipsum\s_foo.gif' ). - assert_equals( act = lv_filename exp = 's_foo.gif' ). + cl_abap_unit_assert=>assert_equals( act = lv_filename exp = 's_foo.gif' ). ENDMETHOD. " get_filename_from_syspath. diff --git a/src/zcl_abapgit_file_status.clas.testclasses.abap b/src/zcl_abapgit_file_status.clas.testclasses.abap index ede47b643..a2d34d26a 100644 --- a/src/zcl_abapgit_file_status.clas.testclasses.abap +++ b/src/zcl_abapgit_file_status.clas.testclasses.abap @@ -38,8 +38,7 @@ DEFINE _append_result. END-OF-DEFINITION. CLASS ltcl_file_status DEFINITION FOR TESTING RISK LEVEL HARMLESS - DURATION SHORT FINAL - INHERITING FROM cl_aunit_assert. + DURATION SHORT FINAL. PUBLIC SECTION. METHODS calculate_status FOR TESTING @@ -137,7 +136,9 @@ CLASS ltcl_file_status IMPLEMENTATION. it_remote = lt_remote it_cur_state = lt_state ). - assert_equals( act = lt_results exp = lt_results_exp ). + cl_abap_unit_assert=>assert_equals( + act = lt_results + exp = lt_results_exp ). ENDMETHOD. "calculate_status @@ -147,8 +148,7 @@ CLASS ltcl_file_status2 DEFINITION DEFERRED. CLASS zcl_abapgit_file_status DEFINITION LOCAL FRIENDS ltcl_file_status2. CLASS ltcl_file_status2 DEFINITION FOR TESTING RISK LEVEL HARMLESS - DURATION SHORT FINAL - INHERITING FROM cl_aunit_assert. + DURATION SHORT FINAL. PUBLIC SECTION. METHODS check FOR TESTING RAISING zcx_abapgit_exception. @@ -179,7 +179,9 @@ CLASS ltcl_file_status2 IMPLEMENTATION. io_dot = zcl_abapgit_dot_abapgit=>build_default( ) iv_top = '$Z$' ). - assert_equals( act = lo_log->count( ) exp = 0 ). + cl_abap_unit_assert=>assert_equals( + act = lo_log->count( ) + exp = 0 ). *** 1 Negative, different path for same object @@ -198,8 +200,13 @@ CLASS ltcl_file_status2 IMPLEMENTATION. iv_top = '$Z$' ). " This one is not pure - incorrect path also triggers path vs package check - assert_equals( act = lo_log->count( ) exp = 2 ). - assert_equals( act = lo_log->has_rc( '1' ) exp = abap_true ). + cl_abap_unit_assert=>assert_equals( + act = lo_log->count( ) + exp = 2 ). + + cl_abap_unit_assert=>assert_equals( + act = lo_log->has_rc( '1' ) + exp = abap_true ). *** 2 Negative, incorrect path vs package @@ -217,8 +224,13 @@ CLASS ltcl_file_status2 IMPLEMENTATION. io_dot = zcl_abapgit_dot_abapgit=>build_default( ) iv_top = '$Z$' ). - assert_equals( act = lo_log->count( ) exp = 1 ). - assert_equals( act = lo_log->has_rc( '2' ) exp = abap_true ). + cl_abap_unit_assert=>assert_equals( + act = lo_log->count( ) + exp = 1 ). + + cl_abap_unit_assert=>assert_equals( + act = lo_log->has_rc( '2' ) + exp = abap_true ). *** 3 Negative, similar filenames @@ -236,8 +248,13 @@ CLASS ltcl_file_status2 IMPLEMENTATION. io_dot = zcl_abapgit_dot_abapgit=>build_default( ) iv_top = '$Z$' ). - assert_equals( act = lo_log->count( ) exp = 1 ). - assert_equals( act = lo_log->has_rc( '3' ) exp = abap_true ). + cl_abap_unit_assert=>assert_equals( + act = lo_log->count( ) + exp = 1 ). + + cl_abap_unit_assert=>assert_equals( + act = lo_log->has_rc( '3' ) + exp = abap_true ). *** 4 Negative, empty filenames @@ -254,11 +271,13 @@ CLASS ltcl_file_status2 IMPLEMENTATION. io_dot = zcl_abapgit_dot_abapgit=>build_default( ) iv_top = '$Z$' ). - assert_equals( act = lo_log->count( ) - exp = 1 ). + cl_abap_unit_assert=>assert_equals( + act = lo_log->count( ) + exp = 1 ). - assert_equals( act = lo_log->has_rc( '4' ) - exp = abap_true ). + cl_abap_unit_assert=>assert_equals( + act = lo_log->has_rc( '4' ) + exp = abap_true ). ENDMETHOD. " check. From 4e67e884de43a18105f131bfe796e6a4b1b7d633 Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 10 Jun 2018 12:11:48 +0000 Subject: [PATCH 071/136] first dependency injection #1390 * extract public methods of ZCL_ABAPGIT_TADIR to new interface * create factory ZCL_ABAPGIT_FACTORY * refactor existing calls --- src/ui/zcl_abapgit_popups.clas.abap | 2 +- src/ui/zcl_abapgit_services_repo.clas.abap | 2 +- src/zcl_abapgit_factory.clas.abap | 30 +++++++++ src/zcl_abapgit_factory.clas.xml | 18 +++++ src/zcl_abapgit_file_status.clas.abap | 6 +- src/zcl_abapgit_objects.clas.abap | 2 +- src/zcl_abapgit_objects.clas.testclasses.abap | 4 +- src/zcl_abapgit_repo.clas.abap | 5 +- src/zcl_abapgit_repo_content_list.clas.abap | 2 +- src/zcl_abapgit_repo_online.clas.abap | 6 +- src/zcl_abapgit_repo_srv.clas.abap | 2 +- src/zcl_abapgit_tadir.clas.abap | 66 ++++++------------- src/zcl_abapgit_transport.clas.abap | 2 +- src/zif_abapgit_tadir.intf.abap | 34 ++++++++++ src/zif_abapgit_tadir.intf.xml | 16 +++++ 15 files changed, 134 insertions(+), 63 deletions(-) create mode 100644 src/zcl_abapgit_factory.clas.abap create mode 100644 src/zcl_abapgit_factory.clas.xml create mode 100644 src/zif_abapgit_tadir.intf.abap create mode 100644 src/zif_abapgit_tadir.intf.xml diff --git a/src/ui/zcl_abapgit_popups.clas.abap b/src/ui/zcl_abapgit_popups.clas.abap index 2f7003742..761bef5e1 100644 --- a/src/ui/zcl_abapgit_popups.clas.abap +++ b/src/ui/zcl_abapgit_popups.clas.abap @@ -721,7 +721,7 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. TRANSLATE -value TO UPPER CASE. rs_tadir-obj_name = -value. - rs_tadir = zcl_abapgit_tadir=>read_single( + rs_tadir = zcl_abapgit_factory=>get_tadir( )->read_single( iv_object = rs_tadir-object iv_obj_name = rs_tadir-obj_name ). diff --git a/src/ui/zcl_abapgit_services_repo.clas.abap b/src/ui/zcl_abapgit_services_repo.clas.abap index d06af1ade..39bb98686 100644 --- a/src/ui/zcl_abapgit_services_repo.clas.abap +++ b/src/ui/zcl_abapgit_services_repo.clas.abap @@ -288,7 +288,7 @@ CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION. lo_repo = zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). lv_package = lo_repo->get_package( ). - lt_tadir = zcl_abapgit_tadir=>read( lv_package ). + lt_tadir = zcl_abapgit_factory=>get_tadir( )->read( lv_package ). IF lines( lt_tadir ) > 0. diff --git a/src/zcl_abapgit_factory.clas.abap b/src/zcl_abapgit_factory.clas.abap new file mode 100644 index 000000000..466248785 --- /dev/null +++ b/src/zcl_abapgit_factory.clas.abap @@ -0,0 +1,30 @@ +CLASS zcl_abapgit_factory DEFINITION + PUBLIC + CREATE PUBLIC . + + PUBLIC SECTION. + + CLASS-DATA gi_tadir TYPE REF TO zif_abapgit_tadir . + + CLASS-METHODS get_tadir + RETURNING + VALUE(ri_tadir) TYPE REF TO zif_abapgit_tadir . + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_FACTORY IMPLEMENTATION. + + + METHOD get_tadir. + + IF gi_tadir IS INITIAL. + CREATE OBJECT gi_tadir TYPE zcl_abapgit_tadir. + ENDIF. + + ri_tadir = gi_tadir. + + ENDMETHOD. +ENDCLASS. diff --git a/src/zcl_abapgit_factory.clas.xml b/src/zcl_abapgit_factory.clas.xml new file mode 100644 index 000000000..b92211da3 --- /dev/null +++ b/src/zcl_abapgit_factory.clas.xml @@ -0,0 +1,18 @@ + + + + + + ZCL_ABAPGIT_FACTORY + 1 + E + Factory + 2 + 1 + X + X + X + + + + diff --git a/src/zcl_abapgit_file_status.clas.abap b/src/zcl_abapgit_file_status.clas.abap index d0507ba86..4f0b8da84 100644 --- a/src/zcl_abapgit_file_status.clas.abap +++ b/src/zcl_abapgit_file_status.clas.abap @@ -236,9 +236,9 @@ CLASS ZCL_ABAPGIT_FILE_STATUS IMPLEMENTATION. CHECK lv_is_xml = abap_true. " Skip all but obj definitions - ls_item-devclass = zcl_abapgit_tadir=>get_object_package( - iv_object = ls_item-obj_type - iv_obj_name = ls_item-obj_name ). + ls_item-devclass = zcl_abapgit_factory=>get_tadir( )->get_object_package( + iv_object = ls_item-obj_type + iv_obj_name = ls_item-obj_name ). IF NOT ls_item-devclass IS INITIAL AND iv_devclass <> ls_item-devclass. * make sure the package is under the repo main package diff --git a/src/zcl_abapgit_objects.clas.abap b/src/zcl_abapgit_objects.clas.abap index 3ec8f6bd2..793a947ff 100644 --- a/src/zcl_abapgit_objects.clas.abap +++ b/src/zcl_abapgit_objects.clas.abap @@ -893,7 +893,7 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION. io_dot = io_repo->get_dot_abapgit( ) iv_path = -path ). - ls_tadir = zcl_abapgit_tadir=>read_single( + ls_tadir = zcl_abapgit_factory=>get_tadir( )->read_single( iv_object = -obj_type iv_obj_name = -obj_name ). diff --git a/src/zcl_abapgit_objects.clas.testclasses.abap b/src/zcl_abapgit_objects.clas.testclasses.abap index 32890db8d..cc400bdbd 100644 --- a/src/zcl_abapgit_objects.clas.testclasses.abap +++ b/src/zcl_abapgit_objects.clas.testclasses.abap @@ -64,7 +64,7 @@ CLASS ltcl_dangerous IMPLEMENTATION. lo_repo->status( ). lo_repo->deserialize( ls_checks ). - lt_tadir = zcl_abapgit_tadir=>read( c_package ). + lt_tadir = zcl_abapgit_factory=>get_tadir( )->read( c_package ). LOOP AT lt_types ASSIGNING . READ TABLE lt_tadir WITH KEY object = TRANSPORTING NO FIELDS. IF sy-subrc <> 0. @@ -85,7 +85,7 @@ CLASS ltcl_dangerous IMPLEMENTATION. ENDLOOP. zcl_abapgit_objects=>delete( lt_tadir ). - lt_tadir = zcl_abapgit_tadir=>read( c_package ). + lt_tadir = zcl_abapgit_factory=>get_tadir( )->read( c_package ). LOOP AT lt_tadir ASSIGNING . lv_msg = |Not deleted properly { -object } { -obj_name }|. cl_abap_unit_assert=>fail( diff --git a/src/zcl_abapgit_repo.clas.abap b/src/zcl_abapgit_repo.clas.abap index 1564cb7a7..669c6f3c4 100644 --- a/src/zcl_abapgit_repo.clas.abap +++ b/src/zcl_abapgit_repo.clas.abap @@ -125,7 +125,7 @@ ENDCLASS. -CLASS zcl_abapgit_repo IMPLEMENTATION. +CLASS ZCL_ABAPGIT_REPO IMPLEMENTATION. METHOD constructor. @@ -262,7 +262,7 @@ CLASS zcl_abapgit_repo IMPLEMENTATION. iv_data = -file-data ). lt_cache = mt_local. - lt_tadir = zcl_abapgit_tadir=>read( + lt_tadir = zcl_abapgit_factory=>get_tadir( )->read( iv_package = get_package( ) iv_ignore_subpackages = get_local_settings( )-ignore_subpackages iv_only_local_objects = get_local_settings( )-only_local_objects @@ -609,5 +609,4 @@ CLASS zcl_abapgit_repo IMPLEMENTATION. set( it_checksums = lt_checksums ). ENDMETHOD. " update_local_checksums - ENDCLASS. diff --git a/src/zcl_abapgit_repo_content_list.clas.abap b/src/zcl_abapgit_repo_content_list.clas.abap index 6ab245a2e..cd34c2c6c 100644 --- a/src/zcl_abapgit_repo_content_list.clas.abap +++ b/src/zcl_abapgit_repo_content_list.clas.abap @@ -108,7 +108,7 @@ CLASS ZCL_ABAPGIT_REPO_CONTENT_LIST IMPLEMENTATION. LIKE LINE OF lt_tadir. - lt_tadir = zcl_abapgit_tadir=>read( + lt_tadir = zcl_abapgit_factory=>get_tadir( )->read( iv_package = mo_repo->get_package( ) io_dot = mo_repo->get_dot_abapgit( ) ). diff --git a/src/zcl_abapgit_repo_online.clas.abap b/src/zcl_abapgit_repo_online.clas.abap index 77495e5b1..e600f8bc9 100644 --- a/src/zcl_abapgit_repo_online.clas.abap +++ b/src/zcl_abapgit_repo_online.clas.abap @@ -107,7 +107,7 @@ ENDCLASS. -CLASS zcl_abapgit_repo_online IMPLEMENTATION. +CLASS ZCL_ABAPGIT_REPO_ONLINE IMPLEMENTATION. METHOD actualize_head_branch. @@ -215,8 +215,8 @@ CLASS zcl_abapgit_repo_online IMPLEMENTATION. lt_remote = get_files_remote( ). lt_status = status( ). - lv_package = me->get_package( ). - lt_tadir = zcl_abapgit_tadir=>read( lv_package ). + lv_package = get_package( ). + lt_tadir = zcl_abapgit_factory=>get_tadir( )->read( lv_package ). SORT lt_tadir BY pgmid ASCENDING object ASCENDING obj_name ASCENDING devclass ASCENDING. LOOP AT lt_status ASSIGNING diff --git a/src/zcl_abapgit_repo_srv.clas.abap b/src/zcl_abapgit_repo_srv.clas.abap index 826de4d5b..848671aa3 100644 --- a/src/zcl_abapgit_repo_srv.clas.abap +++ b/src/zcl_abapgit_repo_srv.clas.abap @@ -290,7 +290,7 @@ CLASS ZCL_ABAPGIT_REPO_SRV IMPLEMENTATION. zcx_abapgit_exception=>raise( 'Not authorized' ). ENDIF. - lt_tadir = zcl_abapgit_tadir=>read( io_repo->get_package( ) ). + lt_tadir = zcl_abapgit_factory=>get_tadir( )->read( io_repo->get_package( ) ). zcl_abapgit_objects=>delete( lt_tadir ). diff --git a/src/zcl_abapgit_tadir.clas.abap b/src/zcl_abapgit_tadir.clas.abap index c43dbb9d4..cecbf07cb 100644 --- a/src/zcl_abapgit_tadir.clas.abap +++ b/src/zcl_abapgit_tadir.clas.abap @@ -1,55 +1,28 @@ CLASS zcl_abapgit_tadir DEFINITION PUBLIC FINAL - CREATE PUBLIC . + CREATE PUBLIC + + GLOBAL FRIENDS zcl_abapgit_factory . PUBLIC SECTION. - CLASS-METHODS read - IMPORTING - !iv_package TYPE tadir-devclass - !iv_ignore_subpackages TYPE abap_bool DEFAULT abap_false - !iv_only_local_objects TYPE abap_bool DEFAULT abap_false - !io_dot TYPE REF TO zcl_abapgit_dot_abapgit OPTIONAL - !io_log TYPE REF TO zcl_abapgit_log OPTIONAL - RETURNING - VALUE(rt_tadir) TYPE zif_abapgit_definitions=>ty_tadir_tt - RAISING - zcx_abapgit_exception . - CLASS-METHODS read_single - IMPORTING - !iv_pgmid TYPE tadir-pgmid DEFAULT 'R3TR' - !iv_object TYPE tadir-object - !iv_obj_name TYPE tadir-obj_name - RETURNING - VALUE(rs_tadir) TYPE tadir - RAISING - zcx_abapgit_exception . - CLASS-METHODS get_object_package - IMPORTING - !iv_pgmid TYPE tadir-pgmid DEFAULT 'R3TR' - !iv_object TYPE tadir-object - !iv_obj_name TYPE tadir-obj_name - RETURNING - VALUE(rv_devclass) TYPE tadir-devclass - RAISING - zcx_abapgit_exception . - + INTERFACES zif_abapgit_tadir . PRIVATE SECTION. - CLASS-METHODS exists + METHODS exists IMPORTING - is_item TYPE zif_abapgit_definitions=>ty_item + !is_item TYPE zif_abapgit_definitions=>ty_item RETURNING - VALUE(rv_exists) TYPE abap_bool. - CLASS-METHODS check_exists + VALUE(rv_exists) TYPE abap_bool . + METHODS check_exists IMPORTING !it_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt RETURNING VALUE(rt_tadir) TYPE zif_abapgit_definitions=>ty_tadir_tt RAISING zcx_abapgit_exception . - CLASS-METHODS build + METHODS build IMPORTING !iv_package TYPE tadir-devclass !iv_top TYPE tadir-devclass @@ -65,7 +38,7 @@ ENDCLASS. -CLASS zcl_abapgit_tadir IMPLEMENTATION. +CLASS ZCL_ABAPGIT_TADIR IMPLEMENTATION. METHOD build. @@ -211,14 +184,15 @@ CLASS zcl_abapgit_tadir IMPLEMENTATION. ENDMETHOD. - METHOD get_object_package. + METHOD zif_abapgit_tadir~get_object_package. DATA: ls_tadir TYPE tadir, ls_item TYPE zif_abapgit_definitions=>ty_item. - ls_tadir = read_single( iv_pgmid = iv_pgmid - iv_object = iv_object - iv_obj_name = iv_obj_name ). + ls_tadir = zif_abapgit_tadir~read_single( + iv_pgmid = iv_pgmid + iv_object = iv_object + iv_obj_name = iv_obj_name ). IF ls_tadir-delflag = 'X'. RETURN. "Mark for deletion -> return nothing @@ -233,10 +207,10 @@ CLASS zcl_abapgit_tadir IMPLEMENTATION. rv_devclass = ls_tadir-devclass. - ENDMETHOD. "get_object_package. + ENDMETHOD. - METHOD read. + METHOD zif_abapgit_tadir~read. * start recursion * hmm, some problems here, should TADIR also build path? @@ -255,10 +229,10 @@ CLASS zcl_abapgit_tadir IMPLEMENTATION. rt_tadir = check_exists( rt_tadir ). - ENDMETHOD. "read + ENDMETHOD. - METHOD read_single. + METHOD zif_abapgit_tadir~read_single. IF iv_object = 'SICF'. rs_tadir = zcl_abapgit_object_sicf=>read_tadir_sicf( @@ -271,5 +245,5 @@ CLASS zcl_abapgit_tadir IMPLEMENTATION. AND obj_name = iv_obj_name. "#EC CI_SUBRC ENDIF. - ENDMETHOD. "read_single + ENDMETHOD. ENDCLASS. diff --git a/src/zcl_abapgit_transport.clas.abap b/src/zcl_abapgit_transport.clas.abap index 10ec2ab19..1a1a89bfd 100644 --- a/src/zcl_abapgit_transport.clas.abap +++ b/src/zcl_abapgit_transport.clas.abap @@ -115,7 +115,7 @@ CLASS ZCL_ABAPGIT_TRANSPORT IMPLEMENTATION. lv_obj_name = -obj_name. ENDIF. - ls_tadir = zcl_abapgit_tadir=>read_single( + ls_tadir = zcl_abapgit_factory=>get_tadir( )->read_single( iv_object = lv_object iv_obj_name = lv_obj_name ). diff --git a/src/zif_abapgit_tadir.intf.abap b/src/zif_abapgit_tadir.intf.abap new file mode 100644 index 000000000..7649efde2 --- /dev/null +++ b/src/zif_abapgit_tadir.intf.abap @@ -0,0 +1,34 @@ +INTERFACE zif_abapgit_tadir + PUBLIC . + + + METHODS get_object_package + IMPORTING + !iv_pgmid TYPE tadir-pgmid DEFAULT 'R3TR' + !iv_object TYPE tadir-object + !iv_obj_name TYPE tadir-obj_name + RETURNING + VALUE(rv_devclass) TYPE tadir-devclass + RAISING + zcx_abapgit_exception . + METHODS read + IMPORTING + !iv_package TYPE tadir-devclass + !iv_ignore_subpackages TYPE abap_bool DEFAULT abap_false + !iv_only_local_objects TYPE abap_bool DEFAULT abap_false + !io_dot TYPE REF TO zcl_abapgit_dot_abapgit OPTIONAL + !io_log TYPE REF TO zcl_abapgit_log OPTIONAL + RETURNING + VALUE(rt_tadir) TYPE zif_abapgit_definitions=>ty_tadir_tt + RAISING + zcx_abapgit_exception . + METHODS read_single + IMPORTING + !iv_pgmid TYPE tadir-pgmid DEFAULT 'R3TR' + !iv_object TYPE tadir-object + !iv_obj_name TYPE tadir-obj_name + RETURNING + VALUE(rs_tadir) TYPE tadir + RAISING + zcx_abapgit_exception . +ENDINTERFACE. diff --git a/src/zif_abapgit_tadir.intf.xml b/src/zif_abapgit_tadir.intf.xml new file mode 100644 index 000000000..8b86827b7 --- /dev/null +++ b/src/zif_abapgit_tadir.intf.xml @@ -0,0 +1,16 @@ + + + + + + ZIF_ABAPGIT_TADIR + 1 + E + TADIR access + 2 + 1 + X + + + + From 3e3cd365a8384f7ac1b8552158870dc92db3365e Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Sun, 10 Jun 2018 17:51:21 +0000 Subject: [PATCH 072/136] Quick fix: duplicate type definition --- src/zif_abapgit_exit.intf.abap | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/zif_abapgit_exit.intf.abap b/src/zif_abapgit_exit.intf.abap index 85431499b..1918e8adf 100644 --- a/src/zif_abapgit_exit.intf.abap +++ b/src/zif_abapgit_exit.intf.abap @@ -1,7 +1,16 @@ INTERFACE zif_abapgit_exit PUBLIC. TYPES: - ty_icm_sinfo2_tt TYPE STANDARD TABLE OF icm_sinfo2 WITH DEFAULT KEY . + BEGIN OF ty_tadir, + pgmid TYPE tadir-pgmid, + object TYPE tadir-object, + obj_name TYPE tadir-obj_name, + devclass TYPE tadir-devclass, + korrnum TYPE tadir-korrnum, + path TYPE string, + END OF ty_tadir, + ty_tadir_tt TYPE STANDARD TABLE OF ty_tadir WITH DEFAULT KEY, + ty_icm_sinfo2_tt TYPE STANDARD TABLE OF icm_sinfo2 WITH DEFAULT KEY. METHODS: change_local_host @@ -24,6 +33,6 @@ INTERFACE zif_abapgit_exit PUBLIC. IMPORTING iv_package TYPE devclass CHANGING - ct_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt. + ct_tadir TYPE ty_tadir_tt. ENDINTERFACE. From 334ce44c0d2c4a7d68f2f69036af055576cb195a Mon Sep 17 00:00:00 2001 From: larshp Date: Mon, 11 Jun 2018 12:03:59 +0200 Subject: [PATCH 073/136] DDLS: fix dump #1488 --- src/objects/zcl_abapgit_object_ddls.clas.abap | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/objects/zcl_abapgit_object_ddls.clas.abap b/src/objects/zcl_abapgit_object_ddls.clas.abap index ee96d359a..b83ee5df1 100644 --- a/src/objects/zcl_abapgit_object_ddls.clas.abap +++ b/src/objects/zcl_abapgit_object_ddls.clas.abap @@ -248,8 +248,8 @@ CLASS ZCL_ABAPGIT_OBJECT_DDLS IMPLEMENTATION. METHOD zif_abapgit_object~serialize. - DATA: lo_ddl TYPE REF TO object, - lr_data TYPE REF TO data, + DATA: lo_ddl TYPE REF TO object, + lr_data TYPE REF TO data, lt_clr_comps TYPE STANDARD TABLE OF fieldname WITH DEFAULT KEY. FIELD-SYMBOLS: TYPE any, @@ -283,8 +283,9 @@ CLASS ZCL_ABAPGIT_OBJECT_DDLS IMPLEMENTATION. LOOP AT lt_clr_comps ASSIGNING . ASSIGN COMPONENT OF STRUCTURE TO . - ASSERT sy-subrc = 0. - CLEAR . + IF sy-subrc = 0. + CLEAR . + ENDIF. ENDLOOP. ASSIGN COMPONENT 'SOURCE' OF STRUCTURE TO . From a62eae188ad71b35d73103b449f20fa9a536a992 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Mon, 11 Jun 2018 14:49:20 +0000 Subject: [PATCH 074/136] disable "no changes" for offline projects --- src/zcl_abapgit_repo_content_list.clas.abap | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/zcl_abapgit_repo_content_list.clas.abap b/src/zcl_abapgit_repo_content_list.clas.abap index 6ab245a2e..7ece8bec4 100644 --- a/src/zcl_abapgit_repo_content_list.clas.abap +++ b/src/zcl_abapgit_repo_content_list.clas.abap @@ -47,7 +47,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_REPO_CONTENT_LIST IMPLEMENTATION. +CLASS zcl_abapgit_repo_content_list IMPLEMENTATION. METHOD build_folders. @@ -209,7 +209,8 @@ CLASS ZCL_ABAPGIT_REPO_CONTENT_LIST IMPLEMENTATION. CHANGING ct_repo_items = rt_repo_items ). ENDIF. - IF iv_changes_only = abap_true. + IF iv_changes_only = abap_true AND mo_repo->is_offline( ) = abap_false. + " There are never changes for offline repositories filter_changes( CHANGING ct_repo_items = rt_repo_items ). ENDIF. From 56c58b7a29c05f533b3fe1a1924ec4e7879d28ec Mon Sep 17 00:00:00 2001 From: Jakub Filak Date: Mon, 11 Jun 2018 10:51:39 +0000 Subject: [PATCH 075/136] SAP Package: add the method get_transport_type For the parameters WI_ORDER_TYPE and WI_TASK_TYPE of the function TRINT_ORDER_CHOICE called from the method popup_transport_request of the class zcl_abapgit_popups. Sometimes we need a repair task but the function TRINT_ORDER_CHOICE searches for Development/Correction tasks. I hope that we can decide what task type is needed by a package (DEVC). Related to #1446 --- src/zcl_abapgit_sap_package.clas.abap | 39 +++++++++++++++++++++++++++ src/zif_abapgit_definitions.intf.abap | 5 ++++ src/zif_abapgit_sap_package.intf.abap | 3 +++ 3 files changed, 47 insertions(+) diff --git a/src/zcl_abapgit_sap_package.clas.abap b/src/zcl_abapgit_sap_package.clas.abap index ec58193c4..d8d06a9d2 100644 --- a/src/zcl_abapgit_sap_package.clas.abap +++ b/src/zcl_abapgit_sap_package.clas.abap @@ -298,4 +298,43 @@ CLASS zcl_abapgit_sap_package IMPLEMENTATION. ENDMETHOD. + METHOD zif_abapgit_sap_package~get_transport_type. + DATA: lv_err_prefix TYPE string, + lv_pkg_name TYPE e071-obj_name. + + lv_err_prefix = |TRINT_GET_REQUEST_TYPE(R3TR, DEVC, { mv_package })|. + lv_pkg_name = mv_package. + + CALL FUNCTION 'TRINT_GET_REQUEST_TYPE' + EXPORTING + iv_pgmid = 'R3TR' + iv_object = 'DEVC' + iv_obj_name = lv_pkg_name + IMPORTING + ev_request_type = rv_transport_type-request + ev_task_type = rv_transport_type-task + EXCEPTIONS + no_request_needed = 1 + internal_error = 2 + cts_initialization_failure = 3. + + CASE sy-subrc. + WHEN 0. + " OK! + + WHEN 1. + zcx_abapgit_exception=>raise( |{ lv_err_prefix }: transport is not needed| ). + + WHEN 2. + zcx_abapgit_exception=>raise( |{ lv_err_prefix }: internal error| ). + + WHEN 3. + zcx_abapgit_exception=>raise( |{ lv_err_prefix }: failed to initialized CTS| ). + + WHEN OTHERS. + zcx_abapgit_exception=>raise( |{ lv_err_prefix }: unrecognized return code| ). + ENDCASE. + + ENDMETHOD. + ENDCLASS. diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index 5404d74fe..6815147ba 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -111,6 +111,11 @@ INTERFACE zif_abapgit_definitions PUBLIC. decision TYPE ty_yes_no, END OF ty_requirements. + TYPES: BEGIN OF ty_transport_type, + request TYPE trfunction, + task TYPE trfunction, + END OF ty_transport_type. + TYPES: BEGIN OF ty_transport, required TYPE abap_bool, transport TYPE trkorr, diff --git a/src/zif_abapgit_sap_package.intf.abap b/src/zif_abapgit_sap_package.intf.abap index 14cf21106..08c200c51 100644 --- a/src/zif_abapgit_sap_package.intf.abap +++ b/src/zif_abapgit_sap_package.intf.abap @@ -16,6 +16,9 @@ INTERFACE zif_abapgit_sap_package PUBLIC. RETURNING VALUE(rv_bool) TYPE abap_bool, are_changes_recorded_in_tr_req RETURNING VALUE(rv_are_changes_rec_in_tr_req) TYPE abap_bool + RAISING zcx_abapgit_exception, + get_transport_type + RETURNING VALUE(rv_transport_type) TYPE zif_abapgit_definitions=>ty_transport_type RAISING zcx_abapgit_exception. ENDINTERFACE. From fb6efabfb9bde95c444f5bee41874cd606353490 Mon Sep 17 00:00:00 2001 From: Jakub Filak Date: Mon, 11 Jun 2018 10:57:45 +0000 Subject: [PATCH 076/136] tp: use the correct transport type in the tr popup We are developing in an infinity system which is somehow cloned into a new releases system. When we need to backport a bug fixes we do cherry-pick the commits and pull them the release system. However, in those systems we need to use the task type Repair. Hence, we need to overwrite the default value of the parameter wi_task_type of the function TRINT_ORDER_CHOICE which is 'S' (Development/Correction) with the value 'R'. I use the function TRINT_GET_REQUEST_TYPE and for the sake of simplicity I assume that it is enough to know the transport type of the repository package - in other words, it is no necessary to check every deserialized object. Related to #1446 --- src/ui/zcl_abapgit_popups.clas.abap | 5 +++++ src/ui/zcl_abapgit_services_repo.clas.abap | 3 ++- src/zcl_abapgit_objects.clas.abap | 10 +++++++--- src/zif_abapgit_definitions.intf.abap | 1 + 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/ui/zcl_abapgit_popups.clas.abap b/src/ui/zcl_abapgit_popups.clas.abap index 2f7003742..b684bec35 100644 --- a/src/ui/zcl_abapgit_popups.clas.abap +++ b/src/ui/zcl_abapgit_popups.clas.abap @@ -139,6 +139,8 @@ CLASS zcl_abapgit_popups DEFINITION RAISING zcx_abapgit_exception . CLASS-METHODS popup_transport_request + IMPORTING + !is_transport_type TYPE zif_abapgit_definitions=>ty_transport_type RETURNING VALUE(rv_transport) TYPE trkorr RAISING @@ -1015,6 +1017,9 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. lt_e071k TYPE STANDARD TABLE OF e071k. CALL FUNCTION 'TRINT_ORDER_CHOICE' + EXPORTING + wi_order_type = is_transport_type-request + wi_task_type = is_transport_type-task IMPORTING we_order = rv_transport TABLES diff --git a/src/ui/zcl_abapgit_services_repo.clas.abap b/src/ui/zcl_abapgit_services_repo.clas.abap index d06af1ade..aded62fa6 100644 --- a/src/ui/zcl_abapgit_services_repo.clas.abap +++ b/src/ui/zcl_abapgit_services_repo.clas.abap @@ -121,7 +121,8 @@ CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION. ENDIF. IF ls_checks-transport-required = abap_true. - ls_checks-transport-transport = zcl_abapgit_popups=>popup_transport_request( ). + ls_checks-transport-transport = zcl_abapgit_popups=>popup_transport_request( + is_transport_type = ls_checks-transport-type ). ENDIF. CATCH zcx_abapgit_cancel. diff --git a/src/zcl_abapgit_objects.clas.abap b/src/zcl_abapgit_objects.clas.abap index 3ec8f6bd2..f90a34860 100644 --- a/src/zcl_abapgit_objects.clas.abap +++ b/src/zcl_abapgit_objects.clas.abap @@ -520,7 +520,8 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION. METHOD deserialize_checks. - DATA: lt_results TYPE zif_abapgit_definitions=>ty_results_tt. + DATA: lt_results TYPE zif_abapgit_definitions=>ty_results_tt, + li_package TYPE REF TO zif_abapgit_sap_package. lt_results = files_to_deserialize( io_repo ). @@ -532,8 +533,11 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION. it_results = lt_results ). IF lines( lt_results ) > 0. - rs_checks-transport-required = zcl_abapgit_sap_package=>get( io_repo->get_package( ) - )->are_changes_recorded_in_tr_req( ). + li_package = zcl_abapgit_sap_package=>get( io_repo->get_package( ) ). + rs_checks-transport-required = li_package->are_changes_recorded_in_tr_req( ). + IF NOT rs_checks-transport-required IS INITIAL. + rs_checks-transport-type = li_package->get_transport_type( ). + ENDIF. ENDIF. ENDMETHOD. diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index 6815147ba..26b75afbb 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -119,6 +119,7 @@ INTERFACE zif_abapgit_definitions PUBLIC. TYPES: BEGIN OF ty_transport, required TYPE abap_bool, transport TYPE trkorr, + type TYPE ty_transport_type, END OF ty_transport. From 2d108246fbdd57b3d59b7265e24ef129566646f7 Mon Sep 17 00:00:00 2001 From: larshp Date: Wed, 13 Jun 2018 15:05:23 +0000 Subject: [PATCH 077/136] docs: move on development --- CONTRIBUTING.md | 17 ++---------- docs/collections/_development/contributing.md | 6 ++--- docs/collections/_development/docs.md | 7 +++-- docs/collections/_development/guidelines.md | 27 +++++++++++++++++++ docs/collections/_development/tests.md | 7 +++++ 5 files changed, 42 insertions(+), 22 deletions(-) create mode 100644 docs/collections/_development/guidelines.md create mode 100644 docs/collections/_development/tests.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 94aa79043..817661b94 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,21 +16,8 @@ A good bug report should not leave others needing to chase you up for more infor ## Development Guidelines -a. Make sure there is an open issue for the stuff that you want to work on. When starting the development add a comment in the issue. This will allow for discussing possible solutions, and avoid having multiple people look into the same issue. - -b. Keep the commits/PR as small as possible, try not to fix multiple issues in one commit/PR if possible. Smaller changes are easier to review, and are more likely to be accepted. - -c. Variables are prefixed using the standard setting in Code Inspector check "Extended Naming Conventions for Programs" - -d. abapGit is targeted for version 702, so the code should only contain expressions/statements that works on 702 - -e. commit often, whenever something is working, and is a step in the right direction do a commit or PR. This way other contributors can see the changes, and it will minimize the risk of merge conflicts. - -f. Use pretty printer, keywords upper case + indentation - -External Links: -https://guides.github.com/activities/contributing-to-open-source/ +http://docs.abapgit.org/development/guidelines.html ## Building/Creating a PR -Building/Creating a PR is described here: http://docs.abapgit.org/other-contributing-abapGit.html +http://docs.abapgit.org/development/contributing.html diff --git a/docs/collections/_development/contributing.md b/docs/collections/_development/contributing.md index 4a9c1c214..6f53648cd 100644 --- a/docs/collections/_development/contributing.md +++ b/docs/collections/_development/contributing.md @@ -1,6 +1,6 @@ --- -title: Contributing to abapGit -order: 90 +title: Contributing +order: 5 --- ******************************* @@ -15,6 +15,6 @@ order: 90 5: After the pull request is merged, abapmerge will automatically run to build the report version of abapGit. -Every time a commit is pushed to the master branch, https://travis-ci.org/ will be triggered to perform the build. It will use [abapmerge](https://github.com/larshp/abapmerge) to merge all the includes into a single file, the build can be downloaded from https://raw.githubusercontent.com/abapGit/build/master/zabapgit.abap +Every time a commit is pushed to the master branch, [Travis CI](https://travis-ci.org/) will be triggered to perform the build. It will use [abapmerge](https://github.com/larshp/abapmerge) to merge all the includes into a single file, the build can be downloaded from [https://raw.githubusercontent.com/abapGit/build/master/zabapgit.abap](https://raw.githubusercontent.com/abapGit/build/master/zabapgit.abap) Alternatively, use the GitHub webinterface to change the files and submit a pull request. diff --git a/docs/collections/_development/docs.md b/docs/collections/_development/docs.md index 00f4fe631..de8f7a063 100644 --- a/docs/collections/_development/docs.md +++ b/docs/collections/_development/docs.md @@ -1,11 +1,10 @@ --- title: docs -order: 10 +order: 200 --- -abapGit uses github pages for documentation, https://help.github.com/articles/what-is-github-pages/ - -All pages are generated statically using https://jekyllrb.com/ +abapGit uses [github pages](https://help.github.com/articles/what-is-github-pages/) for documentation, +all pages are generated statically using [Jekyll](https://jekyllrb.com/) Building /docs/ locally: diff --git a/docs/collections/_development/guidelines.md b/docs/collections/_development/guidelines.md new file mode 100644 index 000000000..7bfc673c3 --- /dev/null +++ b/docs/collections/_development/guidelines.md @@ -0,0 +1,27 @@ +--- +title: Development Guidelines +order: 10 +--- + +### Practical + +* Make sure there is an open issue for the stuff that you want to work on. When starting the development add a comment in the issue. This will allow for discussing possible solutions, and avoid having multiple people look into the same issue. + +* Keep the commits/PR as small as possible, try not to fix multiple issues in one commit/PR if possible. Smaller changes are easier to review, and are more likely to be accepted. + +* commit often, whenever something is working, and is a step in the right direction do a commit or PR. This way other contributors can see the changes, and it will minimize the risk of merge conflicts. + +External Links: +[https://guides.github.com/activities/contributing-to-open-source/](https://guides.github.com/activities/contributing-to-open-source/) + +### Conventions + +#### Prefixing +Variables are prefixed using the standard setting in [abapOpenChecks Naming Conventions](http://docs.abapopenchecks.org/checks/69/) + +#### Downport +abapGit is targeted for version 702, so the code should only contain expressions/statements that works on 702. +[abaplint](https://abaplint.org) will automatically check every PR for language syntax that is not available on 702. + +#### Pretty Printer +Use pretty printer, keywords upper case + indentation, [abapOpenChecks](http://docs.abapopenchecks.org/checks/06/) can be used for checking this \ No newline at end of file diff --git a/docs/collections/_development/tests.md b/docs/collections/_development/tests.md new file mode 100644 index 000000000..8f33ec891 --- /dev/null +++ b/docs/collections/_development/tests.md @@ -0,0 +1,7 @@ +--- +title: Unit Tests +order: 70 +--- + +* Todo: Describe dependency lookup approach +* Todo: describe dangerous flag \ No newline at end of file From 45aa71f2da2992de2d573fbb1f0e872eac72edf3 Mon Sep 17 00:00:00 2001 From: larshp Date: Wed, 13 Jun 2018 17:28:56 +0200 Subject: [PATCH 078/136] interface for ZCL_ABAPGIT_REPO_SRV --- src/zcl_abapgit_repo_srv.clas.abap | 417 +++++++++++++---------------- src/zif_abapgit_repo_srv.intf.abap | 63 +++++ src/zif_abapgit_repo_srv.intf.xml | 16 ++ 3 files changed, 266 insertions(+), 230 deletions(-) create mode 100644 src/zif_abapgit_repo_srv.intf.abap create mode 100644 src/zif_abapgit_repo_srv.intf.xml diff --git a/src/zcl_abapgit_repo_srv.clas.abap b/src/zcl_abapgit_repo_srv.clas.abap index 826de4d5b..364ec5239 100644 --- a/src/zcl_abapgit_repo_srv.clas.abap +++ b/src/zcl_abapgit_repo_srv.clas.abap @@ -5,70 +5,23 @@ CLASS zcl_abapgit_repo_srv DEFINITION PUBLIC SECTION. + INTERFACES zif_abapgit_repo_srv . + CLASS-METHODS get_instance RETURNING - VALUE(rv_srv) TYPE REF TO zcl_abapgit_repo_srv . - METHODS list - RETURNING - VALUE(rt_list) TYPE zif_abapgit_definitions=>ty_repo_ref_tt - RAISING - zcx_abapgit_exception . - METHODS new_online - IMPORTING - !iv_url TYPE string - !iv_branch_name TYPE string - !iv_package TYPE devclass - RETURNING - VALUE(ro_repo) TYPE REF TO zcl_abapgit_repo_online - RAISING - zcx_abapgit_exception . - METHODS new_offline - IMPORTING - !iv_url TYPE string - !iv_package TYPE devclass - RETURNING - VALUE(ro_repo) TYPE REF TO zcl_abapgit_repo_offline - RAISING - zcx_abapgit_exception . - METHODS delete - IMPORTING - !io_repo TYPE REF TO zcl_abapgit_repo - RAISING - zcx_abapgit_exception . - METHODS get - IMPORTING - !iv_key TYPE zif_abapgit_persistence=>ty_value - RETURNING - VALUE(ro_repo) TYPE REF TO zcl_abapgit_repo - RAISING - zcx_abapgit_exception . - METHODS is_repo_installed - IMPORTING - !iv_url TYPE string - !iv_target_package TYPE devclass OPTIONAL - RETURNING - VALUE(rv_installed) TYPE abap_bool - RAISING - zcx_abapgit_exception . - METHODS switch_repo_type - IMPORTING - !iv_key TYPE zif_abapgit_persistence=>ty_value - !iv_offline TYPE abap_bool - RAISING - zcx_abapgit_exception . - METHODS validate_package - IMPORTING - !iv_package TYPE devclass - RAISING - zcx_abapgit_exception . - METHODS purge - IMPORTING - !io_repo TYPE REF TO zcl_abapgit_repo - RAISING - zcx_abapgit_exception . + VALUE(ri_srv) TYPE REF TO zif_abapgit_repo_srv . PRIVATE SECTION. - CLASS-DATA go_ref TYPE REF TO zcl_abapgit_repo_srv . + ALIASES delete + FOR zif_abapgit_repo_srv~delete . + ALIASES get + FOR zif_abapgit_repo_srv~get . + ALIASES list + FOR zif_abapgit_repo_srv~list . + ALIASES validate_package + FOR zif_abapgit_repo_srv~validate_package . + + CLASS-DATA gi_ref TYPE REF TO zif_abapgit_repo_srv . DATA mv_init TYPE abap_bool VALUE abap_false ##NO_TEXT. DATA mo_persistence TYPE REF TO zcl_abapgit_persistence_repo . DATA mt_list TYPE zif_abapgit_definitions=>ty_repo_ref_tt . @@ -116,79 +69,14 @@ CLASS ZCL_ABAPGIT_REPO_SRV IMPLEMENTATION. ENDMETHOD. "class_constructor - METHOD delete. - - io_repo->delete( ). - - DELETE TABLE mt_list FROM io_repo. - ASSERT sy-subrc = 0. - - ENDMETHOD. "delete - - - METHOD get. - - FIELD-SYMBOLS: LIKE LINE OF mt_list. - - - IF mv_init = abap_false. - refresh( ). - ENDIF. - - LOOP AT mt_list ASSIGNING . - IF ->get_key( ) = iv_key. - ro_repo = . - RETURN. - ENDIF. - ENDLOOP. - - zcx_abapgit_exception=>raise( 'repo not found, get' ). - - ENDMETHOD. "get - - METHOD get_instance. - IF go_ref IS INITIAL. - CREATE OBJECT go_ref. + IF gi_ref IS INITIAL. + CREATE OBJECT gi_ref TYPE zcl_abapgit_repo_srv. ENDIF. - rv_srv = go_ref. + ri_srv = gi_ref. ENDMETHOD. - METHOD is_repo_installed. - - DATA: lt_repo TYPE zif_abapgit_definitions=>ty_repo_ref_tt, - lo_repo TYPE REF TO zcl_abapgit_repo, - lv_url TYPE string, - lv_package TYPE devclass, - lo_repo_online TYPE REF TO zcl_abapgit_repo_online, - lv_err TYPE string. - - lt_repo = list( ). - - LOOP AT lt_repo INTO lo_repo. - CHECK lo_repo->is_offline( ) = abap_false. - lo_repo_online ?= lo_repo. - - lv_url = lo_repo_online->get_url( ). - lv_package = lo_repo_online->get_package( ). - CHECK to_upper( lv_url ) = to_upper( iv_url ). - - " Validate bindings - "TODO refactor: move this message out of this method - IF iv_target_package IS NOT INITIAL AND iv_target_package <> lv_package. - lv_err = |Installation to package { lv_package } detected. | - && |Cancelling installation|. - zcx_abapgit_exception=>raise( lv_err ). - ENDIF. - - rv_installed = abap_true. - EXIT. - ENDLOOP. - - ENDMETHOD. "is_repo_installed - - METHOD is_sap_object_allowed. rv_allowed = cl_enh_badi_def_utility=>is_sap_system( ). @@ -201,104 +89,6 @@ CLASS ZCL_ABAPGIT_REPO_SRV IMPLEMENTATION. ENDMETHOD. - METHOD list. - - IF mv_init = abap_false. - refresh( ). - ENDIF. - - rt_list = mt_list. - - ENDMETHOD. "list - - - METHOD new_offline. - - DATA: ls_repo TYPE zif_abapgit_persistence=>ty_repo, - lv_key TYPE zif_abapgit_persistence=>ty_repo-key. - - - validate_package( iv_package ). - - lv_key = mo_persistence->add( - iv_url = iv_url - iv_branch_name = '' - iv_package = iv_package - iv_offline = abap_true - is_dot_abapgit = zcl_abapgit_dot_abapgit=>build_default( )->get_data( ) ). - - TRY. - ls_repo = mo_persistence->read( lv_key ). - CATCH zcx_abapgit_not_found. - zcx_abapgit_exception=>raise( 'new_offline not found' ). - ENDTRY. - - CREATE OBJECT ro_repo - EXPORTING - is_data = ls_repo. - - add( ro_repo ). - - ENDMETHOD. "new_offline - - - METHOD new_online. - - DATA: ls_repo TYPE zif_abapgit_persistence=>ty_repo, - lv_key TYPE zif_abapgit_persistence=>ty_repo-key. - - - ASSERT NOT iv_url IS INITIAL - AND NOT iv_branch_name IS INITIAL - AND NOT iv_package IS INITIAL. - - validate_package( iv_package ). - zcl_abapgit_url=>validate( |{ iv_url }| ). - - lv_key = mo_persistence->add( - iv_url = iv_url - iv_branch_name = iv_branch_name - iv_package = iv_package - iv_offline = abap_false - is_dot_abapgit = zcl_abapgit_dot_abapgit=>build_default( )->get_data( ) ). - TRY. - ls_repo = mo_persistence->read( lv_key ). - CATCH zcx_abapgit_not_found. - zcx_abapgit_exception=>raise( 'new_online not found' ). - ENDTRY. - - CREATE OBJECT ro_repo - EXPORTING - is_data = ls_repo. - - add( ro_repo ). - - ro_repo->initialize( ). - ro_repo->find_remote_dot_abapgit( ). - - ENDMETHOD. "new_online - - - METHOD purge. - - DATA: lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt. - - - IF io_repo->get_local_settings( )-write_protected = abap_true. - zcx_abapgit_exception=>raise( 'Cannot purge. Local code is write-protected by repo config' ). - ELSEIF zcl_abapgit_auth=>is_allowed( zif_abapgit_auth=>gc_authorization-uninstall ) = abap_false. - zcx_abapgit_exception=>raise( 'Not authorized' ). - ENDIF. - - lt_tadir = zcl_abapgit_tadir=>read( io_repo->get_package( ) ). - - zcl_abapgit_objects=>delete( lt_tadir ). - - delete( io_repo ). - - ENDMETHOD. - - METHOD refresh. DATA: lt_list TYPE zif_abapgit_persistence=>tt_repo, @@ -330,7 +120,174 @@ CLASS ZCL_ABAPGIT_REPO_SRV IMPLEMENTATION. ENDMETHOD. "refresh - METHOD switch_repo_type. + METHOD zif_abapgit_repo_srv~delete. + + io_repo->delete( ). + + DELETE TABLE mt_list FROM io_repo. + ASSERT sy-subrc = 0. + + ENDMETHOD. + + + METHOD zif_abapgit_repo_srv~get. + + FIELD-SYMBOLS: LIKE LINE OF mt_list. + + + IF mv_init = abap_false. + refresh( ). + ENDIF. + + LOOP AT mt_list ASSIGNING . + IF ->get_key( ) = iv_key. + ro_repo = . + RETURN. + ENDIF. + ENDLOOP. + + zcx_abapgit_exception=>raise( 'repo not found, get' ). + + ENDMETHOD. + + + METHOD zif_abapgit_repo_srv~is_repo_installed. + + DATA: lt_repo TYPE zif_abapgit_definitions=>ty_repo_ref_tt, + lo_repo TYPE REF TO zcl_abapgit_repo, + lv_url TYPE string, + lv_package TYPE devclass, + lo_repo_online TYPE REF TO zcl_abapgit_repo_online, + lv_err TYPE string. + + lt_repo = list( ). + + LOOP AT lt_repo INTO lo_repo. + CHECK lo_repo->is_offline( ) = abap_false. + lo_repo_online ?= lo_repo. + + lv_url = lo_repo_online->get_url( ). + lv_package = lo_repo_online->get_package( ). + CHECK to_upper( lv_url ) = to_upper( iv_url ). + + " Validate bindings + "TODO refactor: move this message out of this method + IF iv_target_package IS NOT INITIAL AND iv_target_package <> lv_package. + lv_err = |Installation to package { lv_package } detected. | + && |Cancelling installation|. + zcx_abapgit_exception=>raise( lv_err ). + ENDIF. + + rv_installed = abap_true. + EXIT. + ENDLOOP. + + ENDMETHOD. + + + METHOD zif_abapgit_repo_srv~list. + + IF mv_init = abap_false. + refresh( ). + ENDIF. + + rt_list = mt_list. + + ENDMETHOD. + + + METHOD zif_abapgit_repo_srv~new_offline. + + DATA: ls_repo TYPE zif_abapgit_persistence=>ty_repo, + lv_key TYPE zif_abapgit_persistence=>ty_repo-key. + + + validate_package( iv_package ). + + lv_key = mo_persistence->add( + iv_url = iv_url + iv_branch_name = '' + iv_package = iv_package + iv_offline = abap_true + is_dot_abapgit = zcl_abapgit_dot_abapgit=>build_default( )->get_data( ) ). + + TRY. + ls_repo = mo_persistence->read( lv_key ). + CATCH zcx_abapgit_not_found. + zcx_abapgit_exception=>raise( 'new_offline not found' ). + ENDTRY. + + CREATE OBJECT ro_repo + EXPORTING + is_data = ls_repo. + + add( ro_repo ). + + ENDMETHOD. + + + METHOD zif_abapgit_repo_srv~new_online. + + DATA: ls_repo TYPE zif_abapgit_persistence=>ty_repo, + lv_key TYPE zif_abapgit_persistence=>ty_repo-key. + + + ASSERT NOT iv_url IS INITIAL + AND NOT iv_branch_name IS INITIAL + AND NOT iv_package IS INITIAL. + + validate_package( iv_package ). + zcl_abapgit_url=>validate( |{ iv_url }| ). + + lv_key = mo_persistence->add( + iv_url = iv_url + iv_branch_name = iv_branch_name + iv_package = iv_package + iv_offline = abap_false + is_dot_abapgit = zcl_abapgit_dot_abapgit=>build_default( )->get_data( ) ). + TRY. + ls_repo = mo_persistence->read( lv_key ). + CATCH zcx_abapgit_not_found. + zcx_abapgit_exception=>raise( 'new_online not found' ). + ENDTRY. + + CREATE OBJECT ro_repo + EXPORTING + is_data = ls_repo. + + add( ro_repo ). + + ro_repo->initialize( ). + ro_repo->find_remote_dot_abapgit( ). + + ENDMETHOD. + + + METHOD zif_abapgit_repo_srv~purge. + +* todo, this should be a method on the repo instead + + DATA: lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt. + + + IF io_repo->get_local_settings( )-write_protected = abap_true. + zcx_abapgit_exception=>raise( 'Cannot purge. Local code is write-protected by repo config' ). + ELSEIF zcl_abapgit_auth=>is_allowed( zif_abapgit_auth=>gc_authorization-uninstall ) = abap_false. + zcx_abapgit_exception=>raise( 'Not authorized' ). + ENDIF. + + lt_tadir = zcl_abapgit_tadir=>read( io_repo->get_package( ) ). + + zcl_abapgit_objects=>delete( lt_tadir ). + + delete( io_repo ). + + ENDMETHOD. + + + METHOD zif_abapgit_repo_srv~switch_repo_type. + +* todo, this should be a method on the repo instead? DATA lo_repo TYPE REF TO zcl_abapgit_repo. @@ -358,10 +315,10 @@ CLASS ZCL_ABAPGIT_REPO_SRV IMPLEMENTATION. is_data = lo_repo->ms_data. ENDIF. - ENDMETHOD. "switch_repo_type + ENDMETHOD. - METHOD validate_package. + METHOD zif_abapgit_repo_srv~validate_package. DATA: lv_as4user TYPE tdevc-as4user, lt_repos TYPE zif_abapgit_persistence=>tt_repo. @@ -393,5 +350,5 @@ CLASS ZCL_ABAPGIT_REPO_SRV IMPLEMENTATION. zcx_abapgit_exception=>raise( |Package { iv_package } already in use| ). ENDIF. - ENDMETHOD. "validate_package + ENDMETHOD. ENDCLASS. diff --git a/src/zif_abapgit_repo_srv.intf.abap b/src/zif_abapgit_repo_srv.intf.abap new file mode 100644 index 000000000..0ab89d978 --- /dev/null +++ b/src/zif_abapgit_repo_srv.intf.abap @@ -0,0 +1,63 @@ +INTERFACE zif_abapgit_repo_srv + PUBLIC . + + + METHODS delete + IMPORTING + !io_repo TYPE REF TO zcl_abapgit_repo + RAISING + zcx_abapgit_exception . + METHODS get + IMPORTING + !iv_key TYPE zif_abapgit_persistence=>ty_value + RETURNING + VALUE(ro_repo) TYPE REF TO zcl_abapgit_repo + RAISING + zcx_abapgit_exception . + METHODS is_repo_installed + IMPORTING + !iv_url TYPE string + !iv_target_package TYPE devclass OPTIONAL + RETURNING + VALUE(rv_installed) TYPE abap_bool + RAISING + zcx_abapgit_exception . + METHODS list + RETURNING + VALUE(rt_list) TYPE zif_abapgit_definitions=>ty_repo_ref_tt + RAISING + zcx_abapgit_exception . + METHODS new_offline + IMPORTING + !iv_url TYPE string + !iv_package TYPE devclass + RETURNING + VALUE(ro_repo) TYPE REF TO zcl_abapgit_repo_offline + RAISING + zcx_abapgit_exception . + METHODS new_online + IMPORTING + !iv_url TYPE string + !iv_branch_name TYPE string + !iv_package TYPE devclass + RETURNING + VALUE(ro_repo) TYPE REF TO zcl_abapgit_repo_online + RAISING + zcx_abapgit_exception . + METHODS purge + IMPORTING + !io_repo TYPE REF TO zcl_abapgit_repo + RAISING + zcx_abapgit_exception . + METHODS switch_repo_type + IMPORTING + !iv_key TYPE zif_abapgit_persistence=>ty_value + !iv_offline TYPE abap_bool + RAISING + zcx_abapgit_exception . + METHODS validate_package + IMPORTING + !iv_package TYPE devclass + RAISING + zcx_abapgit_exception . +ENDINTERFACE. diff --git a/src/zif_abapgit_repo_srv.intf.xml b/src/zif_abapgit_repo_srv.intf.xml new file mode 100644 index 000000000..c893add86 --- /dev/null +++ b/src/zif_abapgit_repo_srv.intf.xml @@ -0,0 +1,16 @@ + + + + + + ZIF_ABAPGIT_REPO_SRV + 1 + E + Repo services + 2 + 1 + X + + + + From a8fb4d47a4bd039c8bd8349b69e1e1c1183fb96d Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Wed, 13 Jun 2018 19:08:12 +0200 Subject: [PATCH 079/136] docs, rephrase --- docs/collections/_development/guidelines.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/collections/_development/guidelines.md b/docs/collections/_development/guidelines.md index 7bfc673c3..d860140e6 100644 --- a/docs/collections/_development/guidelines.md +++ b/docs/collections/_development/guidelines.md @@ -5,7 +5,7 @@ order: 10 ### Practical -* Make sure there is an open issue for the stuff that you want to work on. When starting the development add a comment in the issue. This will allow for discussing possible solutions, and avoid having multiple people look into the same issue. +* For non-tivial changes make sure there is an open issue. When starting the development add a comment in the issue. This will allow for discussing possible solutions, and avoid having multiple people look into the same issue. * Keep the commits/PR as small as possible, try not to fix multiple issues in one commit/PR if possible. Smaller changes are easier to review, and are more likely to be accepted. @@ -24,4 +24,4 @@ abapGit is targeted for version 702, so the code should only contain expressions [abaplint](https://abaplint.org) will automatically check every PR for language syntax that is not available on 702. #### Pretty Printer -Use pretty printer, keywords upper case + indentation, [abapOpenChecks](http://docs.abapopenchecks.org/checks/06/) can be used for checking this \ No newline at end of file +Use pretty printer, keywords upper case + indentation, [abapOpenChecks](http://docs.abapopenchecks.org/checks/06/) can be used for checking this From a38d9feaffe18d23677d2571e3c894b3d07280f3 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Wed, 13 Jun 2018 19:15:53 +0000 Subject: [PATCH 080/136] Pass log object to user exit method change_tadir --- src/zcl_abapgit_exit.clas.abap | 1 + src/zcl_abapgit_tadir.clas.abap | 1 + src/zif_abapgit_exit.intf.abap | 1 + 3 files changed, 3 insertions(+) diff --git a/src/zcl_abapgit_exit.clas.abap b/src/zcl_abapgit_exit.clas.abap index c7b939ecd..7f4205d8a 100644 --- a/src/zcl_abapgit_exit.clas.abap +++ b/src/zcl_abapgit_exit.clas.abap @@ -108,6 +108,7 @@ CLASS zcl_abapgit_exit IMPLEMENTATION. gi_exit->change_tadir( EXPORTING iv_package = iv_package + io_log = io_log CHANGING ct_tadir = ct_tadir ). CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method. diff --git a/src/zcl_abapgit_tadir.clas.abap b/src/zcl_abapgit_tadir.clas.abap index c43dbb9d4..e0d200947 100644 --- a/src/zcl_abapgit_tadir.clas.abap +++ b/src/zcl_abapgit_tadir.clas.abap @@ -250,6 +250,7 @@ CLASS zcl_abapgit_tadir IMPLEMENTATION. zcl_abapgit_exit=>get_instance( )->change_tadir( EXPORTING iv_package = iv_package + io_log = io_log CHANGING ct_tadir = rt_tadir ). diff --git a/src/zif_abapgit_exit.intf.abap b/src/zif_abapgit_exit.intf.abap index 1918e8adf..202b03e7e 100644 --- a/src/zif_abapgit_exit.intf.abap +++ b/src/zif_abapgit_exit.intf.abap @@ -32,6 +32,7 @@ INTERFACE zif_abapgit_exit PUBLIC. change_tadir IMPORTING iv_package TYPE devclass + io_log TYPE REF TO zcl_abapgit_log CHANGING ct_tadir TYPE ty_tadir_tt. From ce89e75eb91004059625d44b109ff15ceb335b7f Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Wed, 13 Jun 2018 19:39:35 +0000 Subject: [PATCH 081/136] SSFO deserialization: catch cx_ssf_fb --- src/objects/zcl_abapgit_object_ssfo.clas.abap | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/objects/zcl_abapgit_object_ssfo.clas.abap b/src/objects/zcl_abapgit_object_ssfo.clas.abap index 7645c09d0..4b0c589a8 100644 --- a/src/objects/zcl_abapgit_object_ssfo.clas.abap +++ b/src/objects/zcl_abapgit_object_ssfo.clas.abap @@ -225,7 +225,9 @@ CLASS zcl_abapgit_object_ssfo IMPLEMENTATION. lv_name TYPE string, li_iterator TYPE REF TO if_ixml_node_iterator, lo_sf TYPE REF TO cl_ssf_fb_smart_form, - lo_res TYPE REF TO cl_ssf_fb_smart_form. + lo_res TYPE REF TO cl_ssf_fb_smart_form, + lx_error TYPE REF TO cx_ssf_fb, + lv_text TYPE string. CREATE OBJECT lo_sf. @@ -252,21 +254,28 @@ CLASS zcl_abapgit_object_ssfo IMPLEMENTATION. tadir_insert( iv_package ). lv_formname = ms_item-obj_name. - lo_sf->enqueue( suppress_corr_check = space - master_language = mv_language - mode = 'INSERT' - formname = lv_formname ). - lo_sf->xml_upload( EXPORTING dom = io_xml->get_raw( )->get_root_element( ) - formname = lv_formname - language = mv_language - CHANGING sform = lo_res ). + TRY. + lo_sf->enqueue( suppress_corr_check = space + master_language = mv_language + mode = 'INSERT' + formname = lv_formname ). - lo_res->store( im_formname = lo_res->header-formname - im_language = mv_language - im_active = abap_true ). + lo_sf->xml_upload( EXPORTING dom = io_xml->get_raw( )->get_root_element( ) + formname = lv_formname + language = mv_language + CHANGING sform = lo_res ). - lo_sf->dequeue( lv_formname ). + lo_res->store( im_formname = lo_res->header-formname + im_language = mv_language + im_active = abap_true ). + + lo_sf->dequeue( lv_formname ). + + CATCH cx_ssf_fb INTO lx_error. + lv_text = lx_error->get_text( ). + zcx_abapgit_exception=>raise( |{ ms_item-obj_type } { ms_item-obj_name }: { lv_text } | ). + ENDTRY. ENDMETHOD. "deserialize From eec7a7d096363effe1c6fc5ff039f3ca5e74db8d Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Thu, 14 Jun 2018 08:13:37 +0200 Subject: [PATCH 082/136] refactor file status unit tests (#1499) * refactor file status unit tests one method per check tests in ltcl_file_status2 now successful * more tests add helper class --- ..._abapgit_file_status.clas.testclasses.abap | 278 ++++++++++++++---- 1 file changed, 214 insertions(+), 64 deletions(-) diff --git a/src/zcl_abapgit_file_status.clas.testclasses.abap b/src/zcl_abapgit_file_status.clas.testclasses.abap index a2d34d26a..b042513f4 100644 --- a/src/zcl_abapgit_file_status.clas.testclasses.abap +++ b/src/zcl_abapgit_file_status.clas.testclasses.abap @@ -26,7 +26,7 @@ DEFINE _append_remote. END-OF-DEFINITION. DEFINE _append_result. - APPEND INITIAL LINE TO lt_results ASSIGNING . + APPEND INITIAL LINE TO mt_results ASSIGNING . -obj_type = &1. -obj_name = &2. -match = &3. @@ -40,11 +40,12 @@ END-OF-DEFINITION. CLASS ltcl_file_status DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. - PUBLIC SECTION. - METHODS calculate_status FOR TESTING - RAISING zcx_abapgit_exception. + PRIVATE SECTION. + DATA: mt_results TYPE zif_abapgit_definitions=>ty_results_tt. -ENDCLASS. "ltcl_file_status + METHODS: calculate_status FOR TESTING RAISING zcx_abapgit_exception. + +ENDCLASS. CLASS ltcl_file_status IMPLEMENTATION. @@ -53,15 +54,15 @@ CLASS ltcl_file_status IMPLEMENTATION. DATA: lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt, lt_remote TYPE zif_abapgit_definitions=>ty_files_tt, lt_state TYPE zif_abapgit_definitions=>ty_file_signatures_tt, - lt_results TYPE zif_abapgit_definitions=>ty_results_tt, lt_results_exp TYPE zif_abapgit_definitions=>ty_results_tt, lo_dot TYPE REF TO zcl_abapgit_dot_abapgit. FIELD-SYMBOLS: LIKE LINE OF lt_local, LIKE LINE OF lt_remote, - LIKE LINE OF lt_results, + LIKE LINE OF mt_results, LIKE LINE OF lt_state. + "STATE FILE SHA1 _append_state '$$zclass1.clas.xml' 'C1_F1'. " class1 testclasses is new locally, abap is new remotely @@ -125,11 +126,11 @@ CLASS ltcl_file_status IMPLEMENTATION. _append_result 'DOMA' '$$ZDOMA9' ' ' 'D' ' ' '' '/' '$$zdoma9.doma.xml'. _append_result 'DOMA' 'NUM01' ' ' ' ' 'M' 'SUTI' '/' 'num01.doma.xml'. _append_result 'DOMA' 'XFELD' 'X' ' ' ' ' 'SUTI' '/' 'xfeld.doma.xml'. - lt_results_exp = lt_results. + lt_results_exp = mt_results. lo_dot = zcl_abapgit_dot_abapgit=>build_default( ). - lt_results = zcl_abapgit_file_status=>calculate_status( + mt_results = zcl_abapgit_file_status=>calculate_status( iv_devclass = '$Z$' io_dot = lo_dot it_local = lt_local @@ -137,56 +138,74 @@ CLASS ltcl_file_status IMPLEMENTATION. it_cur_state = lt_state ). cl_abap_unit_assert=>assert_equals( - act = lt_results + act = mt_results exp = lt_results_exp ). - ENDMETHOD. "calculate_status + ENDMETHOD. -ENDCLASS. "ltcl_file_status +ENDCLASS. -CLASS ltcl_file_status2 DEFINITION DEFERRED. -CLASS zcl_abapgit_file_status DEFINITION LOCAL FRIENDS ltcl_file_status2. +CLASS ltcl_run_checks DEFINITION DEFERRED. +CLASS zcl_abapgit_file_status DEFINITION LOCAL FRIENDS ltcl_run_checks. -CLASS ltcl_file_status2 DEFINITION FOR TESTING RISK LEVEL HARMLESS +CLASS ltcl_run_checks DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. - PUBLIC SECTION. - METHODS check FOR TESTING RAISING zcx_abapgit_exception. + PRIVATE SECTION. + DATA: mt_results TYPE zif_abapgit_definitions=>ty_results_tt, + mo_dot TYPE REF TO zcl_abapgit_dot_abapgit, + mo_log TYPE REF TO zcl_abapgit_log. -ENDCLASS. "ltcl_sap_package + METHODS: + setup, + positive FOR TESTING RAISING zcx_abapgit_exception, + neg_diff_path_for_same_obj FOR TESTING RAISING zcx_abapgit_exception, + neg_incorrect_path_vs_pack FOR TESTING RAISING zcx_abapgit_exception, + neg_similar_filenames FOR TESTING RAISING zcx_abapgit_exception, + neg_empty_filenames FOR TESTING RAISING zcx_abapgit_exception. -CLASS ltcl_file_status2 IMPLEMENTATION. +ENDCLASS. - METHOD check. +CLASS ltcl_run_checks IMPLEMENTATION. - DATA: lt_results TYPE zif_abapgit_definitions=>ty_results_tt, - lo_log TYPE REF TO zcl_abapgit_log. + METHOD setup. - FIELD-SYMBOLS: LIKE LINE OF lt_results. + CREATE OBJECT mo_log. + + mo_dot = zcl_abapgit_dot_abapgit=>build_default( ). + mo_dot->set_starting_folder( '/' ). + + ENDMETHOD. + + METHOD positive. *** 0 Positive - CLEAR lt_results. - CREATE OBJECT lo_log. + FIELD-SYMBOLS: LIKE LINE OF mt_results. + "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE _append_result 'CLAS' 'ZCLASS1' ' ' ' ' 'A' '$Z$' '/' 'zclass1.clas.abap'. _append_result 'CLAS' 'ZCLASS1' 'X' ' ' ' ' '$Z$' '/' 'zclass1.clas.xml'. _append_result 'DOMA' 'ZDOMA1' 'X' ' ' ' ' '$Z$' '/' 'zdoma1.doma.xml'. _append_result 'DOMA' 'ZDOMA2' ' ' 'M' ' ' '$Z$' '/' 'zdoma2.doma.xml'. - zcl_abapgit_file_status=>run_checks( io_log = lo_log - it_results = lt_results - io_dot = zcl_abapgit_dot_abapgit=>build_default( ) - iv_top = '$Z$' ). + zcl_abapgit_file_status=>run_checks( + io_log = mo_log + it_results = mt_results + io_dot = mo_dot + iv_top = '$Z$' ). cl_abap_unit_assert=>assert_equals( - act = lo_log->count( ) + act = mo_log->count( ) exp = 0 ). + ENDMETHOD. + + METHOD neg_diff_path_for_same_obj. + *** 1 Negative, different path for same object - CLEAR lt_results. - CREATE OBJECT lo_log. + FIELD-SYMBOLS: LIKE LINE OF mt_results. "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE _append_result 'CLAS' 'ZCLASS1' ' ' ' ' 'A' '$Z$' '/' 'zclass1.clas.abap'. @@ -194,24 +213,28 @@ CLASS ltcl_file_status2 IMPLEMENTATION. _append_result 'DOMA' 'ZDOMA1' 'X' ' ' ' ' '$Z$' '/' 'zdoma1.doma.xml'. _append_result 'DOMA' 'ZDOMA2' ' ' 'M' ' ' '$Z$' '/' 'zdoma2.doma.xml'. - zcl_abapgit_file_status=>run_checks( io_log = lo_log - it_results = lt_results - io_dot = zcl_abapgit_dot_abapgit=>build_default( ) - iv_top = '$Z$' ). + zcl_abapgit_file_status=>run_checks( + io_log = mo_log + it_results = mt_results + io_dot = mo_dot + iv_top = '$Z$' ). " This one is not pure - incorrect path also triggers path vs package check cl_abap_unit_assert=>assert_equals( - act = lo_log->count( ) + act = mo_log->count( ) exp = 2 ). cl_abap_unit_assert=>assert_equals( - act = lo_log->has_rc( '1' ) + act = mo_log->has_rc( '1' ) exp = abap_true ). + ENDMETHOD. + + METHOD neg_incorrect_path_vs_pack. + *** 2 Negative, incorrect path vs package - CLEAR lt_results. - CREATE OBJECT lo_log. + FIELD-SYMBOLS: LIKE LINE OF mt_results. "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE _append_result 'CLAS' '$$ZCLASS1' ' ' ' ' 'A' '$Z$' '/' '$$zclass1.clas.abap'. @@ -219,23 +242,27 @@ CLASS ltcl_file_status2 IMPLEMENTATION. _append_result 'DOMA' '$$ZDOMA1' 'X' ' ' ' ' '$Z$' '/sub' '$$zdoma1.doma.xml'. _append_result 'DOMA' '$$ZDOMA2' ' ' 'M' ' ' '$Z$' '/' '$$zdoma2.doma.xml'. - zcl_abapgit_file_status=>run_checks( io_log = lo_log - it_results = lt_results - io_dot = zcl_abapgit_dot_abapgit=>build_default( ) - iv_top = '$Z$' ). + zcl_abapgit_file_status=>run_checks( + io_log = mo_log + it_results = mt_results + io_dot = mo_dot + iv_top = '$Z$' ). cl_abap_unit_assert=>assert_equals( - act = lo_log->count( ) + act = mo_log->count( ) exp = 1 ). cl_abap_unit_assert=>assert_equals( - act = lo_log->has_rc( '2' ) + act = mo_log->has_rc( '2' ) exp = abap_true ). + ENDMETHOD. + + METHOD neg_similar_filenames. + *** 3 Negative, similar filenames - CLEAR lt_results. - CREATE OBJECT lo_log. + FIELD-SYMBOLS: LIKE LINE OF mt_results. "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE _append_result 'CLAS' '$$ZCLASS1' ' ' ' ' 'A' '$Z$' '/' '$$zclass1.clas.abap'. @@ -243,42 +270,165 @@ CLASS ltcl_file_status2 IMPLEMENTATION. _append_result 'DOMA' '$$ZDOMA1' 'X' ' ' ' ' '$Z$' '/' '$$zdoma1.doma.xml'. _append_result 'DOMA' '$$ZDOMA2' ' ' 'M' ' ' '$Z$' '/' '$$zdoma1.doma.xml'. - zcl_abapgit_file_status=>run_checks( io_log = lo_log - it_results = lt_results - io_dot = zcl_abapgit_dot_abapgit=>build_default( ) - iv_top = '$Z$' ). + zcl_abapgit_file_status=>run_checks( + io_log = mo_log + it_results = mt_results + io_dot = mo_dot + iv_top = '$Z$' ). cl_abap_unit_assert=>assert_equals( - act = lo_log->count( ) + act = mo_log->count( ) exp = 1 ). cl_abap_unit_assert=>assert_equals( - act = lo_log->has_rc( '3' ) + act = mo_log->has_rc( '3' ) exp = abap_true ). + ENDMETHOD. + + METHOD neg_empty_filenames. + *** 4 Negative, empty filenames - CLEAR lt_results. - CREATE OBJECT lo_log. + FIELD-SYMBOLS: LIKE LINE OF mt_results. "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE _append_result 'CLAS' '$$ZCLASS1' ' ' ' ' 'A' '$Z$' '/' '$$zclass1.clas.abap'. _append_result 'CLAS' '$$ZCLASS1' 'X' ' ' ' ' '$Z$' '/' '$$zclass1.clas.xml'. _append_result 'DOMA' '$$ZDOMA1' 'X' ' ' ' ' '$Z$' '/' ''. - zcl_abapgit_file_status=>run_checks( io_log = lo_log - it_results = lt_results - io_dot = zcl_abapgit_dot_abapgit=>build_default( ) - iv_top = '$Z$' ). + zcl_abapgit_file_status=>run_checks( + io_log = mo_log + it_results = mt_results + io_dot = mo_dot + iv_top = '$Z$' ). cl_abap_unit_assert=>assert_equals( - act = lo_log->count( ) + act = mo_log->count( ) exp = 1 ). cl_abap_unit_assert=>assert_equals( - act = lo_log->has_rc( '4' ) + act = mo_log->has_rc( '4' ) exp = abap_true ). - ENDMETHOD. " check. + ENDMETHOD. -ENDCLASS. "ltcl_sap_package +ENDCLASS. + +CLASS ltcl_status_helper DEFINITION DEFERRED. +CLASS zcl_abapgit_file_status DEFINITION LOCAL FRIENDS ltcl_status_helper. + +CLASS ltcl_status_helper DEFINITION. + + PUBLIC SECTION. + METHODS: + add_remote + IMPORTING + iv_path TYPE string DEFAULT '/' + iv_filename TYPE string + iv_sha1 TYPE zif_abapgit_definitions=>ty_sha1, + add_local, + add_state, + run + RETURNING VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt + RAISING zcx_abapgit_exception. + + PRIVATE SECTION. + + DATA: mt_local TYPE zif_abapgit_definitions=>ty_files_item_tt, + mt_remote TYPE zif_abapgit_definitions=>ty_files_tt, + mt_state TYPE zif_abapgit_definitions=>ty_file_signatures_tt. + +ENDCLASS. + +CLASS ltcl_status_helper IMPLEMENTATION. + + METHOD add_remote. + + FIELD-SYMBOLS: LIKE LINE OF mt_remote. + + APPEND INITIAL LINE TO mt_remote ASSIGNING . + -path = iv_path. + -filename = iv_filename. + -sha1 = iv_sha1. + + ENDMETHOD. + + METHOD add_local. + + FIELD-SYMBOLS: LIKE LINE OF mt_local. + +* todo + ENDMETHOD. + + METHOD add_state. + + FIELD-SYMBOLS: LIKE LINE OF mt_state. +* todo + ENDMETHOD. + + METHOD run. + + DATA: lo_dot TYPE REF TO zcl_abapgit_dot_abapgit. + + lo_dot = zcl_abapgit_dot_abapgit=>build_default( ). + + rt_results = zcl_abapgit_file_status=>calculate_status( + iv_devclass = '$Z$' + io_dot = lo_dot + it_local = mt_local + it_remote = mt_remote + it_cur_state = mt_state ). + + ENDMETHOD. + +ENDCLASS. + +CLASS ltcl_calculate_status DEFINITION DEFERRED. +CLASS zcl_abapgit_file_status DEFINITION LOCAL FRIENDS ltcl_calculate_status. + +CLASS ltcl_calculate_status DEFINITION FOR TESTING RISK LEVEL HARMLESS + DURATION SHORT FINAL. + + PRIVATE SECTION. + DATA: + mt_results TYPE zif_abapgit_definitions=>ty_results_tt, + ms_result LIKE LINE OF mt_results, + mo_helper TYPE REF TO ltcl_status_helper. + + METHODS: + setup, + test1 FOR TESTING RAISING zcx_abapgit_exception. + +ENDCLASS. + +CLASS ltcl_calculate_status IMPLEMENTATION. + + METHOD setup. + + CREATE OBJECT mo_helper. + + ENDMETHOD. + + METHOD test1. + + mo_helper->add_remote( + iv_filename = '$$zdoma1.doma.xml' + iv_sha1 = 'D1' ). + + mt_results = mo_helper->run( ). + + cl_abap_unit_assert=>assert_equals( + act = lines( mt_results ) + exp = 1 ). + + READ TABLE mt_results INDEX 1 INTO ms_result. + cl_abap_unit_assert=>assert_subrc( ). + + cl_abap_unit_assert=>assert_equals( + act = ms_result-rstate + exp = zif_abapgit_definitions=>gc_state-added ). + + ENDMETHOD. + +ENDCLASS. From 7b9578a11b91c9cab8898e1277f9ed6d43d5bdb6 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Thu, 14 Jun 2018 18:25:00 +0000 Subject: [PATCH 083/136] implement missing interface methods --- src/zcl_abapgit_folder_logic.clas.testclasses.abap | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/zcl_abapgit_folder_logic.clas.testclasses.abap b/src/zcl_abapgit_folder_logic.clas.testclasses.abap index de6360707..1e85621a3 100644 --- a/src/zcl_abapgit_folder_logic.clas.testclasses.abap +++ b/src/zcl_abapgit_folder_logic.clas.testclasses.abap @@ -165,6 +165,10 @@ CLASS ltcl_folder_logic IMPLEMENTATION. iv_path = '/src/top_foo/' ). ENDMETHOD. + METHOD zif_abapgit_sap_package~get_transport_type. + RETURN. + ENDMETHOD. + ENDCLASS. CLASS ltcl_folder_logic_namespaces DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. @@ -212,6 +216,10 @@ CLASS ltcl_folder_logic_namespaces IMPLEMENTATION. rv_bool = abap_true. ENDMETHOD. + METHOD zif_abapgit_sap_package~get_transport_type. + RETURN. + ENDMETHOD. + METHOD setup. FIELD-SYMBOLS: LIKE LINE OF zcl_abapgit_sap_package=>gt_injected. From 6a9acb8a1be526b8000784139034922112bbe937 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Sun, 10 Jun 2018 16:24:44 +0000 Subject: [PATCH 084/136] add injector class --- src/zcl_abapgit_factory.clas.abap | 25 ++--- src/zcl_abapgit_factory.clas.xml | 1 - src/zcl_abapgit_injector.clas.abap | 24 +++++ ...zcl_abapgit_injector.clas.testclasses.abap | 93 +++++++++++++++++++ src/zcl_abapgit_injector.clas.xml | 19 ++++ src/zcl_abapgit_tadir.clas.abap | 7 +- src/zcl_abapgit_tadir.clas.xml | 1 - 7 files changed, 153 insertions(+), 17 deletions(-) create mode 100644 src/zcl_abapgit_injector.clas.abap create mode 100644 src/zcl_abapgit_injector.clas.testclasses.abap create mode 100644 src/zcl_abapgit_injector.clas.xml diff --git a/src/zcl_abapgit_factory.clas.abap b/src/zcl_abapgit_factory.clas.abap index 466248785..be4fd03f0 100644 --- a/src/zcl_abapgit_factory.clas.abap +++ b/src/zcl_abapgit_factory.clas.abap @@ -1,30 +1,33 @@ CLASS zcl_abapgit_factory DEFINITION PUBLIC - CREATE PUBLIC . + CREATE PRIVATE + GLOBAL FRIENDS zcl_abapgit_injector. PUBLIC SECTION. - CLASS-DATA gi_tadir TYPE REF TO zif_abapgit_tadir . + CLASS-METHODS: + get_tadir + RETURNING + VALUE(ri_tadir) TYPE REF TO zif_abapgit_tadir. - CLASS-METHODS get_tadir - RETURNING - VALUE(ri_tadir) TYPE REF TO zif_abapgit_tadir . - PROTECTED SECTION. PRIVATE SECTION. + CLASS-DATA: + mi_tadir TYPE REF TO zif_abapgit_tadir. + ENDCLASS. -CLASS ZCL_ABAPGIT_FACTORY IMPLEMENTATION. - +CLASS zcl_abapgit_factory IMPLEMENTATION. METHOD get_tadir. - IF gi_tadir IS INITIAL. - CREATE OBJECT gi_tadir TYPE zcl_abapgit_tadir. + IF mi_tadir IS INITIAL. + CREATE OBJECT mi_tadir TYPE zcl_abapgit_tadir. ENDIF. - ri_tadir = gi_tadir. + ri_tadir = mi_tadir. ENDMETHOD. + ENDCLASS. diff --git a/src/zcl_abapgit_factory.clas.xml b/src/zcl_abapgit_factory.clas.xml index b92211da3..a8cd80d72 100644 --- a/src/zcl_abapgit_factory.clas.xml +++ b/src/zcl_abapgit_factory.clas.xml @@ -7,7 +7,6 @@ 1 E Factory - 2 1 X X diff --git a/src/zcl_abapgit_injector.clas.abap b/src/zcl_abapgit_injector.clas.abap new file mode 100644 index 000000000..7f3ba3ca8 --- /dev/null +++ b/src/zcl_abapgit_injector.clas.abap @@ -0,0 +1,24 @@ +CLASS zcl_abapgit_injector DEFINITION + PUBLIC + CREATE PRIVATE + FOR TESTING . + + PUBLIC SECTION. + + CLASS-METHODS set_tadir + IMPORTING + !ii_tadir TYPE REF TO zif_abapgit_tadir . + +ENDCLASS. + + + +CLASS zcl_abapgit_injector IMPLEMENTATION. + + METHOD set_tadir. + + zcl_abapgit_factory=>mi_tadir = ii_tadir. + + ENDMETHOD. + +ENDCLASS. diff --git a/src/zcl_abapgit_injector.clas.testclasses.abap b/src/zcl_abapgit_injector.clas.testclasses.abap new file mode 100644 index 000000000..28bb3a47d --- /dev/null +++ b/src/zcl_abapgit_injector.clas.testclasses.abap @@ -0,0 +1,93 @@ +*"* use this source file for your ABAP unit test classes + +CLASS ltd_abapgit_tadir_mock DEFINITION. + + PUBLIC SECTION. + INTERFACES: zif_abapgit_tadir. + +ENDCLASS. + +CLASS no_dependency_injection DEFINITION FOR TESTING + RISK LEVEL HARMLESS + DURATION SHORT. + + PRIVATE SECTION. + METHODS: + no_injection FOR TESTING RAISING cx_static_check. + +ENDCLASS. + +CLASS simple_dependency_injection DEFINITION FOR TESTING + RISK LEVEL HARMLESS + DURATION SHORT. + + PRIVATE SECTION. + METHODS: + setup, + simple_injection FOR TESTING RAISING cx_static_check. + +ENDCLASS. + +CLASS ltd_abapgit_tadir_mock IMPLEMENTATION. + + METHOD zif_abapgit_tadir~get_object_package. + + ENDMETHOD. + + METHOD zif_abapgit_tadir~read. + + ENDMETHOD. + + METHOD zif_abapgit_tadir~read_single. + + ENDMETHOD. + +ENDCLASS. + +CLASS no_dependency_injection IMPLEMENTATION. + + METHOD no_injection. + + DATA: lo_tadir TYPE REF TO zif_abapgit_tadir, + lo_class_descr TYPE REF TO cl_abap_classdescr. + + lo_tadir = zcl_abapgit_factory=>get_tadir( ). + + lo_class_descr ?= cl_abap_classdescr=>describe_by_object_ref( lo_tadir ). + + cl_abap_unit_assert=>assert_equals( + exp = '\CLASS=ZCL_ABAPGIT_TADIR' + act = lo_class_descr->absolute_name ). + + ENDMETHOD. + +ENDCLASS. + +CLASS simple_dependency_injection IMPLEMENTATION. + + METHOD setup. + + DATA: lo_tadir_mock TYPE REF TO ltd_abapgit_tadir_mock. + + CREATE OBJECT lo_tadir_mock. + + zcl_abapgit_injector=>set_tadir( lo_tadir_mock ). + + ENDMETHOD. + + METHOD simple_injection. + + DATA: lo_tadir TYPE REF TO zif_abapgit_tadir, + lo_class_descr TYPE REF TO cl_abap_classdescr. + + lo_tadir = zcl_abapgit_factory=>get_tadir( ). + + lo_class_descr ?= cl_abap_classdescr=>describe_by_object_ref( lo_tadir ). + + cl_abap_unit_assert=>assert_equals( + exp = '\CLASS-POOL=ZCL_ABAPGIT_INJECTOR\CLASS=LTD_ABAPGIT_TADIR_MOCK' + act = lo_class_descr->absolute_name ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/zcl_abapgit_injector.clas.xml b/src/zcl_abapgit_injector.clas.xml new file mode 100644 index 000000000..8e632aa21 --- /dev/null +++ b/src/zcl_abapgit_injector.clas.xml @@ -0,0 +1,19 @@ + + + + + + ZCL_ABAPGIT_INJECTOR + 1 + E + abapGit injector + 05 + 1 + X + X + X + X + + + + diff --git a/src/zcl_abapgit_tadir.clas.abap b/src/zcl_abapgit_tadir.clas.abap index 0bc91e958..69ddd1218 100644 --- a/src/zcl_abapgit_tadir.clas.abap +++ b/src/zcl_abapgit_tadir.clas.abap @@ -1,13 +1,12 @@ CLASS zcl_abapgit_tadir DEFINITION PUBLIC FINAL - CREATE PUBLIC - + CREATE PRIVATE GLOBAL FRIENDS zcl_abapgit_factory . PUBLIC SECTION. - INTERFACES zif_abapgit_tadir . + PRIVATE SECTION. METHODS exists @@ -38,7 +37,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_TADIR IMPLEMENTATION. +CLASS zcl_abapgit_tadir IMPLEMENTATION. METHOD build. diff --git a/src/zcl_abapgit_tadir.clas.xml b/src/zcl_abapgit_tadir.clas.xml index 8c7c92231..e556c16a2 100644 --- a/src/zcl_abapgit_tadir.clas.xml +++ b/src/zcl_abapgit_tadir.clas.xml @@ -7,7 +7,6 @@ 1 E TADIR access - 2 1 X X From 9352ddbf3f9e991325ca26028735c05a22b67f1e Mon Sep 17 00:00:00 2001 From: larshp Date: Fri, 15 Jun 2018 07:29:13 +0000 Subject: [PATCH 085/136] SEO_CS_CACHE downport #1414 --- src/objects/zcl_abapgit_oo_class_new.clas.abap | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/objects/zcl_abapgit_oo_class_new.clas.abap b/src/objects/zcl_abapgit_oo_class_new.clas.abap index ca2fcb7cf..db811cc1f 100644 --- a/src/objects/zcl_abapgit_oo_class_new.clas.abap +++ b/src/objects/zcl_abapgit_oo_class_new.clas.abap @@ -180,7 +180,13 @@ CLASS ZCL_ABAPGIT_OO_CLASS_NEW IMPLEMENTATION. TYPE any. - CREATE DATA lr_cache_entry TYPE ('SEO_CS_CACHE'). + TRY. + CREATE DATA lr_cache_entry TYPE ('SEO_CS_CACHE'). + CATCH cx_sy_create_data_error. +* does not exist in some older systems + RETURN. + ENDTRY. + ASSIGN lr_cache_entry->* TO . ASSERT sy-subrc = 0. From d8a5f395ea287548679f03b9f7e1d8b8d81bdaac Mon Sep 17 00:00:00 2001 From: larshp Date: Fri, 15 Jun 2018 08:12:42 +0000 Subject: [PATCH 086/136] TABL: consider DD12L in changed_by #1502 --- src/objects/zcl_abapgit_object_tabl.clas.abap | 40 ++++++++++++++----- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/src/objects/zcl_abapgit_object_tabl.clas.abap b/src/objects/zcl_abapgit_object_tabl.clas.abap index f5eff19b5..6fda867cf 100644 --- a/src/objects/zcl_abapgit_object_tabl.clas.abap +++ b/src/objects/zcl_abapgit_object_tabl.clas.abap @@ -13,26 +13,44 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION. METHOD zif_abapgit_object~changed_by. - DATA: lv_as4date TYPE dd02l-as4date, - lv_as4time TYPE dd02l-as4time. + TYPES: BEGIN OF ty_data, + as4user TYPE as4user, + as4date TYPE as4date, + as4time TYPE as4time, + END OF ty_data. + + DATA: lt_data TYPE STANDARD TABLE OF ty_data WITH DEFAULT KEY, + ls_data LIKE LINE OF lt_data. - SELECT SINGLE as4user as4date as4time - FROM dd02l INTO (rv_user, lv_as4date, lv_as4time) + SELECT as4user as4date as4time + FROM dd02l INTO TABLE lt_data WHERE tabname = ms_item-obj_name AND as4local = 'A' AND as4vers = '0000'. - IF sy-subrc <> 0. - rv_user = c_user_unknown. - RETURN. - ENDIF. - SELECT SINGLE as4user INTO rv_user + SELECT as4user as4date as4time + APPENDING TABLE lt_data FROM dd09l WHERE tabname = ms_item-obj_name AND as4local = 'A' - AND as4vers = '0000' - AND ( as4date > lv_as4date OR ( as4date = lv_as4date AND as4time > lv_as4time ) ). + AND as4vers = '0000'. + + SELECT as4user as4date as4time + APPENDING TABLE lt_data + FROM dd12l + WHERE sqltab = ms_item-obj_name + AND as4local = 'A' + AND as4vers = '0000'. + + SORT lt_data BY as4date DESCENDING as4time DESCENDING. + + READ TABLE lt_data INDEX 1 INTO ls_data. + IF sy-subrc = 0. + rv_user = ls_data-as4user. + ELSE. + rv_user = c_user_unknown. + ENDIF. ENDMETHOD. From a366fed83365ff40349c9d3bbd61a6f587a2802e Mon Sep 17 00:00:00 2001 From: larshp Date: Fri, 15 Jun 2018 09:20:42 +0000 Subject: [PATCH 087/136] file_status, more testing old broken test removed --- ..._abapgit_file_status.clas.testclasses.abap | 400 +++++++++++------- 1 file changed, 239 insertions(+), 161 deletions(-) diff --git a/src/zcl_abapgit_file_status.clas.testclasses.abap b/src/zcl_abapgit_file_status.clas.testclasses.abap index b042513f4..241fb5a23 100644 --- a/src/zcl_abapgit_file_status.clas.testclasses.abap +++ b/src/zcl_abapgit_file_status.clas.testclasses.abap @@ -1,30 +1,3 @@ -CLASS ltcl_file_status DEFINITION DEFERRED. -CLASS zcl_abapgit_file_status DEFINITION LOCAL FRIENDS ltcl_file_status. - -DEFINE _append_state. - APPEND INITIAL LINE TO lt_state ASSIGNING . - -path = '/'. - -filename = &1. - -sha1 = &2. -END-OF-DEFINITION. - -DEFINE _append_local. - APPEND INITIAL LINE TO lt_local ASSIGNING . - -item-obj_type = &1. - -item-obj_name = &2. - -item-devclass = '$Z$'. - -file-path = '/'. - -file-filename = &3. - -file-sha1 = &4. -END-OF-DEFINITION. - -DEFINE _append_remote. - APPEND INITIAL LINE TO lt_remote ASSIGNING . - -path = '/'. - -filename = &1. - -sha1 = &2. -END-OF-DEFINITION. - DEFINE _append_result. APPEND INITIAL LINE TO mt_results ASSIGNING . -obj_type = &1. @@ -37,114 +10,6 @@ DEFINE _append_result. -filename = &8. END-OF-DEFINITION. -CLASS ltcl_file_status DEFINITION FOR TESTING RISK LEVEL HARMLESS - DURATION SHORT FINAL. - - PRIVATE SECTION. - DATA: mt_results TYPE zif_abapgit_definitions=>ty_results_tt. - - METHODS: calculate_status FOR TESTING RAISING zcx_abapgit_exception. - -ENDCLASS. - -CLASS ltcl_file_status IMPLEMENTATION. - - METHOD calculate_status. - - DATA: lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt, - lt_remote TYPE zif_abapgit_definitions=>ty_files_tt, - lt_state TYPE zif_abapgit_definitions=>ty_file_signatures_tt, - lt_results_exp TYPE zif_abapgit_definitions=>ty_results_tt, - lo_dot TYPE REF TO zcl_abapgit_dot_abapgit. - - FIELD-SYMBOLS: LIKE LINE OF lt_local, - LIKE LINE OF lt_remote, - LIKE LINE OF mt_results, - LIKE LINE OF lt_state. - - - "STATE FILE SHA1 - _append_state '$$zclass1.clas.xml' 'C1_F1'. - " class1 testclasses is new locally, abap is new remotely - " class2 is completely new remotely - _append_state '$$zdoma1.doma.xml' 'D1'. - _append_state '$$zdoma2.doma.xml' 'D2'. - _append_state '$$zdoma3.doma.xml' 'D3'. - " doma4 is new locally - " doma5 is new remotely - _append_state '$$zdoma6.doma.xml' 'D6'. - " doma7 is not in state - emulate brocken cache - " doma8 is not in state - emulate brocken cache - _append_state '$$zdoma9.doma.xml' 'D9'. - _append_state 'num01.doma.xml' 'NUM01'. " another from different package - _append_state 'xfeld.doma.xml' 'XFELD'. " from different package - - "LOCAL TYPE NAME FILE SHA1 - _append_local 'CLAS' '$$ZCLASS1' '$$zclass1.clas.testclasses.abap' 'C1_F3'. - _append_local 'CLAS' '$$ZCLASS1' '$$zclass1.clas.xml' 'C1_F1'. - _append_local 'DOMA' '$$ZDOMA1' '$$zdoma1.doma.xml' 'D1'. - _append_local 'DOMA' '$$ZDOMA2' '$$zdoma2.doma.xml' 'D2_CHANGED_L'. - _append_local 'DOMA' '$$ZDOMA3' '$$zdoma3.doma.xml' 'D3'. - _append_local 'DOMA' '$$ZDOMA4' '$$zdoma4.doma.xml' 'D4'. - _append_local 'DOMA' '$$ZDOMA6' '$$zdoma6.doma.xml' 'D6_CHANGED_L'. - _append_local 'DOMA' '$$ZDOMA7' '$$zdoma7.doma.xml' 'D7'. - _append_local 'DOMA' '$$ZDOMA8' '$$zdoma8.doma.xml' 'D8'. - " dome9 was deleted from local system. Can be found by existing state - - "REMOTE FILE SHA1 - _append_remote 'textfile.txt' 'T1'. - _append_remote '$$zclass1.clas.abap' 'C1_F2'. " Must be before xml for tougher test - _append_remote '$$zclass1.clas.xml' 'C1_F1'. - _append_remote '$$zclass2.clas.abap' 'C1_F2'. " Must be before xml for tougher test - _append_remote '$$zclass2.clas.xml' 'C1_F1'. - _append_remote '$$zdoma1.doma.xml' 'D1'. - _append_remote '$$zdoma2.doma.xml' 'D2'. - _append_remote '$$zdoma3.doma.xml' 'D3_CHANGED_R'. - _append_remote '$$zdoma5.doma.xml' 'D5'. - _append_remote '$$zdoma6.doma.xml' 'D6_CHANGED_R'. - _append_remote '$$zdoma7.doma.xml' 'D7'. - _append_remote '$$zdoma8.doma.xml' 'D8_CHANGED_R'. " This one is changed - _append_remote '$$zdoma9.doma.xml' 'D9'. " This one is deleted locally - _append_remote 'xfeld.doma.xml' 'XFELD'. " Object from different package - _append_remote 'num01.doma.xml' 'NUM01_CHANGED'. " Changed object from different package - - "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE - _append_result '' '' ' ' ' ' 'A' '' '/' 'textfile.txt'. - _append_result 'CLAS' '$$ZCLASS1' ' ' ' ' 'A' '$Z$' '/' '$$zclass1.clas.abap'. - _append_result 'CLAS' '$$ZCLASS1' ' ' 'A' ' ' '$Z$' '/' '$$zclass1.clas.testclasses.abap'. - _append_result 'CLAS' '$$ZCLASS1' 'X' ' ' ' ' '$Z$' '/' '$$zclass1.clas.xml'. - _append_result 'CLAS' '$$ZCLASS2' ' ' ' ' 'A' '' '/' '$$zclass2.clas.abap'. - _append_result 'CLAS' '$$ZCLASS2' ' ' ' ' 'A' '' '/' '$$zclass2.clas.xml'. - _append_result 'DOMA' '$$ZDOMA1' 'X' ' ' ' ' '$Z$' '/' '$$zdoma1.doma.xml'. - _append_result 'DOMA' '$$ZDOMA2' ' ' 'M' ' ' '$Z$' '/' '$$zdoma2.doma.xml'. - _append_result 'DOMA' '$$ZDOMA3' ' ' ' ' 'M' '$Z$' '/' '$$zdoma3.doma.xml'. - _append_result 'DOMA' '$$ZDOMA4' ' ' 'A' ' ' '$Z$' '/' '$$zdoma4.doma.xml'. - _append_result 'DOMA' '$$ZDOMA5' ' ' ' ' 'A' '' '/' '$$zdoma5.doma.xml'. - _append_result 'DOMA' '$$ZDOMA6' ' ' 'M' 'M' '$Z$' '/' '$$zdoma6.doma.xml'. - _append_result 'DOMA' '$$ZDOMA7' 'X' ' ' ' ' '$Z$' '/' '$$zdoma7.doma.xml'. - _append_result 'DOMA' '$$ZDOMA8' ' ' 'M' 'M' '$Z$' '/' '$$zdoma8.doma.xml'. - _append_result 'DOMA' '$$ZDOMA9' ' ' 'D' ' ' '' '/' '$$zdoma9.doma.xml'. - _append_result 'DOMA' 'NUM01' ' ' ' ' 'M' 'SUTI' '/' 'num01.doma.xml'. - _append_result 'DOMA' 'XFELD' 'X' ' ' ' ' 'SUTI' '/' 'xfeld.doma.xml'. - lt_results_exp = mt_results. - - lo_dot = zcl_abapgit_dot_abapgit=>build_default( ). - - mt_results = zcl_abapgit_file_status=>calculate_status( - iv_devclass = '$Z$' - io_dot = lo_dot - it_local = lt_local - it_remote = lt_remote - it_cur_state = lt_state ). - - cl_abap_unit_assert=>assert_equals( - act = mt_results - exp = lt_results_exp ). - - ENDMETHOD. - -ENDCLASS. - CLASS ltcl_run_checks DEFINITION DEFERRED. CLASS zcl_abapgit_file_status DEFINITION LOCAL FRIENDS ltcl_run_checks. @@ -315,33 +180,147 @@ CLASS ltcl_run_checks IMPLEMENTATION. ENDCLASS. -CLASS ltcl_status_helper DEFINITION DEFERRED. -CLASS zcl_abapgit_file_status DEFINITION LOCAL FRIENDS ltcl_status_helper. - -CLASS ltcl_status_helper DEFINITION. +CLASS lcl_status_result DEFINITION. PUBLIC SECTION. METHODS: + constructor + IMPORTING + it_results TYPE zif_abapgit_definitions=>ty_results_tt, + get_line + IMPORTING + iv_line TYPE i + RETURNING + VALUE(rs_data) TYPE zif_abapgit_definitions=>ty_result, + assert_lines + IMPORTING + iv_lines TYPE i. + + PRIVATE SECTION. + DATA: mt_results TYPE zif_abapgit_definitions=>ty_results_tt. + +ENDCLASS. + +CLASS lcl_status_result IMPLEMENTATION. + + METHOD constructor. + + mt_results = it_results. + + ENDMETHOD. + + METHOD get_line. + + READ TABLE mt_results INDEX iv_line INTO rs_data. + cl_abap_unit_assert=>assert_subrc( ). + + ENDMETHOD. + + METHOD assert_lines. + + cl_abap_unit_assert=>assert_equals( + act = lines( mt_results ) + exp = iv_lines ). + + ENDMETHOD. + +ENDCLASS. + +CLASS lcl_status_helper DEFINITION DEFERRED. +CLASS zcl_abapgit_file_status DEFINITION LOCAL FRIENDS lcl_status_helper. + +CLASS lcl_status_helper DEFINITION FOR TESTING. + + PUBLIC SECTION. + INTERFACES: + zif_abapgit_tadir. + + METHODS: + constructor, + add_tadir + IMPORTING + iv_obj_type TYPE tadir-object + iv_obj_name TYPE tadir-obj_name + iv_devclass TYPE tadir-devclass, add_remote IMPORTING iv_path TYPE string DEFAULT '/' iv_filename TYPE string iv_sha1 TYPE zif_abapgit_definitions=>ty_sha1, - add_local, + add_local + IMPORTING + iv_path TYPE string DEFAULT '/' + iv_filename TYPE string + iv_sha1 TYPE zif_abapgit_definitions=>ty_sha1 + iv_obj_type TYPE tadir-object + iv_obj_name TYPE tadir-obj_name + iv_devclass TYPE devclass DEFAULT '$Z$', add_state, run - RETURNING VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt - RAISING zcx_abapgit_exception. + IMPORTING + iv_devclass TYPE devclass DEFAULT '$Z$' + RETURNING + VALUE(ro_result) TYPE REF TO lcl_status_result + RAISING + zcx_abapgit_exception. PRIVATE SECTION. - DATA: mt_local TYPE zif_abapgit_definitions=>ty_files_item_tt, - mt_remote TYPE zif_abapgit_definitions=>ty_files_tt, - mt_state TYPE zif_abapgit_definitions=>ty_file_signatures_tt. + TYPES: BEGIN OF ty_tadir, + obj_type TYPE tadir-object, + obj_name TYPE tadir-obj_name, + devclass TYPE tadir-devclass, + END OF ty_tadir. + + DATA: + mt_tadir TYPE STANDARD TABLE OF ty_tadir WITH DEFAULT KEY, + mt_local TYPE zif_abapgit_definitions=>ty_files_item_tt, + mt_remote TYPE zif_abapgit_definitions=>ty_files_tt, + mt_state TYPE zif_abapgit_definitions=>ty_file_signatures_tt. ENDCLASS. -CLASS ltcl_status_helper IMPLEMENTATION. +CLASS lcl_status_helper IMPLEMENTATION. + + METHOD constructor. + + zcl_abapgit_injector=>set_tadir( me ). + + ENDMETHOD. + + METHOD add_tadir. + + FIELD-SYMBOLS: LIKE LINE OF mt_tadir. + + APPEND INITIAL LINE TO mt_tadir ASSIGNING . + -obj_type = iv_obj_type. + -obj_name = iv_obj_name. + -devclass = iv_devclass. + + ENDMETHOD. + + METHOD zif_abapgit_tadir~get_object_package. + + DATA: ls_tadir LIKE LINE OF mt_tadir. + + IF lines( mt_tadir ) > 0. + READ TABLE mt_tadir INTO ls_tadir WITH KEY + obj_type = iv_object + obj_name = iv_obj_name. + cl_abap_unit_assert=>assert_subrc( ). + + rv_devclass = ls_tadir-devclass. + ENDIF. + + ENDMETHOD. + + METHOD zif_abapgit_tadir~read. + cl_abap_unit_assert=>fail( ). + ENDMETHOD. + + METHOD zif_abapgit_tadir~read_single. + cl_abap_unit_assert=>fail( ). + ENDMETHOD. METHOD add_remote. @@ -358,7 +337,14 @@ CLASS ltcl_status_helper IMPLEMENTATION. FIELD-SYMBOLS: LIKE LINE OF mt_local. -* todo + APPEND INITIAL LINE TO mt_local ASSIGNING . + -item-obj_type = iv_obj_type. + -item-obj_name = iv_obj_name. + -item-devclass = iv_devclass. + -file-path = iv_path. + -file-filename = iv_filename. + -file-sha1 = iv_sha1. + ENDMETHOD. METHOD add_state. @@ -369,17 +355,23 @@ CLASS ltcl_status_helper IMPLEMENTATION. METHOD run. - DATA: lo_dot TYPE REF TO zcl_abapgit_dot_abapgit. + DATA: lt_results TYPE zif_abapgit_definitions=>ty_results_tt, + lo_dot TYPE REF TO zcl_abapgit_dot_abapgit. + lo_dot = zcl_abapgit_dot_abapgit=>build_default( ). - rt_results = zcl_abapgit_file_status=>calculate_status( - iv_devclass = '$Z$' + lt_results = zcl_abapgit_file_status=>calculate_status( + iv_devclass = iv_devclass io_dot = lo_dot it_local = mt_local it_remote = mt_remote it_cur_state = mt_state ). + CREATE OBJECT ro_result + EXPORTING + it_results = lt_results. + ENDMETHOD. ENDCLASS. @@ -392,13 +384,16 @@ CLASS ltcl_calculate_status DEFINITION FOR TESTING RISK LEVEL HARMLESS PRIVATE SECTION. DATA: - mt_results TYPE zif_abapgit_definitions=>ty_results_tt, - ms_result LIKE LINE OF mt_results, - mo_helper TYPE REF TO ltcl_status_helper. + mo_helper TYPE REF TO lcl_status_helper, + mo_result TYPE REF TO lcl_status_result. METHODS: setup, - test1 FOR TESTING RAISING zcx_abapgit_exception. + only_remote FOR TESTING RAISING zcx_abapgit_exception, + only_local FOR TESTING RAISING zcx_abapgit_exception, + match FOR TESTING RAISING zcx_abapgit_exception, + diff FOR TESTING RAISING zcx_abapgit_exception, + local_outside_main FOR TESTING RAISING zcx_abapgit_exception. ENDCLASS. @@ -410,23 +405,106 @@ CLASS ltcl_calculate_status IMPLEMENTATION. ENDMETHOD. - METHOD test1. + METHOD only_remote. mo_helper->add_remote( iv_filename = '$$zdoma1.doma.xml' iv_sha1 = 'D1' ). - mt_results = mo_helper->run( ). + mo_result = mo_helper->run( ). + + mo_result->assert_lines( 1 ). cl_abap_unit_assert=>assert_equals( - act = lines( mt_results ) - exp = 1 ). + act = mo_result->get_line( 1 )-rstate + exp = zif_abapgit_definitions=>gc_state-added ). - READ TABLE mt_results INDEX 1 INTO ms_result. - cl_abap_unit_assert=>assert_subrc( ). + ENDMETHOD. + + METHOD only_local. + + mo_helper->add_local( + iv_obj_type = 'DOMA' + iv_obj_name = '$$ZDOMA1' + iv_filename = '$$zdoma1.doma.xml' + iv_sha1 = 'D1' ). + + mo_result = mo_helper->run( ). + + mo_result->assert_lines( 1 ). cl_abap_unit_assert=>assert_equals( - act = ms_result-rstate + act = mo_result->get_line( 1 )-lstate + exp = zif_abapgit_definitions=>gc_state-added ). + + ENDMETHOD. + + METHOD match. + + mo_helper->add_local( + iv_obj_type = 'DOMA' + iv_obj_name = '$$ZDOMA1' + iv_filename = '$$zdoma1.doma.xml' + iv_sha1 = 'D1' ). + + mo_helper->add_remote( + iv_filename = '$$zdoma1.doma.xml' + iv_sha1 = 'D1' ). + + mo_result = mo_helper->run( ). + + mo_result->assert_lines( 1 ). + + cl_abap_unit_assert=>assert_equals( + act = mo_result->get_line( 1 )-match + exp = abap_true ). + + ENDMETHOD. + + METHOD diff. + + mo_helper->add_local( + iv_obj_type = 'DOMA' + iv_obj_name = '$$ZDOMA1' + iv_filename = '$$zdoma1.doma.xml' + iv_sha1 = '12345' ). + + mo_helper->add_remote( + iv_filename = '$$zdoma1.doma.xml' + iv_sha1 = '54321' ). + + mo_result = mo_helper->run( ). + + mo_result->assert_lines( 1 ). + + cl_abap_unit_assert=>assert_equals( + act = mo_result->get_line( 1 )-lstate + exp = zif_abapgit_definitions=>gc_state-modified ). + + cl_abap_unit_assert=>assert_equals( + act = mo_result->get_line( 1 )-rstate + exp = zif_abapgit_definitions=>gc_state-modified ). + + ENDMETHOD. + + METHOD local_outside_main. + + mo_helper->add_tadir( + iv_obj_type = 'DOMA' + iv_obj_name = '$$ZDOMA1' + iv_devclass = '$OUTSIDE$' ). + + mo_helper->add_remote( + iv_filename = '$$zdoma1.doma.xml' + iv_sha1 = '54321' ). + + mo_result = mo_helper->run( ). + + mo_result->assert_lines( 1 ). + +* it should appear as not existing locally + cl_abap_unit_assert=>assert_equals( + act = mo_result->get_line( 1 )-rstate exp = zif_abapgit_definitions=>gc_state-added ). ENDMETHOD. From 46628837232956bfdb8d830036150cffb480d222 Mon Sep 17 00:00:00 2001 From: christianguenter2 Date: Fri, 15 Jun 2018 09:35:33 +0200 Subject: [PATCH 088/136] Introduce ZIF_ABAPGIT_POPUPS - create popups with factory ZCL_ABAPGIT_UI_FACTORY - inject test doubles with injector class ZCL_ABAPGIT_UI_INJECTOR --- src/ui/zcl_abapgit_gui_page_db.clas.abap | 2 +- src/ui/zcl_abapgit_gui_page_main.clas.abap | 2 +- src/ui/zcl_abapgit_gui_router.clas.abap | 2 +- src/ui/zcl_abapgit_popups.clas.abap | 235 +++++------------- src/ui/zcl_abapgit_popups.clas.xml | 1 - src/ui/zcl_abapgit_services_abapgit.clas.abap | 6 +- src/ui/zcl_abapgit_services_git.clas.abap | 12 +- src/ui/zcl_abapgit_services_repo.clas.abap | 35 ++- src/ui/zcl_abapgit_ui_factory.clas.abap | 32 +++ src/ui/zcl_abapgit_ui_factory.clas.xml | 17 ++ src/ui/zcl_abapgit_ui_injector.clas.abap | 23 ++ ..._abapgit_ui_injector.clas.testclasses.abap | 149 +++++++++++ src/ui/zcl_abapgit_ui_injector.clas.xml | 18 ++ src/ui/zif_abapgit_popups.intf.abap | 161 ++++++++++++ src/ui/zif_abapgit_popups.intf.xml | 16 ++ src/zabapgit_forms.prog.abap | 4 +- src/zcl_abapgit_transport.clas.abap | 4 +- src/zcl_abapgit_zip.clas.abap | 4 +- 18 files changed, 508 insertions(+), 215 deletions(-) create mode 100644 src/ui/zcl_abapgit_ui_factory.clas.abap create mode 100644 src/ui/zcl_abapgit_ui_factory.clas.xml create mode 100644 src/ui/zcl_abapgit_ui_injector.clas.abap create mode 100644 src/ui/zcl_abapgit_ui_injector.clas.testclasses.abap create mode 100644 src/ui/zcl_abapgit_ui_injector.clas.xml create mode 100644 src/ui/zif_abapgit_popups.intf.abap create mode 100644 src/ui/zif_abapgit_popups.intf.xml diff --git a/src/ui/zcl_abapgit_gui_page_db.clas.abap b/src/ui/zcl_abapgit_gui_page_db.clas.abap index 244ab4750..c43422144 100644 --- a/src/ui/zcl_abapgit_gui_page_db.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_db.clas.abap @@ -53,7 +53,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_DB IMPLEMENTATION. ASSERT is_key-type IS NOT INITIAL. - lv_answer = zcl_abapgit_popups=>popup_to_confirm( + lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm( titlebar = 'Warning' text_question = 'Delete?' text_button_1 = 'Ok' diff --git a/src/ui/zcl_abapgit_gui_page_main.clas.abap b/src/ui/zcl_abapgit_gui_page_main.clas.abap index da4fdd26c..fa778f26d 100644 --- a/src/ui/zcl_abapgit_gui_page_main.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_main.clas.abap @@ -270,7 +270,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MAIN IMPLEMENTATION. ls_item TYPE zif_abapgit_definitions=>ty_item. - ls_tadir = zcl_abapgit_popups=>popup_object( ). + ls_tadir = zcl_abapgit_ui_factory=>get_popups( )->popup_object( ). IF ls_tadir IS INITIAL. RETURN. ENDIF. diff --git a/src/ui/zcl_abapgit_gui_router.clas.abap b/src/ui/zcl_abapgit_gui_router.clas.abap index 0aa4260d5..ac369715f 100644 --- a/src/ui/zcl_abapgit_gui_router.clas.abap +++ b/src/ui/zcl_abapgit_gui_router.clas.abap @@ -108,7 +108,7 @@ CLASS zcl_abapgit_gui_router IMPLEMENTATION. DATA: lv_class_name TYPE string, lv_cancel TYPE abap_bool. - zcl_abapgit_popups=>run_page_class_popup( + zcl_abapgit_ui_factory=>get_popups( )->run_page_class_popup( IMPORTING ev_name = lv_class_name ev_cancel = lv_cancel ). diff --git a/src/ui/zcl_abapgit_popups.clas.abap b/src/ui/zcl_abapgit_popups.clas.abap index 3b01f4b9a..e4879953c 100644 --- a/src/ui/zcl_abapgit_popups.clas.abap +++ b/src/ui/zcl_abapgit_popups.clas.abap @@ -1,151 +1,30 @@ CLASS zcl_abapgit_popups DEFINITION PUBLIC FINAL - CREATE PUBLIC . + CREATE PRIVATE + GLOBAL FRIENDS zcl_abapgit_ui_factory. PUBLIC SECTION. - TYPES: - BEGIN OF ty_popup, - url TYPE string, - package TYPE devclass, - branch_name TYPE string, - cancel TYPE abap_bool, - END OF ty_popup . - - CONSTANTS c_new_branch_label TYPE string VALUE '+ create new ...' ##NO_TEXT. - - CLASS-METHODS popup_package_export - EXPORTING - !ev_package TYPE devclass - !ev_folder_logic TYPE string - RAISING - zcx_abapgit_exception . - CLASS-METHODS popup_folder_logic - RETURNING - VALUE(rv_folder_logic) TYPE string - RAISING - zcx_abapgit_exception . - CLASS-METHODS popup_object - RETURNING - VALUE(rs_tadir) TYPE tadir - RAISING - zcx_abapgit_exception . - CLASS-METHODS create_branch_popup - EXPORTING - !ev_name TYPE string - !ev_cancel TYPE abap_bool - RAISING - zcx_abapgit_exception . - - CLASS-METHODS run_page_class_popup - EXPORTING - !ev_name TYPE string - !ev_cancel TYPE abap_bool - RAISING - zcx_abapgit_exception . - CLASS-METHODS repo_new_offline - RETURNING - VALUE(rs_popup) TYPE ty_popup - RAISING - zcx_abapgit_exception . - CLASS-METHODS branch_list_popup - IMPORTING - !iv_url TYPE string - !iv_default_branch TYPE string OPTIONAL - !iv_show_new_option TYPE abap_bool OPTIONAL - RETURNING - VALUE(rs_branch) TYPE zif_abapgit_definitions=>ty_git_branch - RAISING - zcx_abapgit_exception . - - - CLASS-METHODS repo_popup - IMPORTING - !iv_url TYPE string - !iv_package TYPE devclass OPTIONAL - !iv_branch TYPE string DEFAULT 'refs/heads/master' - !iv_freeze_package TYPE abap_bool OPTIONAL - !iv_freeze_url TYPE abap_bool OPTIONAL - !iv_title TYPE clike DEFAULT 'Clone repository ...' - RETURNING - VALUE(rs_popup) TYPE ty_popup - RAISING - zcx_abapgit_exception ##NO_TEXT. - CLASS-METHODS popup_to_confirm - IMPORTING - !titlebar TYPE clike - !text_question TYPE clike - !text_button_1 TYPE clike DEFAULT 'Yes' - !icon_button_1 TYPE icon-name DEFAULT space - !text_button_2 TYPE clike DEFAULT 'No' - !icon_button_2 TYPE icon-name DEFAULT space - !default_button TYPE char1 DEFAULT '1' - !display_cancel_button TYPE char1 DEFAULT abap_true - RETURNING - VALUE(rv_answer) TYPE char1 - RAISING - zcx_abapgit_exception . - CLASS-METHODS popup_to_inform - IMPORTING - !titlebar TYPE clike - !text_message TYPE clike - RAISING - zcx_abapgit_exception . - CLASS-METHODS popup_to_create_package - EXPORTING - !es_package_data TYPE scompkdtln - !ev_create TYPE boolean - RAISING - zcx_abapgit_exception . - CLASS-METHODS popup_to_create_transp_branch - IMPORTING - !it_transport_headers TYPE trwbo_request_headers - RETURNING - VALUE(rs_transport_branch) TYPE zif_abapgit_definitions=>ty_transport_to_branch - RAISING - zcx_abapgit_exception - zcx_abapgit_cancel . - CLASS-METHODS popup_to_select_transports - RETURNING - VALUE(rt_trkorr) TYPE trwbo_request_headers . - CLASS-METHODS popup_to_select_from_list - IMPORTING - !it_list TYPE STANDARD TABLE - !i_header_text TYPE csequence - !i_select_column_text TYPE csequence - !it_columns_to_display TYPE stringtab - EXPORTING - VALUE(et_list) TYPE STANDARD TABLE - RAISING - zcx_abapgit_cancel - zcx_abapgit_exception . - CLASS-METHODS branch_popup_callback - IMPORTING - !iv_code TYPE clike - CHANGING - !ct_fields TYPE zif_abapgit_definitions=>ty_sval_tt - !cs_error TYPE svale - !cv_show_popup TYPE char01 - RAISING - zcx_abapgit_exception . - CLASS-METHODS package_popup_callback - IMPORTING - !iv_code TYPE clike - CHANGING - !ct_fields TYPE zif_abapgit_definitions=>ty_sval_tt - !cs_error TYPE svale - !cv_show_popup TYPE char01 - RAISING - zcx_abapgit_exception . - CLASS-METHODS popup_transport_request - IMPORTING - !is_transport_type TYPE zif_abapgit_definitions=>ty_transport_type - RETURNING - VALUE(rv_transport) TYPE trkorr - RAISING - zcx_abapgit_exception - zcx_abapgit_cancel . + INTERFACES: zif_abapgit_popups. + ALIASES: + popup_package_export FOR zif_abapgit_popups~popup_package_export, + popup_folder_logic FOR zif_abapgit_popups~popup_folder_logic, + popup_object FOR zif_abapgit_popups~popup_object, + create_branch_popup FOR zif_abapgit_popups~create_branch_popup, + run_page_class_popup FOR zif_abapgit_popups~run_page_class_popup, + repo_new_offline FOR zif_abapgit_popups~repo_new_offline, + branch_list_popup FOR zif_abapgit_popups~branch_list_popup, + repo_popup FOR zif_abapgit_popups~repo_popup, + popup_to_confirm FOR zif_abapgit_popups~popup_to_confirm, + popup_to_inform FOR zif_abapgit_popups~popup_to_inform, + popup_to_create_package FOR zif_abapgit_popups~popup_to_create_package, + popup_to_create_transp_branch FOR zif_abapgit_popups~popup_to_create_transp_branch, + popup_to_select_transports FOR zif_abapgit_popups~popup_to_select_transports, + popup_to_select_from_list FOR zif_abapgit_popups~popup_to_select_from_list, + branch_popup_callback FOR zif_abapgit_popups~branch_popup_callback, + package_popup_callback FOR zif_abapgit_popups~package_popup_callback, + popup_transport_request FOR zif_abapgit_popups~popup_transport_request. PRIVATE SECTION. @@ -153,12 +32,13 @@ CLASS zcl_abapgit_popups DEFINITION ty_sval_tt TYPE STANDARD TABLE OF sval WITH DEFAULT KEY. CONSTANTS c_fieldname_selected TYPE lvc_fname VALUE `SELECTED` ##NO_TEXT. - CLASS-DATA go_select_list_popup TYPE REF TO cl_salv_table . - CLASS-DATA gr_table TYPE REF TO data . - CLASS-DATA gv_cancel TYPE abap_bool . - CLASS-DATA go_table_descr TYPE REF TO cl_abap_tabledescr . - CLASS-METHODS add_field + DATA go_select_list_popup TYPE REF TO cl_salv_table . + DATA gr_table TYPE REF TO data . + DATA gv_cancel TYPE abap_bool . + DATA go_table_descr TYPE REF TO cl_abap_tabledescr . + + METHODS add_field IMPORTING !iv_tabname TYPE sval-tabname !iv_fieldname TYPE sval-fieldname @@ -168,22 +48,22 @@ CLASS zcl_abapgit_popups DEFINITION !iv_obligatory TYPE spo_obl OPTIONAL CHANGING !ct_fields TYPE ty_sval_tt . - CLASS-METHODS create_new_table + METHODS create_new_table IMPORTING !it_list TYPE STANDARD TABLE . - CLASS-METHODS get_selected_rows + METHODS get_selected_rows EXPORTING !et_list TYPE INDEX TABLE . - CLASS-METHODS on_select_list_link_click + METHODS on_select_list_link_click FOR EVENT link_click OF cl_salv_events_table IMPORTING !row !column . - CLASS-METHODS on_select_list_function_click + METHODS on_select_list_function_click FOR EVENT added_function OF cl_salv_events_table IMPORTING !e_salv_function . - CLASS-METHODS extract_field_values + METHODS extract_field_values IMPORTING it_fields TYPE ty_sval_tt EXPORTING @@ -195,8 +75,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. - +CLASS zcl_abapgit_popups IMPLEMENTATION. METHOD add_field. @@ -213,7 +92,7 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. ENDMETHOD. - METHOD branch_list_popup. + METHOD zif_abapgit_popups~branch_list_popup. DATA: lo_branches TYPE REF TO zcl_abapgit_git_branch_list, lt_branches TYPE zif_abapgit_definitions=>ty_git_branch_list_tt, @@ -271,7 +150,7 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. IF iv_show_new_option = abap_true. APPEND INITIAL LINE TO lt_selection ASSIGNING . - -varoption = c_new_branch_label. + -varoption = zif_abapgit_popups=>c_new_branch_label. ENDIF. CALL FUNCTION 'POPUP_TO_DECIDE_LIST' @@ -301,8 +180,8 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. READ TABLE lt_selection ASSIGNING WITH KEY selflag = abap_true. ASSERT sy-subrc = 0. - IF iv_show_new_option = abap_true AND -varoption = c_new_branch_label. - rs_branch-name = c_new_branch_label. + IF iv_show_new_option = abap_true AND -varoption = zif_abapgit_popups=>c_new_branch_label. + rs_branch-name = zif_abapgit_popups=>c_new_branch_label. ELSE. REPLACE FIRST OCCURRENCE OF lv_head_suffix IN -varoption WITH ''. READ TABLE lt_branches WITH KEY display_name = -varoption ASSIGNING . @@ -319,7 +198,7 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. ENDMETHOD. - METHOD branch_popup_callback. + METHOD zif_abapgit_popups~branch_popup_callback. DATA: lv_url TYPE string, ls_package_data TYPE scompkdtln, @@ -342,7 +221,7 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. ENDIF. lv_url = -value. - ls_branch = zcl_abapgit_popups=>branch_list_popup( lv_url ). + ls_branch = branch_list_popup( lv_url ). IF ls_branch IS INITIAL. RETURN. ENDIF. @@ -358,7 +237,7 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. ASSERT sy-subrc = 0. ls_package_data-devclass = -value. - zcl_abapgit_popups=>popup_to_create_package( + popup_to_create_package( IMPORTING es_package_data = ls_package_data ev_create = lv_create ). @@ -375,7 +254,7 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. ENDMETHOD. - METHOD create_branch_popup. + METHOD zif_abapgit_popups~create_branch_popup. DATA: lv_answer TYPE c LENGTH 1, lt_fields TYPE TABLE OF sval. @@ -604,7 +483,7 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. ENDMETHOD. - METHOD package_popup_callback. + METHOD zif_abapgit_popups~package_popup_callback. DATA: ls_package_data TYPE scompkdtln, lv_create TYPE boolean. @@ -620,8 +499,8 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. ASSERT sy-subrc = 0. ls_package_data-devclass = -value. - zcl_abapgit_popups=>popup_to_create_package( IMPORTING es_package_data = ls_package_data - ev_create = lv_create ). + popup_to_create_package( IMPORTING es_package_data = ls_package_data + ev_create = lv_create ). IF lv_create = abap_false. RETURN. ENDIF. @@ -635,7 +514,7 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. ENDMETHOD. - METHOD popup_folder_logic. + METHOD zif_abapgit_popups~popup_folder_logic. DATA: lv_returncode TYPE c, lt_fields TYPE TABLE OF sval. @@ -676,7 +555,7 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. ENDMETHOD. "popup_package_export - METHOD popup_object. + METHOD zif_abapgit_popups~popup_object. DATA: lv_returncode TYPE c, lt_fields TYPE TABLE OF sval. @@ -730,7 +609,7 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. ENDMETHOD. - METHOD popup_package_export. + METHOD zif_abapgit_popups~popup_package_export. DATA: lv_returncode TYPE c, lt_fields TYPE TABLE OF sval. @@ -781,7 +660,7 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. ENDMETHOD. "popup_package_export - METHOD popup_to_confirm. + METHOD zif_abapgit_popups~popup_to_confirm. CALL FUNCTION 'POPUP_TO_CONFIRM' EXPORTING @@ -805,7 +684,7 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. ENDMETHOD. "popup_to_confirm - METHOD popup_to_create_package. + METHOD zif_abapgit_popups~popup_to_create_package. CALL FUNCTION 'FUNCTION_EXISTS' EXPORTING funcname = 'PB_POPUP_PACKAGE_CREATE' @@ -832,7 +711,7 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. ENDMETHOD. " popup_to_create_package - METHOD popup_to_create_transp_branch. + METHOD zif_abapgit_popups~popup_to_create_transp_branch. DATA: lv_returncode TYPE c, lt_fields TYPE TABLE OF sval, lv_transports_as_text TYPE string, @@ -885,7 +764,7 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. ENDMETHOD. - METHOD popup_to_inform. + METHOD zif_abapgit_popups~popup_to_inform. DATA: lv_line1 TYPE char70, lv_line2 TYPE char70. @@ -904,7 +783,7 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. ENDMETHOD. " popup_to_inform. - METHOD popup_to_select_from_list. + METHOD zif_abapgit_popups~popup_to_select_from_list. DATA: lo_events TYPE REF TO cl_salv_events_table, @@ -991,7 +870,7 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. ENDMETHOD. - METHOD popup_to_select_transports. + METHOD zif_abapgit_popups~popup_to_select_transports. * todo, method to be renamed, it only returns one transport @@ -1011,7 +890,7 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. ENDMETHOD. - METHOD popup_transport_request. + METHOD zif_abapgit_popups~popup_transport_request. DATA: lt_e071 TYPE STANDARD TABLE OF e071, lt_e071k TYPE STANDARD TABLE OF e071k. @@ -1042,7 +921,7 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. ENDMETHOD. - METHOD repo_new_offline. + METHOD zif_abapgit_popups~repo_new_offline. DATA: lv_returncode TYPE c, lt_fields TYPE TABLE OF sval, @@ -1123,7 +1002,7 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. ENDMETHOD. "repo_new_offline - METHOD repo_popup. + METHOD zif_abapgit_popups~repo_popup. DATA: lv_returncode TYPE c, lv_icon_ok TYPE icon-name, @@ -1242,7 +1121,7 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. ENDMETHOD. - METHOD run_page_class_popup. + METHOD zif_abapgit_popups~run_page_class_popup. DATA: lv_answer TYPE c LENGTH 1, lt_fields TYPE TABLE OF sval. diff --git a/src/ui/zcl_abapgit_popups.clas.xml b/src/ui/zcl_abapgit_popups.clas.xml index 48c46ddc3..b37c9eb7b 100644 --- a/src/ui/zcl_abapgit_popups.clas.xml +++ b/src/ui/zcl_abapgit_popups.clas.xml @@ -7,7 +7,6 @@ 1 E Popups - 2 1 X X diff --git a/src/ui/zcl_abapgit_services_abapgit.clas.abap b/src/ui/zcl_abapgit_services_abapgit.clas.abap index ea21ca794..c2f83cdf7 100644 --- a/src/ui/zcl_abapgit_services_abapgit.clas.abap +++ b/src/ui/zcl_abapgit_services_abapgit.clas.abap @@ -54,7 +54,7 @@ CLASS ZCL_ABAPGIT_SERVICES_ABAPGIT IMPLEMENTATION. lv_answer TYPE c LENGTH 1. - lv_answer = zcl_abapgit_popups=>popup_to_confirm( + lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm( titlebar = iv_title text_question = iv_text text_button_1 = 'Continue' @@ -94,7 +94,7 @@ CLASS ZCL_ABAPGIT_SERVICES_ABAPGIT IMPLEMENTATION. IF is_installed( ) = abap_true. lv_text = 'Seems like abapGit package is already installed. No changes to be done'. - zcl_abapgit_popups=>popup_to_inform( + zcl_abapgit_ui_factory=>get_popups( )->popup_to_inform( titlebar = lc_title text_message = lv_text ). RETURN. @@ -117,7 +117,7 @@ CLASS ZCL_ABAPGIT_SERVICES_ABAPGIT IMPLEMENTATION. IF is_installed_pi( ) = abap_true. lv_text = 'Seems like abapGit plugins package is already installed. No changes to be done'. - zcl_abapgit_popups=>popup_to_inform( + zcl_abapgit_ui_factory=>get_popups( )->popup_to_inform( titlebar = lc_title text_message = lv_text ). RETURN. diff --git a/src/ui/zcl_abapgit_services_git.clas.abap b/src/ui/zcl_abapgit_services_git.clas.abap index 2a022c200..fda6bca65 100644 --- a/src/ui/zcl_abapgit_services_git.clas.abap +++ b/src/ui/zcl_abapgit_services_git.clas.abap @@ -129,7 +129,7 @@ CLASS zcl_abapgit_services_git IMPLEMENTATION. lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). - zcl_abapgit_popups=>create_branch_popup( + zcl_abapgit_ui_factory=>get_popups( )->create_branch_popup( IMPORTING ev_name = lv_name ev_cancel = lv_cancel ). @@ -160,7 +160,7 @@ CLASS zcl_abapgit_services_git IMPLEMENTATION. lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). - ls_branch = zcl_abapgit_popups=>branch_list_popup( lo_repo->get_url( ) ). + ls_branch = zcl_abapgit_ui_factory=>get_popups( )->branch_list_popup( lo_repo->get_url( ) ). IF ls_branch IS INITIAL. RAISE EXCEPTION TYPE zcx_abapgit_cancel. ENDIF. @@ -233,7 +233,7 @@ CLASS zcl_abapgit_services_git IMPLEMENTATION. zcx_abapgit_exception=>raise( 'Cannot reset. Local code is write-protected by repo config' ). ENDIF. - lv_answer = zcl_abapgit_popups=>popup_to_confirm( + lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm( titlebar = 'Warning' text_question = 'Reset local objects?' text_button_1 = 'Ok' @@ -254,7 +254,7 @@ CLASS zcl_abapgit_services_git IMPLEMENTATION. INSERT `OBJECT` INTO TABLE lt_columns. INSERT `OBJ_NAME` INTO TABLE lt_columns. - zcl_abapgit_popups=>popup_to_select_from_list( + zcl_abapgit_ui_factory=>get_popups( )->popup_to_select_from_list( EXPORTING it_list = lt_unnecessary_local_objs i_header_text = |Which unnecessary objects should be deleted?| @@ -282,7 +282,7 @@ CLASS zcl_abapgit_services_git IMPLEMENTATION. lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). - ls_branch = zcl_abapgit_popups=>branch_list_popup( + ls_branch = zcl_abapgit_ui_factory=>get_popups( )->branch_list_popup( iv_url = lo_repo->get_url( ) iv_default_branch = lo_repo->get_branch_name( ) iv_show_new_option = abap_true ). @@ -290,7 +290,7 @@ CLASS zcl_abapgit_services_git IMPLEMENTATION. RAISE EXCEPTION TYPE zcx_abapgit_cancel. ENDIF. - IF ls_branch-name = zcl_abapgit_popups=>c_new_branch_label. + IF ls_branch-name = zcl_abapgit_ui_factory=>get_popups( )->c_new_branch_label. create_branch( iv_key ). RETURN. ENDIF. diff --git a/src/ui/zcl_abapgit_services_repo.clas.abap b/src/ui/zcl_abapgit_services_repo.clas.abap index f1a52ffaf..8e6b9a61e 100644 --- a/src/ui/zcl_abapgit_services_repo.clas.abap +++ b/src/ui/zcl_abapgit_services_repo.clas.abap @@ -121,7 +121,7 @@ CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION. ENDIF. IF ls_checks-transport-required = abap_true. - ls_checks-transport-transport = zcl_abapgit_popups=>popup_transport_request( + ls_checks-transport-transport = zcl_abapgit_ui_factory=>get_popups( )->popup_transport_request( is_transport_type = ls_checks-transport-type ). ENDIF. @@ -138,9 +138,9 @@ CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION. METHOD new_offline. DATA: lo_repo TYPE REF TO zcl_abapgit_repo, - ls_popup TYPE zcl_abapgit_popups=>ty_popup. + ls_popup TYPE zif_abapgit_popups=>ty_popup. - ls_popup = zcl_abapgit_popups=>repo_new_offline( ). + ls_popup = zcl_abapgit_ui_factory=>get_popups( )->repo_new_offline( ). IF ls_popup-cancel = abap_true. RAISE EXCEPTION TYPE zcx_abapgit_cancel. ENDIF. @@ -159,10 +159,9 @@ CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION. METHOD new_online. - DATA: ls_popup TYPE zcl_abapgit_popups=>ty_popup. + DATA: ls_popup TYPE zif_abapgit_popups=>ty_popup. - - ls_popup = zcl_abapgit_popups=>repo_popup( iv_url ). + ls_popup = zcl_abapgit_ui_factory=>get_popups( )->repo_popup( iv_url ). IF ls_popup-cancel = abap_true. RAISE EXCEPTION TYPE zcx_abapgit_cancel. ENDIF. @@ -213,7 +212,7 @@ CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION. lv_column = 'OBJ_NAME'. INSERT lv_column INTO TABLE lt_columns. - zcl_abapgit_popups=>popup_to_select_from_list( + zcl_abapgit_ui_factory=>get_popups( )->popup_to_select_from_list( EXPORTING it_list = ct_overwrite i_header_text = |The following Objects have been modified locally.| @@ -255,7 +254,7 @@ CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION. 'from package' -devclass INTO lv_question SEPARATED BY space. "#EC NOTEXT - lv_answer = zcl_abapgit_popups=>popup_to_confirm( + lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm( titlebar = 'Warning' text_question = lv_question text_button_1 = 'Ok' @@ -296,7 +295,7 @@ CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION. lv_question = |This will DELETE all objects in package { lv_package } ({ lines( lt_tadir ) } objects) from the system|. "#EC NOTEXT - lv_answer = zcl_abapgit_popups=>popup_to_confirm( + lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm( titlebar = 'Uninstall' text_question = lv_question text_button_1 = 'Delete' @@ -350,7 +349,7 @@ CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION. && ' Please make sure you don''t have ones like that.'. ENDIF. - lv_answer = zcl_abapgit_popups=>popup_to_confirm( + lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm( titlebar = 'Warning' text_question = lv_question text_button_1 = 'OK' @@ -371,10 +370,10 @@ CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION. METHOD remote_attach. - DATA: ls_popup TYPE zcl_abapgit_popups=>ty_popup, + DATA: ls_popup TYPE zif_abapgit_popups=>ty_popup, lo_repo TYPE REF TO zcl_abapgit_repo_online. - ls_popup = zcl_abapgit_popups=>repo_popup( + ls_popup = zcl_abapgit_ui_factory=>get_popups( )->repo_popup( iv_title = 'Attach repo to remote ...' iv_url = '' iv_package = zcl_abapgit_repo_srv=>get_instance( )->get( iv_key )->get_package( ) @@ -398,12 +397,12 @@ CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION. METHOD remote_change. - DATA: ls_popup TYPE zcl_abapgit_popups=>ty_popup, + DATA: ls_popup TYPE zif_abapgit_popups=>ty_popup, lo_repo TYPE REF TO zcl_abapgit_repo_online. lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). - ls_popup = zcl_abapgit_popups=>repo_popup( + ls_popup = zcl_abapgit_ui_factory=>get_popups( )->repo_popup( iv_title = 'Change repo remote ...' iv_url = lo_repo->get_url( ) iv_package = lo_repo->get_package( ) @@ -425,7 +424,7 @@ CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION. DATA: lv_answer TYPE c LENGTH 1. - lv_answer = zcl_abapgit_popups=>popup_to_confirm( + lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm( titlebar = 'Make repository OFF-line' text_question = 'This will detach the repo from remote and make it OFF-line' text_button_1 = 'Make OFF-line' @@ -459,7 +458,7 @@ CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION. lv_question = |This will remove the repository reference to the package { lv_package }. All objects will safely remain in the system.|. - lv_answer = zcl_abapgit_popups=>popup_to_confirm( + lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm( titlebar = 'Remove' text_question = lv_question text_button_1 = 'Remove' @@ -503,13 +502,13 @@ CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION. lo_repository ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_repository_key ). - lt_transport_headers = zcl_abapgit_popups=>popup_to_select_transports( ). + lt_transport_headers = zcl_abapgit_ui_factory=>get_popups( )->popup_to_select_transports( ). lt_transport_objects = zcl_abapgit_transport=>to_tadir( lt_transport_headers ). IF lt_transport_objects IS INITIAL. zcx_abapgit_exception=>raise( 'Canceled or List of objects is empty ' ). ENDIF. - ls_transport_to_branch = zcl_abapgit_popups=>popup_to_create_transp_branch( + ls_transport_to_branch = zcl_abapgit_ui_factory=>get_popups( )->popup_to_create_transp_branch( lt_transport_headers ). CREATE OBJECT lo_transport_to_branch. diff --git a/src/ui/zcl_abapgit_ui_factory.clas.abap b/src/ui/zcl_abapgit_ui_factory.clas.abap new file mode 100644 index 000000000..a78782b76 --- /dev/null +++ b/src/ui/zcl_abapgit_ui_factory.clas.abap @@ -0,0 +1,32 @@ +CLASS zcl_abapgit_ui_factory DEFINITION + PUBLIC + CREATE PRIVATE + GLOBAL FRIENDS zcl_abapgit_ui_injector. + + PUBLIC SECTION. + CLASS-METHODS: + get_popups + RETURNING + VALUE(ri_popups) TYPE REF TO zif_abapgit_popups. + + PRIVATE SECTION. + CLASS-DATA: + mi_popups TYPE REF TO zif_abapgit_popups. + +ENDCLASS. + + + +CLASS zcl_abapgit_ui_factory IMPLEMENTATION. + + METHOD get_popups. + + IF mi_popups IS INITIAL. + CREATE OBJECT mi_popups TYPE zcl_abapgit_popups. + ENDIF. + + ri_popups = mi_popups. + + ENDMETHOD. + +ENDCLASS. diff --git a/src/ui/zcl_abapgit_ui_factory.clas.xml b/src/ui/zcl_abapgit_ui_factory.clas.xml new file mode 100644 index 000000000..4adeca9e1 --- /dev/null +++ b/src/ui/zcl_abapgit_ui_factory.clas.xml @@ -0,0 +1,17 @@ + + + + + + ZCL_ABAPGIT_UI_FACTORY + 1 + E + abapGit UI factory + 1 + X + X + X + + + + diff --git a/src/ui/zcl_abapgit_ui_injector.clas.abap b/src/ui/zcl_abapgit_ui_injector.clas.abap new file mode 100644 index 000000000..8634dc6e8 --- /dev/null +++ b/src/ui/zcl_abapgit_ui_injector.clas.abap @@ -0,0 +1,23 @@ +CLASS zcl_abapgit_ui_injector DEFINITION + PUBLIC + CREATE PRIVATE. + + PUBLIC SECTION. + CLASS-METHODS: + set_popups + IMPORTING + ii_popups TYPE REF TO zif_abapgit_popups. + +ENDCLASS. + + + +CLASS zcl_abapgit_ui_injector IMPLEMENTATION. + + METHOD set_popups. + + zcl_abapgit_ui_factory=>mi_popups = ii_popups. + + ENDMETHOD. + +ENDCLASS. diff --git a/src/ui/zcl_abapgit_ui_injector.clas.testclasses.abap b/src/ui/zcl_abapgit_ui_injector.clas.testclasses.abap new file mode 100644 index 000000000..e8f961801 --- /dev/null +++ b/src/ui/zcl_abapgit_ui_injector.clas.testclasses.abap @@ -0,0 +1,149 @@ +*"* use this source file for your ABAP unit test classes + +CLASS ltd_abapgit_popups_mock DEFINITION. + + PUBLIC SECTION. + INTERFACES: zif_abapgit_popups. + +ENDCLASS. + +CLASS no_dependency_injection DEFINITION FOR TESTING + RISK LEVEL HARMLESS + DURATION SHORT. + + PRIVATE SECTION. + METHODS: + no_injection FOR TESTING RAISING cx_static_check. + +ENDCLASS. + +CLASS simple_dependency_injection DEFINITION FOR TESTING + RISK LEVEL HARMLESS + DURATION SHORT. + + PRIVATE SECTION. + METHODS: + setup, + simple_injection FOR TESTING RAISING cx_static_check. + +ENDCLASS. + +CLASS ltd_abapgit_popups_mock IMPLEMENTATION. + + METHOD zif_abapgit_popups~branch_list_popup. + + ENDMETHOD. + + METHOD zif_abapgit_popups~branch_popup_callback. + + ENDMETHOD. + + METHOD zif_abapgit_popups~create_branch_popup. + + ENDMETHOD. + + METHOD zif_abapgit_popups~package_popup_callback. + + ENDMETHOD. + + METHOD zif_abapgit_popups~popup_folder_logic. + + ENDMETHOD. + + METHOD zif_abapgit_popups~popup_object. + + ENDMETHOD. + + METHOD zif_abapgit_popups~popup_package_export. + + ENDMETHOD. + + METHOD zif_abapgit_popups~popup_to_confirm. + + ENDMETHOD. + + METHOD zif_abapgit_popups~popup_to_create_package. + + ENDMETHOD. + + METHOD zif_abapgit_popups~popup_to_create_transp_branch. + + ENDMETHOD. + + METHOD zif_abapgit_popups~popup_to_inform. + + ENDMETHOD. + + METHOD zif_abapgit_popups~popup_to_select_from_list. + + ENDMETHOD. + + METHOD zif_abapgit_popups~popup_to_select_transports. + + ENDMETHOD. + + METHOD zif_abapgit_popups~popup_transport_request. + + ENDMETHOD. + + METHOD zif_abapgit_popups~repo_new_offline. + + ENDMETHOD. + + METHOD zif_abapgit_popups~repo_popup. + + ENDMETHOD. + + METHOD zif_abapgit_popups~run_page_class_popup. + + ENDMETHOD. + +ENDCLASS. + +CLASS no_dependency_injection IMPLEMENTATION. + + METHOD no_injection. + + DATA: lo_popups TYPE REF TO zif_abapgit_popups, + lo_class_descr TYPE REF TO cl_abap_classdescr. + + lo_popups = zcl_abapgit_ui_factory=>get_popups( ). + + lo_class_descr ?= cl_abap_classdescr=>describe_by_object_ref( lo_popups ). + + cl_abap_unit_assert=>assert_equals( + exp = '\CLASS=ZCL_ABAPGIT_POPUPS' + act = lo_class_descr->absolute_name ). + + ENDMETHOD. + +ENDCLASS. + +CLASS simple_dependency_injection IMPLEMENTATION. + + METHOD setup. + + DATA: lo_popups_mock TYPE REF TO ltd_abapgit_popups_mock. + + CREATE OBJECT lo_popups_mock. + + zcl_abapgit_ui_injector=>set_popups( lo_popups_mock ). + + ENDMETHOD. + + METHOD simple_injection. + + DATA: lo_popups TYPE REF TO zif_abapgit_popups, + lo_class_descr TYPE REF TO cl_abap_classdescr. + + lo_popups = zcl_abapgit_ui_factory=>get_popups( ). + + lo_class_descr ?= cl_abap_classdescr=>describe_by_object_ref( lo_popups ). + + cl_abap_unit_assert=>assert_equals( + exp = '\CLASS-POOL=ZCL_ABAPGIT_UI_INJECTOR\CLASS=LTD_ABAPGIT_POPUPS_MOCK' + act = lo_class_descr->absolute_name ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/ui/zcl_abapgit_ui_injector.clas.xml b/src/ui/zcl_abapgit_ui_injector.clas.xml new file mode 100644 index 000000000..414c4ec1b --- /dev/null +++ b/src/ui/zcl_abapgit_ui_injector.clas.xml @@ -0,0 +1,18 @@ + + + + + + ZCL_ABAPGIT_UI_INJECTOR + 1 + E + abapGit UI injector + 1 + X + X + X + X + + + + diff --git a/src/ui/zif_abapgit_popups.intf.abap b/src/ui/zif_abapgit_popups.intf.abap new file mode 100644 index 000000000..0d9f9e8fc --- /dev/null +++ b/src/ui/zif_abapgit_popups.intf.abap @@ -0,0 +1,161 @@ +INTERFACE zif_abapgit_popups + PUBLIC . + + TYPES: + BEGIN OF ty_popup, + url TYPE string, + package TYPE devclass, + branch_name TYPE string, + cancel TYPE abap_bool, + END OF ty_popup . + + CONSTANTS: + c_new_branch_label TYPE string VALUE '+ create new ...' ##NO_TEXT. + + METHODS: + popup_package_export + EXPORTING + ev_package TYPE devclass + ev_folder_logic TYPE string + RAISING + zcx_abapgit_exception, + + popup_folder_logic + RETURNING + VALUE(rv_folder_logic) TYPE string + RAISING + zcx_abapgit_exception, + + popup_object + RETURNING + VALUE(rs_tadir) TYPE tadir + RAISING + zcx_abapgit_exception, + + create_branch_popup + EXPORTING + ev_name TYPE string + ev_cancel TYPE abap_bool + RAISING + zcx_abapgit_exception, + + run_page_class_popup + EXPORTING + ev_name TYPE string + ev_cancel TYPE abap_bool + RAISING + zcx_abapgit_exception, + + repo_new_offline + RETURNING + VALUE(rs_popup) TYPE zif_abapgit_popups=>ty_popup + RAISING + zcx_abapgit_exception, + + branch_list_popup + IMPORTING + iv_url TYPE string + iv_default_branch TYPE string OPTIONAL + iv_show_new_option TYPE abap_bool OPTIONAL + RETURNING + VALUE(rs_branch) TYPE zif_abapgit_definitions=>ty_git_branch + RAISING + zcx_abapgit_exception, + + repo_popup + IMPORTING + iv_url TYPE string + iv_package TYPE devclass OPTIONAL + iv_branch TYPE string DEFAULT 'refs/heads/master' + iv_freeze_package TYPE abap_bool OPTIONAL + iv_freeze_url TYPE abap_bool OPTIONAL + iv_title TYPE clike DEFAULT 'Clone repository ...' + RETURNING + VALUE(rs_popup) TYPE zif_abapgit_popups=>ty_popup + RAISING + zcx_abapgit_exception ##NO_TEXT, + + popup_to_confirm + IMPORTING + titlebar TYPE clike + text_question TYPE clike + text_button_1 TYPE clike DEFAULT 'Yes' + icon_button_1 TYPE icon-name DEFAULT space + text_button_2 TYPE clike DEFAULT 'No' + icon_button_2 TYPE icon-name DEFAULT space + default_button TYPE char1 DEFAULT '1' + display_cancel_button TYPE char1 DEFAULT abap_true + RETURNING + VALUE(rv_answer) TYPE char1 + RAISING + zcx_abapgit_exception, + + popup_to_inform + IMPORTING + titlebar TYPE clike + text_message TYPE clike + RAISING + zcx_abapgit_exception, + + popup_to_create_package + EXPORTING + es_package_data TYPE scompkdtln + ev_create TYPE boolean + RAISING + zcx_abapgit_exception, + + popup_to_create_transp_branch + IMPORTING + it_transport_headers TYPE trwbo_request_headers + RETURNING + VALUE(rs_transport_branch) TYPE zif_abapgit_definitions=>ty_transport_to_branch + RAISING + zcx_abapgit_exception + zcx_abapgit_cancel, + + popup_to_select_transports + RETURNING + VALUE(rt_trkorr) TYPE trwbo_request_headers, + + popup_to_select_from_list + IMPORTING + it_list TYPE STANDARD TABLE + i_header_text TYPE csequence + i_select_column_text TYPE csequence + it_columns_to_display TYPE stringtab + EXPORTING + VALUE(et_list) TYPE STANDARD TABLE + RAISING + zcx_abapgit_cancel + zcx_abapgit_exception, + + branch_popup_callback + IMPORTING + iv_code TYPE clike + CHANGING + ct_fields TYPE zif_abapgit_definitions=>ty_sval_tt + cs_error TYPE svale + cv_show_popup TYPE char01 + RAISING + zcx_abapgit_exception, + + package_popup_callback + IMPORTING + iv_code TYPE clike + CHANGING + ct_fields TYPE zif_abapgit_definitions=>ty_sval_tt + cs_error TYPE svale + cv_show_popup TYPE char01 + RAISING + zcx_abapgit_exception, + + popup_transport_request + IMPORTING + is_transport_type TYPE zif_abapgit_definitions=>ty_transport_type + RETURNING + VALUE(rv_transport) TYPE trkorr + RAISING + zcx_abapgit_exception + zcx_abapgit_cancel . + +ENDINTERFACE. diff --git a/src/ui/zif_abapgit_popups.intf.xml b/src/ui/zif_abapgit_popups.intf.xml new file mode 100644 index 000000000..d6cf35d51 --- /dev/null +++ b/src/ui/zif_abapgit_popups.intf.xml @@ -0,0 +1,16 @@ + + + + + + ZIF_ABAPGIT_POPUPS + 1 + E + abapGit popups + 2 + 1 + X + + + + diff --git a/src/zabapgit_forms.prog.abap b/src/zabapgit_forms.prog.abap index 5bd54503c..c54e03242 100644 --- a/src/zabapgit_forms.prog.abap +++ b/src/zabapgit_forms.prog.abap @@ -64,7 +64,7 @@ FORM branch_popup TABLES tt_fields TYPE zif_abapgit_definitions=>ty_sval_tt DATA: lx_error TYPE REF TO zcx_abapgit_exception. TRY. - zcl_abapgit_popups=>branch_popup_callback( + zcl_abapgit_ui_factory=>get_popups( )->branch_popup_callback( EXPORTING iv_code = pv_code CHANGING @@ -88,7 +88,7 @@ FORM package_popup TABLES tt_fields TYPE zif_abapgit_definitions=>ty_sval_tt DATA: lx_error TYPE REF TO zcx_abapgit_exception. TRY. - zcl_abapgit_popups=>package_popup_callback( + zcl_abapgit_ui_factory=>get_popups( )->package_popup_callback( EXPORTING iv_code = pv_code CHANGING diff --git a/src/zcl_abapgit_transport.clas.abap b/src/zcl_abapgit_transport.clas.abap index 1a1a89bfd..d3bd00cfe 100644 --- a/src/zcl_abapgit_transport.clas.abap +++ b/src/zcl_abapgit_transport.clas.abap @@ -152,7 +152,7 @@ CLASS ZCL_ABAPGIT_TRANSPORT IMPLEMENTATION. lt_trkorr TYPE trwbo_request_headers. - lt_trkorr = zcl_abapgit_popups=>popup_to_select_transports( ). + lt_trkorr = zcl_abapgit_ui_factory=>get_popups( )->popup_to_select_transports( ). IF lines( lt_trkorr ) = 0. RETURN. ENDIF. @@ -172,7 +172,7 @@ CLASS ZCL_ABAPGIT_TRANSPORT IMPLEMENTATION. ls_data-package = lv_package. ls_data-dot_abapgit = zcl_abapgit_dot_abapgit=>build_default( )->get_data( ). - ls_data-dot_abapgit-folder_logic = zcl_abapgit_popups=>popup_folder_logic( ). + ls_data-dot_abapgit-folder_logic = zcl_abapgit_ui_factory=>get_popups( )->popup_folder_logic( ). CREATE OBJECT lo_repo EXPORTING diff --git a/src/zcl_abapgit_zip.clas.abap b/src/zcl_abapgit_zip.clas.abap index 0b6aadcf1..be5b8e337 100644 --- a/src/zcl_abapgit_zip.clas.abap +++ b/src/zcl_abapgit_zip.clas.abap @@ -119,7 +119,7 @@ CLASS zcl_abapgit_zip IMPLEMENTATION. FIELD-SYMBOLS: LIKE LINE OF lt_files. - ls_tadir = zcl_abapgit_popups=>popup_object( ). + ls_tadir = zcl_abapgit_ui_factory=>get_popups( )->popup_object( ). IF ls_tadir IS INITIAL. RAISE EXCEPTION TYPE zcx_abapgit_cancel. ENDIF. @@ -205,7 +205,7 @@ CLASS zcl_abapgit_zip IMPLEMENTATION. ls_data-key = 'DUMMY'. ls_data-dot_abapgit = zcl_abapgit_dot_abapgit=>build_default( )->get_data( ). - zcl_abapgit_popups=>popup_package_export( + zcl_abapgit_ui_factory=>get_popups( )->popup_package_export( IMPORTING ev_package = ls_data-package ev_folder_logic = ls_data-dot_abapgit-folder_logic ). From a1e23739b255e78c6768b95d991106dc25cf1080 Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 17 Jun 2018 07:58:52 +0000 Subject: [PATCH 089/136] 1.69.1 --- src/zif_abapgit_definitions.intf.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index 26b75afbb..653215f95 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -326,7 +326,7 @@ INTERFACE zif_abapgit_definitions PUBLIC. END OF ty_s_user_settings. CONSTANTS gc_xml_version TYPE string VALUE 'v1.0.0' ##NO_TEXT. - CONSTANTS gc_abap_version TYPE string VALUE '1.69.0' ##NO_TEXT. + CONSTANTS gc_abap_version TYPE string VALUE '1.69.1' ##NO_TEXT. CONSTANTS: BEGIN OF gc_type, commit TYPE zif_abapgit_definitions=>ty_type VALUE 'commit', "#EC NOTEXT From fe6c978198ea33cb5cb9053ca12ec1d63200d50b Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sun, 17 Jun 2018 10:00:36 +0200 Subject: [PATCH 090/136] v1.69.1 --- changelog.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/changelog.txt b/changelog.txt index 4c02165f2..4a31d2b9d 100644 --- a/changelog.txt +++ b/changelog.txt @@ -8,6 +8,17 @@ Legend + : added - : removed +2018-06-17 v1.69.1 +------------------ ++ new exit: change_tadir +* fix objects outside of repo +* started dependency injection for unit testing +* DDLS fix dump +* handle repair transports +* SSFO catch exception +* SEO_CS_CACHE downport +* TABL consider DD12L in changed_by + 2018-06-09 v1.69.0 ------------------ ! FORM serialization, filenames changed From 9f75d6bd2bf8eadfec3b383c5fc9ad970d35f3eb Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 17 Jun 2018 08:23:56 +0000 Subject: [PATCH 091/136] refresh repo cache after deletion #1482 --- src/ui/zcl_abapgit_services_git.clas.abap | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ui/zcl_abapgit_services_git.clas.abap b/src/ui/zcl_abapgit_services_git.clas.abap index fda6bca65..87326ebcc 100644 --- a/src/ui/zcl_abapgit_services_git.clas.abap +++ b/src/ui/zcl_abapgit_services_git.clas.abap @@ -77,7 +77,7 @@ ENDCLASS. -CLASS zcl_abapgit_services_git IMPLEMENTATION. +CLASS ZCL_ABAPGIT_SERVICES_GIT IMPLEMENTATION. METHOD commit. @@ -233,6 +233,7 @@ CLASS zcl_abapgit_services_git IMPLEMENTATION. zcx_abapgit_exception=>raise( 'Cannot reset. Local code is write-protected by repo config' ). ENDIF. +* todo, separate UI and logic lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm( titlebar = 'Warning' text_question = 'Reset local objects?' @@ -265,6 +266,8 @@ CLASS zcl_abapgit_services_git IMPLEMENTATION. IF lines( lt_selected ) > 0. zcl_abapgit_objects=>delete( lt_selected ). +* update repo cache + lo_repo->refresh( ). ENDIF. ENDIF. From 1290dcec93be23674fce897d2ffc31689c89f0ff Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 17 Jun 2018 12:29:29 +0000 Subject: [PATCH 092/136] CHAR support, #1511 --- src/objects/zcl_abapgit_object_char.clas.abap | 249 ++++++++++++++++++ src/objects/zcl_abapgit_object_char.clas.xml | 18 ++ 2 files changed, 267 insertions(+) create mode 100644 src/objects/zcl_abapgit_object_char.clas.abap create mode 100644 src/objects/zcl_abapgit_object_char.clas.xml diff --git a/src/objects/zcl_abapgit_object_char.clas.abap b/src/objects/zcl_abapgit_object_char.clas.abap new file mode 100644 index 000000000..6d08cb9ad --- /dev/null +++ b/src/objects/zcl_abapgit_object_char.clas.abap @@ -0,0 +1,249 @@ +CLASS zcl_abapgit_object_char DEFINITION + PUBLIC + INHERITING FROM zcl_abapgit_objects_super + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + INTERFACES zif_abapgit_object . + + PRIVATE SECTION. + + TYPES: + BEGIN OF ty_char, + cls_attribute TYPE cls_attribute, + cls_attributet TYPE STANDARD TABLE OF cls_attributet WITH DEFAULT KEY, + cls_attr_value TYPE STANDARD TABLE OF cls_attr_value WITH DEFAULT KEY, + cls_attr_valuet TYPE STANDARD TABLE OF cls_attr_valuet WITH DEFAULT KEY, + END OF ty_char . + + METHODS instantiate_char + IMPORTING + !iv_type_group TYPE cls_object_type_group + RETURNING + VALUE(ro_char) TYPE REF TO cl_cls_attribute + RAISING + zcx_abapgit_exception . +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_OBJECT_CHAR IMPLEMENTATION. + + + METHOD instantiate_char. + + DATA: lv_new TYPE abap_bool, + lv_name TYPE cls_attribute_name. + + + SELECT SINGLE name FROM cls_attribute INTO lv_name WHERE name = ms_item-obj_name. + lv_new = boolc( sy-subrc <> 0 ). + lv_name = ms_item-obj_name. + + TRY. + CREATE OBJECT ro_char + EXPORTING + im_name = lv_name + im_type_group = iv_type_group + im_new = lv_new. + CATCH cx_pak_invalid_data + cx_pak_not_authorized + cx_pak_invalid_state + cx_pak_wb_object_locked. + zcx_abapgit_exception=>raise( 'Error while instantiating CL_CLS_ATTRIBUTE' ). + ENDTRY. + + IF lv_new = abap_false. + TRY. + ro_char->if_pak_wb_object~lock_and_refresh( ). + CATCH cx_pak_wb_object_locked. + zcx_abapgit_exception=>raise( |Could not aquire lock, CHAR { lv_name }| ). + ENDTRY. + ENDIF. + + ENDMETHOD. + + + METHOD zif_abapgit_object~changed_by. + + SELECT SINGLE changed_by FROM cls_attribute INTO rv_user + WHERE name = ms_item-obj_name + AND activation_state = 'A'. + + IF rv_user IS INITIAL. + SELECT SINGLE created_by FROM cls_attribute INTO rv_user + WHERE name = ms_item-obj_name + AND activation_state = 'A'. + ENDIF. + + IF rv_user IS INITIAL. + rv_user = c_user_unknown. + ENDIF. + + ENDMETHOD. + + + METHOD zif_abapgit_object~compare_to_remote_version. + CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. + ENDMETHOD. + + + METHOD zif_abapgit_object~delete. + + DATA: lo_char TYPE REF TO cl_cls_attribute, + lv_type_group TYPE cls_attribute-type_group. + + + SELECT SINGLE type_group FROM cls_attribute INTO lv_type_group + WHERE name = ms_item-obj_name + AND activation_state = 'A'. + + lo_char = instantiate_char( lv_type_group ). + + lo_char->if_pak_wb_object~delete( ). + + lo_char->if_pak_wb_object~save( ). + + lo_char->if_pak_wb_object_internal~unlock( ). + + ENDMETHOD. + + + METHOD zif_abapgit_object~deserialize. + + DATA: ls_char TYPE ty_char, + lv_request TYPE trkorr, + ls_description LIKE LINE OF ls_char-cls_attributet, + lo_char TYPE REF TO cl_cls_attribute. + + + io_xml->read( EXPORTING iv_name = 'CHAR' + CHANGING cg_data = ls_char ). + + tadir_insert( iv_package ). + + lo_char = instantiate_char( ls_char-cls_attribute-type_group ). + + lo_char->if_cls_attribute~set_kind( ls_char-cls_attribute-kind ). + lo_char->if_cls_attribute~set_single_valued( ls_char-cls_attribute-is_single_valued ). + lo_char->if_cls_attribute~set_aspect( + im_aspect_for = ls_char-cls_attribute-is_aspect_for + im_aspect_value = ls_char-cls_attribute-aspect_value ). + lo_char->if_cls_attribute~set_default_flag( ls_char-cls_attribute-default_flag ). + lo_char->if_cls_attribute~set_default_value( ls_char-cls_attribute-default_value ). + lo_char->if_cls_attribute~set_sub_object_treatment( ls_char-cls_attribute-sub_obj_treatm ). + lo_char->if_cls_attribute~set_automatic_changes_allowed( ls_char-cls_attribute-automatic_change ). + lo_char->if_cls_attribute~set_manual_changes_allowed( ls_char-cls_attribute-manu_chag_allow ). + lo_char->if_cls_attribute~set_implicit_changes_allowed( ls_char-cls_attribute-implicit_change ). + lo_char->if_cls_attribute~set_expl_values_dominate_links( ls_char-cls_attribute-weak_links ). + lo_char->if_cls_attribute~set_assignment_package_rule( ls_char-cls_attribute-assignment_devc ). + lo_char->if_cls_attribute~set_hide_remark( ls_char-cls_attribute-hide_remark ). + lo_char->if_cls_attribute~set_visible_in_customer_system( ls_char-cls_attribute-visible_for_cust ). + lo_char->if_cls_attribute~set_value_table( ls_char-cls_attribute-value_table ). + lo_char->if_cls_attribute~set_vtable_field( ls_char-cls_attribute-vtable_field ). + lo_char->if_cls_attribute~set_vtable_icon_f( ls_char-cls_attribute-vtable_icon_f ). + lo_char->if_cls_attribute~set_vtext_langu_f( ls_char-cls_attribute-vtext_langu_f ). + lo_char->if_cls_attribute~set_vtext_table( ls_char-cls_attribute-vtext_table ). + lo_char->if_cls_attribute~set_vtext_text_f( ls_char-cls_attribute-vtext_text_f ). + lo_char->if_cls_attribute~set_vtext_value_f( ls_char-cls_attribute-vtext_value_f ). + lo_char->if_cls_attribute~set_existing_objects_only( ls_char-cls_attribute-existing_objects ). + lo_char->if_cls_attribute~set_objs_of_typegr( ls_char-cls_attribute-objs_of_typegr ). + lo_char->if_cls_attribute~set_obj_values_have_subtypes( ls_char-cls_attribute-objs_w_subtype ). + lo_char->if_cls_attribute~set_arbtry_val_type( ls_char-cls_attribute-arbtry_val_type ). + + READ TABLE ls_char-cls_attributet INTO ls_description WITH KEY langu = sy-langu. + IF sy-subrc <> 0. + READ TABLE ls_char-cls_attributet INTO ls_description INDEX 1. + ENDIF. + lo_char->if_cls_attribute~set_description( ls_description-text ). + + lo_char->if_cls_attribute~set_values( + im_values = ls_char-cls_attr_value + im_values_t = ls_char-cls_attr_valuet ). + +* set default package, see function module RS_CORR_INSERT + SET PARAMETER ID 'EUK' FIELD iv_package. + + lo_char->if_pak_wb_object~save( ). + + SET PARAMETER ID 'EUK' FIELD ''. + + lo_char->if_pak_wb_object~activate( ). + + lo_char->if_pak_wb_object_internal~unlock( ). + + ENDMETHOD. + + + METHOD zif_abapgit_object~exists. + + rv_bool = cl_cls_attribute=>exists_object_attribute( ms_item-obj_name ). + + ENDMETHOD. + + + METHOD zif_abapgit_object~get_metadata. + rs_metadata = get_metadata( ). + ENDMETHOD. + + + METHOD zif_abapgit_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. + + + METHOD zif_abapgit_object~jump. + + CALL FUNCTION 'RS_TOOL_ACCESS' + EXPORTING + operation = 'SHOW' + object_name = ms_item-obj_name + object_type = ms_item-obj_type + EXCEPTIONS + not_executed = 1 + invalid_object_type = 2 + OTHERS = 3. + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |Error from RS_TOOL_ACCESS, CHAR| ). + ENDIF. + + ENDMETHOD. + + + METHOD zif_abapgit_object~serialize. + + DATA: ls_char TYPE ty_char. + + CONSTANTS: lc_active TYPE c LENGTH 1 VALUE 'A'. + + + SELECT SINGLE * FROM cls_attribute INTO ls_char-cls_attribute + WHERE name = ms_item-obj_name + AND activation_state = lc_active. +* todo, ASSIGNMENT_DEVC? + + CLEAR: ls_char-cls_attribute-created_by, + ls_char-cls_attribute-created_on, + ls_char-cls_attribute-changed_by, + ls_char-cls_attribute-changed_on. + + SELECT * FROM cls_attributet INTO TABLE ls_char-cls_attributet + WHERE name = ms_item-obj_name + AND activation_state = lc_active. + + SELECT * FROM cls_attr_value INTO TABLE ls_char-cls_attr_value + WHERE name = ms_item-obj_name + AND activation_state = lc_active. + + SELECT * FROM cls_attr_valuet INTO TABLE ls_char-cls_attr_valuet + WHERE name = ms_item-obj_name + AND activation_state = lc_active. + + io_xml->add( iv_name = 'CHAR' + ig_data = ls_char ). + + ENDMETHOD. +ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_char.clas.xml b/src/objects/zcl_abapgit_object_char.clas.xml new file mode 100644 index 000000000..d7b57e002 --- /dev/null +++ b/src/objects/zcl_abapgit_object_char.clas.xml @@ -0,0 +1,18 @@ + + + + + + ZCL_ABAPGIT_OBJECT_CHAR + 1 + E + 2 + 1 + X + X + X + X + + + + From 59421eb2124cccfa4dc4af31076235bea79c2591 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sun, 17 Jun 2018 14:46:55 +0200 Subject: [PATCH 093/136] docs: supported objects, update links --- docs/ref-supported.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/ref-supported.md b/docs/ref-supported.md index 66349791c..c8437d007 100644 --- a/docs/ref-supported.md +++ b/docs/ref-supported.md @@ -10,7 +10,9 @@ Type | Description | Supported ACID | Checkpoint Group | Yes AOBJ | Archiving Object | [#804](https://github.com/larshp/abapGit/issues/804) AUTH | Authorization Check Fields | Yes +AVAS | Classification | [#1360](https://github.com/larshp/abapGit/issues/1360) BOBF | BOPF: Business Object Model | [#165](https://github.com/larshp/abapGit/issues/165) +CHAR | Object characteristic | [#1511](https://github.com/larshp/abapGit/issues/1511) CHDO | Change Document Object | [#802](https://github.com/larshp/abapGit/issues/802) CLAS | Class (ABAP Objects) | Yes CMOD | Customer enhancement projects | [#151](https://github.com/larshp/abapGit/issues/151) From c05ff4ce8b22f3520ef51ab501181199e8c0dd69 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sun, 17 Jun 2018 14:54:02 +0200 Subject: [PATCH 094/136] docs: add link to OTGR issue --- docs/ref-supported.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/ref-supported.md b/docs/ref-supported.md index c8437d007..e75dddee0 100644 --- a/docs/ref-supported.md +++ b/docs/ref-supported.md @@ -53,6 +53,7 @@ JOBD | Technical Job Definition | Yes LPDC | Launchpad short texts | [#107](https://github.com/larshp/abapGit/issues/107) MSAG | Message Class | Yes NROB | Number Range Objects | Yes +OTGR | Object type group | [#1515](https://github.com/larshp/abapGit/issues/1515) PARA | SPA/GPA Parameters | Yes PDTS | Standard Task | [#153](https://github.com/larshp/abapGit/issues/153) PDWS | Workflow templates | [#154](https://github.com/larshp/abapGit/issues/154) From 7e4285c1a87d7e266ffd4f075b43e9a5d13b142d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20Hud=C3=A1k?= Date: Mon, 18 Jun 2018 09:21:51 +0200 Subject: [PATCH 095/136] Fixed error message when committing --- src/ui/zcl_abapgit_services_git.clas.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/zcl_abapgit_services_git.clas.abap b/src/ui/zcl_abapgit_services_git.clas.abap index fda6bca65..b5c1f3943 100644 --- a/src/ui/zcl_abapgit_services_git.clas.abap +++ b/src/ui/zcl_abapgit_services_git.clas.abap @@ -96,7 +96,7 @@ CLASS zcl_abapgit_services_git IMPLEMENTATION. ELSEIF is_commit-committer_email IS INITIAL. zcx_abapgit_exception=>raise( 'Commit: Committer email empty' ). ELSEIF is_commit-author_email IS NOT INITIAL AND is_commit-author_name IS INITIAL. - zcx_abapgit_exception=>raise( 'Commit: Author email empty' ). " Opposite should be OK ? + zcx_abapgit_exception=>raise( 'Commit: Author name empty' ). " Opposite should be OK ? ELSEIF is_commit-comment IS INITIAL. zcx_abapgit_exception=>raise( 'Commit: empty comment' ). ENDIF. From 6521d094707e43fe8621c11e3c5813b6ac5635e1 Mon Sep 17 00:00:00 2001 From: christianguenter2 Date: Mon, 18 Jun 2018 12:32:07 +0200 Subject: [PATCH 096/136] Block pull if any of deserialized object is locked --- src/objects/zcl_abapgit_object_acid.clas.abap | 6 + src/objects/zcl_abapgit_object_auth.clas.abap | 9 +- .../zcl_abapgit_object_clas_old.clas.abap | 47 +++++- src/objects/zcl_abapgit_object_cmpt.clas.abap | 6 + src/objects/zcl_abapgit_object_cus0.clas.abap | 6 + src/objects/zcl_abapgit_object_cus1.clas.abap | 6 + src/objects/zcl_abapgit_object_cus2.clas.abap | 6 + src/objects/zcl_abapgit_object_dcls.clas.abap | 10 +- src/objects/zcl_abapgit_object_ddls.clas.abap | 8 + src/objects/zcl_abapgit_object_ddlx.clas.abap | 10 +- src/objects/zcl_abapgit_object_devc.clas.abap | 14 ++ src/objects/zcl_abapgit_object_dial.clas.abap | 7 + src/objects/zcl_abapgit_object_doct.clas.abap | 6 + src/objects/zcl_abapgit_object_docv.clas.abap | 6 + src/objects/zcl_abapgit_object_doma.clas.abap | 10 +- src/objects/zcl_abapgit_object_dsys.clas.abap | 6 + src/objects/zcl_abapgit_object_dtel.clas.abap | 11 +- src/objects/zcl_abapgit_object_ecat.clas.abap | 9 +- .../zcl_abapgit_object_ecatt_super.clas.abap | 19 ++- src/objects/zcl_abapgit_object_ecsd.clas.abap | 9 +- src/objects/zcl_abapgit_object_ecsp.clas.abap | 9 +- src/objects/zcl_abapgit_object_ectc.clas.abap | 9 +- src/objects/zcl_abapgit_object_ectd.clas.abap | 9 +- src/objects/zcl_abapgit_object_ecvo.clas.abap | 9 +- src/objects/zcl_abapgit_object_enho.clas.abap | 6 + src/objects/zcl_abapgit_object_enhs.clas.abap | 6 + src/objects/zcl_abapgit_object_enqu.clas.abap | 6 + src/objects/zcl_abapgit_object_ensc.clas.abap | 6 + src/objects/zcl_abapgit_object_form.clas.abap | 6 + src/objects/zcl_abapgit_object_fugr.clas.abap | 99 +++++++++++- src/objects/zcl_abapgit_object_iamu.clas.abap | 6 + src/objects/zcl_abapgit_object_iarp.clas.abap | 6 + src/objects/zcl_abapgit_object_iasp.clas.abap | 6 + src/objects/zcl_abapgit_object_iatu.clas.abap | 6 + src/objects/zcl_abapgit_object_idoc.clas.abap | 7 + src/objects/zcl_abapgit_object_iext.clas.abap | 6 + src/objects/zcl_abapgit_object_intf.clas.abap | 7 + src/objects/zcl_abapgit_object_jobd.clas.abap | 7 + src/objects/zcl_abapgit_object_msag.clas.abap | 6 + src/objects/zcl_abapgit_object_nrob.clas.abap | 6 + src/objects/zcl_abapgit_object_para.clas.abap | 6 + src/objects/zcl_abapgit_object_pinf.clas.abap | 6 + src/objects/zcl_abapgit_object_prag.clas.abap | 7 + src/objects/zcl_abapgit_object_prog.clas.abap | 31 +++- src/objects/zcl_abapgit_object_sfbf.clas.abap | 7 + src/objects/zcl_abapgit_object_sfbs.clas.abap | 7 + src/objects/zcl_abapgit_object_sfpf.clas.abap | 7 + src/objects/zcl_abapgit_object_sfpi.clas.abap | 6 + src/objects/zcl_abapgit_object_sfsw.clas.abap | 7 + src/objects/zcl_abapgit_object_shi3.clas.abap | 6 + src/objects/zcl_abapgit_object_shi5.clas.abap | 6 + src/objects/zcl_abapgit_object_shi8.clas.abap | 6 + src/objects/zcl_abapgit_object_shlp.clas.abap | 6 + src/objects/zcl_abapgit_object_shma.clas.abap | 6 + src/objects/zcl_abapgit_object_sicf.clas.abap | 7 + src/objects/zcl_abapgit_object_smim.clas.abap | 6 + src/objects/zcl_abapgit_object_splo.clas.abap | 6 + src/objects/zcl_abapgit_object_srfc.clas.abap | 7 + src/objects/zcl_abapgit_object_ssfo.clas.abap | 6 + src/objects/zcl_abapgit_object_ssst.clas.abap | 7 + src/objects/zcl_abapgit_object_styl.clas.abap | 6 + src/objects/zcl_abapgit_object_susc.clas.abap | 6 + src/objects/zcl_abapgit_object_suso.clas.abap | 6 + src/objects/zcl_abapgit_object_sxci.clas.abap | 7 + src/objects/zcl_abapgit_object_tabl.clas.abap | 8 + .../zcl_abapgit_object_tabl_dialog.clas.abap | 1 + src/objects/zcl_abapgit_object_tobj.clas.abap | 6 + src/objects/zcl_abapgit_object_tran.clas.abap | 7 + src/objects/zcl_abapgit_object_ttyp.clas.abap | 6 + src/objects/zcl_abapgit_object_type.clas.abap | 6 + src/objects/zcl_abapgit_object_ucsa.clas.abap | 7 + src/objects/zcl_abapgit_object_vcls.clas.abap | 6 + src/objects/zcl_abapgit_object_view.clas.abap | 7 + .../zcl_abapgit_object_w3super.clas.abap | 7 + src/objects/zcl_abapgit_object_wapa.clas.abap | 6 + src/objects/zcl_abapgit_object_wdya.clas.abap | 6 + src/objects/zcl_abapgit_object_wdyn.clas.abap | 7 + src/objects/zcl_abapgit_object_webi.clas.abap | 7 + src/objects/zcl_abapgit_object_xinx.clas.abap | 7 + src/objects/zcl_abapgit_object_xslt.clas.abap | 6 + .../zcl_abapgit_objects_program.clas.abap | 64 ++++++++ .../zcl_abapgit_objects_saxx_super.clas.abap | 9 +- .../zcl_abapgit_objects_super.clas.abap | 35 +++- src/objects/zif_abapgit_object.intf.abap | 4 + src/zcl_abapgit_objects.clas.abap | 80 +++++++--- src/zcl_abapgit_objects.clas.testclasses.abap | 150 ++++++++++++++++++ src/zcl_abapgit_objects_bridge.clas.abap | 7 + src/zcl_abapgit_repo.clas.abap | 4 +- 88 files changed, 1026 insertions(+), 44 deletions(-) diff --git a/src/objects/zcl_abapgit_object_acid.clas.abap b/src/objects/zcl_abapgit_object_acid.clas.abap index df68176b8..cf4b328fb 100644 --- a/src/objects/zcl_abapgit_object_acid.clas.abap +++ b/src/objects/zcl_abapgit_object_acid.clas.abap @@ -139,4 +139,10 @@ CLASS zcl_abapgit_object_acid IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_acid IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_auth.clas.abap b/src/objects/zcl_abapgit_object_auth.clas.abap index 4b99d7931..ff36e3d57 100644 --- a/src/objects/zcl_abapgit_object_auth.clas.abap +++ b/src/objects/zcl_abapgit_object_auth.clas.abap @@ -8,7 +8,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_OBJECT_AUTH IMPLEMENTATION. +CLASS zcl_abapgit_object_auth IMPLEMENTATION. METHOD zif_abapgit_object~changed_by. @@ -127,4 +127,11 @@ CLASS ZCL_ABAPGIT_OBJECT_AUTH IMPLEMENTATION. ig_data = ls_authx ). ENDMETHOD. "zif_abapgit_object~serialize + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_clas_old.clas.abap b/src/objects/zcl_abapgit_object_clas_old.clas.abap index 4b898e2e5..192f0f200 100644 --- a/src/objects/zcl_abapgit_object_clas_old.clas.abap +++ b/src/objects/zcl_abapgit_object_clas_old.clas.abap @@ -30,12 +30,17 @@ CLASS zcl_abapgit_object_clas_old DEFINITION PUBLIC INHERITING FROM zcl_abapgit_ serialize_xml IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_output RAISING zcx_abapgit_exception. + PRIVATE SECTION. + METHODS: + is_class_locked + RETURNING VALUE(rv_is_class_locked) TYPE abap_bool + RAISING zcx_abapgit_exception. ENDCLASS. -CLASS ZCL_ABAPGIT_OBJECT_CLAS_OLD IMPLEMENTATION. +CLASS zcl_abapgit_object_clas_old IMPLEMENTATION. METHOD constructor. @@ -408,4 +413,44 @@ CLASS ZCL_ABAPGIT_OBJECT_CLAS_OLD IMPLEMENTATION. serialize_xml( io_xml ). ENDMETHOD. "serialize + + METHOD zif_abapgit_object~is_locked. + + DATA: lv_classpool TYPE program. + + lv_classpool = cl_oo_classname_service=>get_classpool_name( |{ ms_item-obj_name }| ). + + IF is_class_locked( ) = abap_true + OR is_text_locked( lv_classpool ) = abap_true. + + rv_is_locked = abap_true. + + ENDIF. + + ENDMETHOD. + + + METHOD is_class_locked. + + DATA: lv_clsname TYPE seoclsenq-clsname. + + lv_clsname = ms_item-obj_name. + OVERLAY lv_clsname WITH '=============================='. + + CALL FUNCTION 'ENQUEUE_ESEOCLASS' + EXPORTING + clsname = lv_clsname + EXCEPTIONS + foreign_lock = 1 + system_failure = 2 + OTHERS = 3. + + rv_is_class_locked = boolc( sy-subrc <> 0 ). + + CALL FUNCTION 'DEQUEUE_ESEOCLASS' + EXPORTING + clsname = lv_clsname. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_cmpt.clas.abap b/src/objects/zcl_abapgit_object_cmpt.clas.abap index 78c35ee02..ed24e282b 100644 --- a/src/objects/zcl_abapgit_object_cmpt.clas.abap +++ b/src/objects/zcl_abapgit_object_cmpt.clas.abap @@ -214,6 +214,12 @@ CLASS ZCL_ABAPGIT_OBJECT_CMPT IMPLEMENTATION. zcx_abapgit_exception=>raise( 'CMPT not supported' ). ENDTRY. + ENDMETHOD. + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_cus0.clas.abap b/src/objects/zcl_abapgit_object_cus0.clas.abap index 3a15b2760..c34d00bfa 100644 --- a/src/objects/zcl_abapgit_object_cus0.clas.abap +++ b/src/objects/zcl_abapgit_object_cus0.clas.abap @@ -140,4 +140,10 @@ CLASS zcl_abapgit_object_cus0 IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_cus0 IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_cus1.clas.abap b/src/objects/zcl_abapgit_object_cus1.clas.abap index 616978ad2..88a6a9399 100644 --- a/src/objects/zcl_abapgit_object_cus1.clas.abap +++ b/src/objects/zcl_abapgit_object_cus1.clas.abap @@ -152,4 +152,10 @@ CLASS zcl_abapgit_object_cus1 IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_cus1 IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_cus2.clas.abap b/src/objects/zcl_abapgit_object_cus2.clas.abap index 8ecad1e41..3b83a523c 100644 --- a/src/objects/zcl_abapgit_object_cus2.clas.abap +++ b/src/objects/zcl_abapgit_object_cus2.clas.abap @@ -145,4 +145,10 @@ CLASS zcl_abapgit_object_cus2 IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_cus2 IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_dcls.clas.abap b/src/objects/zcl_abapgit_object_dcls.clas.abap index 14fd22311..f66ab48c1 100644 --- a/src/objects/zcl_abapgit_object_dcls.clas.abap +++ b/src/objects/zcl_abapgit_object_dcls.clas.abap @@ -8,7 +8,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_OBJECT_DCLS IMPLEMENTATION. +CLASS zcl_abapgit_object_dcls IMPLEMENTATION. METHOD zif_abapgit_object~changed_by. @@ -194,4 +194,12 @@ CLASS ZCL_ABAPGIT_OBJECT_DCLS IMPLEMENTATION. ENDTRY. ENDMETHOD. + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'E_ACMDCLSRC' + iv_argument = |{ ms_item-obj_name }| ). + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_ddls.clas.abap b/src/objects/zcl_abapgit_object_ddls.clas.abap index b83ee5df1..0102167ae 100644 --- a/src/objects/zcl_abapgit_object_ddls.clas.abap +++ b/src/objects/zcl_abapgit_object_ddls.clas.abap @@ -300,4 +300,12 @@ CLASS ZCL_ABAPGIT_OBJECT_DDLS IMPLEMENTATION. ig_data = ). ENDMETHOD. "serialize + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'ESDICT' + iv_argument = |{ ms_item-obj_type }{ ms_item-obj_name }| ). + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_ddlx.clas.abap b/src/objects/zcl_abapgit_object_ddlx.clas.abap index 10abc5bbf..2802671a2 100644 --- a/src/objects/zcl_abapgit_object_ddlx.clas.abap +++ b/src/objects/zcl_abapgit_object_ddlx.clas.abap @@ -28,7 +28,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_OBJECT_DDLX IMPLEMENTATION. +CLASS zcl_abapgit_object_ddlx IMPLEMENTATION. METHOD clear_field. @@ -254,4 +254,12 @@ CLASS ZCL_ABAPGIT_OBJECT_DDLX IMPLEMENTATION. ENDTRY. ENDMETHOD. + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'ESDICT' + iv_argument = |{ ms_item-obj_type }{ ms_item-obj_name }| ). + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_devc.clas.abap b/src/objects/zcl_abapgit_object_devc.clas.abap index c89ee7e4b..cd5f50025 100644 --- a/src/objects/zcl_abapgit_object_devc.clas.abap +++ b/src/objects/zcl_abapgit_object_devc.clas.abap @@ -544,4 +544,18 @@ CLASS zcl_abapgit_object_devc IMPLEMENTATION. io_xml->add( iv_name = 'PERMISSION' ig_data = lt_usage_data ). ENDIF. ENDMETHOD. + + METHOD zif_abapgit_object~is_locked. + + DATA: lv_object TYPE eqegraarg . + + lv_object = |DV{ ms_item-obj_name }|. + OVERLAY lv_object WITH ' '. + lv_object = lv_object && '*'. + + rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'EEUDB' + iv_argument = lv_object ). + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_dial.clas.abap b/src/objects/zcl_abapgit_object_dial.clas.abap index 489daaae3..8432ce522 100644 --- a/src/objects/zcl_abapgit_object_dial.clas.abap +++ b/src/objects/zcl_abapgit_object_dial.clas.abap @@ -206,4 +206,11 @@ CLASS ZCL_ABAPGIT_OBJECT_DIAL IMPLEMENTATION. WHERE dnam = lv_dnam. ENDMETHOD. + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_doct.clas.abap b/src/objects/zcl_abapgit_object_doct.clas.abap index 8459a0fa0..122cdd7a8 100644 --- a/src/objects/zcl_abapgit_object_doct.clas.abap +++ b/src/objects/zcl_abapgit_object_doct.clas.abap @@ -191,4 +191,10 @@ CLASS zcl_abapgit_object_doct IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_msag IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_docv.clas.abap b/src/objects/zcl_abapgit_object_docv.clas.abap index 455748b35..2d8720c71 100644 --- a/src/objects/zcl_abapgit_object_docv.clas.abap +++ b/src/objects/zcl_abapgit_object_docv.clas.abap @@ -153,4 +153,10 @@ CLASS zcl_abapgit_object_docv IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_msag IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_doma.clas.abap b/src/objects/zcl_abapgit_object_doma.clas.abap index 77ab42d2c..5e19c3492 100644 --- a/src/objects/zcl_abapgit_object_doma.clas.abap +++ b/src/objects/zcl_abapgit_object_doma.clas.abap @@ -36,7 +36,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_OBJECT_DOMA IMPLEMENTATION. +CLASS zcl_abapgit_object_doma IMPLEMENTATION. METHOD deserialize_texts. @@ -389,4 +389,12 @@ CLASS ZCL_ABAPGIT_OBJECT_DOMA IMPLEMENTATION. serialize_texts( io_xml ). ENDMETHOD. "serialize + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'ESDICT' + iv_argument = |{ ms_item-obj_type }{ ms_item-obj_name }| ). + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_dsys.clas.abap b/src/objects/zcl_abapgit_object_dsys.clas.abap index 96df5b53e..1641bb15c 100644 --- a/src/objects/zcl_abapgit_object_dsys.clas.abap +++ b/src/objects/zcl_abapgit_object_dsys.clas.abap @@ -162,4 +162,10 @@ CLASS zcl_abapgit_object_dsys IMPLEMENTATION. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_dsys IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_dtel.clas.abap b/src/objects/zcl_abapgit_object_dtel.clas.abap index 045746dc1..d2ff80edd 100644 --- a/src/objects/zcl_abapgit_object_dtel.clas.abap +++ b/src/objects/zcl_abapgit_object_dtel.clas.abap @@ -29,7 +29,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_OBJECT_DTEL IMPLEMENTATION. +CLASS zcl_abapgit_object_dtel IMPLEMENTATION. METHOD deserialize_texts. @@ -334,4 +334,13 @@ CLASS ZCL_ABAPGIT_OBJECT_DTEL IMPLEMENTATION. serialize_texts( io_xml ). ENDMETHOD. "serialize + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'ESDICT' + iv_argument = |{ ms_item-obj_type }{ ms_item-obj_name }| ). + + ENDMETHOD. + + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_ecat.clas.abap b/src/objects/zcl_abapgit_object_ecat.clas.abap index ca31dcaac..a9b0b5640 100644 --- a/src/objects/zcl_abapgit_object_ecat.clas.abap +++ b/src/objects/zcl_abapgit_object_ecat.clas.abap @@ -16,7 +16,8 @@ CLASS zcl_abapgit_object_ecat DEFINITION METHODS: get_object_type REDEFINITION, get_upload REDEFINITION, - get_download REDEFINITION. + get_download REDEFINITION, + get_lock_object REDEFINITION. ENDCLASS. @@ -51,4 +52,10 @@ CLASS zcl_abapgit_object_ecat IMPLEMENTATION. ENDMETHOD. + METHOD get_lock_object. + + rv_lock_object = 'E_ECATT'. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_ecatt_super.clas.abap b/src/objects/zcl_abapgit_object_ecatt_super.clas.abap index 473d79b0b..05dd2fdba 100644 --- a/src/objects/zcl_abapgit_object_ecatt_super.clas.abap +++ b/src/objects/zcl_abapgit_object_ecatt_super.clas.abap @@ -28,7 +28,11 @@ CLASS zcl_abapgit_object_ecatt_super DEFINITION get_download ABSTRACT RETURNING - VALUE(ro_download) TYPE REF TO cl_apl_ecatt_download. + VALUE(ro_download) TYPE REF TO cl_apl_ecatt_download, + + get_lock_object ABSTRACT + RETURNING + VALUE(rv_lock_object) TYPE eqeobj. PRIVATE SECTION. TYPES: @@ -628,5 +632,18 @@ CLASS zcl_abapgit_object_ecatt_super IMPLEMENTATION. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + DATA: lv_object TYPE seqg3-garg. + + lv_object = ms_item-obj_name. + OVERLAY lv_object WITH ' '. + lv_object = lv_object && '*'. + + rv_is_locked = exists_a_lock_entry_for( iv_lock_object = get_lock_object( ) + iv_argument = lv_object ). + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_ecsd.clas.abap b/src/objects/zcl_abapgit_object_ecsd.clas.abap index 282108b85..d2e128001 100644 --- a/src/objects/zcl_abapgit_object_ecsd.clas.abap +++ b/src/objects/zcl_abapgit_object_ecsd.clas.abap @@ -16,7 +16,8 @@ CLASS zcl_abapgit_object_ecsd DEFINITION METHODS: get_object_type REDEFINITION, get_upload REDEFINITION, - get_download REDEFINITION. + get_download REDEFINITION, + get_lock_object REDEFINITION. ENDCLASS. @@ -51,4 +52,10 @@ CLASS zcl_abapgit_object_ecsd IMPLEMENTATION. ENDMETHOD. + METHOD get_lock_object. + + rv_lock_object = 'E_ECATT_SD'. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_ecsp.clas.abap b/src/objects/zcl_abapgit_object_ecsp.clas.abap index 2e36e72ea..9a921c8ed 100644 --- a/src/objects/zcl_abapgit_object_ecsp.clas.abap +++ b/src/objects/zcl_abapgit_object_ecsp.clas.abap @@ -16,7 +16,8 @@ CLASS zcl_abapgit_object_ecsp DEFINITION METHODS: get_object_type REDEFINITION, get_upload REDEFINITION, - get_download REDEFINITION. + get_download REDEFINITION, + get_lock_object REDEFINITION. ENDCLASS. @@ -53,4 +54,10 @@ CLASS zcl_abapgit_object_ecsp IMPLEMENTATION. ENDMETHOD. + METHOD get_lock_object. + + rv_lock_object = 'E_ECATT_SP'. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_ectc.clas.abap b/src/objects/zcl_abapgit_object_ectc.clas.abap index 6c884ab9e..0041184cc 100644 --- a/src/objects/zcl_abapgit_object_ectc.clas.abap +++ b/src/objects/zcl_abapgit_object_ectc.clas.abap @@ -16,7 +16,8 @@ CLASS zcl_abapgit_object_ectc DEFINITION METHODS: get_object_type REDEFINITION, get_upload REDEFINITION, - get_download REDEFINITION. + get_download REDEFINITION, + get_lock_object REDEFINITION. ENDCLASS. @@ -51,4 +52,10 @@ CLASS zcl_abapgit_object_ectc IMPLEMENTATION. ENDMETHOD. + METHOD get_lock_object. + + rv_lock_object = 'E_ECATT_TC'. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_ectd.clas.abap b/src/objects/zcl_abapgit_object_ectd.clas.abap index cc2da7979..6691679fc 100644 --- a/src/objects/zcl_abapgit_object_ectd.clas.abap +++ b/src/objects/zcl_abapgit_object_ectd.clas.abap @@ -16,7 +16,8 @@ CLASS zcl_abapgit_object_ectd DEFINITION METHODS: get_object_type REDEFINITION, get_upload REDEFINITION, - get_download REDEFINITION. + get_download REDEFINITION, + get_lock_object REDEFINITION. ENDCLASS. @@ -50,4 +51,10 @@ CLASS zcl_abapgit_object_ectd IMPLEMENTATION. ENDMETHOD. + METHOD get_lock_object. + + rv_lock_object = 'E_ECATT_TD'. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_ecvo.clas.abap b/src/objects/zcl_abapgit_object_ecvo.clas.abap index e02899116..52d90776b 100644 --- a/src/objects/zcl_abapgit_object_ecvo.clas.abap +++ b/src/objects/zcl_abapgit_object_ecvo.clas.abap @@ -16,7 +16,8 @@ CLASS zcl_abapgit_object_ecvo DEFINITION METHODS: get_object_type REDEFINITION, get_upload REDEFINITION, - get_download REDEFINITION. + get_download REDEFINITION, + get_lock_object REDEFINITION. ENDCLASS. @@ -53,4 +54,10 @@ CLASS zcl_abapgit_object_ecvo IMPLEMENTATION. ENDMETHOD. + METHOD get_lock_object. + + rv_lock_object = 'E_ECATT_TD'. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_enho.clas.abap b/src/objects/zcl_abapgit_object_enho.clas.abap index 37cb6a774..c604d5456 100644 --- a/src/objects/zcl_abapgit_object_enho.clas.abap +++ b/src/objects/zcl_abapgit_object_enho.clas.abap @@ -211,4 +211,10 @@ CLASS zcl_abapgit_object_enho IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. "zif_abapgit_object~compare_to_remote_version + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_enho IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_enhs.clas.abap b/src/objects/zcl_abapgit_object_enhs.clas.abap index 7401d007d..92a0317fe 100644 --- a/src/objects/zcl_abapgit_object_enhs.clas.abap +++ b/src/objects/zcl_abapgit_object_enhs.clas.abap @@ -179,4 +179,10 @@ CLASS zcl_abapgit_object_enhs IMPLEMENTATION. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_enhs diff --git a/src/objects/zcl_abapgit_object_enqu.clas.abap b/src/objects/zcl_abapgit_object_enqu.clas.abap index 1b29a4b48..693aea16d 100644 --- a/src/objects/zcl_abapgit_object_enqu.clas.abap +++ b/src/objects/zcl_abapgit_object_enqu.clas.abap @@ -175,4 +175,10 @@ CLASS zcl_abapgit_object_enqu IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_enqu IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_ensc.clas.abap b/src/objects/zcl_abapgit_object_ensc.clas.abap index d7ff374bd..d35d8f0ff 100644 --- a/src/objects/zcl_abapgit_object_ensc.clas.abap +++ b/src/objects/zcl_abapgit_object_ensc.clas.abap @@ -187,4 +187,10 @@ CLASS zcl_abapgit_object_ensc IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_ensc diff --git a/src/objects/zcl_abapgit_object_form.clas.abap b/src/objects/zcl_abapgit_object_form.clas.abap index d81505bb3..1b971431e 100644 --- a/src/objects/zcl_abapgit_object_form.clas.abap +++ b/src/objects/zcl_abapgit_object_form.clas.abap @@ -434,4 +434,10 @@ CLASS zcl_abapgit_object_form IMPLEMENTATION. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_FORM IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_fugr.clas.abap b/src/objects/zcl_abapgit_object_fugr.clas.abap index 53591a7aa..ca8b08242 100644 --- a/src/objects/zcl_abapgit_object_fugr.clas.abap +++ b/src/objects/zcl_abapgit_object_fugr.clas.abap @@ -77,16 +77,34 @@ CLASS zcl_abapgit_object_fugr DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje zcx_abapgit_exception . METHODS are_exceptions_class_based IMPORTING - !iv_function_name TYPE rs38l_fnam + iv_function_name TYPE rs38l_fnam RETURNING - VALUE(rv_return) TYPE abap_bool + VALUE(rv_return) TYPE abap_bool RAISING zcx_abapgit_exception . + METHODS is_function_group_locked + RETURNING + VALUE(rv_is_functions_group_locked) TYPE abap_bool + RAISING + zcx_abapgit_exception. + METHODS is_any_include_locked + RETURNING + VALUE(rv_is_any_include_locked) TYPE abap_bool + RAISING + zcx_abapgit_exception. + METHODS is_any_function_module_locked + RETURNING + VALUE(rv_any_function_module_locked) TYPE abap_bool + RAISING + zcx_abapgit_exception. + + + ENDCLASS. -CLASS ZCL_ABAPGIT_OBJECT_FUGR IMPLEMENTATION. +CLASS zcl_abapgit_object_fugr IMPLEMENTATION. METHOD are_exceptions_class_based. @@ -844,4 +862,79 @@ CLASS ZCL_ABAPGIT_OBJECT_FUGR IMPLEMENTATION. ENDIF. ENDMETHOD. "serialize + + METHOD zif_abapgit_object~is_locked. + + DATA: lv_program TYPE program. + + lv_program = main_name( ). + + IF is_function_group_locked( ) = abap_true + OR is_any_include_locked( ) = abap_true + OR is_any_function_module_locked( ) = abap_true + OR is_any_dynpro_locked( lv_program ) = abap_true + OR is_cua_locked( lv_program ) = abap_true + OR is_text_locked( lv_program ) = abap_true. + + rv_is_locked = abap_true. + + ENDIF. + + ENDMETHOD. + + + METHOD is_function_group_locked. + + DATA: lv_object TYPE eqegraarg . + + lv_object = |FG{ ms_item-obj_name }|. + OVERLAY lv_object WITH ' '. + lv_object = lv_object && '*'. + + rv_is_functions_group_locked = exists_a_lock_entry_for( iv_lock_object = 'EEUDB' + iv_argument = lv_object ). + + ENDMETHOD. + + + METHOD is_any_include_locked. + + DATA: lt_includes TYPE rso_t_objnm. + FIELD-SYMBOLS: TYPE sobj_name. + + lt_includes = includes( ). + + LOOP AT lt_includes ASSIGNING . + + IF exists_a_lock_entry_for( iv_lock_object = 'ESRDIRE' + iv_argument = |{ }| ) = abap_true. + rv_is_any_include_locked = abap_true. + EXIT. + ENDIF. + + ENDLOOP. + + ENDMETHOD. + + + METHOD is_any_function_module_locked. + + DATA: lt_functions TYPE zcl_abapgit_object_fugr=>ty_rs38l_incl_tt. + + FIELD-SYMBOLS: TYPE rs38l_incl. + + lt_functions = functions( ). + + LOOP AT lt_functions ASSIGNING . + + IF exists_a_lock_entry_for( iv_lock_object = 'ESFUNCTION' + iv_argument = |{ -funcname }| ) = abap_true. + rv_any_function_module_locked = abap_true. + EXIT. + ENDIF. + + ENDLOOP. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_iamu.clas.abap b/src/objects/zcl_abapgit_object_iamu.clas.abap index 3396827d3..6d418830c 100644 --- a/src/objects/zcl_abapgit_object_iamu.clas.abap +++ b/src/objects/zcl_abapgit_object_iamu.clas.abap @@ -296,4 +296,10 @@ CLASS zcl_abapgit_object_iamu IMPLEMENTATION. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_iarp.clas.abap b/src/objects/zcl_abapgit_object_iarp.clas.abap index db4f01fd9..222e0b1aa 100644 --- a/src/objects/zcl_abapgit_object_iarp.clas.abap +++ b/src/objects/zcl_abapgit_object_iarp.clas.abap @@ -184,4 +184,10 @@ CLASS zcl_abapgit_object_iarp IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_iarp IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_iasp.clas.abap b/src/objects/zcl_abapgit_object_iasp.clas.abap index 9b813efb0..61f65f5d1 100644 --- a/src/objects/zcl_abapgit_object_iasp.clas.abap +++ b/src/objects/zcl_abapgit_object_iasp.clas.abap @@ -184,4 +184,10 @@ CLASS zcl_abapgit_object_iasp IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_iasp IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_iatu.clas.abap b/src/objects/zcl_abapgit_object_iatu.clas.abap index 4d953b96c..378ba88a5 100644 --- a/src/objects/zcl_abapgit_object_iatu.clas.abap +++ b/src/objects/zcl_abapgit_object_iatu.clas.abap @@ -201,4 +201,10 @@ CLASS zcl_abapgit_object_iatu IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_iatu IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_idoc.clas.abap b/src/objects/zcl_abapgit_object_idoc.clas.abap index 7ffc7b4fb..973f3a4f5 100644 --- a/src/objects/zcl_abapgit_object_idoc.clas.abap +++ b/src/objects/zcl_abapgit_object_idoc.clas.abap @@ -225,4 +225,11 @@ CLASS ZCL_ABAPGIT_OBJECT_IDOC IMPLEMENTATION. ig_data = ls_idoc ). ENDMETHOD. + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_iext.clas.abap b/src/objects/zcl_abapgit_object_iext.clas.abap index af3d3b8fa..2da456c40 100644 --- a/src/objects/zcl_abapgit_object_iext.clas.abap +++ b/src/objects/zcl_abapgit_object_iext.clas.abap @@ -222,4 +222,10 @@ CLASS zcl_abapgit_object_iext IMPLEMENTATION. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_intf.clas.abap b/src/objects/zcl_abapgit_object_intf.clas.abap index 74377a4e4..0fe224c09 100644 --- a/src/objects/zcl_abapgit_object_intf.clas.abap +++ b/src/objects/zcl_abapgit_object_intf.clas.abap @@ -265,4 +265,11 @@ CLASS ZCL_ABAPGIT_OBJECT_INTF IMPLEMENTATION. serialize_xml( io_xml ). ENDMETHOD. + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_jobd.clas.abap b/src/objects/zcl_abapgit_object_jobd.clas.abap index 0b93f47ae..91f54c5d5 100644 --- a/src/objects/zcl_abapgit_object_jobd.clas.abap +++ b/src/objects/zcl_abapgit_object_jobd.clas.abap @@ -205,4 +205,11 @@ CLASS ZCL_ABAPGIT_OBJECT_JOBD IMPLEMENTATION. ENDTRY. ENDMETHOD. + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_msag.clas.abap b/src/objects/zcl_abapgit_object_msag.clas.abap index aae5bf8c2..63b6fb7cd 100644 --- a/src/objects/zcl_abapgit_object_msag.clas.abap +++ b/src/objects/zcl_abapgit_object_msag.clas.abap @@ -288,4 +288,10 @@ CLASS zcl_abapgit_object_msag IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_msag IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_nrob.clas.abap b/src/objects/zcl_abapgit_object_nrob.clas.abap index dbeae55cd..5a1eacaec 100644 --- a/src/objects/zcl_abapgit_object_nrob.clas.abap +++ b/src/objects/zcl_abapgit_object_nrob.clas.abap @@ -274,4 +274,10 @@ CLASS zcl_abapgit_object_nrob IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_nrob IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_para.clas.abap b/src/objects/zcl_abapgit_object_para.clas.abap index 4d6067d41..29e45fff7 100644 --- a/src/objects/zcl_abapgit_object_para.clas.abap +++ b/src/objects/zcl_abapgit_object_para.clas.abap @@ -134,4 +134,10 @@ CLASS zcl_abapgit_object_para IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_para IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_pinf.clas.abap b/src/objects/zcl_abapgit_object_pinf.clas.abap index bd1382a49..4afeefaae 100644 --- a/src/objects/zcl_abapgit_object_pinf.clas.abap +++ b/src/objects/zcl_abapgit_object_pinf.clas.abap @@ -345,4 +345,10 @@ CLASS zcl_abapgit_object_pinf IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_PINF IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_prag.clas.abap b/src/objects/zcl_abapgit_object_prag.clas.abap index dba156f86..f7bcce9d7 100644 --- a/src/objects/zcl_abapgit_object_prag.clas.abap +++ b/src/objects/zcl_abapgit_object_prag.clas.abap @@ -182,4 +182,11 @@ CLASS ZCL_ABAPGIT_OBJECT_PRAG IMPLEMENTATION. zcx_abapgit_exception=>raise( |Pragma { ms_item-obj_name } doesn't exist| ). ENDMETHOD. + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_prog.clas.abap b/src/objects/zcl_abapgit_object_prog.clas.abap index 8ca4f4392..dbd8d50d4 100644 --- a/src/objects/zcl_abapgit_object_prog.clas.abap +++ b/src/objects/zcl_abapgit_object_prog.clas.abap @@ -17,13 +17,18 @@ CLASS zcl_abapgit_object_prog DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje RAISING zcx_abapgit_exception, deserialize_texts IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_input - RAISING zcx_abapgit_exception. + RAISING zcx_abapgit_exception, + is_program_locked + RETURNING + VALUE(rv_is_program_locked) TYPE abap_bool + RAISING + zcx_abapgit_exception. ENDCLASS. -CLASS ZCL_ABAPGIT_OBJECT_PROG IMPLEMENTATION. +CLASS zcl_abapgit_object_prog IMPLEMENTATION. METHOD deserialize_texts. @@ -213,4 +218,26 @@ CLASS ZCL_ABAPGIT_OBJECT_PROG IMPLEMENTATION. serialize_texts( io_xml ). ENDMETHOD. "zif_abapgit_serialize~serialize + + METHOD zif_abapgit_object~is_locked. + + IF is_program_locked( ) = abap_true + OR is_any_dynpro_locked( ms_item-obj_name ) = abap_true + OR is_cua_locked( ms_item-obj_name ) = abap_true + OR is_text_locked( ms_item-obj_name ) = abap_true. + + rv_is_locked = abap_true. + + ENDIF. + + ENDMETHOD. + + + METHOD is_program_locked. + + rv_is_program_locked = exists_a_lock_entry_for( iv_lock_object = 'ESRDIRE' + iv_argument = |{ ms_item-obj_name }| ). + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_sfbf.clas.abap b/src/objects/zcl_abapgit_object_sfbf.clas.abap index c621e545d..049e6fd74 100644 --- a/src/objects/zcl_abapgit_object_sfbf.clas.abap +++ b/src/objects/zcl_abapgit_object_sfbf.clas.abap @@ -176,6 +176,13 @@ CLASS ZCL_ABAPGIT_OBJECT_SFBF IMPLEMENTATION. ENDMETHOD. "zif_abapgit_object~has_changed_since + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + + METHOD zif_abapgit_object~jump. CALL FUNCTION 'RS_TOOL_ACCESS' diff --git a/src/objects/zcl_abapgit_object_sfbs.clas.abap b/src/objects/zcl_abapgit_object_sfbs.clas.abap index 7ccbda572..44aeb470a 100644 --- a/src/objects/zcl_abapgit_object_sfbs.clas.abap +++ b/src/objects/zcl_abapgit_object_sfbs.clas.abap @@ -224,4 +224,11 @@ CLASS ZCL_ABAPGIT_OBJECT_SFBS IMPLEMENTATION. iv_name = 'PARENT_BFS' ). ENDMETHOD. "serialize + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_sfpf.clas.abap b/src/objects/zcl_abapgit_object_sfpf.clas.abap index 5db233ab8..a48ad8d01 100644 --- a/src/objects/zcl_abapgit_object_sfpf.clas.abap +++ b/src/objects/zcl_abapgit_object_sfpf.clas.abap @@ -224,4 +224,11 @@ CLASS ZCL_ABAPGIT_OBJECT_SFPF IMPLEMENTATION. io_xml->set_raw( li_document->get_root_element( ) ). ENDMETHOD. "serialize + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_sfpi.clas.abap b/src/objects/zcl_abapgit_object_sfpi.clas.abap index b842b30ac..16219d2d8 100644 --- a/src/objects/zcl_abapgit_object_sfpi.clas.abap +++ b/src/objects/zcl_abapgit_object_sfpi.clas.abap @@ -157,4 +157,10 @@ CLASS zcl_abapgit_object_sfpi IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_doma IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_sfsw.clas.abap b/src/objects/zcl_abapgit_object_sfsw.clas.abap index 01a2b5a31..3d20e7a86 100644 --- a/src/objects/zcl_abapgit_object_sfsw.clas.abap +++ b/src/objects/zcl_abapgit_object_sfsw.clas.abap @@ -215,4 +215,11 @@ CLASS ZCL_ABAPGIT_OBJECT_SFSW IMPLEMENTATION. iv_name = 'CONFLICTS' ). ENDMETHOD. "serialize + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_shi3.clas.abap b/src/objects/zcl_abapgit_object_shi3.clas.abap index dd65fc8e8..9bb182804 100644 --- a/src/objects/zcl_abapgit_object_shi3.clas.abap +++ b/src/objects/zcl_abapgit_object_shi3.clas.abap @@ -261,4 +261,10 @@ CLASS zcl_abapgit_object_shi3 IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_shi3 IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_shi5.clas.abap b/src/objects/zcl_abapgit_object_shi5.clas.abap index b294fc52e..f15a19082 100644 --- a/src/objects/zcl_abapgit_object_shi5.clas.abap +++ b/src/objects/zcl_abapgit_object_shi5.clas.abap @@ -126,4 +126,10 @@ CLASS zcl_abapgit_object_shi5 IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_shi5 IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_shi8.clas.abap b/src/objects/zcl_abapgit_object_shi8.clas.abap index c57406721..d52e59193 100644 --- a/src/objects/zcl_abapgit_object_shi8.clas.abap +++ b/src/objects/zcl_abapgit_object_shi8.clas.abap @@ -132,4 +132,10 @@ CLASS zcl_abapgit_object_shi8 IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_shi8 IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_shlp.clas.abap b/src/objects/zcl_abapgit_object_shlp.clas.abap index ef17e7bbb..75a0c0fc7 100644 --- a/src/objects/zcl_abapgit_object_shlp.clas.abap +++ b/src/objects/zcl_abapgit_object_shlp.clas.abap @@ -196,4 +196,10 @@ CLASS zcl_abapgit_object_shlp IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_shlp IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_shma.clas.abap b/src/objects/zcl_abapgit_object_shma.clas.abap index ec247ec77..d95cad78f 100644 --- a/src/objects/zcl_abapgit_object_shma.clas.abap +++ b/src/objects/zcl_abapgit_object_shma.clas.abap @@ -266,4 +266,10 @@ CLASS zcl_abapgit_object_shma IMPLEMENTATION. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_sicf.clas.abap b/src/objects/zcl_abapgit_object_sicf.clas.abap index 4d4e8f426..905d2c176 100644 --- a/src/objects/zcl_abapgit_object_sicf.clas.abap +++ b/src/objects/zcl_abapgit_object_sicf.clas.abap @@ -572,4 +572,11 @@ CLASS ZCL_ABAPGIT_OBJECT_SICF IMPLEMENTATION. ig_data = lt_icfhandler ). ENDMETHOD. "serialize + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_smim.clas.abap b/src/objects/zcl_abapgit_object_smim.clas.abap index 6d3f5e870..110805970 100644 --- a/src/objects/zcl_abapgit_object_smim.clas.abap +++ b/src/objects/zcl_abapgit_object_smim.clas.abap @@ -330,4 +330,10 @@ CLASS zcl_abapgit_object_smim IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_smim IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_splo.clas.abap b/src/objects/zcl_abapgit_object_splo.clas.abap index 3c2838322..703b0979e 100644 --- a/src/objects/zcl_abapgit_object_splo.clas.abap +++ b/src/objects/zcl_abapgit_object_splo.clas.abap @@ -109,4 +109,10 @@ CLASS zcl_abapgit_object_splo IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_splo IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_srfc.clas.abap b/src/objects/zcl_abapgit_object_srfc.clas.abap index 46d4f782e..82fa5823c 100644 --- a/src/objects/zcl_abapgit_object_srfc.clas.abap +++ b/src/objects/zcl_abapgit_object_srfc.clas.abap @@ -181,4 +181,11 @@ CLASS ZCL_ABAPGIT_OBJECT_SRFC IMPLEMENTATION. ig_data = ). ENDMETHOD. + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_ssfo.clas.abap b/src/objects/zcl_abapgit_object_ssfo.clas.abap index 4b0c589a8..be02fa50e 100644 --- a/src/objects/zcl_abapgit_object_ssfo.clas.abap +++ b/src/objects/zcl_abapgit_object_ssfo.clas.abap @@ -283,4 +283,10 @@ CLASS zcl_abapgit_object_ssfo IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_ssfo IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_ssst.clas.abap b/src/objects/zcl_abapgit_object_ssst.clas.abap index b58374129..377b10975 100644 --- a/src/objects/zcl_abapgit_object_ssst.clas.abap +++ b/src/objects/zcl_abapgit_object_ssst.clas.abap @@ -261,4 +261,11 @@ CLASS ZCL_ABAPGIT_OBJECT_SSST IMPLEMENTATION. iv_name = 'STXSTAB' ). ENDMETHOD. "serialize + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_styl.clas.abap b/src/objects/zcl_abapgit_object_styl.clas.abap index 3378de8dd..03fac8ef6 100644 --- a/src/objects/zcl_abapgit_object_styl.clas.abap +++ b/src/objects/zcl_abapgit_object_styl.clas.abap @@ -186,4 +186,10 @@ CLASS zcl_abapgit_object_styl IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_styl IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_susc.clas.abap b/src/objects/zcl_abapgit_object_susc.clas.abap index 6c724dbd2..72886dfe3 100644 --- a/src/objects/zcl_abapgit_object_susc.clas.abap +++ b/src/objects/zcl_abapgit_object_susc.clas.abap @@ -111,4 +111,10 @@ CLASS zcl_abapgit_object_susc IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_susc IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_suso.clas.abap b/src/objects/zcl_abapgit_object_suso.clas.abap index 50827885d..4f94f01ec 100644 --- a/src/objects/zcl_abapgit_object_suso.clas.abap +++ b/src/objects/zcl_abapgit_object_suso.clas.abap @@ -162,4 +162,10 @@ CLASS zcl_abapgit_object_suso IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_suso IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_sxci.clas.abap b/src/objects/zcl_abapgit_object_sxci.clas.abap index e0d5362b8..878ac2ccf 100644 --- a/src/objects/zcl_abapgit_object_sxci.clas.abap +++ b/src/objects/zcl_abapgit_object_sxci.clas.abap @@ -276,4 +276,11 @@ CLASS ZCL_ABAPGIT_OBJECT_SXCI IMPLEMENTATION. ig_data = ls_classic_badi_implementation ). ENDMETHOD. + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_tabl.clas.abap b/src/objects/zcl_abapgit_object_tabl.clas.abap index 6fda867cf..7c0e66b31 100644 --- a/src/objects/zcl_abapgit_object_tabl.clas.abap +++ b/src/objects/zcl_abapgit_object_tabl.clas.abap @@ -498,4 +498,12 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION. ig_data = lt_dd36m ). ENDMETHOD. "serialize + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'ESDICT' + iv_argument = |{ ms_item-obj_type }{ ms_item-obj_name }| ). + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_tabl_dialog.clas.abap b/src/objects/zcl_abapgit_object_tabl_dialog.clas.abap index a9c51823a..3a78873de 100644 --- a/src/objects/zcl_abapgit_object_tabl_dialog.clas.abap +++ b/src/objects/zcl_abapgit_object_tabl_dialog.clas.abap @@ -55,4 +55,5 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL_DIALOG IMPLEMENTATION. ENDIF. ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_tobj.clas.abap b/src/objects/zcl_abapgit_object_tobj.clas.abap index 4c638c79f..c5746a6b9 100644 --- a/src/objects/zcl_abapgit_object_tobj.clas.abap +++ b/src/objects/zcl_abapgit_object_tobj.clas.abap @@ -300,4 +300,10 @@ CLASS zcl_abapgit_object_tobj IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_tobj IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_tran.clas.abap b/src/objects/zcl_abapgit_object_tran.clas.abap index ccdb9e16a..979f1d279 100644 --- a/src/objects/zcl_abapgit_object_tran.clas.abap +++ b/src/objects/zcl_abapgit_object_tran.clas.abap @@ -482,4 +482,11 @@ CLASS ZCL_ABAPGIT_OBJECT_TRAN IMPLEMENTATION. serialize_texts( io_xml ). ENDMETHOD. "serialize + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_ttyp.clas.abap b/src/objects/zcl_abapgit_object_ttyp.clas.abap index 1d53fd9e7..b66ab7f3a 100644 --- a/src/objects/zcl_abapgit_object_ttyp.clas.abap +++ b/src/objects/zcl_abapgit_object_ttyp.clas.abap @@ -175,4 +175,10 @@ CLASS zcl_abapgit_object_ttyp IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_ttyp IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_type.clas.abap b/src/objects/zcl_abapgit_object_type.clas.abap index fb855e8e0..ed6dab64d 100644 --- a/src/objects/zcl_abapgit_object_type.clas.abap +++ b/src/objects/zcl_abapgit_object_type.clas.abap @@ -201,4 +201,10 @@ CLASS zcl_abapgit_object_type IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_type IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_ucsa.clas.abap b/src/objects/zcl_abapgit_object_ucsa.clas.abap index 8ae62b5be..803abc0ba 100644 --- a/src/objects/zcl_abapgit_object_ucsa.clas.abap +++ b/src/objects/zcl_abapgit_object_ucsa.clas.abap @@ -272,4 +272,11 @@ CLASS ZCL_ABAPGIT_OBJECT_UCSA IMPLEMENTATION. ENDTRY. ENDMETHOD. + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_vcls.clas.abap b/src/objects/zcl_abapgit_object_vcls.clas.abap index c8dfd4862..9d2939062 100644 --- a/src/objects/zcl_abapgit_object_vcls.clas.abap +++ b/src/objects/zcl_abapgit_object_vcls.clas.abap @@ -185,4 +185,10 @@ CLASS zcl_abapgit_object_vcls IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_vcls IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_view.clas.abap b/src/objects/zcl_abapgit_object_view.clas.abap index 85e4a635d..7b3bf694c 100644 --- a/src/objects/zcl_abapgit_object_view.clas.abap +++ b/src/objects/zcl_abapgit_object_view.clas.abap @@ -268,4 +268,11 @@ CLASS ZCL_ABAPGIT_OBJECT_VIEW IMPLEMENTATION. iv_name = 'DD28V_TABLE' ). ENDMETHOD. "serialize + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_w3super.clas.abap b/src/objects/zcl_abapgit_object_w3super.clas.abap index 91892d841..b254e820b 100644 --- a/src/objects/zcl_abapgit_object_w3super.clas.abap +++ b/src/objects/zcl_abapgit_object_w3super.clas.abap @@ -491,4 +491,11 @@ CLASS ZCL_ABAPGIT_OBJECT_W3SUPER IMPLEMENTATION. iv_ext = get_ext( lt_w3params ) ). ENDMETHOD. "serialize + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_wapa.clas.abap b/src/objects/zcl_abapgit_object_wapa.clas.abap index 7523fe8ee..33bf4c5ba 100644 --- a/src/objects/zcl_abapgit_object_wapa.clas.abap +++ b/src/objects/zcl_abapgit_object_wapa.clas.abap @@ -473,4 +473,10 @@ CLASS zcl_abapgit_object_wapa IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_tran IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_wdya.clas.abap b/src/objects/zcl_abapgit_object_wdya.clas.abap index 1a98fbfa8..af80780a0 100644 --- a/src/objects/zcl_abapgit_object_wdya.clas.abap +++ b/src/objects/zcl_abapgit_object_wdya.clas.abap @@ -225,4 +225,10 @@ CLASS zcl_abapgit_object_wdya IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_wdya IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_object_wdyn.clas.abap b/src/objects/zcl_abapgit_object_wdyn.clas.abap index d67d20998..ed14d6f7a 100644 --- a/src/objects/zcl_abapgit_object_wdyn.clas.abap +++ b/src/objects/zcl_abapgit_object_wdyn.clas.abap @@ -822,4 +822,11 @@ CLASS ZCL_ABAPGIT_OBJECT_WDYN IMPLEMENTATION. iv_name = 'SOURCES' ). ENDMETHOD. "serialize + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_webi.clas.abap b/src/objects/zcl_abapgit_object_webi.clas.abap index defdf81ca..604a8ac60 100644 --- a/src/objects/zcl_abapgit_object_webi.clas.abap +++ b/src/objects/zcl_abapgit_object_webi.clas.abap @@ -462,4 +462,11 @@ CLASS ZCL_ABAPGIT_OBJECT_WEBI IMPLEMENTATION. ig_data = ls_webi ). ENDMETHOD. "zif_abapgit_object~serialize + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_xinx.clas.abap b/src/objects/zcl_abapgit_object_xinx.clas.abap index fed10e32f..0bf7b8266 100644 --- a/src/objects/zcl_abapgit_object_xinx.clas.abap +++ b/src/objects/zcl_abapgit_object_xinx.clas.abap @@ -213,4 +213,11 @@ CLASS zcl_abapgit_object_xinx IMPLEMENTATION. ig_data = ls_extension_index ). ENDMETHOD. "serialize + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_xslt.clas.abap b/src/objects/zcl_abapgit_object_xslt.clas.abap index a04554b90..417f25ba5 100644 --- a/src/objects/zcl_abapgit_object_xslt.clas.abap +++ b/src/objects/zcl_abapgit_object_xslt.clas.abap @@ -206,4 +206,10 @@ CLASS zcl_abapgit_object_xslt IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. "zcl_abapgit_object_xslt IMPLEMENTATION diff --git a/src/objects/zcl_abapgit_objects_program.clas.abap b/src/objects/zcl_abapgit_objects_program.clas.abap index 6bf6f5bfa..a4466f775 100644 --- a/src/objects/zcl_abapgit_objects_program.clas.abap +++ b/src/objects/zcl_abapgit_objects_program.clas.abap @@ -114,6 +114,22 @@ CLASS zcl_abapgit_objects_program DEFINITION PUBLIC INHERITING FROM zcl_abapgit_ iv_skip_gui TYPE abap_bool DEFAULT abap_false RETURNING VALUE(rv_changed) TYPE abap_bool. + METHODS is_any_dynpro_locked + IMPORTING iv_program TYPE programm + RETURNING VALUE(rv_is_any_dynpro_locked) TYPE abap_bool + RAISING zcx_abapgit_exception. + + METHODS is_cua_locked + IMPORTING iv_program TYPE programm + RETURNING VALUE(rv_is_cua_locked) TYPE abap_bool + RAISING zcx_abapgit_exception. + + METHODS is_text_locked + IMPORTING iv_program TYPE programm + RETURNING VALUE(rv_is_text_locked) TYPE abap_bool + RAISING zcx_abapgit_exception. + + CLASS-METHODS: add_tpool IMPORTING it_tpool TYPE textpool_table @@ -137,6 +153,54 @@ ENDCLASS. CLASS zcl_abapgit_objects_program IMPLEMENTATION. + METHOD is_text_locked. + + DATA: lv_object TYPE eqegraarg. + + lv_object = |*{ iv_program }|. + + rv_is_text_locked = exists_a_lock_entry_for( iv_lock_object = 'EABAPTEXTE' + iv_argument = lv_object ). + + ENDMETHOD. + + METHOD is_cua_locked. + + DATA: lv_object TYPE eqegraarg, + ls_cua TYPE zcl_abapgit_objects_program=>ty_cua. + + lv_object = |CU{ iv_program }|. + OVERLAY lv_object WITH ' '. + lv_object = lv_object && '*'. + + rv_is_cua_locked = exists_a_lock_entry_for( iv_lock_object = 'ESCUAPAINT' + iv_argument = lv_object ). + + ENDMETHOD. + + METHOD is_any_dynpro_locked. + + DATA: lt_dynpros TYPE zcl_abapgit_objects_program=>ty_dynpro_tt, + lv_object TYPE seqg3-garg. + + FIELD-SYMBOLS: TYPE zcl_abapgit_objects_program=>ty_dynpro. + + lt_dynpros = serialize_dynpros( iv_program ). + + LOOP AT lt_dynpros ASSIGNING . + + lv_object = |{ -header-screen }{ -header-program }|. + + IF exists_a_lock_entry_for( iv_lock_object = 'ESCRP' + iv_argument = lv_object ) = abap_true. + rv_is_any_dynpro_locked = abap_true. + EXIT. + ENDIF. + + ENDLOOP. + + ENDMETHOD. + METHOD condense_flow. DATA: lv_spaces LIKE LINE OF et_spaces. diff --git a/src/objects/zcl_abapgit_objects_saxx_super.clas.abap b/src/objects/zcl_abapgit_objects_saxx_super.clas.abap index 7a461103b..fda715806 100644 --- a/src/objects/zcl_abapgit_objects_saxx_super.clas.abap +++ b/src/objects/zcl_abapgit_objects_saxx_super.clas.abap @@ -52,7 +52,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_OBJECTS_SAXX_SUPER IMPLEMENTATION. +CLASS zcl_abapgit_objects_saxx_super IMPLEMENTATION. METHOD create_channel_objects. @@ -391,4 +391,11 @@ CLASS ZCL_ABAPGIT_OBJECTS_SAXX_SUPER IMPLEMENTATION. ig_data = ). ENDMETHOD. + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_objects_super.clas.abap b/src/objects/zcl_abapgit_objects_super.clas.abap index d93dfcce7..88b3ff90f 100644 --- a/src/objects/zcl_abapgit_objects_super.clas.abap +++ b/src/objects/zcl_abapgit_objects_super.clas.abap @@ -40,6 +40,11 @@ CLASS zcl_abapgit_objects_super DEFINITION PUBLIC ABSTRACT. jump_se11 IMPORTING iv_radio TYPE string iv_field TYPE string + RAISING zcx_abapgit_exception, + exists_a_lock_entry_for + IMPORTING iv_lock_object TYPE string + iv_argument TYPE seqg3-garg OPTIONAL + RETURNING VALUE(rv_exists_a_lock_entry) TYPE abap_bool RAISING zcx_abapgit_exception. PRIVATE SECTION. @@ -55,7 +60,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_OBJECTS_SUPER IMPLEMENTATION. +CLASS zcl_abapgit_objects_super IMPLEMENTATION. METHOD check_timestamp. @@ -116,6 +121,34 @@ CLASS ZCL_ABAPGIT_OBJECTS_SUPER IMPLEMENTATION. ENDMETHOD. "corr_insert + METHOD exists_a_lock_entry_for. + + DATA: lt_lock_entries TYPE STANDARD TABLE OF seqg3. + + CALL FUNCTION 'ENQUEUE_READ' + EXPORTING + guname = '*' + garg = iv_argument + TABLES + enq = lt_lock_entries + EXCEPTIONS + communication_failure = 1 + system_failure = 2 + OTHERS = 3. + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise_t100( ). + ENDIF. + + READ TABLE lt_lock_entries TRANSPORTING NO FIELDS + WITH KEY gobj = iv_lock_object. + IF sy-subrc = 0. + rv_exists_a_lock_entry = abap_true. + ENDIF. + + ENDMETHOD. + + METHOD get_metadata. DATA: lv_class TYPE string. diff --git a/src/objects/zif_abapgit_object.intf.abap b/src/objects/zif_abapgit_object.intf.abap index 6b64bfdf6..ebc0686d7 100644 --- a/src/objects/zif_abapgit_object.intf.abap +++ b/src/objects/zif_abapgit_object.intf.abap @@ -13,6 +13,10 @@ INTERFACE zif_abapgit_object PUBLIC. exists RETURNING VALUE(rv_bool) TYPE abap_bool RAISING zcx_abapgit_exception, + is_locked + RETURNING VALUE(rv_is_locked) type abap_bool + RAISING + zcx_abapgit_exception, changed_by RETURNING VALUE(rv_user) TYPE xubname RAISING zcx_abapgit_exception, diff --git a/src/zcl_abapgit_objects.clas.abap b/src/zcl_abapgit_objects.clas.abap index ea520d233..32430d226 100644 --- a/src/zcl_abapgit_objects.clas.abap +++ b/src/zcl_abapgit_objects.clas.abap @@ -79,7 +79,16 @@ CLASS zcl_abapgit_objects DEFINITION CLASS-METHODS supported_list RETURNING VALUE(rt_types) TYPE ty_types_tt . + PROTECTED SECTION. + PRIVATE SECTION. + TYPES: BEGIN OF ty_obj_serializer_map, + item TYPE zif_abapgit_definitions=>ty_item, + metadata TYPE zif_abapgit_definitions=>ty_metadata, + END OF ty_obj_serializer_map, + tty_obj_serializer_map + TYPE SORTED TABLE OF ty_obj_serializer_map WITH UNIQUE KEY item. + CLASS-DATA st_obj_serializer_map TYPE tty_obj_serializer_map. CLASS-METHODS files_to_deserialize IMPORTING @@ -93,16 +102,7 @@ CLASS zcl_abapgit_objects DEFINITION !it_files TYPE zif_abapgit_definitions=>ty_files_tt RAISING zcx_abapgit_exception . - CLASS-METHODS create_object - IMPORTING - !is_item TYPE zif_abapgit_definitions=>ty_item - !iv_language TYPE spras - !is_metadata TYPE zif_abapgit_definitions=>ty_metadata OPTIONAL - !iv_native_only TYPE abap_bool DEFAULT abap_false - RETURNING - VALUE(ri_obj) TYPE REF TO zif_abapgit_object - RAISING - zcx_abapgit_exception . + CLASS-METHODS prioritize_deser IMPORTING !it_results TYPE zif_abapgit_definitions=>ty_results_tt @@ -168,18 +168,34 @@ CLASS zcl_abapgit_objects DEFINITION zcx_abapgit_exception . CLASS-METHODS deserialize_objects IMPORTING - !it_objects TYPE ty_deserialization_tt - !iv_ddic TYPE abap_bool DEFAULT abap_false - !iv_descr TYPE string + it_objects TYPE ty_deserialization_tt + iv_ddic TYPE abap_bool DEFAULT abap_false + iv_descr TYPE string CHANGING - !ct_files TYPE zif_abapgit_definitions=>ty_file_signatures_tt + ct_files TYPE zif_abapgit_definitions=>ty_file_signatures_tt + RAISING + zcx_abapgit_exception . + CLASS-METHODS check_objects_locked + IMPORTING + iv_language TYPE spras + it_results TYPE zif_abapgit_definitions=>ty_results_tt + RAISING + zcx_abapgit_exception. + CLASS-METHODS create_object + IMPORTING + is_item TYPE zif_abapgit_definitions=>ty_item + iv_language TYPE spras + is_metadata TYPE zif_abapgit_definitions=>ty_metadata OPTIONAL + iv_native_only TYPE abap_bool DEFAULT abap_false + RETURNING + VALUE(ri_obj) TYPE REF TO zif_abapgit_object RAISING zcx_abapgit_exception . ENDCLASS. -CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION. +CLASS zcl_abapgit_objects IMPLEMENTATION. METHOD changed_by. @@ -234,6 +250,29 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION. ENDMETHOD. + METHOD check_objects_locked. + + DATA: li_obj TYPE REF TO zif_abapgit_object, + ls_item TYPE zif_abapgit_definitions=>ty_item. + FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_result. + + LOOP AT it_results ASSIGNING . + + MOVE-CORRESPONDING TO ls_item. + + li_obj = create_object( is_item = ls_item + iv_language = iv_language ). + + IF li_obj->is_locked( ) = abap_true. + zcx_abapgit_exception=>raise( |Object { ls_item-obj_type } { ls_item-obj_name } | + && |is locked. Deserialization not possible.| ). + ENDIF. + + ENDLOOP. + + ENDMETHOD. + + METHOD class_name. CONCATENATE 'ZCL_ABAPGIT_OBJECT_' is_item-obj_type INTO rv_class_name. "#EC NOTEXT @@ -280,14 +319,6 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION. METHOD create_object. - TYPES: BEGIN OF ty_obj_serializer_map, - item LIKE is_item, - metadata LIKE is_metadata, - END OF ty_obj_serializer_map. - - STATICS st_obj_serializer_map - TYPE SORTED TABLE OF ty_obj_serializer_map WITH UNIQUE KEY item. - DATA: lv_message TYPE string, lv_class_name TYPE string, ls_obj_serializer_map LIKE LINE OF st_obj_serializer_map. @@ -441,6 +472,9 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION. EXPORTING iv_total = lines( lt_results ). + check_objects_locked( iv_language = io_repo->get_dot_abapgit( )->get_master_language( ) + it_results = lt_results ). + LOOP AT lt_results ASSIGNING . lo_progress->show( iv_current = sy-tabix iv_text = |Deserialize { -obj_name }| ) ##NO_TEXT. diff --git a/src/zcl_abapgit_objects.clas.testclasses.abap b/src/zcl_abapgit_objects.clas.testclasses.abap index cc400bdbd..c40c9eb13 100644 --- a/src/zcl_abapgit_objects.clas.testclasses.abap +++ b/src/zcl_abapgit_objects.clas.testclasses.abap @@ -356,3 +356,153 @@ CLASS ltcl_serialize IMPLEMENTATION. ENDMETHOD. "check ENDCLASS. "ltcl_serialize IMPLEMENTATION + +CLASS ltd_objcet_ddls_mock DEFINITION FOR TESTING. + + PUBLIC SECTION. + INTERFACES zif_abapgit_object PARTIALLY IMPLEMENTED. + METHODS: + constructor + IMPORTING + is_item TYPE zif_abapgit_definitions=>ty_item + iv_language TYPE spras. + + PRIVATE SECTION. + DATA ms_item TYPE zif_abapgit_definitions=>ty_item. + +ENDCLASS. + +CLASS ltd_objcet_ddls_mock IMPLEMENTATION. + + METHOD constructor. + + ms_item = is_item. + + ENDMETHOD. + + METHOD zif_abapgit_object~is_locked. + + CASE ms_item-obj_name. + WHEN 'Z_TEST_DDLS'. + + rv_is_locked = abap_true. + + WHEN 'Z_TEST_DDLS2'. + + rv_is_locked = abap_false. + + ENDCASE. + + ENDMETHOD. + +ENDCLASS. + +CLASS ltcl_check_objects_locked DEFINITION FINAL FOR TESTING + DURATION SHORT + RISK LEVEL HARMLESS. + + PRIVATE SECTION. + DATA: + mt_given_results TYPE zif_abapgit_definitions=>ty_results_tt, + mv_exception_text TYPE string. + + METHODS: + throw_excp_if_object_is_locked FOR TESTING RAISING cx_static_check, + no_excp_if_obj_is_not_locked FOR TESTING RAISING cx_static_check, + given_locked_object, + when_check_objects_locked, + then_exception_shd_be_raised, + given_not_locked_object, + then_no_exception_shd_occur, + given_object + IMPORTING + iv_object_name TYPE string. + +ENDCLASS. + +CLASS zcl_abapgit_objects DEFINITION LOCAL FRIENDS ltcl_check_objects_locked. + +CLASS ltcl_check_objects_locked IMPLEMENTATION. + + METHOD throw_excp_if_object_is_locked. + + given_locked_object( ). + when_check_objects_locked( ). + then_exception_shd_be_raised( ). + + ENDMETHOD. + + METHOD no_excp_if_obj_is_not_locked. + + given_not_locked_object( ). + when_check_objects_locked( ). + then_no_exception_shd_occur( ). + + ENDMETHOD. + + METHOD given_locked_object. + + given_object( 'Z_TEST_DDLS' ). + + ENDMETHOD. + + + METHOD when_check_objects_locked. + + DATA: lx_error TYPE REF TO zcx_abapgit_exception. + + TRY. + zcl_abapgit_objects=>check_objects_locked( iv_language = 'E' + it_results = mt_given_results ). + + CATCH zcx_abapgit_exception INTO lx_error. + mv_exception_text = lx_error->get_text( ). + ENDTRY. + + ENDMETHOD. + + + METHOD then_exception_shd_be_raised. + + cl_abap_unit_assert=>assert_equals( + exp = |Object DDLS Z_TEST_DDLS is locked. Deserialization not possible.| + act = mv_exception_text ). + + ENDMETHOD. + + + METHOD given_not_locked_object. + + given_object( 'Z_TEST_DDLS2' ). + + ENDMETHOD. + + + METHOD then_no_exception_shd_occur. + + cl_abap_unit_assert=>assert_initial( mv_exception_text ). + + ENDMETHOD. + + + METHOD given_object. + + CONSTANTS: + co_obj_type TYPE string VALUE 'DDLS'. + + DATA: + ls_result LIKE LINE OF mt_given_results, + ls_obj_serializer_map LIKE LINE OF zcl_abapgit_objects=>st_obj_serializer_map. + + ls_result-obj_type = co_obj_type. + ls_result-obj_name = iv_object_name. + INSERT ls_result INTO TABLE mt_given_results. + + ls_obj_serializer_map-item-obj_type = co_obj_type. + ls_obj_serializer_map-item-obj_name = iv_object_name. + ls_obj_serializer_map-metadata-class = '\CLASS-POOL=ZCL_ABAPGIT_OBJECTS\CLASS=LTD_OBJCET_DDLS_MOCK'. + INSERT ls_obj_serializer_map INTO TABLE zcl_abapgit_objects=>st_obj_serializer_map. + + ENDMETHOD. + +ENDCLASS. diff --git a/src/zcl_abapgit_objects_bridge.clas.abap b/src/zcl_abapgit_objects_bridge.clas.abap index 0c5de88eb..5742db809 100644 --- a/src/zcl_abapgit_objects_bridge.clas.abap +++ b/src/zcl_abapgit_objects_bridge.clas.abap @@ -175,6 +175,13 @@ CLASS ZCL_ABAPGIT_OBJECTS_BRIDGE IMPLEMENTATION. ENDMETHOD. "lif_object~has_changed_since + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + + METHOD zif_abapgit_object~jump. CALL METHOD mo_plugin->('ZIF_ABAPGITP_PLUGIN~JUMP'). diff --git a/src/zcl_abapgit_repo.clas.abap b/src/zcl_abapgit_repo.clas.abap index 669c6f3c4..240e2a2d5 100644 --- a/src/zcl_abapgit_repo.clas.abap +++ b/src/zcl_abapgit_repo.clas.abap @@ -120,7 +120,6 @@ CLASS zcl_abapgit_repo DEFINITION RAISING zcx_abapgit_exception . - ENDCLASS. @@ -609,4 +608,7 @@ CLASS ZCL_ABAPGIT_REPO IMPLEMENTATION. set( it_checksums = lt_checksums ). ENDMETHOD. " update_local_checksums + + + ENDCLASS. From 36f257f0bb20b19784cf246684bdd51aef80568f Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Mon, 18 Jun 2018 11:35:43 +0000 Subject: [PATCH 097/136] Dependency injection for ZCL_ABAPGIT_SAP_PACKAGE --- src/ui/zcl_abapgit_popups.clas.abap | 4 +- src/ui/zcl_abapgit_services_abapgit.clas.abap | 4 +- src/zcl_abapgit_factory.clas.abap | 43 +++- src/zcl_abapgit_file_status.clas.abap | 2 +- src/zcl_abapgit_folder_logic.clas.abap | 6 +- ...abapgit_folder_logic.clas.testclasses.abap | 74 ++++--- src/zcl_abapgit_injector.clas.abap | 34 ++- src/zcl_abapgit_objects.clas.abap | 4 +- src/zcl_abapgit_objects.clas.testclasses.abap | 2 +- src/zcl_abapgit_sap_package.clas.abap | 195 ++++++++---------- src/zcl_abapgit_sap_package.clas.xml | 1 - src/zcl_abapgit_transport.clas.abap | 4 +- src/zcl_abapgit_zip.clas.abap | 2 +- src/zif_abapgit_sap_package.intf.abap | 10 +- 14 files changed, 212 insertions(+), 173 deletions(-) diff --git a/src/ui/zcl_abapgit_popups.clas.abap b/src/ui/zcl_abapgit_popups.clas.abap index e4879953c..023df35a7 100644 --- a/src/ui/zcl_abapgit_popups.clas.abap +++ b/src/ui/zcl_abapgit_popups.clas.abap @@ -245,7 +245,7 @@ CLASS zcl_abapgit_popups IMPLEMENTATION. RETURN. ENDIF. - zcl_abapgit_sap_package=>create( ls_package_data ). + zcl_abapgit_factory=>get_sap_package( ls_package_data-devclass )->create( ls_package_data ). COMMIT WORK. -value = ls_package_data-devclass. @@ -505,7 +505,7 @@ CLASS zcl_abapgit_popups IMPLEMENTATION. RETURN. ENDIF. - zcl_abapgit_sap_package=>create( ls_package_data ). + zcl_abapgit_factory=>get_sap_package( ls_package_data-devclass )->create( ls_package_data ). COMMIT WORK. -value = ls_package_data-devclass. diff --git a/src/ui/zcl_abapgit_services_abapgit.clas.abap b/src/ui/zcl_abapgit_services_abapgit.clas.abap index c2f83cdf7..134f1bc4b 100644 --- a/src/ui/zcl_abapgit_services_abapgit.clas.abap +++ b/src/ui/zcl_abapgit_services_abapgit.clas.abap @@ -45,7 +45,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_SERVICES_ABAPGIT IMPLEMENTATION. +CLASS zcl_abapgit_services_abapgit IMPLEMENTATION. METHOD do_install. @@ -70,7 +70,7 @@ CLASS ZCL_ABAPGIT_SERVICES_ABAPGIT IMPLEMENTATION. iv_url = iv_url iv_target_package = iv_package ). - zcl_abapgit_sap_package=>create_local( iv_package ). + zcl_abapgit_factory=>get_sap_package( iv_package )->create_local( ). lo_repo = zcl_abapgit_repo_srv=>get_instance( )->new_online( iv_url = iv_url diff --git a/src/zcl_abapgit_factory.clas.abap b/src/zcl_abapgit_factory.clas.abap index be4fd03f0..8038164d7 100644 --- a/src/zcl_abapgit_factory.clas.abap +++ b/src/zcl_abapgit_factory.clas.abap @@ -8,11 +8,26 @@ CLASS zcl_abapgit_factory DEFINITION CLASS-METHODS: get_tadir RETURNING - VALUE(ri_tadir) TYPE REF TO zif_abapgit_tadir. + VALUE(ri_tadir) TYPE REF TO zif_abapgit_tadir, + + get_sap_package + IMPORTING + iv_package TYPE devclass + RETURNING + VALUE(ri_sap_package) TYPE REF TO zif_abapgit_sap_package. PRIVATE SECTION. + TYPES: + BEGIN OF ty_sap_package, + package TYPE devclass, + 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. + CLASS-DATA: - mi_tadir TYPE REF TO zif_abapgit_tadir. + mi_tadir TYPE REF TO zif_abapgit_tadir, + mt_sap_package TYPE tty_sap_package. ENDCLASS. @@ -30,4 +45,28 @@ CLASS zcl_abapgit_factory IMPLEMENTATION. ENDMETHOD. + METHOD get_sap_package. + + DATA: ls_sap_package TYPE ty_sap_package. + FIELD-SYMBOLS: TYPE ty_sap_package. + + READ TABLE mt_sap_package ASSIGNING + WITH TABLE KEY package = iv_package. + IF sy-subrc <> 0. + + ls_sap_package-package = iv_package. + CREATE OBJECT ls_sap_package-instance TYPE zcl_abapgit_sap_package + EXPORTING + iv_package = iv_package. + + INSERT ls_sap_package + INTO TABLE mt_sap_package + ASSIGNING . + + ENDIF. + + ri_sap_package = -instance. + + ENDMETHOD. + ENDCLASS. diff --git a/src/zcl_abapgit_file_status.clas.abap b/src/zcl_abapgit_file_status.clas.abap index 4f0b8da84..dbb582c86 100644 --- a/src/zcl_abapgit_file_status.clas.abap +++ b/src/zcl_abapgit_file_status.clas.abap @@ -242,7 +242,7 @@ CLASS ZCL_ABAPGIT_FILE_STATUS IMPLEMENTATION. IF NOT ls_item-devclass IS INITIAL AND iv_devclass <> ls_item-devclass. * make sure the package is under the repo main package - lt_super = zcl_abapgit_sap_package=>get( iv_devclass )->list_subpackages( ). + lt_super = zcl_abapgit_factory=>get_sap_package( iv_devclass )->list_subpackages( ). READ TABLE lt_super WITH KEY table_line = ls_item-devclass TRANSPORTING NO FIELDS. IF sy-subrc <> 0. CLEAR ls_item-devclass. diff --git a/src/zcl_abapgit_folder_logic.clas.abap b/src/zcl_abapgit_folder_logic.clas.abap index 6e62c7fa5..653e07371 100644 --- a/src/zcl_abapgit_folder_logic.clas.abap +++ b/src/zcl_abapgit_folder_logic.clas.abap @@ -41,7 +41,7 @@ CLASS zcl_abapgit_folder_logic IMPLEMENTATION. IF iv_top = iv_package. rv_path = io_dot->get_starting_folder( ). ELSE. - lv_parentcl = zcl_abapgit_sap_package=>get( iv_package )->read_parent( ). + lv_parentcl = zcl_abapgit_factory=>get_sap_package( iv_package )->read_parent( ). IF lv_parentcl IS INITIAL. zcx_abapgit_exception=>raise( |error, expected parent package, { iv_package }| ). @@ -133,10 +133,10 @@ CLASS zcl_abapgit_folder_logic IMPLEMENTATION. TRANSLATE rv_package TO UPPER CASE. - IF zcl_abapgit_sap_package=>get( rv_package )->exists( ) = abap_false AND + IF zcl_abapgit_factory=>get_sap_package( rv_package )->exists( ) = abap_false AND iv_create_if_not_exists = abap_true. - zcl_abapgit_sap_package=>get( lv_parent )->create_child( rv_package ). + zcl_abapgit_factory=>get_sap_package( lv_parent )->create_child( rv_package ). ENDIF. lv_parent = rv_package. diff --git a/src/zcl_abapgit_folder_logic.clas.testclasses.abap b/src/zcl_abapgit_folder_logic.clas.testclasses.abap index 1e85621a3..05fbc2618 100644 --- a/src/zcl_abapgit_folder_logic.clas.testclasses.abap +++ b/src/zcl_abapgit_folder_logic.clas.testclasses.abap @@ -58,7 +58,6 @@ CLASS ltcl_folder_logic DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHOR METHODS: setup, - teardown, prefix1 FOR TESTING RAISING zcx_abapgit_exception, prefix2 FOR TESTING RAISING zcx_abapgit_exception, prefix_error1 FOR TESTING RAISING zcx_abapgit_exception, @@ -93,26 +92,29 @@ CLASS ltcl_folder_logic IMPLEMENTATION. RETURN. ENDMETHOD. - METHOD setup. - FIELD-SYMBOLS: LIKE LINE OF zcl_abapgit_sap_package=>gt_injected. - - CLEAR zcl_abapgit_sap_package=>gt_injected. - - APPEND INITIAL LINE TO zcl_abapgit_sap_package=>gt_injected ASSIGNING . - -package = '$TOP'. - -object = me. - - APPEND INITIAL LINE TO zcl_abapgit_sap_package=>gt_injected ASSIGNING . - -package = '$TOP_FOO'. - -object = me. - - APPEND INITIAL LINE TO zcl_abapgit_sap_package=>gt_injected ASSIGNING . - -package = '$FOOBAR'. - -object = me. + METHOD zif_abapgit_sap_package~get_transport_type. + RETURN. ENDMETHOD. - METHOD teardown. - CLEAR zcl_abapgit_sap_package=>gt_injected. + METHOD zif_abapgit_sap_package~create. + RETURN. + ENDMETHOD. + + METHOD zif_abapgit_sap_package~create_local. + RETURN. + ENDMETHOD. + + METHOD setup. + + zcl_abapgit_injector=>set_sap_package( iv_package = '$TOP' + ii_sap_package = me ). + + zcl_abapgit_injector=>set_sap_package( iv_package = '$TOP_FOO' + ii_sap_package = me ). + + zcl_abapgit_injector=>set_sap_package( iv_package = '$FOOBAR' + ii_sap_package = me ). + ENDMETHOD. METHOD prefix1. @@ -165,10 +167,6 @@ CLASS ltcl_folder_logic IMPLEMENTATION. iv_path = '/src/top_foo/' ). ENDMETHOD. - METHOD zif_abapgit_sap_package~get_transport_type. - RETURN. - ENDMETHOD. - ENDCLASS. CLASS ltcl_folder_logic_namespaces DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. @@ -182,7 +180,6 @@ CLASS ltcl_folder_logic_namespaces DEFINITION FOR TESTING RISK LEVEL HARMLESS DU METHODS: setup, - teardown, prefix1 FOR TESTING RAISING zcx_abapgit_exception, prefix2 FOR TESTING RAISING zcx_abapgit_exception, full1 FOR TESTING RAISING zcx_abapgit_exception, @@ -220,27 +217,28 @@ CLASS ltcl_folder_logic_namespaces IMPLEMENTATION. RETURN. ENDMETHOD. + METHOD zif_abapgit_sap_package~create. + RETURN. + ENDMETHOD. + + METHOD zif_abapgit_sap_package~create_local. + RETURN. + ENDMETHOD. + METHOD setup. - FIELD-SYMBOLS: LIKE LINE OF zcl_abapgit_sap_package=>gt_injected. - CLEAR zcl_abapgit_sap_package=>gt_injected. + zcl_abapgit_injector=>set_sap_package( iv_package = '/TEST/TOOLS' + ii_sap_package = me ). - APPEND INITIAL LINE TO zcl_abapgit_sap_package=>gt_injected ASSIGNING . - -package = '/TEST/TOOLS'. - -object = me. + zcl_abapgit_injector=>set_sap_package( iv_package = '/TEST/T1' + ii_sap_package = me ). - APPEND INITIAL LINE TO zcl_abapgit_sap_package=>gt_injected ASSIGNING . - -package = '/TEST/T1'. - -object = me. + zcl_abapgit_injector=>set_sap_package( iv_package = '/TEST/TOOLS_T1' + ii_sap_package = me ). - APPEND INITIAL LINE TO zcl_abapgit_sap_package=>gt_injected ASSIGNING . - -package = '/TEST/TOOLS_T1'. - -object = me. ENDMETHOD. - METHOD teardown. - CLEAR zcl_abapgit_sap_package=>gt_injected. - ENDMETHOD. + METHOD prefix1. ltcl_folder_logic_helper=>test( diff --git a/src/zcl_abapgit_injector.clas.abap b/src/zcl_abapgit_injector.clas.abap index 7f3ba3ca8..4a8ca2e63 100644 --- a/src/zcl_abapgit_injector.clas.abap +++ b/src/zcl_abapgit_injector.clas.abap @@ -5,9 +5,15 @@ CLASS zcl_abapgit_injector DEFINITION PUBLIC SECTION. - CLASS-METHODS set_tadir - IMPORTING - !ii_tadir TYPE REF TO zif_abapgit_tadir . + CLASS-METHODS: + set_tadir + IMPORTING + !ii_tadir TYPE REF TO zif_abapgit_tadir, + + set_sap_package + IMPORTING + iv_package TYPE devclass + ii_sap_package TYPE REF TO zif_abapgit_sap_package. ENDCLASS. @@ -21,4 +27,26 @@ CLASS zcl_abapgit_injector IMPLEMENTATION. ENDMETHOD. + METHOD set_sap_package. + + DATA: ls_sap_package TYPE zcl_abapgit_factory=>ty_sap_package. + FIELD-SYMBOLS: TYPE zcl_abapgit_factory=>ty_sap_package. + + READ TABLE zcl_abapgit_factory=>mt_sap_package + ASSIGNING + WITH TABLE KEY package = iv_package. + + IF sy-subrc <> 0. + + ls_sap_package-package = iv_package. + INSERT ls_sap_package + INTO TABLE zcl_abapgit_factory=>mt_sap_package + ASSIGNING . + + ENDIF. + + -instance = ii_sap_package. + + ENDMETHOD. + ENDCLASS. diff --git a/src/zcl_abapgit_objects.clas.abap b/src/zcl_abapgit_objects.clas.abap index 32430d226..f57d1e5ae 100644 --- a/src/zcl_abapgit_objects.clas.abap +++ b/src/zcl_abapgit_objects.clas.abap @@ -567,7 +567,7 @@ CLASS zcl_abapgit_objects IMPLEMENTATION. it_results = lt_results ). IF lines( lt_results ) > 0. - li_package = zcl_abapgit_sap_package=>get( io_repo->get_package( ) ). + li_package = zcl_abapgit_factory=>get_sap_package( io_repo->get_package( ) ). rs_checks-transport-required = li_package->are_changes_recorded_in_tr_req( ). IF NOT rs_checks-transport-required IS INITIAL. rs_checks-transport-type = li_package->get_transport_type( ). @@ -811,7 +811,7 @@ CLASS zcl_abapgit_objects IMPLEMENTATION. lv_tree TYPE dirtree-tname. - lt_packages = zcl_abapgit_sap_package=>get( iv_package )->list_subpackages( ). + lt_packages = zcl_abapgit_factory=>get_sap_package( iv_package )->list_subpackages( ). APPEND iv_package TO lt_packages. LOOP AT lt_packages INTO lv_package. diff --git a/src/zcl_abapgit_objects.clas.testclasses.abap b/src/zcl_abapgit_objects.clas.testclasses.abap index c40c9eb13..cd61a4a0b 100644 --- a/src/zcl_abapgit_objects.clas.testclasses.abap +++ b/src/zcl_abapgit_objects.clas.testclasses.abap @@ -53,7 +53,7 @@ CLASS ltcl_dangerous IMPLEMENTATION. LIKE LINE OF lt_types. - zcl_abapgit_sap_package=>create_local( c_package ). + zcl_abapgit_factory=>get_sap_package( c_package )->create_local( ). lt_types = zcl_abapgit_objects=>supported_list( ). diff --git a/src/zcl_abapgit_sap_package.clas.abap b/src/zcl_abapgit_sap_package.clas.abap index d8d06a9d2..faa4aef47 100644 --- a/src/zcl_abapgit_sap_package.clas.abap +++ b/src/zcl_abapgit_sap_package.clas.abap @@ -1,34 +1,21 @@ -CLASS zcl_abapgit_sap_package DEFINITION PUBLIC CREATE PUBLIC. +CLASS zcl_abapgit_sap_package DEFINITION + PUBLIC CREATE PRIVATE + GLOBAL FRIENDS zcl_abapgit_factory. PUBLIC SECTION. - CLASS-METHODS: - get - IMPORTING iv_package TYPE devclass - RETURNING VALUE(ri_package) TYPE REF TO zif_abapgit_sap_package, - create - IMPORTING is_package TYPE scompkdtln - RAISING zcx_abapgit_exception, - create_local - IMPORTING iv_package TYPE devclass - RAISING zcx_abapgit_exception. - METHODS: constructor IMPORTING iv_package TYPE devclass. INTERFACES: zif_abapgit_sap_package. - TYPES: BEGIN OF ty_injected, - package TYPE devclass, - object TYPE REF TO zif_abapgit_sap_package, - END OF ty_injected. - -* TODO, isolate this variable? - CLASS-DATA: gt_injected TYPE STANDARD TABLE OF ty_injected. - PRIVATE SECTION. DATA: mv_package TYPE devclass. + ALIASES: + create FOR zif_abapgit_sap_package~create, + create_local FOR zif_abapgit_sap_package~create_local. + ENDCLASS. @@ -41,7 +28,7 @@ CLASS zcl_abapgit_sap_package IMPLEMENTATION. ENDMETHOD. - METHOD create. + METHOD zif_abapgit_sap_package~create. DATA: lv_err TYPE string, li_package TYPE REF TO if_package, @@ -144,13 +131,13 @@ CLASS zcl_abapgit_sap_package IMPLEMENTATION. ENDMETHOD. - METHOD create_local. + METHOD zif_abapgit_sap_package~create_local. DATA: ls_package TYPE scompkdtln. - ls_package-devclass = iv_package. - ls_package-ctext = iv_package. + ls_package-devclass = mv_package. + ls_package-ctext = mv_package. ls_package-parentcl = '$TMP'. ls_package-dlvunit = 'LOCAL'. ls_package-as4user = sy-uname. @@ -160,20 +147,29 @@ CLASS zcl_abapgit_sap_package IMPLEMENTATION. ENDMETHOD. "create - METHOD get. + METHOD zif_abapgit_sap_package~are_changes_recorded_in_tr_req. - FIELD-SYMBOLS: LIKE LINE OF gt_injected. + DATA: li_package TYPE REF TO if_package. - IF lines( gt_injected ) > 0. - READ TABLE gt_injected ASSIGNING WITH KEY package = iv_package. - ASSERT sy-subrc = 0. " unit test should be in control - ri_package = -object. - ELSE. - CREATE OBJECT ri_package TYPE zcl_abapgit_sap_package - EXPORTING - iv_package = iv_package. + cl_package_factory=>load_package( + EXPORTING + i_package_name = mv_package + IMPORTING + e_package = li_package + EXCEPTIONS + object_not_existing = 1 + unexpected_error = 2 + intern_err = 3 + no_access = 4 + object_locked_and_modified = 5 + OTHERS = 6 ). + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |Error from CL_PACKAGE_FACTORY=>LOAD_PACKAGE { sy-subrc }| ). ENDIF. + rv_are_changes_rec_in_tr_req = li_package->wbo_korr_flag. + ENDMETHOD. @@ -227,77 +223,6 @@ CLASS zcl_abapgit_sap_package IMPLEMENTATION. ENDMETHOD. - METHOD zif_abapgit_sap_package~list_subpackages. - - DATA: lt_list LIKE rt_list, - lv_devclass LIKE LINE OF rt_list. - - - SELECT devclass INTO TABLE rt_list - FROM tdevc WHERE parentcl = mv_package. "#EC CI_GENBUFF "#EC CI_SUBRC - -* note the recursion, since packages are added to the list - LOOP AT rt_list INTO lv_devclass. - lt_list = get( lv_devclass )->list_subpackages( ). - APPEND LINES OF lt_list TO rt_list. - ENDLOOP. - - ENDMETHOD. - - - METHOD zif_abapgit_sap_package~list_superpackages. - - DATA: lt_list LIKE rt_list, - lv_parent TYPE tdevc-parentcl. - - - APPEND mv_package TO rt_list. - - SELECT SINGLE parentcl INTO lv_parent - FROM tdevc WHERE devclass = mv_package. "#EC CI_GENBUFF - - IF sy-subrc = 0 AND NOT lv_parent IS INITIAL. - APPEND lv_parent TO rt_list. - lt_list = get( lv_parent )->list_superpackages( ). - APPEND LINES OF lt_list TO rt_list. - ENDIF. - - ENDMETHOD. - - - METHOD zif_abapgit_sap_package~read_parent. - - SELECT SINGLE parentcl FROM tdevc INTO rv_parentcl - WHERE devclass = mv_package. "#EC CI_SUBRC "#EC CI_GENBUFF - ASSERT sy-subrc = 0. - - ENDMETHOD. - - METHOD zif_abapgit_sap_package~are_changes_recorded_in_tr_req. - - DATA: li_package TYPE REF TO if_package. - - cl_package_factory=>load_package( - EXPORTING - i_package_name = mv_package - IMPORTING - e_package = li_package - EXCEPTIONS - object_not_existing = 1 - unexpected_error = 2 - intern_err = 3 - no_access = 4 - object_locked_and_modified = 5 - OTHERS = 6 ). - - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( |Error from CL_PACKAGE_FACTORY=>LOAD_PACKAGE { sy-subrc }| ). - ENDIF. - - rv_are_changes_rec_in_tr_req = li_package->wbo_korr_flag. - - ENDMETHOD. - METHOD zif_abapgit_sap_package~get_transport_type. DATA: lv_err_prefix TYPE string, lv_pkg_name TYPE e071-obj_name. @@ -307,15 +232,15 @@ CLASS zcl_abapgit_sap_package IMPLEMENTATION. CALL FUNCTION 'TRINT_GET_REQUEST_TYPE' EXPORTING - iv_pgmid = 'R3TR' - iv_object = 'DEVC' - iv_obj_name = lv_pkg_name + iv_pgmid = 'R3TR' + iv_object = 'DEVC' + iv_obj_name = lv_pkg_name IMPORTING - ev_request_type = rv_transport_type-request - ev_task_type = rv_transport_type-task + ev_request_type = rv_transport_type-request + ev_task_type = rv_transport_type-task EXCEPTIONS - no_request_needed = 1 - internal_error = 2 + no_request_needed = 1 + internal_error = 2 cts_initialization_failure = 3. CASE sy-subrc. @@ -337,4 +262,50 @@ CLASS zcl_abapgit_sap_package IMPLEMENTATION. ENDMETHOD. + + METHOD zif_abapgit_sap_package~list_subpackages. + + DATA: lt_list LIKE rt_list, + lv_devclass LIKE LINE OF rt_list. + + + SELECT devclass INTO TABLE rt_list + FROM tdevc WHERE parentcl = mv_package. "#EC CI_GENBUFF "#EC CI_SUBRC + +* note the recursion, since packages are added to the list + LOOP AT rt_list INTO lv_devclass. + lt_list = zcl_abapgit_factory=>get_sap_package( lv_devclass )->list_subpackages( ). + APPEND LINES OF lt_list TO rt_list. + ENDLOOP. + + ENDMETHOD. + + + METHOD zif_abapgit_sap_package~list_superpackages. + + DATA: lt_list LIKE rt_list, + lv_parent TYPE tdevc-parentcl. + + + APPEND mv_package TO rt_list. + + SELECT SINGLE parentcl INTO lv_parent + FROM tdevc WHERE devclass = mv_package. "#EC CI_GENBUFF + + IF sy-subrc = 0 AND NOT lv_parent IS INITIAL. + APPEND lv_parent TO rt_list. + lt_list = zcl_abapgit_factory=>get_sap_package( lv_parent )->list_superpackages( ). + APPEND LINES OF lt_list TO rt_list. + ENDIF. + + ENDMETHOD. + + + METHOD zif_abapgit_sap_package~read_parent. + + SELECT SINGLE parentcl FROM tdevc INTO rv_parentcl + WHERE devclass = mv_package. "#EC CI_SUBRC "#EC CI_GENBUFF + ASSERT sy-subrc = 0. + + ENDMETHOD. ENDCLASS. diff --git a/src/zcl_abapgit_sap_package.clas.xml b/src/zcl_abapgit_sap_package.clas.xml index d9240df1a..225c1abc9 100644 --- a/src/zcl_abapgit_sap_package.clas.xml +++ b/src/zcl_abapgit_sap_package.clas.xml @@ -7,7 +7,6 @@ 1 E SAP package - 2 1 X X diff --git a/src/zcl_abapgit_transport.clas.abap b/src/zcl_abapgit_transport.clas.abap index d3bd00cfe..437cfe7b6 100644 --- a/src/zcl_abapgit_transport.clas.abap +++ b/src/zcl_abapgit_transport.clas.abap @@ -41,10 +41,10 @@ CLASS ZCL_ABAPGIT_TRANSPORT IMPLEMENTATION. READ TABLE it_tadir INDEX 1 ASSIGNING . ASSERT sy-subrc = 0. - lt_super = zcl_abapgit_sap_package=>get( -devclass )->list_superpackages( ). + lt_super = zcl_abapgit_factory=>get_sap_package( -devclass )->list_superpackages( ). LOOP AT it_tadir ASSIGNING . - lt_obj = zcl_abapgit_sap_package=>get( -devclass )->list_superpackages( ). + lt_obj = zcl_abapgit_factory=>get_sap_package( -devclass )->list_superpackages( ). * filter out possibilities from lt_super LOOP AT lt_super INTO lv_super. diff --git a/src/zcl_abapgit_zip.clas.abap b/src/zcl_abapgit_zip.clas.abap index be5b8e337..9021fc8e5 100644 --- a/src/zcl_abapgit_zip.clas.abap +++ b/src/zcl_abapgit_zip.clas.abap @@ -87,7 +87,7 @@ CLASS zcl_abapgit_zip IMPLEMENTATION. lv_package = io_repo->get_package( ). - IF zcl_abapgit_sap_package=>get( lv_package )->exists( ) = abap_false. + IF zcl_abapgit_factory=>get_sap_package( lv_package )->exists( ) = abap_false. zcx_abapgit_exception=>raise( |Package { lv_package } doesn't exist| ). ENDIF. diff --git a/src/zif_abapgit_sap_package.intf.abap b/src/zif_abapgit_sap_package.intf.abap index 08c200c51..0b5a7260f 100644 --- a/src/zif_abapgit_sap_package.intf.abap +++ b/src/zif_abapgit_sap_package.intf.abap @@ -1,8 +1,12 @@ INTERFACE zif_abapgit_sap_package PUBLIC. TYPES: ty_devclass_tt TYPE STANDARD TABLE OF devclass WITH DEFAULT KEY. - METHODS: + create + IMPORTING is_package TYPE scompkdtln + RAISING zcx_abapgit_exception, + create_local + RAISING zcx_abapgit_exception, list_subpackages RETURNING VALUE(rt_list) TYPE ty_devclass_tt, list_superpackages @@ -16,9 +20,9 @@ INTERFACE zif_abapgit_sap_package PUBLIC. RETURNING VALUE(rv_bool) TYPE abap_bool, are_changes_recorded_in_tr_req RETURNING VALUE(rv_are_changes_rec_in_tr_req) TYPE abap_bool - RAISING zcx_abapgit_exception, + RAISING zcx_abapgit_exception, get_transport_type RETURNING VALUE(rv_transport_type) TYPE zif_abapgit_definitions=>ty_transport_type - RAISING zcx_abapgit_exception. + RAISING zcx_abapgit_exception. ENDINTERFACE. From cac21f2b37ec5e0fa67b63232b9e4a748e8b0bd6 Mon Sep 17 00:00:00 2001 From: larshp Date: Mon, 18 Jun 2018 15:41:13 +0200 Subject: [PATCH 098/136] CHAR: implement is_locked --- src/objects/zcl_abapgit_object_char.clas.abap | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/objects/zcl_abapgit_object_char.clas.abap b/src/objects/zcl_abapgit_object_char.clas.abap index 6d08cb9ad..69b9e0300 100644 --- a/src/objects/zcl_abapgit_object_char.clas.abap +++ b/src/objects/zcl_abapgit_object_char.clas.abap @@ -194,6 +194,11 @@ CLASS ZCL_ABAPGIT_OBJECT_CHAR IMPLEMENTATION. ENDMETHOD. + METHOD zif_abapgit_object~is_locked. + rv_is_locked = abap_false. + ENDMETHOD. + + METHOD zif_abapgit_object~jump. CALL FUNCTION 'RS_TOOL_ACCESS' From fa94fa8ea14806973594735f77e5adb794740333 Mon Sep 17 00:00:00 2001 From: larshp Date: Tue, 19 Jun 2018 08:16:55 +0200 Subject: [PATCH 099/136] unexpected folder structure #1425 treat objects as non existing when outside the starting folder --- src/zcl_abapgit_folder_logic.clas.abap | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/zcl_abapgit_folder_logic.clas.abap b/src/zcl_abapgit_folder_logic.clas.abap index 653e07371..850147418 100644 --- a/src/zcl_abapgit_folder_logic.clas.abap +++ b/src/zcl_abapgit_folder_logic.clas.abap @@ -27,7 +27,7 @@ ENDCLASS. -CLASS zcl_abapgit_folder_logic IMPLEMENTATION. +CLASS ZCL_ABAPGIT_FOLDER_LOGIC IMPLEMENTATION. METHOD package_to_path. @@ -109,7 +109,8 @@ CLASS zcl_abapgit_folder_logic IMPLEMENTATION. lv_length = strlen( io_dot->get_starting_folder( ) ). IF lv_length > strlen( iv_path ). - zcx_abapgit_exception=>raise( 'unexpected folder structure' ). +* treat as not existing locally + RETURN. ENDIF. lv_path = iv_path+lv_length. lv_parent = lv_top. From e167464f1d5daa5e9118c2631905e24eb9e91952 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Tue, 19 Jun 2018 11:24:00 +0000 Subject: [PATCH 100/136] add commit to toggle_favorites --- src/persist/zcl_abapgit_persistence_user.clas.abap | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/persist/zcl_abapgit_persistence_user.clas.abap b/src/persist/zcl_abapgit_persistence_user.clas.abap index c2d161b70..25d63948d 100644 --- a/src/persist/zcl_abapgit_persistence_user.clas.abap +++ b/src/persist/zcl_abapgit_persistence_user.clas.abap @@ -506,6 +506,8 @@ CLASS zcl_abapgit_persistence_user IMPLEMENTATION. update( ls_user ). + COMMIT WORK AND WAIT. + ENDMETHOD. " toggle_favorite. From 79a0a8fa855989228060da2bd3247c37c58d40e7 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Tue, 19 Jun 2018 13:32:25 +0000 Subject: [PATCH 101/136] Delete: checks if any object is locked --- src/zcl_abapgit_objects.clas.abap | 75 ++++++++++++++++--- src/zcl_abapgit_objects.clas.testclasses.abap | 14 ++-- 2 files changed, 70 insertions(+), 19 deletions(-) diff --git a/src/zcl_abapgit_objects.clas.abap b/src/zcl_abapgit_objects.clas.abap index f57d1e5ae..77eb10406 100644 --- a/src/zcl_abapgit_objects.clas.abap +++ b/src/zcl_abapgit_objects.clas.abap @@ -178,7 +178,7 @@ CLASS zcl_abapgit_objects DEFINITION CLASS-METHODS check_objects_locked IMPORTING iv_language TYPE spras - it_results TYPE zif_abapgit_definitions=>ty_results_tt + it_items TYPE zif_abapgit_definitions=>ty_items_tt RAISING zcx_abapgit_exception. CLASS-METHODS create_object @@ -191,6 +191,16 @@ CLASS zcl_abapgit_objects DEFINITION VALUE(ri_obj) TYPE REF TO zif_abapgit_object RAISING zcx_abapgit_exception . + CLASS-METHODS map_tadir_to_items + IMPORTING + it_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt + RETURNING + VALUE(rt_items) TYPE zif_abapgit_definitions=>ty_items_tt. + CLASS-METHODS map_results_to_items + IMPORTING + it_results TYPE zif_abapgit_definitions=>ty_results_tt + RETURNING + VALUE(rt_items) TYPE zif_abapgit_definitions=>ty_items_tt. ENDCLASS. @@ -252,20 +262,18 @@ CLASS zcl_abapgit_objects IMPLEMENTATION. METHOD check_objects_locked. - DATA: li_obj TYPE REF TO zif_abapgit_object, - ls_item TYPE zif_abapgit_definitions=>ty_item. - FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_result. + DATA: li_obj TYPE REF TO zif_abapgit_object. - LOOP AT it_results ASSIGNING . + FIELD-SYMBOLS: LIKE LINE OF it_items. - MOVE-CORRESPONDING TO ls_item. + LOOP AT it_items ASSIGNING . - li_obj = create_object( is_item = ls_item + li_obj = create_object( is_item = iv_language = iv_language ). IF li_obj->is_locked( ) = abap_true. - zcx_abapgit_exception=>raise( |Object { ls_item-obj_type } { ls_item-obj_name } | - && |is locked. Deserialization not possible.| ). + zcx_abapgit_exception=>raise( |Object { -obj_type } { -obj_name } | + && |is locked. Action not possible.| ). ENDIF. ENDLOOP. @@ -376,7 +384,8 @@ CLASS zcl_abapgit_objects IMPLEMENTATION. DATA: ls_item TYPE zif_abapgit_definitions=>ty_item, lo_progress TYPE REF TO zcl_abapgit_progress, - lt_tadir LIKE it_tadir. + lt_tadir LIKE it_tadir, + lt_items TYPE zif_abapgit_definitions=>ty_items_tt. FIELD-SYMBOLS: LIKE LINE OF it_tadir. @@ -388,6 +397,11 @@ CLASS zcl_abapgit_objects IMPLEMENTATION. EXPORTING iv_total = lines( lt_tadir ). + lt_items = map_tadir_to_items( lt_tadir ). + + check_objects_locked( iv_language = zif_abapgit_definitions=>gc_english + it_items = lt_items ). + LOOP AT lt_tadir ASSIGNING . lo_progress->show( iv_current = sy-tabix iv_text = |Delete { -obj_name }| ) ##NO_TEXT. @@ -443,7 +457,8 @@ CLASS zcl_abapgit_objects IMPLEMENTATION. lt_rest TYPE TABLE OF ty_deserialization, lt_late TYPE TABLE OF ty_deserialization, lo_progress TYPE REF TO zcl_abapgit_progress, - lv_path TYPE string. + lv_path TYPE string, + lt_items TYPE zif_abapgit_definitions=>ty_items_tt. FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_result, LIKE LINE OF lt_late. @@ -472,8 +487,10 @@ CLASS zcl_abapgit_objects IMPLEMENTATION. EXPORTING iv_total = lines( lt_results ). + lt_items = map_results_to_items( lt_results ). + check_objects_locked( iv_language = io_repo->get_dot_abapgit( )->get_master_language( ) - it_results = lt_results ). + it_items = lt_items ). LOOP AT lt_results ASSIGNING . lo_progress->show( iv_current = sy-tabix @@ -947,4 +964,38 @@ CLASS zcl_abapgit_objects IMPLEMENTATION. ENDLOOP. ENDMETHOD. + + METHOD map_tadir_to_items. + + DATA: ls_item LIKE LINE OF rt_items. + FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_tadir. + + LOOP AT it_tadir ASSIGNING . + + ls_item-devclass = -devclass. + ls_item-obj_type = -object. + ls_item-obj_name = -obj_name. + INSERT ls_item INTO TABLE rt_items. + + ENDLOOP. + + ENDMETHOD. + + + METHOD map_results_to_items. + + DATA: ls_item LIKE LINE OF rt_items. + FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_result. + + LOOP AT it_results ASSIGNING . + + ls_item-devclass = -package. + ls_item-obj_type = -obj_type. + ls_item-obj_name = -obj_name. + INSERT ls_item INTO TABLE rt_items. + + ENDLOOP. + + ENDMETHOD. + ENDCLASS. diff --git a/src/zcl_abapgit_objects.clas.testclasses.abap b/src/zcl_abapgit_objects.clas.testclasses.abap index cd61a4a0b..f35a8facc 100644 --- a/src/zcl_abapgit_objects.clas.testclasses.abap +++ b/src/zcl_abapgit_objects.clas.testclasses.abap @@ -403,7 +403,7 @@ CLASS ltcl_check_objects_locked DEFINITION FINAL FOR TESTING PRIVATE SECTION. DATA: - mt_given_results TYPE zif_abapgit_definitions=>ty_results_tt, + mt_given_items TYPE zif_abapgit_definitions=>ty_items_tt, mv_exception_text TYPE string. METHODS: @@ -453,7 +453,7 @@ CLASS ltcl_check_objects_locked IMPLEMENTATION. TRY. zcl_abapgit_objects=>check_objects_locked( iv_language = 'E' - it_results = mt_given_results ). + it_items = mt_given_items ). CATCH zcx_abapgit_exception INTO lx_error. mv_exception_text = lx_error->get_text( ). @@ -465,7 +465,7 @@ CLASS ltcl_check_objects_locked IMPLEMENTATION. METHOD then_exception_shd_be_raised. cl_abap_unit_assert=>assert_equals( - exp = |Object DDLS Z_TEST_DDLS is locked. Deserialization not possible.| + exp = |Object DDLS Z_TEST_DDLS is locked. Action not possible.| act = mv_exception_text ). ENDMETHOD. @@ -491,12 +491,12 @@ CLASS ltcl_check_objects_locked IMPLEMENTATION. co_obj_type TYPE string VALUE 'DDLS'. DATA: - ls_result LIKE LINE OF mt_given_results, + ls_item LIKE LINE OF mt_given_items, ls_obj_serializer_map LIKE LINE OF zcl_abapgit_objects=>st_obj_serializer_map. - ls_result-obj_type = co_obj_type. - ls_result-obj_name = iv_object_name. - INSERT ls_result INTO TABLE mt_given_results. + ls_item-obj_type = co_obj_type. + ls_item-obj_name = iv_object_name. + INSERT ls_item INTO TABLE mt_given_items. ls_obj_serializer_map-item-obj_type = co_obj_type. ls_obj_serializer_map-item-obj_name = iv_object_name. From 002f5ba73d840075a70acd5f3bb03b00c2bfe8bc Mon Sep 17 00:00:00 2001 From: christianguenter2 Date: Tue, 19 Jun 2018 18:05:09 +0200 Subject: [PATCH 102/136] Implement IS_LOCKED for W3*, TTYP, TRAN, SSFO, SSST --- src/objects/zcl_abapgit_object_intf.clas.abap | 9 ++++++++- src/objects/zcl_abapgit_object_ssfo.clas.abap | 3 ++- src/objects/zcl_abapgit_object_ssst.clas.abap | 3 ++- src/objects/zcl_abapgit_object_tran.clas.abap | 10 +++++++++- src/objects/zcl_abapgit_object_ttyp.clas.abap | 3 ++- src/objects/zcl_abapgit_object_w3super.clas.abap | 11 +++++++++-- 6 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/objects/zcl_abapgit_object_intf.clas.abap b/src/objects/zcl_abapgit_object_intf.clas.abap index 0fe224c09..402ffb447 100644 --- a/src/objects/zcl_abapgit_object_intf.clas.abap +++ b/src/objects/zcl_abapgit_object_intf.clas.abap @@ -268,7 +268,14 @@ CLASS ZCL_ABAPGIT_OBJECT_INTF IMPLEMENTATION. METHOD zif_abapgit_object~is_locked. - rv_is_locked = abap_false. + DATA: lv_object TYPE eqegraarg. + + lv_object = |{ ms_item-obj_name }|. + OVERLAY lv_object WITH '==============================P'. + lv_object = lv_object && '*'. + + rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'ESEOCLASS' + iv_argument = lv_object ). ENDMETHOD. diff --git a/src/objects/zcl_abapgit_object_ssfo.clas.abap b/src/objects/zcl_abapgit_object_ssfo.clas.abap index be02fa50e..1eefae029 100644 --- a/src/objects/zcl_abapgit_object_ssfo.clas.abap +++ b/src/objects/zcl_abapgit_object_ssfo.clas.abap @@ -285,7 +285,8 @@ CLASS zcl_abapgit_object_ssfo IMPLEMENTATION. METHOD zif_abapgit_object~is_locked. - rv_is_locked = abap_false. + rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'E_SMFORM' + iv_argument = |{ ms_item-obj_name }| ). ENDMETHOD. diff --git a/src/objects/zcl_abapgit_object_ssst.clas.abap b/src/objects/zcl_abapgit_object_ssst.clas.abap index 377b10975..f716c8b0d 100644 --- a/src/objects/zcl_abapgit_object_ssst.clas.abap +++ b/src/objects/zcl_abapgit_object_ssst.clas.abap @@ -264,7 +264,8 @@ CLASS ZCL_ABAPGIT_OBJECT_SSST IMPLEMENTATION. METHOD zif_abapgit_object~is_locked. - rv_is_locked = abap_false. + rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'E_SMSTYLE' + iv_argument = |{ ms_item-obj_name }| ). ENDMETHOD. diff --git a/src/objects/zcl_abapgit_object_tran.clas.abap b/src/objects/zcl_abapgit_object_tran.clas.abap index 979f1d279..885cd7770 100644 --- a/src/objects/zcl_abapgit_object_tran.clas.abap +++ b/src/objects/zcl_abapgit_object_tran.clas.abap @@ -485,7 +485,15 @@ CLASS ZCL_ABAPGIT_OBJECT_TRAN IMPLEMENTATION. METHOD zif_abapgit_object~is_locked. - rv_is_locked = abap_false. + DATA: lv_object TYPE eqegraarg. + + lv_object = |TN{ ms_item-obj_name }|. + OVERLAY lv_object WITH ' '. + lv_object = lv_object && '*'. + + rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'EEUDB' + iv_argument = lv_object ). + ENDMETHOD. diff --git a/src/objects/zcl_abapgit_object_ttyp.clas.abap b/src/objects/zcl_abapgit_object_ttyp.clas.abap index b66ab7f3a..338d1f0b3 100644 --- a/src/objects/zcl_abapgit_object_ttyp.clas.abap +++ b/src/objects/zcl_abapgit_object_ttyp.clas.abap @@ -177,7 +177,8 @@ CLASS zcl_abapgit_object_ttyp IMPLEMENTATION. METHOD zif_abapgit_object~is_locked. - rv_is_locked = abap_false. + rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'ESDICT' + iv_argument = |{ ms_item-obj_type }{ ms_item-obj_name }| ). ENDMETHOD. diff --git a/src/objects/zcl_abapgit_object_w3super.clas.abap b/src/objects/zcl_abapgit_object_w3super.clas.abap index b254e820b..a8f96515c 100644 --- a/src/objects/zcl_abapgit_object_w3super.clas.abap +++ b/src/objects/zcl_abapgit_object_w3super.clas.abap @@ -56,7 +56,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_OBJECT_W3SUPER IMPLEMENTATION. +CLASS zcl_abapgit_object_w3super IMPLEMENTATION. METHOD constructor. @@ -494,7 +494,14 @@ CLASS ZCL_ABAPGIT_OBJECT_W3SUPER IMPLEMENTATION. METHOD zif_abapgit_object~is_locked. - rv_is_locked = abap_false. + DATA: lv_object TYPE eqegraarg. + + lv_object = |{ ms_item-obj_type+2(2) }{ ms_item-obj_name }|. + OVERLAY lv_object WITH ' '. + lv_object = lv_object && '*'. + + rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'E_WWW_HTML' + iv_argument = lv_object ). ENDMETHOD. From fb91909947994303bc9f5c87e4c8db4d535a28c5 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Mon, 18 Jun 2018 14:38:16 +0000 Subject: [PATCH 103/136] tag popups dependency injection --- src/ui/zcl_abapgit_services_git.clas.abap | 8 +- src/ui/zcl_abapgit_tag_popups.clas.abap | 201 ++++++++++------------ src/ui/zcl_abapgit_tag_popups.clas.xml | 1 - src/ui/zcl_abapgit_ui_factory.clas.abap | 19 +- src/ui/zcl_abapgit_ui_injector.clas.abap | 12 +- src/ui/zif_abapgit_tag_popups.intf.abap | 21 +++ src/ui/zif_abapgit_tag_popups.intf.xml | 16 ++ 7 files changed, 162 insertions(+), 116 deletions(-) create mode 100644 src/ui/zif_abapgit_tag_popups.intf.abap create mode 100644 src/ui/zif_abapgit_tag_popups.intf.xml diff --git a/src/ui/zcl_abapgit_services_git.clas.abap b/src/ui/zcl_abapgit_services_git.clas.abap index 85b37b82c..5da98c676 100644 --- a/src/ui/zcl_abapgit_services_git.clas.abap +++ b/src/ui/zcl_abapgit_services_git.clas.abap @@ -77,7 +77,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_SERVICES_GIT IMPLEMENTATION. +CLASS zcl_abapgit_services_git IMPLEMENTATION. METHOD commit. @@ -188,7 +188,7 @@ CLASS ZCL_ABAPGIT_SERVICES_GIT IMPLEMENTATION. lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). - ls_tag = zcl_abapgit_tag_popups=>tag_select_popup( lo_repo ). + ls_tag = zcl_abapgit_ui_factory=>get_tag_popups( )->tag_select_popup( lo_repo ). IF ls_tag IS INITIAL. RAISE EXCEPTION TYPE zcx_abapgit_cancel. ENDIF. @@ -312,7 +312,7 @@ CLASS ZCL_ABAPGIT_SERVICES_GIT IMPLEMENTATION. lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). - ls_tag = zcl_abapgit_tag_popups=>tag_select_popup( lo_repo ). + ls_tag = zcl_abapgit_ui_factory=>get_tag_popups( )->tag_select_popup( lo_repo ). IF ls_tag IS INITIAL. RAISE EXCEPTION TYPE zcx_abapgit_cancel. ENDIF. @@ -330,7 +330,7 @@ CLASS ZCL_ABAPGIT_SERVICES_GIT IMPLEMENTATION. lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). - zcl_abapgit_tag_popups=>tag_list_popup( lo_repo ). + zcl_abapgit_ui_factory=>get_tag_popups( )->tag_list_popup( lo_repo ). ENDMETHOD. ENDCLASS. diff --git a/src/ui/zcl_abapgit_tag_popups.clas.abap b/src/ui/zcl_abapgit_tag_popups.clas.abap index 162cace75..366a18648 100644 --- a/src/ui/zcl_abapgit_tag_popups.clas.abap +++ b/src/ui/zcl_abapgit_tag_popups.clas.abap @@ -1,26 +1,11 @@ CLASS zcl_abapgit_tag_popups DEFINITION PUBLIC FINAL - CREATE PUBLIC. + CREATE PRIVATE + GLOBAL FRIENDS zcl_abapgit_ui_factory. PUBLIC SECTION. - - CLASS-METHODS: - tag_list_popup - IMPORTING - io_repo TYPE REF TO zcl_abapgit_repo_online - RETURNING - VALUE(rs_tag) TYPE zif_abapgit_definitions=>ty_git_tag - RAISING - zcx_abapgit_exception, - - tag_select_popup - IMPORTING - io_repo TYPE REF TO zcl_abapgit_repo_online - RETURNING - VALUE(rs_tag) TYPE zif_abapgit_definitions=>ty_git_tag - RAISING - zcx_abapgit_exception . + INTERFACES: zif_abapgit_tag_popups. PRIVATE SECTION. TYPES: @@ -31,12 +16,12 @@ CLASS zcl_abapgit_tag_popups DEFINITION tty_tag_out TYPE STANDARD TABLE OF ty_tag_out WITH NON-UNIQUE DEFAULT KEY. - CLASS-DATA: + DATA: mt_tags TYPE tty_tag_out, mo_docking_container TYPE REF TO cl_gui_docking_container, mo_text_control TYPE REF TO cl_gui_textedit. - CLASS-METHODS: + METHODS: on_double_click FOR EVENT double_click OF cl_salv_events_table IMPORTING row column, @@ -59,6 +44,39 @@ ENDCLASS. CLASS zcl_abapgit_tag_popups IMPLEMENTATION. + METHOD clean_up. + + IF mo_text_control IS BOUND. + + mo_text_control->finalize( ). + mo_text_control->free( + EXCEPTIONS + cntl_error = 1 + cntl_system_error = 2 + OTHERS = 3 ). + ASSERT sy-subrc = 0. + + CLEAR: mo_text_control. + + ENDIF. + + IF mo_docking_container IS BOUND. + + mo_docking_container->finalize( ). + mo_docking_container->free( + EXCEPTIONS + cntl_error = 1 + cntl_system_error = 2 + OTHERS = 3 ). + ASSERT sy-subrc = 0. + + CLEAR: mo_docking_container. + + ENDIF. + + ENDMETHOD. + + METHOD on_double_click. FIELD-SYMBOLS: TYPE zcl_abapgit_tag_popups=>ty_tag_out. @@ -99,7 +117,60 @@ CLASS zcl_abapgit_tag_popups IMPLEMENTATION. ENDMETHOD. - METHOD tag_list_popup. + METHOD show_docking_container_with. + + IF mo_docking_container IS NOT BOUND. + + CREATE OBJECT mo_docking_container + EXPORTING + side = cl_gui_docking_container=>dock_at_bottom + extension = 120 + EXCEPTIONS + cntl_error = 1 + cntl_system_error = 2 + create_error = 3 + lifetime_error = 4 + lifetime_dynpro_dynpro_link = 5 + OTHERS = 6. + ASSERT sy-subrc = 0. + + ENDIF. + + IF mo_text_control IS NOT BOUND. + CREATE OBJECT mo_text_control + EXPORTING + parent = mo_docking_container + EXCEPTIONS + error_cntl_create = 1 + error_cntl_init = 2 + error_cntl_link = 3 + error_dp_create = 4 + gui_type_not_supported = 5 + OTHERS = 6. + ASSERT sy-subrc = 0. + + mo_text_control->set_readonly_mode( + EXCEPTIONS + error_cntl_call_method = 1 + invalid_parameter = 2 + OTHERS = 3 ). + ASSERT sy-subrc = 0. + + ENDIF. + + mo_text_control->set_textstream( + EXPORTING + text = iv_text + EXCEPTIONS + error_cntl_call_method = 1 + not_supported_by_gui = 2 + OTHERS = 3 ). + ASSERT sy-subrc = 0. + + ENDMETHOD. + + + METHOD zif_abapgit_tag_popups~tag_list_popup. DATA: lo_alv TYPE REF TO cl_salv_table, lo_table_header TYPE REF TO cl_salv_form_header_info, @@ -190,7 +261,7 @@ CLASS zcl_abapgit_tag_popups IMPLEMENTATION. ENDMETHOD. - METHOD tag_select_popup. + METHOD zif_abapgit_tag_popups~tag_select_popup. DATA: lt_tags TYPE zif_abapgit_definitions=>ty_git_tag_list_tt, lv_answer TYPE c LENGTH 1, @@ -247,90 +318,4 @@ CLASS zcl_abapgit_tag_popups IMPLEMENTATION. rs_tag = . ENDMETHOD. - - METHOD clean_up. - - IF mo_text_control IS BOUND. - - mo_text_control->finalize( ). - mo_text_control->free( - EXCEPTIONS - cntl_error = 1 - cntl_system_error = 2 - OTHERS = 3 ). - ASSERT sy-subrc = 0. - - CLEAR: mo_text_control. - - ENDIF. - - IF mo_docking_container IS BOUND. - - mo_docking_container->finalize( ). - mo_docking_container->free( - EXCEPTIONS - cntl_error = 1 - cntl_system_error = 2 - OTHERS = 3 ). - ASSERT sy-subrc = 0. - - CLEAR: mo_docking_container. - - ENDIF. - - ENDMETHOD. - - - METHOD show_docking_container_with. - - IF mo_docking_container IS NOT BOUND. - - CREATE OBJECT mo_docking_container - EXPORTING - side = cl_gui_docking_container=>dock_at_bottom - extension = 120 - EXCEPTIONS - cntl_error = 1 - cntl_system_error = 2 - create_error = 3 - lifetime_error = 4 - lifetime_dynpro_dynpro_link = 5 - OTHERS = 6. - ASSERT sy-subrc = 0. - - ENDIF. - - IF mo_text_control IS NOT BOUND. - CREATE OBJECT mo_text_control - EXPORTING - parent = mo_docking_container - EXCEPTIONS - error_cntl_create = 1 - error_cntl_init = 2 - error_cntl_link = 3 - error_dp_create = 4 - gui_type_not_supported = 5 - OTHERS = 6. - ASSERT sy-subrc = 0. - - mo_text_control->set_readonly_mode( - EXCEPTIONS - error_cntl_call_method = 1 - invalid_parameter = 2 - OTHERS = 3 ). - ASSERT sy-subrc = 0. - - ENDIF. - - mo_text_control->set_textstream( - EXPORTING - text = iv_text - EXCEPTIONS - error_cntl_call_method = 1 - not_supported_by_gui = 2 - OTHERS = 3 ). - ASSERT sy-subrc = 0. - - ENDMETHOD. - ENDCLASS. diff --git a/src/ui/zcl_abapgit_tag_popups.clas.xml b/src/ui/zcl_abapgit_tag_popups.clas.xml index 927a080f1..be698d562 100644 --- a/src/ui/zcl_abapgit_tag_popups.clas.xml +++ b/src/ui/zcl_abapgit_tag_popups.clas.xml @@ -7,7 +7,6 @@ 1 E Popups - 2 1 X X diff --git a/src/ui/zcl_abapgit_ui_factory.clas.abap b/src/ui/zcl_abapgit_ui_factory.clas.abap index a78782b76..f8995fe4a 100644 --- a/src/ui/zcl_abapgit_ui_factory.clas.abap +++ b/src/ui/zcl_abapgit_ui_factory.clas.abap @@ -7,11 +7,16 @@ CLASS zcl_abapgit_ui_factory DEFINITION CLASS-METHODS: get_popups RETURNING - VALUE(ri_popups) TYPE REF TO zif_abapgit_popups. + VALUE(ri_popups) TYPE REF TO zif_abapgit_popups, + + get_tag_popups + RETURNING + VALUE(ri_tag_popups) TYPE REF TO zif_abapgit_tag_popups. PRIVATE SECTION. CLASS-DATA: - mi_popups TYPE REF TO zif_abapgit_popups. + mi_popups TYPE REF TO zif_abapgit_popups, + mi_tag_popups TYPE REF TO zif_abapgit_tag_popups. ENDCLASS. @@ -29,4 +34,14 @@ CLASS zcl_abapgit_ui_factory IMPLEMENTATION. ENDMETHOD. + METHOD get_tag_popups. + + IF mi_tag_popups IS INITIAL. + CREATE OBJECT mi_tag_popups TYPE zcl_abapgit_tag_popups. + ENDIF. + + ri_tag_popups = mi_tag_popups. + + ENDMETHOD. + ENDCLASS. diff --git a/src/ui/zcl_abapgit_ui_injector.clas.abap b/src/ui/zcl_abapgit_ui_injector.clas.abap index 8634dc6e8..5445532aa 100644 --- a/src/ui/zcl_abapgit_ui_injector.clas.abap +++ b/src/ui/zcl_abapgit_ui_injector.clas.abap @@ -6,7 +6,11 @@ CLASS zcl_abapgit_ui_injector DEFINITION CLASS-METHODS: set_popups IMPORTING - ii_popups TYPE REF TO zif_abapgit_popups. + ii_popups TYPE REF TO zif_abapgit_popups, + + set_tag_popups + IMPORTING + ii_tag_popups TYPE REF TO zif_abapgit_tag_popups. ENDCLASS. @@ -20,4 +24,10 @@ CLASS zcl_abapgit_ui_injector IMPLEMENTATION. ENDMETHOD. + METHOD set_tag_popups. + + zcl_abapgit_ui_factory=>mi_tag_popups = ii_tag_popups. + + ENDMETHOD. + ENDCLASS. diff --git a/src/ui/zif_abapgit_tag_popups.intf.abap b/src/ui/zif_abapgit_tag_popups.intf.abap new file mode 100644 index 000000000..e1578148e --- /dev/null +++ b/src/ui/zif_abapgit_tag_popups.intf.abap @@ -0,0 +1,21 @@ +INTERFACE zif_abapgit_tag_popups + PUBLIC. + + METHODS: + tag_list_popup + IMPORTING + io_repo TYPE REF TO zcl_abapgit_repo_online + RETURNING + VALUE(rs_tag) TYPE zif_abapgit_definitions=>ty_git_tag + RAISING + zcx_abapgit_exception, + + tag_select_popup + IMPORTING + io_repo TYPE REF TO zcl_abapgit_repo_online + RETURNING + VALUE(rs_tag) TYPE zif_abapgit_definitions=>ty_git_tag + RAISING + zcx_abapgit_exception . + +ENDINTERFACE. diff --git a/src/ui/zif_abapgit_tag_popups.intf.xml b/src/ui/zif_abapgit_tag_popups.intf.xml new file mode 100644 index 000000000..4956bb33e --- /dev/null +++ b/src/ui/zif_abapgit_tag_popups.intf.xml @@ -0,0 +1,16 @@ + + + + + + ZIF_ABAPGIT_TAG_POPUPS + 1 + E + abapGit tag popups + 2 + 1 + X + + + + From a3d26b99016d527d00847948b60ba9c92ec9d443 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Tue, 26 Jun 2018 08:49:12 +0000 Subject: [PATCH 104/136] WAPA: better delta handling --- src/objects/zcl_abapgit_object_wapa.clas.abap | 562 ++++++++++++------ src/zcl_abapgit_objects.clas.abap | 7 +- 2 files changed, 370 insertions(+), 199 deletions(-) diff --git a/src/objects/zcl_abapgit_object_wapa.clas.abap b/src/objects/zcl_abapgit_object_wapa.clas.abap index 33bf4c5ba..81febc4e2 100644 --- a/src/objects/zcl_abapgit_object_wapa.clas.abap +++ b/src/objects/zcl_abapgit_object_wapa.clas.abap @@ -27,15 +27,147 @@ CLASS zcl_abapgit_object_wapa DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje read_page IMPORTING is_page TYPE o2pagattr RETURNING VALUE(rs_page) TYPE ty_page - RAISING zcx_abapgit_exception. + RAISING zcx_abapgit_exception, + create_new_application + IMPORTING is_attributes TYPE o2applattr + it_nodes TYPE o2applnode_table + it_navgraph TYPE o2applgrap_table + RETURNING VALUE(ro_bsp) TYPE REF TO cl_o2_api_application + RAISING zcx_abapgit_exception, + create_new_page + IMPORTING + is_page_attributes TYPE o2pagattr + RETURNING + VALUE(ro_page) TYPE REF TO cl_o2_api_pages + RAISING + zcx_abapgit_exception, + delete_superfluous_pages + IMPORTING + it_local_pages TYPE o2pagelist + it_remote_pages TYPE zcl_abapgit_object_wapa=>ty_pages_tt + RAISING + zcx_abapgit_exception. ENDCLASS. + + CLASS zcl_abapgit_object_wapa IMPLEMENTATION. - METHOD zif_abapgit_object~has_changed_since. - rv_changed = abap_true. - ENDMETHOD. "zif_abapgit_object~has_changed_since + + METHOD get_page_content. + + DATA: lt_content TYPE o2pageline_table, + lv_string TYPE string. + + io_page->get_page( + IMPORTING + p_content = lt_content + EXCEPTIONS + invalid_call = 1 + page_deleted = 2 + OTHERS = 3 ). + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |WAPA - error from get_page_content| ). + ENDIF. + + CONCATENATE LINES OF lt_content INTO lv_string SEPARATED BY zif_abapgit_definitions=>gc_newline RESPECTING BLANKS. + + rv_content = zcl_abapgit_convert=>string_to_xstring_utf8( lv_string ). + + ENDMETHOD. + + + METHOD read_page. + + DATA: lv_name TYPE o2applname, + ls_pagekey TYPE o2pagkey, + lv_content TYPE xstring, + lv_extra TYPE string, + lv_ext TYPE string, + lo_page TYPE REF TO cl_o2_api_pages. + + + lv_name = ms_item-obj_name. + + ls_pagekey-applname = lv_name. + ls_pagekey-pagekey = is_page-pagekey. + + cl_o2_api_pages=>load( + EXPORTING + p_pagekey = ls_pagekey + IMPORTING + p_page = lo_page ). + + lo_page->get_attrs( + IMPORTING + p_attrs = rs_page-attributes ). + + IF rs_page-attributes-pagetype <> so2_controller. + + lo_page->get_event_handlers( + IMPORTING + p_ev_handler = rs_page-event_handlers + EXCEPTIONS + page_deleted = 1 + invalid_call = 2 ). + ASSERT sy-subrc = 0. + + lo_page->get_parameters( + IMPORTING + p_parameters = rs_page-parameters + EXCEPTIONS + page_deleted = 1 + invalid_call = 2 + OTHERS = 3 ). + ASSERT sy-subrc = 0. + + lo_page->get_type_source( + IMPORTING + p_source = rs_page-types + EXCEPTIONS + page_deleted = 1 + invalid_call = 2 + OTHERS = 3 ). + ASSERT sy-subrc = 0. + + lv_content = get_page_content( lo_page ). + SPLIT is_page-pagename AT '.' INTO lv_extra lv_ext. + REPLACE ALL OCCURRENCES OF '/' IN lv_ext WITH '_-'. + REPLACE ALL OCCURRENCES OF '/' IN lv_extra WITH '_-'. + mo_files->add_raw( + iv_extra = lv_extra + iv_ext = lv_ext + iv_data = lv_content ). + + CLEAR: rs_page-attributes-implclass. + + ENDIF. + + CLEAR: rs_page-attributes-author, + rs_page-attributes-createdon, + rs_page-attributes-changedby, + rs_page-attributes-changedon, + rs_page-attributes-changetime, + rs_page-attributes-gendate, + rs_page-attributes-gentime, + rs_page-attributes-devclass. + + ENDMETHOD. + + + METHOD to_page_content. + + DATA: lv_string TYPE string. + + + lv_string = zcl_abapgit_convert=>xstring_to_string_utf8( iv_content ). + + SPLIT lv_string AT zif_abapgit_definitions=>gc_newline INTO TABLE rt_content. + + ENDMETHOD. + METHOD zif_abapgit_object~changed_by. @@ -61,38 +193,11 @@ CLASS zcl_abapgit_object_wapa IMPLEMENTATION. ENDMETHOD. - METHOD zif_abapgit_object~get_metadata. - rs_metadata = get_metadata( ). - ENDMETHOD. "zif_abapgit_object~get_metadata - METHOD zif_abapgit_object~exists. + METHOD zif_abapgit_object~compare_to_remote_version. + CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. + ENDMETHOD. - DATA: lv_name TYPE o2applname. - - - lv_name = ms_item-obj_name. - - cl_o2_api_application=>load( - EXPORTING - p_application_name = lv_name - EXCEPTIONS - object_not_existing = 1 - permission_failure = 2 - error_occured = 3 ). - rv_bool = boolc( sy-subrc = 0 ). - - ENDMETHOD. "zif_abapgit_object~exists - - METHOD zif_abapgit_object~jump. - - CALL FUNCTION 'RS_TOOL_ACCESS' - EXPORTING - operation = 'SHOW' - object_name = ms_item-obj_name - object_type = ms_item-obj_type - in_new_window = abap_true. - - ENDMETHOD. "jump METHOD zif_abapgit_object~delete. @@ -190,22 +295,25 @@ CLASS zcl_abapgit_object_wapa IMPLEMENTATION. ENDMETHOD. "delete + METHOD zif_abapgit_object~deserialize. - DATA: lo_bsp TYPE REF TO cl_o2_api_application, - ls_attributes TYPE o2applattr, - lt_nodes TYPE o2applnode_table, - lt_navgraph TYPE o2applgrap_table, - lv_objkey TYPE seu_objkey, - lv_obj_name TYPE string, - ls_item LIKE ms_item, - lv_extra TYPE string, - lv_content TYPE xstring, - lv_ext TYPE string, - lo_page TYPE REF TO cl_o2_api_pages, - lt_pages_info TYPE ty_pages_tt. + DATA: lo_bsp TYPE REF TO cl_o2_api_application, + ls_attributes TYPE o2applattr, + lt_nodes TYPE o2applnode_table, + lt_navgraph TYPE o2applgrap_table, + lv_obj_name TYPE string, + lv_extra TYPE string, + lv_ext TYPE string, + lo_page TYPE REF TO cl_o2_api_pages, + lt_pages_info TYPE ty_pages_tt, + ls_pagekey TYPE o2pagkey, + ls_local_page TYPE zcl_abapgit_object_wapa=>ty_page, + lv_remote_content TYPE o2pageline_table, + lv_local_content TYPE o2pageline_table, + lt_local_pages TYPE o2pagelist. - FIELD-SYMBOLS: LIKE LINE OF lt_pages_info. + FIELD-SYMBOLS: LIKE LINE OF lt_pages_info. io_xml->read( EXPORTING iv_name = 'ATTRIBUTES' @@ -217,71 +325,102 @@ CLASS zcl_abapgit_object_wapa IMPLEMENTATION. ls_attributes-devclass = iv_package. - IF me->zif_abapgit_object~exists( ) = abap_true. - me->zif_abapgit_object~delete( ). - ENDIF. - - cl_o2_api_application=>create_new( + cl_o2_api_application=>load( EXPORTING - p_application_data = ls_attributes - p_nodes = lt_nodes - p_navgraph = lt_navgraph + p_application_name = ls_attributes-applname " Application Name IMPORTING - p_application = lo_bsp + p_application = lo_bsp " Instance Created EXCEPTIONS - object_already_existing = 1 - object_just_created = 2 - not_authorized = 3 - undefined_name = 4 - author_not_existing = 5 - action_cancelled = 6 - error_occured = 7 - invalid_parameter = 8 ). - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( |WAPA - error from create_new: { sy-subrc }| ). - ENDIF. + object_not_existing = 1 + permission_failure = 2 + error_occured = 3 + OTHERS = 4 ). - lo_bsp->save( ). + CASE sy-subrc. + WHEN 0. - lo_bsp->set_changeable( - p_changeable = abap_false - p_complete_application = abap_true ). + cl_o2_api_pages=>get_all_pages( + EXPORTING + p_applname = ls_attributes-applname + p_version = c_active + IMPORTING + p_pages = lt_local_pages ). - ls_item-obj_type = 'WAPD'. - ls_item-obj_name = ms_item-obj_name. - zcl_abapgit_objects_activation=>add_item( ls_item ). + WHEN 1. - lv_objkey = ls_item-obj_name. -* todo, hmm, the WAPD is not added to the worklist during activation - cl_o2_api_application=>activate( lv_objkey ). + lo_bsp = create_new_application( is_attributes = ls_attributes + it_nodes = lt_nodes + it_navgraph = lt_navgraph ). - LOOP AT lt_pages_info ASSIGNING . - cl_o2_api_pages=>create_new_page( + WHEN OTHERS. + + zcx_abapgit_exception=>raise( |Error { sy-subrc } from CL_O2_API_APPLICATION=>LOAD| ). + + ENDCASE. + + LOOP AT lt_pages_info ASSIGNING . + + ls_pagekey-applname = -attributes-applname. + ls_pagekey-pagekey = -attributes-pagekey. + + cl_o2_api_pages=>load( EXPORTING - p_pageattrs = -attributes + p_pagekey = ls_pagekey IMPORTING - p_page = lo_page ). + p_page = lo_page + EXCEPTIONS + object_not_existing = 1 + version_not_existing = 2 + OTHERS = 3 ). - IF -attributes-pagetype <> so2_controller. + CASE sy-subrc. + WHEN 0. - SPLIT -attributes-pagename AT '.' INTO lv_extra lv_ext. - REPLACE ALL OCCURRENCES OF '/' IN lv_extra WITH '_-'. - REPLACE ALL OCCURRENCES OF '/' IN lv_ext WITH '_-'. - lv_content = mo_files->read_raw( iv_extra = lv_extra - iv_ext = lv_ext ). - lo_page->set_page( to_page_content( lv_content ) ). + ls_local_page = read_page( -attributes ). - lo_page->set_event_handlers( -event_handlers ). - lo_page->set_parameters( -parameters ). - lo_page->set_type_source( -types ). + WHEN 1. + + lo_page = create_new_page( -attributes ). + + WHEN 2. + + " Do nothing... + + WHEN OTHERS. + + zcx_abapgit_exception=>raise( |Error { sy-subrc } from CL_O2_API_PAGES=>LOAD| ). + + ENDCASE. + + SPLIT -attributes-pagename AT '.' INTO lv_extra lv_ext. + REPLACE ALL OCCURRENCES OF '/' IN lv_extra WITH '_-'. + REPLACE ALL OCCURRENCES OF '/' IN lv_ext WITH '_-'. + + lv_remote_content = to_page_content( mo_files->read_raw( iv_extra = lv_extra + iv_ext = lv_ext ) ). + lv_local_content = to_page_content( get_page_content( lo_page ) ). + + IF ls_local_page = + AND lv_local_content = lv_remote_content. + " no changes -> nothing to do + CONTINUE. + ENDIF. + + IF -attributes-pagetype <> so2_controller. + + lo_page->set_page( lv_remote_content ). + + lo_page->set_event_handlers( -event_handlers ). + lo_page->set_parameters( -parameters ). + lo_page->set_type_source( -types ). ENDIF. lo_page->save( p_with_all_texts = abap_true ). lv_obj_name = cl_wb_object_type=>get_concatenated_key_from_id( - p_key_component1 = -attributes-applname - p_key_component2 = -attributes-pagekey + p_key_component1 = -attributes-applname + p_key_component2 = -attributes-pagekey p_external_id = 'WG ' ). zcl_abapgit_objects_activation=>add( iv_type = 'WAPP' @@ -289,8 +428,60 @@ CLASS zcl_abapgit_object_wapa IMPLEMENTATION. ENDLOOP. + delete_superfluous_pages( it_local_pages = lt_local_pages + it_remote_pages = lt_pages_info ). + ENDMETHOD. "deserialize + + METHOD zif_abapgit_object~exists. + + DATA: lv_name TYPE o2applname. + + + lv_name = ms_item-obj_name. + + cl_o2_api_application=>load( + EXPORTING + p_application_name = lv_name + EXCEPTIONS + object_not_existing = 1 + permission_failure = 2 + error_occured = 3 ). + rv_bool = boolc( sy-subrc = 0 ). + + ENDMETHOD. "zif_abapgit_object~exists + + + METHOD zif_abapgit_object~get_metadata. + rs_metadata = get_metadata( ). + ENDMETHOD. "zif_abapgit_object~get_metadata + + + METHOD zif_abapgit_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "zif_abapgit_object~has_changed_since + + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + + + METHOD zif_abapgit_object~jump. + + CALL FUNCTION 'RS_TOOL_ACCESS' + EXPORTING + operation = 'SHOW' + object_name = ms_item-obj_name + object_type = ms_item-obj_type + in_new_window = abap_true. + + ENDMETHOD. "jump + + METHOD zif_abapgit_object~serialize. DATA: lv_name TYPE o2applname, @@ -358,125 +549,102 @@ CLASS zcl_abapgit_object_wapa IMPLEMENTATION. ENDMETHOD. "serialize - METHOD read_page. + METHOD create_new_application. - DATA: lv_name TYPE o2applname, - ls_pagekey TYPE o2pagkey, - lv_content TYPE xstring, - lv_extra TYPE string, - lv_ext TYPE string, - lo_page TYPE REF TO cl_o2_api_pages. + DATA: ls_item LIKE ms_item, + lv_objkey TYPE seu_objkey. - - lv_name = ms_item-obj_name. - - ls_pagekey-applname = lv_name. - ls_pagekey-pagekey = is_page-pagekey. - - cl_o2_api_pages=>load( + cl_o2_api_application=>create_new( EXPORTING - p_pagekey = ls_pagekey + p_application_data = is_attributes + p_nodes = it_nodes + p_navgraph = it_navgraph IMPORTING - p_page = lo_page ). - - lo_page->get_attrs( - IMPORTING - p_attrs = rs_page-attributes ). - - IF rs_page-attributes-pagetype <> so2_controller. - - lo_page->get_event_handlers( - IMPORTING - p_ev_handler = rs_page-event_handlers - EXCEPTIONS - page_deleted = 1 - invalid_call = 2 ). - ASSERT sy-subrc = 0. - - lo_page->get_parameters( - IMPORTING - p_parameters = rs_page-parameters - EXCEPTIONS - page_deleted = 1 - invalid_call = 2 - OTHERS = 3 ). - ASSERT sy-subrc = 0. - - lo_page->get_type_source( - IMPORTING - p_source = rs_page-types - EXCEPTIONS - page_deleted = 1 - invalid_call = 2 - OTHERS = 3 ). - ASSERT sy-subrc = 0. - - lv_content = get_page_content( lo_page ). - SPLIT is_page-pagename AT '.' INTO lv_extra lv_ext. - REPLACE ALL OCCURRENCES OF '/' IN lv_ext WITH '_-'. - REPLACE ALL OCCURRENCES OF '/' IN lv_extra WITH '_-'. - mo_files->add_raw( - iv_extra = lv_extra - iv_ext = lv_ext - iv_data = lv_content ). - - CLEAR: rs_page-attributes-implclass. - - ENDIF. - - CLEAR: rs_page-attributes-author, - rs_page-attributes-createdon, - rs_page-attributes-changedby, - rs_page-attributes-changedon, - rs_page-attributes-changetime, - rs_page-attributes-gendate, - rs_page-attributes-gentime, - rs_page-attributes-devclass. - - ENDMETHOD. - - METHOD to_page_content. - - DATA: lv_string TYPE string. - - - lv_string = zcl_abapgit_convert=>xstring_to_string_utf8( iv_content ). - - SPLIT lv_string AT zif_abapgit_definitions=>gc_newline INTO TABLE rt_content. - - ENDMETHOD. - - METHOD get_page_content. - - DATA: lt_content TYPE o2pageline_table, - lv_string TYPE string. - - io_page->get_page( - IMPORTING - p_content = lt_content + p_application = ro_bsp EXCEPTIONS - invalid_call = 1 - page_deleted = 2 - OTHERS = 3 ). + object_already_existing = 1 + object_just_created = 2 + not_authorized = 3 + undefined_name = 4 + author_not_existing = 5 + action_cancelled = 6 + error_occured = 7 + invalid_parameter = 8 ). IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( |WAPA - error from get_page_content| ). + zcx_abapgit_exception=>raise( |WAPA - error from create_new: { sy-subrc }| ). ENDIF. - CONCATENATE LINES OF lt_content INTO lv_string SEPARATED BY zif_abapgit_definitions=>gc_newline RESPECTING BLANKS. + ro_bsp->save( ). + + ro_bsp->set_changeable( + p_changeable = abap_false + p_complete_application = abap_true ). + + ls_item-obj_type = 'WAPD'. + ls_item-obj_name = ms_item-obj_name. + zcl_abapgit_objects_activation=>add_item( ls_item ). + + lv_objkey = ls_item-obj_name. +* todo, hmm, the WAPD is not added to the worklist during activation + cl_o2_api_application=>activate( lv_objkey ). - rv_content = zcl_abapgit_convert=>string_to_xstring_utf8( lv_string ). ENDMETHOD. - METHOD zif_abapgit_object~compare_to_remote_version. - CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. - ENDMETHOD. - METHOD zif_abapgit_object~is_locked. + METHOD create_new_page. - rv_is_locked = abap_false. + cl_o2_api_pages=>create_new_page( + EXPORTING + p_pageattrs = is_page_attributes + IMPORTING + p_page = ro_page + EXCEPTIONS + object_already_exists = 1 + invalid_name = 2 + error_occured = 3 + o2appl_not_existing = 4 + OTHERS = 5 ). + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |Error { sy-subrc } from CL_O2_API_PAGES=>CREATE_NEW_PAGE| ). + ENDIF. ENDMETHOD. -ENDCLASS. "zcl_abapgit_object_tran IMPLEMENTATION + + METHOD delete_superfluous_pages. + + DATA: ls_pagekey TYPE o2pagkey. + FIELD-SYMBOLS: LIKE LINE OF it_local_pages. + + " delete local pages which doesn't exists remotely + LOOP AT it_local_pages ASSIGNING . + + READ TABLE it_remote_pages WITH KEY attributes-pagekey = -pagekey + TRANSPORTING NO FIELDS. + IF sy-subrc <> 0. + " page exists locally but not remotely -> delete + + ls_pagekey-applname = -applname. + ls_pagekey-pagekey = -pagekey. + + cl_o2_page=>delete_page_for_application( + EXPORTING + p_pagekey = ls_pagekey + EXCEPTIONS + object_not_existing = 1 + error_occured = 2 ). + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |Error { sy-subrc } from CL_O2_PAGE=>DELETE_PAGE_FOR_APPLICATION| ). + ENDIF. + + ENDIF. + + ENDLOOP. + + + ENDMETHOD. + +ENDCLASS. diff --git a/src/zcl_abapgit_objects.clas.abap b/src/zcl_abapgit_objects.clas.abap index 77eb10406..7e03a42a8 100644 --- a/src/zcl_abapgit_objects.clas.abap +++ b/src/zcl_abapgit_objects.clas.abap @@ -646,8 +646,11 @@ CLASS zcl_abapgit_objects IMPLEMENTATION. rt_results = zcl_abapgit_file_status=>status( io_repo ). DELETE rt_results WHERE match = abap_true. " Full match - SORT rt_results BY obj_type ASCENDING obj_name ASCENDING. - DELETE ADJACENT DUPLICATES FROM rt_results COMPARING obj_type obj_name. + SORT rt_results + BY obj_type ASCENDING + obj_name ASCENDING + filename ASCENDING. + DELETE ADJACENT DUPLICATES FROM rt_results COMPARING obj_type obj_name filename. DELETE rt_results WHERE obj_type IS INITIAL. DELETE rt_results WHERE lstate = zif_abapgit_definitions=>gc_state-added AND rstate IS INITIAL. From 557ae3279f3f9e82612d72519c7846d3a2b6e4ac Mon Sep 17 00:00:00 2001 From: christianguenter2 Date: Thu, 28 Jun 2018 12:04:25 +0200 Subject: [PATCH 105/136] move db util pages to separate package --- src/ui/db/package.devc.xml | 10 ++++++++++ src/ui/{ => db}/zcl_abapgit_gui_page_db.clas.abap | 0 src/ui/{ => db}/zcl_abapgit_gui_page_db.clas.xml | 0 src/ui/{ => db}/zcl_abapgit_gui_page_db_dis.clas.abap | 0 src/ui/{ => db}/zcl_abapgit_gui_page_db_dis.clas.xml | 0 src/ui/{ => db}/zcl_abapgit_gui_page_db_edit.clas.abap | 0 src/ui/{ => db}/zcl_abapgit_gui_page_db_edit.clas.xml | 0 7 files changed, 10 insertions(+) create mode 100644 src/ui/db/package.devc.xml rename src/ui/{ => db}/zcl_abapgit_gui_page_db.clas.abap (100%) rename src/ui/{ => db}/zcl_abapgit_gui_page_db.clas.xml (100%) rename src/ui/{ => db}/zcl_abapgit_gui_page_db_dis.clas.abap (100%) rename src/ui/{ => db}/zcl_abapgit_gui_page_db_dis.clas.xml (100%) rename src/ui/{ => db}/zcl_abapgit_gui_page_db_edit.clas.abap (100%) rename src/ui/{ => db}/zcl_abapgit_gui_page_db_edit.clas.xml (100%) diff --git a/src/ui/db/package.devc.xml b/src/ui/db/package.devc.xml new file mode 100644 index 000000000..e792a84cf --- /dev/null +++ b/src/ui/db/package.devc.xml @@ -0,0 +1,10 @@ + + + + + + abapGit UI DB + + + + diff --git a/src/ui/zcl_abapgit_gui_page_db.clas.abap b/src/ui/db/zcl_abapgit_gui_page_db.clas.abap similarity index 100% rename from src/ui/zcl_abapgit_gui_page_db.clas.abap rename to src/ui/db/zcl_abapgit_gui_page_db.clas.abap diff --git a/src/ui/zcl_abapgit_gui_page_db.clas.xml b/src/ui/db/zcl_abapgit_gui_page_db.clas.xml similarity index 100% rename from src/ui/zcl_abapgit_gui_page_db.clas.xml rename to src/ui/db/zcl_abapgit_gui_page_db.clas.xml diff --git a/src/ui/zcl_abapgit_gui_page_db_dis.clas.abap b/src/ui/db/zcl_abapgit_gui_page_db_dis.clas.abap similarity index 100% rename from src/ui/zcl_abapgit_gui_page_db_dis.clas.abap rename to src/ui/db/zcl_abapgit_gui_page_db_dis.clas.abap diff --git a/src/ui/zcl_abapgit_gui_page_db_dis.clas.xml b/src/ui/db/zcl_abapgit_gui_page_db_dis.clas.xml similarity index 100% rename from src/ui/zcl_abapgit_gui_page_db_dis.clas.xml rename to src/ui/db/zcl_abapgit_gui_page_db_dis.clas.xml diff --git a/src/ui/zcl_abapgit_gui_page_db_edit.clas.abap b/src/ui/db/zcl_abapgit_gui_page_db_edit.clas.abap similarity index 100% rename from src/ui/zcl_abapgit_gui_page_db_edit.clas.abap rename to src/ui/db/zcl_abapgit_gui_page_db_edit.clas.abap diff --git a/src/ui/zcl_abapgit_gui_page_db_edit.clas.xml b/src/ui/db/zcl_abapgit_gui_page_db_edit.clas.xml similarity index 100% rename from src/ui/zcl_abapgit_gui_page_db_edit.clas.xml rename to src/ui/db/zcl_abapgit_gui_page_db_edit.clas.xml From ea798193d01b9f6d295b737c515befdf1d1277c9 Mon Sep 17 00:00:00 2001 From: christianguenter2 Date: Wed, 20 Jun 2018 19:53:14 +0200 Subject: [PATCH 106/136] Block commit/push if code inspection has errors - new local setting to set check variant - new local setting to block pull if code inspector check fails - check is executed before staging - new page to display code inspector results --- src/persist/zif_abapgit_persistence.intf.abap | 8 +- .../zcl_abapgit_gui_page_code_insp.clas.abap | 271 ++++++++++++++++++ .../zcl_abapgit_gui_page_code_insp.clas.xml | 19 ++ .../zcl_abapgit_gui_page_repo_sett.clas.abap | 45 ++- src/ui/zcl_abapgit_gui_page_syntax.clas.abap | 10 +- src/ui/zcl_abapgit_gui_router.clas.abap | 40 ++- src/ui/zcl_abapgit_gui_view_repo.clas.abap | 2 + src/ui/zcl_abapgit_popups.clas.abap | 1 + src/ui/zcl_abapgit_services_git.clas.abap | 3 + src/ui/zif_abapgit_popups.intf.abap | 2 +- src/utils/zcl_abapgit_log.clas.abap | 8 +- src/zabapgit_css_common.w3mi.data.css | 1 + src/zcl_abapgit_code_inspector.clas.abap | 232 +++++++++++++++ src/zcl_abapgit_code_inspector.clas.xml | 18 ++ src/zcl_abapgit_dot_abapgit.clas.abap | 7 +- src/zcl_abapgit_factory.clas.abap | 93 +++++- src/zcl_abapgit_injector.clas.abap | 59 +++- src/zcl_abapgit_repo_online.clas.abap | 61 +++- ..._abapgit_repo_online.clas.testclasses.abap | 241 ++++++++++++++++ src/zcl_abapgit_repo_online.clas.xml | 1 + src/zcl_abapgit_syntax_check.clas.abap | 145 +--------- src/zif_abapgit_code_inspector.intf.abap | 15 + src/zif_abapgit_code_inspector.intf.xml | 16 ++ src/zif_abapgit_definitions.intf.abap | 1 + src/zif_abapgit_dot_abapgit.intf.abap | 10 +- 25 files changed, 1121 insertions(+), 188 deletions(-) create mode 100644 src/ui/zcl_abapgit_gui_page_code_insp.clas.abap create mode 100644 src/ui/zcl_abapgit_gui_page_code_insp.clas.xml create mode 100644 src/zcl_abapgit_code_inspector.clas.abap create mode 100644 src/zcl_abapgit_code_inspector.clas.xml create mode 100644 src/zcl_abapgit_repo_online.clas.testclasses.abap create mode 100644 src/zif_abapgit_code_inspector.intf.abap create mode 100644 src/zif_abapgit_code_inspector.intf.xml diff --git a/src/persist/zif_abapgit_persistence.intf.abap b/src/persist/zif_abapgit_persistence.intf.abap index acd528d96..7e2d136b3 100644 --- a/src/persist/zif_abapgit_persistence.intf.abap +++ b/src/persist/zif_abapgit_persistence.intf.abap @@ -20,9 +20,11 @@ INTERFACE zif_abapgit_persistence PUBLIC. TYPES: BEGIN OF ty_local_settings, - ignore_subpackages TYPE abap_bool, - write_protected TYPE abap_bool, - only_local_objects TYPE abap_bool, + ignore_subpackages TYPE abap_bool, + write_protected TYPE abap_bool, + only_local_objects TYPE abap_bool, + code_inspector_check_variant TYPE sci_chkv , + block_commit TYPE abap_bool, END OF ty_local_settings. TYPES: ty_local_checksum_tt TYPE STANDARD TABLE OF ty_local_checksum WITH DEFAULT KEY. diff --git a/src/ui/zcl_abapgit_gui_page_code_insp.clas.abap b/src/ui/zcl_abapgit_gui_page_code_insp.clas.abap new file mode 100644 index 000000000..9a13225aa --- /dev/null +++ b/src/ui/zcl_abapgit_gui_page_code_insp.clas.abap @@ -0,0 +1,271 @@ +CLASS zcl_abapgit_gui_page_code_insp DEFINITION PUBLIC FINAL CREATE PUBLIC + INHERITING FROM zcl_abapgit_gui_page. + + PUBLIC SECTION. + METHODS: + constructor + IMPORTING + io_repo TYPE REF TO zcl_abapgit_repo + RAISING + zcx_abapgit_exception, + + zif_abapgit_gui_page~on_event + REDEFINITION, + + zif_abapgit_gui_page~render + REDEFINITION. + + + PROTECTED SECTION. + DATA: mo_repo TYPE REF TO zcl_abapgit_repo_online. + + METHODS: + render_content REDEFINITION. + + PRIVATE SECTION. + CONSTANTS: + BEGIN OF c_actions, + stage TYPE string VALUE 'stage' ##NO_TEXT, + rerun TYPE string VALUE 'rerun' ##NO_TEXT, + END OF c_actions. + + DATA: + mt_result TYPE scit_alvlist. + + METHODS: + build_menu + RETURNING + VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar, + + run_code_inspector + RAISING + zcx_abapgit_exception, + + has_inspection_errors + RETURNING + VALUE(rv_has_inspection_errors) TYPE abap_bool, + + is_stage_allowed + RETURNING + VALUE(rv_is_stage_allowed) TYPE abap_bool, + jump + IMPORTING + is_item TYPE zif_abapgit_definitions=>ty_item + RAISING + zcx_abapgit_exception. + +ENDCLASS. + + + +CLASS zcl_abapgit_gui_page_code_insp IMPLEMENTATION. + + + METHOD build_menu. + + DATA: lv_opt TYPE c LENGTH 1. + + CREATE OBJECT ro_menu. + + ro_menu->add( iv_txt = 'Re-Run' + iv_act = c_actions-rerun + iv_cur = abap_false ) ##NO_TEXT. + + IF is_stage_allowed( ) = abap_false. + lv_opt = zif_abapgit_definitions=>gc_html_opt-crossout. + ENDIF. + + ro_menu->add( iv_txt = 'Stage' + iv_act = c_actions-stage + iv_cur = abap_false + iv_opt = lv_opt ) ##NO_TEXT. + + ENDMETHOD. + + + METHOD constructor. + super->constructor( ). + mo_repo ?= io_repo. + ms_control-page_title = 'Code Inspector'. + run_code_inspector( ). + ENDMETHOD. " constructor. + + + METHOD has_inspection_errors. + + READ TABLE mt_result TRANSPORTING NO FIELDS + WITH KEY kind = 'E'. + rv_has_inspection_errors = boolc( sy-subrc = 0 ). + + ENDMETHOD. + + + METHOD is_stage_allowed. + + rv_is_stage_allowed = boolc( NOT ( mo_repo->get_local_settings( )-block_commit = abap_true + AND has_inspection_errors( ) = abap_true ) ). + + ENDMETHOD. + + + METHOD render_content. + + DATA: lv_check_variant TYPE sci_chkv, + lv_class TYPE string. + FIELD-SYMBOLS: TYPE scir_alvlist. + + CREATE OBJECT ro_html. + + lv_check_variant = mo_repo->get_local_settings( )-code_inspector_check_variant. + + IF lv_check_variant IS INITIAL. + ro_html->add( |No check variant maintained in repo settings.| ). + RETURN. + ENDIF. + + ro_html->add( '

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

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

    Local settings

    ' ). @@ -159,6 +162,19 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_SETT IMPLEMENTATION. ENDIF. io_html->add( |Only local objects
    | ). + io_html->add( '
    ' ). + io_html->add( 'Code inspector check variant: ' ). + io_html->add( '
    ' ). + + CLEAR lv_checked. + IF ls_settings-block_commit = abap_true. + lv_checked = | checked|. + ENDIF. + io_html->add( |Block commit commit/push if code inspection has erros: | + && |
    | ). + + ENDMETHOD. @@ -200,8 +216,9 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_SETT IMPLEMENTATION. METHOD save_local_settings. - DATA: ls_settings TYPE zif_abapgit_persistence=>ty_repo-local_settings, - ls_post_field LIKE LINE OF it_post_fields. + DATA: ls_settings TYPE zif_abapgit_persistence=>ty_repo-local_settings, + ls_post_field LIKE LINE OF it_post_fields, + lv_check_variant TYPE sci_chkv. ls_settings = mo_repo->get_local_settings( ). @@ -227,6 +244,26 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_SETT IMPLEMENTATION. ls_settings-only_local_objects = abap_false. ENDIF. + READ TABLE it_post_fields INTO ls_post_field WITH KEY name = 'check_variant'. + ASSERT sy-subrc = 0. + lv_check_variant = to_upper( ls_post_field-value ). + IF ls_post_field-value IS NOT INITIAL. + zcl_abapgit_code_inspector=>validate_check_variant( lv_check_variant ). + ENDIF. + ls_settings-code_inspector_check_variant = lv_check_variant. + + READ TABLE it_post_fields INTO ls_post_field WITH KEY name = 'block_commit' value = 'on'. + IF sy-subrc = 0. + ls_settings-block_commit = abap_true. + ELSE. + ls_settings-block_commit = abap_false. + ENDIF. + + IF ls_settings-block_commit = abap_true + AND ls_settings-code_inspector_check_variant IS INITIAL. + zcx_abapgit_exception=>raise( |If block commit is active, a check variant has to be maintained.| ). + ENDIF. + mo_repo->set_local_settings( ls_settings ). ENDMETHOD. @@ -241,4 +278,6 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_SETT IMPLEMENTATION. ENDCASE. ENDMETHOD. + + ENDCLASS. diff --git a/src/ui/zcl_abapgit_gui_page_syntax.clas.abap b/src/ui/zcl_abapgit_gui_page_syntax.clas.abap index 27039f3a1..1604f0abd 100644 --- a/src/ui/zcl_abapgit_gui_page_syntax.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_syntax.clas.abap @@ -16,7 +16,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GUI_PAGE_SYNTAX IMPLEMENTATION. +CLASS zcl_abapgit_gui_page_syntax IMPLEMENTATION. METHOD constructor. @@ -28,11 +28,13 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_SYNTAX IMPLEMENTATION. METHOD render_content. - DATA: lt_result TYPE scit_alvlist, - ls_result LIKE LINE OF lt_result. + DATA: li_syntax_check TYPE REF TO zif_abapgit_code_inspector, + lt_result TYPE scit_alvlist, + ls_result LIKE LINE OF lt_result. + li_syntax_check = zcl_abapgit_factory=>get_syntax_check( iv_package = mo_repo->get_package( ) ). - lt_result = zcl_abapgit_syntax_check=>run( mo_repo->get_package( ) ). + lt_result = li_syntax_check->run( ). CREATE OBJECT ro_html. ro_html->add( '
    ' ). diff --git a/src/ui/zcl_abapgit_gui_router.clas.abap b/src/ui/zcl_abapgit_gui_router.clas.abap index ac369715f..ca0c2c871 100644 --- a/src/ui/zcl_abapgit_gui_router.clas.abap +++ b/src/ui/zcl_abapgit_gui_router.clas.abap @@ -128,10 +128,11 @@ CLASS zcl_abapgit_gui_router IMPLEMENTATION. METHOD get_page_stage. - DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, - lv_key TYPE zif_abapgit_persistence=>ty_repo-key, - lv_seed TYPE string, - lo_stage_page TYPE REF TO zcl_abapgit_gui_page_stage. + DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, + lv_key TYPE zif_abapgit_persistence=>ty_repo-key, + lv_seed TYPE string, + lo_stage_page TYPE REF TO zcl_abapgit_gui_page_stage, + lo_code_inspector_page TYPE REF TO zcl_abapgit_gui_page_code_insp. FIND FIRST OCCURRENCE OF '=' IN iv_getdata. IF sy-subrc <> 0. " Not found ? -> just repo key in params @@ -145,15 +146,27 @@ CLASS zcl_abapgit_gui_router IMPLEMENTATION. lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ). - " force refresh on stage, to make sure the latest local and remote files are used - lo_repo->refresh( ). + IF lo_repo->get_local_settings( )-code_inspector_check_variant IS NOT INITIAL. - CREATE OBJECT lo_stage_page - EXPORTING - io_repo = lo_repo - iv_seed = lv_seed. + CREATE OBJECT lo_code_inspector_page + EXPORTING + io_repo = lo_repo. - ri_page = lo_stage_page. + ri_page = lo_code_inspector_page. + + ELSE. + + " force refresh on stage, to make sure the latest local and remote files are used + lo_repo->refresh( ). + + CREATE OBJECT lo_stage_page + EXPORTING + io_repo = lo_repo + iv_seed = lv_seed. + + ri_page = lo_stage_page. + + ENDIF. ENDMETHOD. "get_page_stage @@ -266,6 +279,11 @@ CLASS zcl_abapgit_gui_router IMPLEMENTATION. EXPORTING io_repo = zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ). ev_state = zif_abapgit_definitions=>gc_event_state-new_page. + WHEN zif_abapgit_definitions=>gc_action-repo_code_inspector. + CREATE OBJECT ei_page TYPE zcl_abapgit_gui_page_code_insp + EXPORTING + io_repo = zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ). + ev_state = zif_abapgit_definitions=>gc_event_state-new_page. WHEN zif_abapgit_definitions=>gc_action-repo_purge. " Repo remove & purge all objects zcl_abapgit_services_repo=>purge( lv_key ). ev_state = zif_abapgit_definitions=>gc_event_state-re_render. diff --git a/src/ui/zcl_abapgit_gui_view_repo.clas.abap b/src/ui/zcl_abapgit_gui_view_repo.clas.abap index f41fc2c4d..4368a5788 100644 --- a/src/ui/zcl_abapgit_gui_view_repo.clas.abap +++ b/src/ui/zcl_abapgit_gui_view_repo.clas.abap @@ -199,6 +199,8 @@ CLASS zcl_abapgit_gui_view_repo IMPLEMENTATION. ENDIF. lo_tb_advanced->add( iv_txt = 'Syntax Check' iv_act = |{ zif_abapgit_definitions=>gc_action-repo_syntax_check }?{ lv_key }| ). + lo_tb_advanced->add( iv_txt = 'Run Code Inspector' + iv_act = |{ zif_abapgit_definitions=>gc_action-repo_code_inspector }?{ lv_key }| ). lo_tb_advanced->add( iv_txt = 'Repo settings' iv_act = |{ zif_abapgit_definitions=>gc_action-repo_settings }?{ lv_key }| ). diff --git a/src/ui/zcl_abapgit_popups.clas.abap b/src/ui/zcl_abapgit_popups.clas.abap index 023df35a7..ee54d7ead 100644 --- a/src/ui/zcl_abapgit_popups.clas.abap +++ b/src/ui/zcl_abapgit_popups.clas.abap @@ -1160,4 +1160,5 @@ CLASS zcl_abapgit_popups IMPLEMENTATION. ENDIF. ENDMETHOD. "run_page_class_popup + ENDCLASS. diff --git a/src/ui/zcl_abapgit_services_git.clas.abap b/src/ui/zcl_abapgit_services_git.clas.abap index 85b37b82c..6321586d5 100644 --- a/src/ui/zcl_abapgit_services_git.clas.abap +++ b/src/ui/zcl_abapgit_services_git.clas.abap @@ -73,6 +73,9 @@ CLASS zcl_abapgit_services_git DEFINITION zcx_abapgit_exception zcx_abapgit_cancel. + PRIVATE SECTION. + + ENDCLASS. diff --git a/src/ui/zif_abapgit_popups.intf.abap b/src/ui/zif_abapgit_popups.intf.abap index 0d9f9e8fc..acf3e5e21 100644 --- a/src/ui/zif_abapgit_popups.intf.abap +++ b/src/ui/zif_abapgit_popups.intf.abap @@ -156,6 +156,6 @@ INTERFACE zif_abapgit_popups VALUE(rv_transport) TYPE trkorr RAISING zcx_abapgit_exception - zcx_abapgit_cancel . + zcx_abapgit_cancel. ENDINTERFACE. diff --git a/src/utils/zcl_abapgit_log.clas.abap b/src/utils/zcl_abapgit_log.clas.abap index 30b7668ac..5818803df 100644 --- a/src/utils/zcl_abapgit_log.clas.abap +++ b/src/utils/zcl_abapgit_log.clas.abap @@ -15,7 +15,9 @@ CLASS zcl_abapgit_log DEFINITION PUBLIC CREATE PUBLIC. has_rc "For unit tests mainly IMPORTING iv_rc TYPE balsort RETURNING VALUE(rv_yes) TYPE abap_bool, - show. + show + IMPORTING + iv_header_text TYPE csequence DEFAULT 'Log'. PRIVATE SECTION. TYPES: BEGIN OF ty_log, @@ -42,7 +44,7 @@ ENDCLASS. -CLASS zcl_abapgit_log IMPLEMENTATION. +CLASS ZCL_ABAPGIT_LOG IMPLEMENTATION. METHOD add. @@ -142,7 +144,7 @@ CLASS zcl_abapgit_log IMPLEMENTATION. CREATE OBJECT lo_form_header EXPORTING - text = |Log|. + text = iv_header_text. lo_alv->set_top_of_list( lo_form_header ). diff --git a/src/zabapgit_css_common.w3mi.data.css b/src/zabapgit_css_common.w3mi.data.css index 968c72bbf..8eff85e72 100644 --- a/src/zabapgit_css_common.w3mi.data.css +++ b/src/zabapgit_css_common.w3mi.data.css @@ -48,6 +48,7 @@ input:focus, textarea:focus { .attention { color: red !important; } .error { color: #d41919 !important; } .warning { color: #efb301 !important; } +.success { color: green !important; } .blue { color: #5e8dc9 !important; } .red { color: red !important; } .white { color: white !important; } diff --git a/src/zcl_abapgit_code_inspector.clas.abap b/src/zcl_abapgit_code_inspector.clas.abap new file mode 100644 index 000000000..fc66e2a10 --- /dev/null +++ b/src/zcl_abapgit_code_inspector.clas.abap @@ -0,0 +1,232 @@ +CLASS zcl_abapgit_code_inspector DEFINITION + PUBLIC + CREATE PROTECTED + GLOBAL FRIENDS zcl_abapgit_factory. + + PUBLIC SECTION. + INTERFACES: + zif_abapgit_code_inspector. + + METHODS: + constructor + IMPORTING + iv_package TYPE devclass + iv_check_variant_name TYPE sci_chkv OPTIONAL + RAISING + zcx_abapgit_exception. + + CLASS-METHODS: + validate_check_variant + IMPORTING + iv_check_variant_name TYPE sci_chkv + RAISING + zcx_abapgit_exception. + + PROTECTED SECTION. + TYPES: + ty_tdevc_tt TYPE STANDARD TABLE OF tdevc WITH DEFAULT KEY . + + DATA: + mv_package TYPE devclass. + + METHODS: + create_variant + RETURNING + VALUE(ro_variant) TYPE REF TO cl_ci_checkvariant + RAISING + zcx_abapgit_exception. + + PRIVATE SECTION. + DATA: + mv_check_variant_name TYPE sci_chkv, + mo_inspection TYPE REF TO cl_ci_inspection. + + METHODS: + find_all_subpackages + IMPORTING + iv_package TYPE devclass + RETURNING + VALUE(rt_packages) TYPE ty_tdevc_tt, + + create_objectset + RETURNING + VALUE(ro_set) TYPE REF TO cl_ci_objectset, + + run_inspection + IMPORTING + io_inspection TYPE REF TO cl_ci_inspection + RETURNING + VALUE(rt_list) TYPE scit_alvlist, + + create_inspection + IMPORTING + io_set TYPE REF TO cl_ci_objectset + io_variant TYPE REF TO cl_ci_checkvariant + RETURNING + VALUE(ro_inspection) TYPE REF TO cl_ci_inspection. + +ENDCLASS. + + + +CLASS zcl_abapgit_code_inspector IMPLEMENTATION. + + + METHOD constructor. + + mv_package = iv_package. + mv_check_variant_name = iv_check_variant_name. + + ENDMETHOD. + + + METHOD create_inspection. + + cl_ci_inspection=>create( + EXPORTING + p_user = sy-uname + p_name = '' + RECEIVING + p_ref = ro_inspection + EXCEPTIONS + locked = 1 + error_in_enqueue = 2 + not_authorized = 3 + OTHERS = 4 ). + ASSERT sy-subrc = 0. + + ro_inspection->set( + p_chkv = io_variant + p_objs = io_set ). + + ENDMETHOD. + + + METHOD create_objectset. + + DATA: lt_objs TYPE scit_objs, + lt_packages TYPE ty_tdevc_tt. + + + lt_packages = find_all_subpackages( mv_package ). + IF lines( lt_packages ) = 0. + RETURN. + ENDIF. + + SELECT object AS objtype obj_name AS objname + FROM tadir + INTO CORRESPONDING FIELDS OF TABLE lt_objs + FOR ALL ENTRIES IN lt_packages + WHERE devclass = lt_packages-devclass + AND delflag = abap_false + AND pgmid = 'R3TR'. "#EC CI_GENBUFF + + ro_set = cl_ci_objectset=>save_from_list( lt_objs ). + + ENDMETHOD. + + + METHOD create_variant. + + IF mv_check_variant_name IS INITIAL. + zcx_abapgit_exception=>raise( |No check variant supplied.| ). + ENDIF. + + cl_ci_checkvariant=>get_ref( + EXPORTING + p_user = '' + p_name = mv_check_variant_name + RECEIVING + p_ref = ro_variant + EXCEPTIONS + chkv_not_exists = 1 + missing_parameter = 2 + OTHERS = 3 ). + + CASE sy-subrc. + WHEN 1. + zcx_abapgit_exception=>raise( |Check variant { mv_check_variant_name } doesn't exist| ). + WHEN 2. + zcx_abapgit_exception=>raise( |Parameter missing for check variant { mv_check_variant_name }| ). + ENDCASE. + + ENDMETHOD. + + + METHOD find_all_subpackages. + +* TODO, in the future, move this method to the ABAPGIT global package class + + DATA: ls_package LIKE LINE OF rt_packages, + lt_found LIKE rt_packages, + lt_sub LIKE rt_packages. + + + SELECT SINGLE * FROM tdevc INTO ls_package WHERE devclass = iv_package. + ASSERT sy-subrc = 0. + APPEND ls_package TO rt_packages. + + SELECT * FROM tdevc APPENDING TABLE lt_sub + WHERE parentcl = ls_package-devclass. + + LOOP AT lt_sub INTO ls_package. + lt_found = find_all_subpackages( ls_package-devclass ). + APPEND LINES OF lt_found TO rt_packages. + ENDLOOP. + + ENDMETHOD. + + + METHOD run_inspection. + + io_inspection->run( + EXCEPTIONS + invalid_check_version = 1 + OTHERS = 2 ). + ASSERT sy-subrc = 0. + + io_inspection->plain_list( + IMPORTING + p_list = rt_list ). + + ENDMETHOD. + + + METHOD zif_abapgit_code_inspector~run. + + DATA: lo_set TYPE REF TO cl_ci_objectset, + lo_variant TYPE REF TO cl_ci_checkvariant. + + lo_set = create_objectset( ). + lo_variant = create_variant( ). + + mo_inspection = create_inspection( + io_set = lo_set + io_variant = lo_variant ). + + rt_list = run_inspection( mo_inspection ). + + ENDMETHOD. + + METHOD validate_check_variant. + + cl_ci_checkvariant=>get_ref( + EXPORTING + p_user = '' + p_name = iv_check_variant_name + EXCEPTIONS + chkv_not_exists = 1 + missing_parameter = 2 + OTHERS = 3 ). + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |No valid check variant { iv_check_variant_name }| ). + ENDIF. + + ENDMETHOD. + + METHOD zif_abapgit_code_inspector~get_inspection. + ro_inspection = mo_inspection. + ENDMETHOD. + +ENDCLASS. diff --git a/src/zcl_abapgit_code_inspector.clas.xml b/src/zcl_abapgit_code_inspector.clas.xml new file mode 100644 index 000000000..27134a6b2 --- /dev/null +++ b/src/zcl_abapgit_code_inspector.clas.xml @@ -0,0 +1,18 @@ + + + + + + ZCL_ABAPGIT_CODE_INSPECTOR + 1 + E + abapGit Code Inspector + 1 + 1 + X + X + X + + + + diff --git a/src/zcl_abapgit_dot_abapgit.clas.abap b/src/zcl_abapgit_dot_abapgit.clas.abap index 8f6273029..e2b2dfeaa 100644 --- a/src/zcl_abapgit_dot_abapgit.clas.abap +++ b/src/zcl_abapgit_dot_abapgit.clas.abap @@ -42,15 +42,19 @@ CLASS zcl_abapgit_dot_abapgit DEFINITION METHODS get_starting_folder RETURNING VALUE(rv_path) TYPE string . + METHODS get_folder_logic RETURNING VALUE(rv_logic) TYPE string . + METHODS set_folder_logic IMPORTING !iv_logic TYPE string . + METHODS set_starting_folder IMPORTING !iv_path TYPE string . + METHODS get_master_language RETURNING VALUE(rv_language) TYPE spras . @@ -77,7 +81,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_DOT_ABAPGIT IMPLEMENTATION. +CLASS zcl_abapgit_dot_abapgit IMPLEMENTATION. METHOD add_ignore. @@ -276,4 +280,5 @@ CLASS ZCL_ABAPGIT_DOT_ABAPGIT IMPLEMENTATION. ASSERT sy-subrc = 0. ENDMETHOD. + ENDCLASS. diff --git a/src/zcl_abapgit_factory.clas.abap b/src/zcl_abapgit_factory.clas.abap index 8038164d7..5bf49aad8 100644 --- a/src/zcl_abapgit_factory.clas.abap +++ b/src/zcl_abapgit_factory.clas.abap @@ -14,7 +14,25 @@ CLASS zcl_abapgit_factory DEFINITION IMPORTING iv_package TYPE devclass RETURNING - VALUE(ri_sap_package) TYPE REF TO zif_abapgit_sap_package. + VALUE(ri_sap_package) TYPE REF TO zif_abapgit_sap_package, + + get_code_inspector + IMPORTING + iv_package TYPE devclass + iv_check_variant_name TYPE sci_chkv + RETURNING + VALUE(ri_code_inspector) TYPE REF TO zif_abapgit_code_inspector + RAISING + zcx_abapgit_exception, + + get_syntax_check + IMPORTING + iv_package TYPE devclass + RETURNING + VALUE(ri_syntax_check) TYPE REF TO zif_abapgit_code_inspector + raising + zcx_abapgit_exception. + PRIVATE SECTION. TYPES: @@ -23,11 +41,27 @@ CLASS zcl_abapgit_factory DEFINITION instance TYPE REF TO zif_abapgit_sap_package, END OF ty_sap_package, tty_sap_package TYPE HASHED TABLE OF ty_sap_package - WITH UNIQUE KEY package. + WITH UNIQUE KEY package, + + BEGIN OF ty_code_inspector, + package TYPE devclass, + check_variant_name TYPE sci_chkv, + instance TYPE REF TO zif_abapgit_code_inspector, + END OF ty_code_inspector, + tty_code_inspector TYPE HASHED TABLE OF ty_code_inspector + WITH UNIQUE KEY package check_variant_name, + BEGIN OF ty_syntax_check, + package TYPE devclass, + instance TYPE REF TO zif_abapgit_code_inspector, + END OF ty_syntax_check, + tty_syntax_check TYPE HASHED TABLE OF ty_syntax_check + WITH UNIQUE KEY package. CLASS-DATA: - mi_tadir TYPE REF TO zif_abapgit_tadir, - mt_sap_package TYPE tty_sap_package. + mi_tadir TYPE REF TO zif_abapgit_tadir, + mt_sap_package TYPE tty_sap_package, + mt_code_inspector TYPE tty_code_inspector, + mt_syntax_check TYPE tty_syntax_check. ENDCLASS. @@ -69,4 +103,55 @@ CLASS zcl_abapgit_factory IMPLEMENTATION. ENDMETHOD. + METHOD get_code_inspector. + + DATA: ls_code_inspector LIKE LINE OF mt_code_inspector. + FIELD-SYMBOLS: TYPE zcl_abapgit_factory=>ty_code_inspector. + + READ TABLE mt_code_inspector ASSIGNING + WITH TABLE KEY package = iv_package + check_variant_name = iv_check_variant_name. + IF sy-subrc <> 0. + ls_code_inspector-package = iv_package. + ls_code_inspector-check_variant_name = iv_check_variant_name. + + CREATE OBJECT ls_code_inspector-instance TYPE zcl_abapgit_code_inspector + EXPORTING + iv_package = iv_package + iv_check_variant_name = iv_check_variant_name. + + INSERT ls_code_inspector + INTO TABLE mt_code_inspector + ASSIGNING . + + ENDIF. + + ri_code_inspector = -instance. + + ENDMETHOD. + + METHOD get_syntax_check. + + DATA: ls_syntax_check LIKE LINE OF mt_syntax_check. + FIELD-SYMBOLS: TYPE zcl_abapgit_factory=>ty_syntax_check. + + READ TABLE mt_syntax_check ASSIGNING + WITH TABLE KEY package = iv_package. + IF sy-subrc <> 0. + ls_syntax_check-package = iv_package. + + CREATE OBJECT ls_syntax_check-instance TYPE zcl_abapgit_syntax_check + EXPORTING + iv_package = iv_package. + + INSERT ls_syntax_check + INTO TABLE mt_syntax_check + ASSIGNING . + + ENDIF. + + ri_syntax_check = -instance. + + ENDMETHOD. + ENDCLASS. diff --git a/src/zcl_abapgit_injector.clas.abap b/src/zcl_abapgit_injector.clas.abap index 4a8ca2e63..2fdfba815 100644 --- a/src/zcl_abapgit_injector.clas.abap +++ b/src/zcl_abapgit_injector.clas.abap @@ -13,7 +13,18 @@ CLASS zcl_abapgit_injector DEFINITION set_sap_package IMPORTING iv_package TYPE devclass - ii_sap_package TYPE REF TO zif_abapgit_sap_package. + ii_sap_package TYPE REF TO zif_abapgit_sap_package, + + set_code_inspector + IMPORTING + iv_package TYPE devclass + iv_check_variant_name TYPE sci_chkv OPTIONAL + ii_code_inspector TYPE REF TO zif_abapgit_code_inspector, + + set_syntax_check + IMPORTING + iv_package TYPE devclass + ii_syntax_check TYPE REF TO zif_abapgit_code_inspector. ENDCLASS. @@ -49,4 +60,50 @@ CLASS zcl_abapgit_injector IMPLEMENTATION. ENDMETHOD. + METHOD set_code_inspector. + + DATA: ls_code_inspector LIKE LINE OF zcl_abapgit_factory=>mt_code_inspector. + FIELD-SYMBOLS: LIKE LINE OF zcl_abapgit_factory=>mt_code_inspector. + + READ TABLE zcl_abapgit_factory=>mt_code_inspector + ASSIGNING + WITH TABLE KEY package = iv_package + check_variant_name = iv_check_variant_name. + IF sy-subrc <> 0. + + ls_code_inspector-package = iv_package. + ls_code_inspector-check_variant_name = iv_check_variant_name. + + INSERT ls_code_inspector + INTO TABLE zcl_abapgit_factory=>mt_code_inspector + ASSIGNING . + + ENDIF. + + -instance = ii_code_inspector. + + ENDMETHOD. + + METHOD set_syntax_check. + + DATA: ls_syntax_check LIKE LINE OF zcl_abapgit_factory=>mt_syntax_check. + FIELD-SYMBOLS: LIKE LINE OF zcl_abapgit_factory=>mt_syntax_check. + + READ TABLE zcl_abapgit_factory=>mt_syntax_check + ASSIGNING + WITH TABLE KEY package = iv_package. + IF sy-subrc <> 0. + + ls_syntax_check-package = iv_package. + + INSERT ls_syntax_check + INTO TABLE zcl_abapgit_factory=>mt_syntax_check + ASSIGNING . + + ENDIF. + + -instance = ii_syntax_check. + + ENDMETHOD. + ENDCLASS. diff --git a/src/zcl_abapgit_repo_online.clas.abap b/src/zcl_abapgit_repo_online.clas.abap index e600f8bc9..91cc5c90d 100644 --- a/src/zcl_abapgit_repo_online.clas.abap +++ b/src/zcl_abapgit_repo_online.clas.abap @@ -76,7 +76,11 @@ CLASS zcl_abapgit_repo_online DEFINITION VALUE(rt_unnecessary_local_objects) TYPE zif_abapgit_definitions=>ty_tadir_tt RAISING zcx_abapgit_exception . - + METHODS run_code_inspector + RETURNING + VALUE(rt_list) TYPE scit_alvlist + RAISING + zcx_abapgit_exception . METHODS deserialize REDEFINITION . METHODS get_files_remote @@ -87,11 +91,12 @@ CLASS zcl_abapgit_repo_online DEFINITION REDEFINITION . PRIVATE SECTION. DATA: - mt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, - mv_branch TYPE zif_abapgit_definitions=>ty_sha1, - mv_initialized TYPE abap_bool, - mo_branches TYPE REF TO zcl_abapgit_git_branch_list, - mt_status TYPE zif_abapgit_definitions=>ty_results_tt. + mt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, + mv_branch TYPE zif_abapgit_definitions=>ty_sha1, + mv_initialized TYPE abap_bool, + mo_branches TYPE REF TO zcl_abapgit_git_branch_list, + mt_status TYPE zif_abapgit_definitions=>ty_results_tt, + mv_code_inspector_successful TYPE abap_bool. METHODS: handle_stage_ignore @@ -107,7 +112,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_REPO_ONLINE IMPLEMENTATION. +CLASS zcl_abapgit_repo_online IMPLEMENTATION. METHOD actualize_head_branch. @@ -305,11 +310,16 @@ CLASS ZCL_ABAPGIT_REPO_ONLINE IMPLEMENTATION. handle_stage_ignore( io_stage ). + IF ms_data-local_settings-block_commit = abap_true + AND mv_code_inspector_successful = abap_false. + zcx_abapgit_exception=>raise( |A successful code inspection is required| ). + ENDIF. + zcl_abapgit_git_porcelain=>push( EXPORTING is_comment = is_comment - io_repo = me - io_stage = io_stage - IMPORTING ev_branch = lv_branch - et_updated_files = lt_updated_files ). + io_repo = me + io_stage = io_stage + IMPORTING ev_branch = lv_branch + et_updated_files = lt_updated_files ). IF io_stage->get_branch_sha1( ) = get_sha1_local( ). * pushing to the branch currently represented by this repository object @@ -325,6 +335,8 @@ CLASS ZCL_ABAPGIT_REPO_ONLINE IMPLEMENTATION. set( iv_sha1 = lv_branch ). ENDIF. + CLEAR: mv_code_inspector_successful. + ENDMETHOD. "push @@ -427,6 +439,33 @@ CLASS ZCL_ABAPGIT_REPO_ONLINE IMPLEMENTATION. ENDMETHOD. " reset_status. + METHOD run_code_inspector. + + DATA: li_code_inspector TYPE REF TO zif_abapgit_code_inspector, + lv_check_variant TYPE string. + + lv_check_variant = get_local_settings( )-code_inspector_check_variant. + + IF lv_check_variant IS INITIAL. + zcx_abapgit_exception=>raise( |No check variant maintained in repo settings.| ). + ENDIF. + + li_code_inspector = zcl_abapgit_factory=>get_code_inspector( + iv_package = get_package( ) + iv_check_variant_name = |{ lv_check_variant }| ). + + rt_list = li_code_inspector->run( ). + + DELETE rt_list WHERE kind = 'N'. + + READ TABLE rt_list TRANSPORTING NO FIELDS + WITH KEY kind = 'E'. + + mv_code_inspector_successful = boolc( sy-subrc = 0 ). + + ENDMETHOD. + + METHOD set_branch_name. IF ms_data-local_settings-write_protected = abap_true. diff --git a/src/zcl_abapgit_repo_online.clas.testclasses.abap b/src/zcl_abapgit_repo_online.clas.testclasses.abap new file mode 100644 index 000000000..d5532e846 --- /dev/null +++ b/src/zcl_abapgit_repo_online.clas.testclasses.abap @@ -0,0 +1,241 @@ +*"* use this source file for your ABAP unit test classes +CLASS ltd_code_inspector DEFINITION FOR TESTING. + + PUBLIC SECTION. + INTERFACES: + zif_abapgit_code_inspector PARTIALLY IMPLEMENTED. + + METHODS: + constructor + IMPORTING + iv_package TYPE devclass. + PRIVATE SECTION. + DATA mv_package TYPE devclass. + +ENDCLASS. + +CLASS ltd_code_inspector IMPLEMENTATION. + + METHOD constructor. + + mv_package = iv_package. + + ENDMETHOD. + + METHOD zif_abapgit_code_inspector~run. + + DATA: ls_list LIKE LINE OF rt_list. + + IF mv_package = '$DUMMY'. + + ls_list-kind = 'E'. + INSERT ls_list INTO TABLE rt_list. + + ENDIF. + + + ENDMETHOD. + +ENDCLASS. + +CLASS ltcl_run_code_inspection DEFINITION FINAL FOR TESTING + DURATION SHORT + RISK LEVEL HARMLESS. + + PRIVATE SECTION. + DATA: + mo_repo_online TYPE REF TO zcl_abapgit_repo_online, + mv_error_text TYPE string, + mt_act_list TYPE scit_alvlist. + + METHODS: + exception_when_no_check_var FOR TESTING RAISING cx_static_check, + exception_when_error FOR TESTING RAISING cx_static_check, + no_exception_when_no_error FOR TESTING RAISING cx_static_check, + push_not_possible_if_ci_req FOR TESTING RAISING cx_static_check, + + given_online_repo + IMPORTING + iv_package TYPE devclass + RAISING + zcx_abapgit_exception, + + given_check_variant + IMPORTING + iv_check_variant TYPE string, + + given_mock_code_inspector + IMPORTING + iv_package TYPE devclass + iv_check_variant TYPE sci_chkv , + + given_block_commit + IMPORTING + iv_block_commit TYPE abap_bool, + + when_push, + + then_exception_text_is + IMPORTING + iv_exp_error_text TYPE csequence, + + when_run_code_inspector, + + then_ci_detected_an_error, + + then_no_exception_is_raised. + +ENDCLASS. + +CLASS zcl_abapgit_repo_online DEFINITION LOCAL FRIENDS ltcl_run_code_inspection. + +CLASS ltcl_run_code_inspection IMPLEMENTATION. + + METHOD exception_when_no_check_var. + + given_online_repo( iv_package = '$DUMMY' ). + given_check_variant( || ). + when_run_code_inspector( ). + then_exception_text_is( |No check variant maintained in repo settings.| ). + + ENDMETHOD. + + METHOD exception_when_error. + + + given_online_repo( '$DUMMY' ). + given_check_variant( |variant| ). + given_mock_code_inspector( iv_package = '$DUMMY' + iv_check_variant = |variant| ). + + when_run_code_inspector( ). + then_ci_detected_an_error( ). + + ENDMETHOD. + + METHOD no_exception_when_no_error. + + DATA: lx_error TYPE REF TO zcx_abapgit_exception. + + given_online_repo( '$PACKAGE' ). + given_check_variant( |variant| ). + given_mock_code_inspector( iv_package = '$PACKAGE' + iv_check_variant = |variant| ). + when_run_code_inspector( ). + then_no_exception_is_raised( ). + + ENDMETHOD. + + + METHOD given_online_repo. + + DATA: ls_data TYPE zif_abapgit_persistence=>ty_repo. + + ls_data-key = 'dummmy'. + ls_data-package = iv_package. + + CREATE OBJECT mo_repo_online + EXPORTING + is_data = ls_data. + + ENDMETHOD. + + + METHOD given_check_variant. + mo_repo_online->ms_data-local_settings-code_inspector_check_variant = iv_check_variant. + ENDMETHOD. + + + METHOD given_mock_code_inspector. + + DATA: lo_mock_code_inspector TYPE REF TO ltd_code_inspector. + + CREATE OBJECT lo_mock_code_inspector + EXPORTING + iv_package = iv_package. + + zcl_abapgit_injector=>set_code_inspector( iv_package = iv_package + iv_check_variant_name = iv_check_variant + ii_code_inspector = lo_mock_code_inspector ). + + + ENDMETHOD. + + METHOD push_not_possible_if_ci_req. + + given_online_repo( '$PACKAGE' ). + given_check_variant( |variant| ). + given_block_commit( abap_true ). + when_push( ). + then_exception_text_is( |A successful code inspection is required| ). + + ENDMETHOD. + + + METHOD given_block_commit. + + mo_repo_online->ms_data-local_settings-block_commit = abap_true. + + ENDMETHOD. + + + METHOD when_push. + + DATA: ls_comment TYPE zif_abapgit_definitions=>ty_comment, + lo_stage TYPE REF TO zcl_abapgit_stage, + lx_error TYPE REF TO zcx_abapgit_exception. + + CREATE OBJECT lo_stage + EXPORTING + iv_branch_name = 'refs/master' + iv_branch_sha1 = 'dummy'. + + TRY. + mo_repo_online->push( is_comment = ls_comment + io_stage = lo_stage ). + + CATCH zcx_abapgit_exception INTO lx_error. + mv_error_text = lx_error->get_text( ). + ENDTRY. + + ENDMETHOD. + + + METHOD then_exception_text_is. + + cl_abap_unit_assert=>assert_equals( + exp = iv_exp_error_text + act = mv_error_text ). + + ENDMETHOD. + + + METHOD when_run_code_inspector. + + DATA: lx_error TYPE REF TO zcx_abapgit_exception. + + TRY. + mt_act_list = mo_repo_online->run_code_inspector( ). + CATCH zcx_abapgit_exception INTO lx_error. + mv_error_text = lx_error->get_text( ). + ENDTRY. + + ENDMETHOD. + + + METHOD then_ci_detected_an_error. + + READ TABLE mt_act_list TRANSPORTING NO FIELDS + WITH KEY kind = 'E'. + cl_abap_unit_assert=>assert_subrc( exp = 0 ). + + ENDMETHOD. + + + METHOD then_no_exception_is_raised. + + cl_abap_unit_assert=>assert_initial( mv_error_text ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/zcl_abapgit_repo_online.clas.xml b/src/zcl_abapgit_repo_online.clas.xml index 419f71945..9b0a8cad2 100644 --- a/src/zcl_abapgit_repo_online.clas.xml +++ b/src/zcl_abapgit_repo_online.clas.xml @@ -13,6 +13,7 @@ X X X + X diff --git a/src/zcl_abapgit_syntax_check.clas.abap b/src/zcl_abapgit_syntax_check.clas.abap index 7e6ce8e4c..60e61c15e 100644 --- a/src/zcl_abapgit_syntax_check.clas.abap +++ b/src/zcl_abapgit_syntax_check.clas.abap @@ -1,44 +1,12 @@ CLASS zcl_abapgit_syntax_check DEFINITION PUBLIC - CREATE PUBLIC . + INHERITING FROM zcl_abapgit_code_inspector + GLOBAL FRIENDS zcl_abapgit_factory. - PUBLIC SECTION. - - CLASS-METHODS run - IMPORTING - !iv_package TYPE devclass - RETURNING - VALUE(rt_list) TYPE scit_alvlist . PROTECTED SECTION. + METHODS: + create_variant REDEFINITION. - TYPES: - ty_tdevc_tt TYPE STANDARD TABLE OF tdevc WITH DEFAULT KEY . - - CLASS-METHODS find_all_subpackages - IMPORTING - !iv_package TYPE devclass - RETURNING - VALUE(rt_packages) TYPE ty_tdevc_tt . - CLASS-METHODS create_inspection - IMPORTING - !io_set TYPE REF TO cl_ci_objectset - !io_variant TYPE REF TO cl_ci_checkvariant - RETURNING - VALUE(ro_inspection) TYPE REF TO cl_ci_inspection . - CLASS-METHODS create_objectset - IMPORTING - !iv_package TYPE devclass - RETURNING - VALUE(ro_set) TYPE REF TO cl_ci_objectset . - CLASS-METHODS create_variant - RETURNING - VALUE(ro_variant) TYPE REF TO cl_ci_checkvariant . - CLASS-METHODS run_inspection - IMPORTING - !io_inspection TYPE REF TO cl_ci_inspection - RETURNING - VALUE(rt_list) TYPE scit_alvlist . - PRIVATE SECTION. ENDCLASS. @@ -46,58 +14,11 @@ ENDCLASS. CLASS ZCL_ABAPGIT_SYNTAX_CHECK IMPLEMENTATION. - METHOD create_inspection. - - cl_ci_inspection=>create( - EXPORTING - p_user = sy-uname - p_name = '' - RECEIVING - p_ref = ro_inspection - EXCEPTIONS - locked = 1 - error_in_enqueue = 2 - not_authorized = 3 - OTHERS = 4 ). - ASSERT sy-subrc = 0. - - ro_inspection->set( - p_chkv = io_variant - p_objs = io_set ). - - ENDMETHOD. - - - METHOD create_objectset. - - DATA: lt_objs TYPE scit_objs, - lt_packages TYPE ty_tdevc_tt. - - - lt_packages = find_all_subpackages( iv_package ). - IF lines( lt_packages ) = 0. - RETURN. - ENDIF. - - SELECT object AS objtype obj_name AS objname - FROM tadir - INTO CORRESPONDING FIELDS OF TABLE lt_objs - FOR ALL ENTRIES IN lt_packages - WHERE devclass = lt_packages-devclass - AND delflag = abap_false - AND pgmid = 'R3TR'. "#EC CI_GENBUFF - - ro_set = cl_ci_objectset=>save_from_list( lt_objs ). - - ENDMETHOD. - - METHOD create_variant. DATA: lt_variant TYPE sci_tstvar, ls_variant LIKE LINE OF lt_variant. - cl_ci_checkvariant=>create( EXPORTING p_user = sy-uname @@ -123,62 +44,4 @@ CLASS ZCL_ABAPGIT_SYNTAX_CHECK IMPLEMENTATION. ASSERT sy-subrc = 0. ENDMETHOD. - - - METHOD find_all_subpackages. - -* TODO, in the future, move this method to the ABAPGIT global package class - - DATA: ls_package LIKE LINE OF rt_packages, - lt_found LIKE rt_packages, - lt_sub LIKE rt_packages. - - - SELECT SINGLE * FROM tdevc INTO ls_package WHERE devclass = iv_package. - ASSERT sy-subrc = 0. - APPEND ls_package TO rt_packages. - - SELECT * FROM tdevc APPENDING TABLE lt_sub - WHERE parentcl = ls_package-devclass. - - LOOP AT lt_sub INTO ls_package. - lt_found = find_all_subpackages( ls_package-devclass ). - APPEND LINES OF lt_found TO rt_packages. - ENDLOOP. - - ENDMETHOD. - - - METHOD run. - - DATA: lo_set TYPE REF TO cl_ci_objectset, - lo_inspection TYPE REF TO cl_ci_inspection, - lo_variant TYPE REF TO cl_ci_checkvariant. - - - lo_set = create_objectset( iv_package ). - lo_variant = create_variant( ). - - lo_inspection = create_inspection( - io_set = lo_set - io_variant = lo_variant ). - - rt_list = run_inspection( lo_inspection ). - - ENDMETHOD. - - - METHOD run_inspection. - - io_inspection->run( - EXCEPTIONS - invalid_check_version = 1 - OTHERS = 2 ). - ASSERT sy-subrc = 0. - - io_inspection->plain_list( - IMPORTING - p_list = rt_list ). - - ENDMETHOD. ENDCLASS. diff --git a/src/zif_abapgit_code_inspector.intf.abap b/src/zif_abapgit_code_inspector.intf.abap new file mode 100644 index 000000000..4b2a93a8e --- /dev/null +++ b/src/zif_abapgit_code_inspector.intf.abap @@ -0,0 +1,15 @@ +INTERFACE zif_abapgit_code_inspector + PUBLIC. + + METHODS: + run + RETURNING + VALUE(rt_list) TYPE scit_alvlist + RAISING + zcx_abapgit_exception, + + get_inspection + RETURNING + VALUE(ro_inspection) TYPE REF TO cl_ci_inspection. + +ENDINTERFACE. diff --git a/src/zif_abapgit_code_inspector.intf.xml b/src/zif_abapgit_code_inspector.intf.xml new file mode 100644 index 000000000..d17fad249 --- /dev/null +++ b/src/zif_abapgit_code_inspector.intf.xml @@ -0,0 +1,16 @@ + + + + + + ZIF_ABAPGIT_CODE_INSPECTOR + 1 + E + abapGit Code Inspector + 2 + 1 + X + + + + diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index 653215f95..8d1c4d1ed 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -395,6 +395,7 @@ INTERFACE zif_abapgit_definitions PUBLIC. repo_toggle_fav TYPE string VALUE 'repo_toggle_fav', repo_transport_to_branch TYPE string VALUE 'repo_transport_to_branch', repo_syntax_check TYPE string VALUE 'repo_syntax_check', + repo_code_inspector TYPE string VALUE 'repo_code_inspector', abapgit_home TYPE string VALUE 'abapgit_home', abapgit_wiki TYPE string VALUE 'abapgit_wiki', diff --git a/src/zif_abapgit_dot_abapgit.intf.abap b/src/zif_abapgit_dot_abapgit.intf.abap index 1ac09f89c..0a9280be9 100644 --- a/src/zif_abapgit_dot_abapgit.intf.abap +++ b/src/zif_abapgit_dot_abapgit.intf.abap @@ -10,11 +10,11 @@ INTERFACE zif_abapgit_dot_abapgit PUBLIC. ty_requirement_tt TYPE STANDARD TABLE OF ty_requirement WITH DEFAULT KEY . TYPES: BEGIN OF ty_dot_abapgit, - master_language TYPE spras, - starting_folder TYPE string, - folder_logic TYPE string, - ignore TYPE STANDARD TABLE OF string WITH DEFAULT KEY, - requirements TYPE ty_requirement_tt, + master_language TYPE spras, + starting_folder TYPE string, + folder_logic TYPE string, + ignore TYPE STANDARD TABLE OF string WITH DEFAULT KEY, + requirements TYPE ty_requirement_tt, END OF ty_dot_abapgit . CONSTANTS: From eeb07b0e3f3c31755a765565e93ffd9575860676 Mon Sep 17 00:00:00 2001 From: larshp Date: Thu, 28 Jun 2018 12:03:30 +0000 Subject: [PATCH 107/136] 1.70.0 --- src/zif_abapgit_definitions.intf.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index 8d1c4d1ed..77c6cdc3b 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -326,7 +326,7 @@ INTERFACE zif_abapgit_definitions PUBLIC. END OF ty_s_user_settings. CONSTANTS gc_xml_version TYPE string VALUE 'v1.0.0' ##NO_TEXT. - CONSTANTS gc_abap_version TYPE string VALUE '1.69.1' ##NO_TEXT. + CONSTANTS gc_abap_version TYPE string VALUE '1.70.0' ##NO_TEXT. CONSTANTS: BEGIN OF gc_type, commit TYPE zif_abapgit_definitions=>ty_type VALUE 'commit', "#EC NOTEXT From 8a347958854fe7b3438140bea46a80cf4d04a3b6 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Thu, 28 Jun 2018 14:05:42 +0200 Subject: [PATCH 108/136] v1.70.0 --- changelog.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/changelog.txt b/changelog.txt index 4a31d2b9d..bc864bbc2 100644 --- a/changelog.txt +++ b/changelog.txt @@ -8,6 +8,13 @@ Legend + : added - : removed +2018-06-28 v1.70.0 +------------------ ++ possibility to run code inspector before staging +* WAPA better delta handling ++ Block pull if any of deserialized object is locked ++ CHAR support + 2018-06-17 v1.69.1 ------------------ + new exit: change_tadir From 25b61c9ce70d0e04de78365cebfa4dce95f4bfbe Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Thu, 28 Jun 2018 14:10:19 +0200 Subject: [PATCH 109/136] docs: CHAR supported --- docs/ref-supported.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ref-supported.md b/docs/ref-supported.md index e75dddee0..677ee3695 100644 --- a/docs/ref-supported.md +++ b/docs/ref-supported.md @@ -12,7 +12,7 @@ AOBJ | Archiving Object | [#804](https://github.com/larshp/abapGit/issues/804) AUTH | Authorization Check Fields | Yes AVAS | Classification | [#1360](https://github.com/larshp/abapGit/issues/1360) BOBF | BOPF: Business Object Model | [#165](https://github.com/larshp/abapGit/issues/165) -CHAR | Object characteristic | [#1511](https://github.com/larshp/abapGit/issues/1511) +CHAR | Object characteristic | Yes CHDO | Change Document Object | [#802](https://github.com/larshp/abapGit/issues/802) CLAS | Class (ABAP Objects) | Yes CMOD | Customer enhancement projects | [#151](https://github.com/larshp/abapGit/issues/151) From f1ffa6eb261928f55e2acb8197b12034d0e49b27 Mon Sep 17 00:00:00 2001 From: larshp Date: Thu, 28 Jun 2018 12:29:29 +0000 Subject: [PATCH 110/136] fix FUGR locking problem plus show sy-subrc in case of errors from RPY_DYNPRO_INSERT --- src/objects/zcl_abapgit_object_fugr.clas.abap | 12 ++++++++++-- src/objects/zcl_abapgit_objects_program.clas.abap | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/objects/zcl_abapgit_object_fugr.clas.abap b/src/objects/zcl_abapgit_object_fugr.clas.abap index ca8b08242..4615c6704 100644 --- a/src/objects/zcl_abapgit_object_fugr.clas.abap +++ b/src/objects/zcl_abapgit_object_fugr.clas.abap @@ -902,7 +902,11 @@ CLASS zcl_abapgit_object_fugr IMPLEMENTATION. DATA: lt_includes TYPE rso_t_objnm. FIELD-SYMBOLS: TYPE sobj_name. - lt_includes = includes( ). + TRY. + lt_includes = includes( ). + CATCH zcx_abapgit_exception. + RETURN. + ENDTRY. LOOP AT lt_includes ASSIGNING . @@ -923,7 +927,11 @@ CLASS zcl_abapgit_object_fugr IMPLEMENTATION. FIELD-SYMBOLS: TYPE rs38l_incl. - lt_functions = functions( ). + TRY. + lt_functions = functions( ). + CATCH zcx_abapgit_exception. + RETURN. + ENDTRY. LOOP AT lt_functions ASSIGNING . diff --git a/src/objects/zcl_abapgit_objects_program.clas.abap b/src/objects/zcl_abapgit_objects_program.clas.abap index a4466f775..dd810a5be 100644 --- a/src/objects/zcl_abapgit_objects_program.clas.abap +++ b/src/objects/zcl_abapgit_objects_program.clas.abap @@ -656,7 +656,7 @@ CLASS zcl_abapgit_objects_program IMPLEMENTATION. illegal_field_position = 9 OTHERS = 10. IF sy-subrc <> 2 AND sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'error from RPY_DYNPRO_INSERT' ). + zcx_abapgit_exception=>raise( |error from RPY_DYNPRO_INSERT: { sy-subrc }| ). ENDIF. * todo, RPY_DYNPRO_UPDATE? From dcc765d013bc4ffd76fba550b33e1c6b961511bc Mon Sep 17 00:00:00 2001 From: larshp Date: Thu, 28 Jun 2018 13:11:42 +0000 Subject: [PATCH 111/136] TABL: check existence before SELECTing --- src/objects/zcl_abapgit_object_tabl.clas.abap | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/objects/zcl_abapgit_object_tabl.clas.abap b/src/objects/zcl_abapgit_object_tabl.clas.abap index 7c0e66b31..b11e63f7d 100644 --- a/src/objects/zcl_abapgit_object_tabl.clas.abap +++ b/src/objects/zcl_abapgit_object_tabl.clas.abap @@ -89,6 +89,7 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION. DATA: lv_objname TYPE rsedd0-ddobjname, lv_tabclass TYPE dd02l-tabclass, lv_no_ask TYPE abap_bool, + lv_subrc TYPE sy-subrc, lr_data TYPE REF TO data. FIELD-SYMBOLS: TYPE any. @@ -102,12 +103,21 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION. AND as4local = 'A' AND as4vers = '0000'. IF sy-subrc = 0 AND lv_tabclass = 'TRANSP'. + +* Avoid dump in dynamic SELECT in case the table does not exist on database + CALL FUNCTION 'DB_EXISTS_TABLE' + EXPORTING + tabname = lv_objname + IMPORTING + subrc = lv_subrc. + IF lv_subrc = 0. * it cannot delete table with table wihtout asking - CREATE DATA lr_data TYPE (lv_objname). - ASSIGN lr_data->* TO . - SELECT SINGLE * FROM (lv_objname) INTO . - IF sy-subrc = 0. - lv_no_ask = abap_false. + CREATE DATA lr_data TYPE (lv_objname). + ASSIGN lr_data->* TO . + SELECT SINGLE * FROM (lv_objname) INTO . + IF sy-subrc = 0. + lv_no_ask = abap_false. + ENDIF. ENDIF. ENDIF. @@ -314,6 +324,14 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION. ENDMETHOD. "zif_abapgit_object~has_changed_since + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'ESDICT' + iv_argument = |{ ms_item-obj_type }{ ms_item-obj_name }| ). + + ENDMETHOD. + + METHOD zif_abapgit_object~jump. jump_se11( iv_radio = 'RSRD1-DDTYPE' @@ -498,12 +516,4 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION. ig_data = lt_dd36m ). ENDMETHOD. "serialize - - METHOD zif_abapgit_object~is_locked. - - rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'ESDICT' - iv_argument = |{ ms_item-obj_type }{ ms_item-obj_name }| ). - - ENDMETHOD. - ENDCLASS. From 10b29556f7d3b5a77c0dfbe5f08b7bb9ab4a0fbc Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Thu, 28 Jun 2018 13:47:07 +0000 Subject: [PATCH 112/136] fix bug in run_code_inspection --- src/zcl_abapgit_repo_online.clas.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zcl_abapgit_repo_online.clas.abap b/src/zcl_abapgit_repo_online.clas.abap index 91cc5c90d..198bce4f8 100644 --- a/src/zcl_abapgit_repo_online.clas.abap +++ b/src/zcl_abapgit_repo_online.clas.abap @@ -461,7 +461,7 @@ CLASS zcl_abapgit_repo_online IMPLEMENTATION. READ TABLE rt_list TRANSPORTING NO FIELDS WITH KEY kind = 'E'. - mv_code_inspector_successful = boolc( sy-subrc = 0 ). + mv_code_inspector_successful = boolc( sy-subrc <> 0 ). ENDMETHOD. From bd7313b4725f036ffcac177b1d43fd64d8abf82b Mon Sep 17 00:00:00 2001 From: larshp Date: Thu, 28 Jun 2018 13:49:32 +0000 Subject: [PATCH 113/136] Delete PARA after DTEL, #1539 --- src/zcl_abapgit_dependencies.clas.abap | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/zcl_abapgit_dependencies.clas.abap b/src/zcl_abapgit_dependencies.clas.abap index 3131f6d8e..47e71f96c 100644 --- a/src/zcl_abapgit_dependencies.clas.abap +++ b/src/zcl_abapgit_dependencies.clas.abap @@ -114,6 +114,9 @@ CLASS ZCL_ABAPGIT_DEPENDENCIES IMPLEMENTATION. ENDIF. WHEN 'DTEL'. -korrnum = '8000'. + WHEN 'PARA'. +* PARA after DTEL + -korrnum = '8100'. WHEN 'DOMA'. -korrnum = '9000'. WHEN 'PROG'. From 31fb79f915e73d03a47e32d6e6521787b4b5b4b4 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Sat, 30 Jun 2018 09:27:46 +0000 Subject: [PATCH 114/136] Fix naming in file_status --- src/zcl_abapgit_file_status.clas.abap | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/zcl_abapgit_file_status.clas.abap b/src/zcl_abapgit_file_status.clas.abap index dbb582c86..5a324a16d 100644 --- a/src/zcl_abapgit_file_status.clas.abap +++ b/src/zcl_abapgit_file_status.clas.abap @@ -57,7 +57,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_FILE_STATUS IMPLEMENTATION. +CLASS zcl_abapgit_file_status IMPLEMENTATION. METHOD build_existing. @@ -186,13 +186,13 @@ CLASS ZCL_ABAPGIT_FILE_STATUS IMPLEMENTATION. METHOD calculate_status. - DATA: lt_remote LIKE it_remote, - lt_items TYPE zif_abapgit_definitions=>ty_items_tt, - ls_item LIKE LINE OF lt_items, - lv_is_xml TYPE abap_bool, - lt_super TYPE zif_abapgit_sap_package=>ty_devclass_tt, - lt_items_idx TYPE zif_abapgit_definitions=>ty_items_ts, - lt_state_idx TYPE zif_abapgit_definitions=>ty_file_signatures_ts. " Sorted by path+filename + DATA: lt_remote LIKE it_remote, + lt_items TYPE zif_abapgit_definitions=>ty_items_tt, + ls_item LIKE LINE OF lt_items, + lv_is_xml TYPE abap_bool, + lt_sub_packages TYPE zif_abapgit_sap_package=>ty_devclass_tt, + lt_items_idx TYPE zif_abapgit_definitions=>ty_items_ts, + lt_state_idx TYPE zif_abapgit_definitions=>ty_file_signatures_ts. " Sorted by path+filename FIELD-SYMBOLS: LIKE LINE OF it_remote, LIKE LINE OF rt_results, @@ -242,8 +242,8 @@ CLASS ZCL_ABAPGIT_FILE_STATUS IMPLEMENTATION. IF NOT ls_item-devclass IS INITIAL AND iv_devclass <> ls_item-devclass. * make sure the package is under the repo main package - lt_super = zcl_abapgit_factory=>get_sap_package( iv_devclass )->list_subpackages( ). - READ TABLE lt_super WITH KEY table_line = ls_item-devclass TRANSPORTING NO FIELDS. + lt_sub_packages = zcl_abapgit_factory=>get_sap_package( iv_devclass )->list_subpackages( ). + READ TABLE lt_sub_packages WITH KEY table_line = ls_item-devclass TRANSPORTING NO FIELDS. IF sy-subrc <> 0. CLEAR ls_item-devclass. ENDIF. From 6dfb6316c6a630da0aa22a8e66870d6d714e69d8 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Fri, 29 Jun 2018 16:28:17 +0000 Subject: [PATCH 115/136] Repository overview page --- src/ui/zcl_abapgit_gui_page_main.clas.abap | 68 ++- .../zcl_abapgit_gui_page_repo_over.clas.abap | 448 ++++++++++++++++++ .../zcl_abapgit_gui_page_repo_over.clas.xml | 19 + src/ui/zcl_abapgit_gui_router.clas.abap | 3 + src/ui/zcl_abapgit_html_toolbar.clas.abap | 7 +- src/zabapgit_js_common.w3mi.data.js | 14 + src/zif_abapgit_definitions.intf.abap | 1 + 7 files changed, 537 insertions(+), 23 deletions(-) create mode 100644 src/ui/zcl_abapgit_gui_page_repo_over.clas.abap create mode 100644 src/ui/zcl_abapgit_gui_page_repo_over.clas.xml diff --git a/src/ui/zcl_abapgit_gui_page_main.clas.abap b/src/ui/zcl_abapgit_gui_page_main.clas.abap index fa778f26d..842442b10 100644 --- a/src/ui/zcl_abapgit_gui_page_main.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_main.clas.abap @@ -16,6 +16,7 @@ CLASS zcl_abapgit_gui_page_main DEFINITION CONSTANTS: BEGIN OF c_actions, show TYPE string VALUE 'show' ##NO_TEXT, changed_by TYPE string VALUE 'changed_by', + overview TYPE string VALUE 'overview', END OF c_actions. DATA: mv_show TYPE zif_abapgit_persistence=>ty_value, @@ -40,7 +41,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GUI_PAGE_MAIN IMPLEMENTATION. +CLASS zcl_abapgit_gui_page_main IMPLEMENTATION. METHOD build_main_menu. @@ -52,24 +53,41 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MAIN IMPLEMENTATION. CREATE OBJECT lo_advsub. CREATE OBJECT lo_helpsub. - lo_advsub->add( iv_txt = 'Database util' iv_act = zif_abapgit_definitions=>gc_action-go_db ) ##NO_TEXT. - lo_advsub->add( iv_txt = 'Package to zip' iv_act = zif_abapgit_definitions=>gc_action-zip_package ) ##NO_TEXT. - lo_advsub->add( iv_txt = 'Transport to zip' iv_act = zif_abapgit_definitions=>gc_action-zip_transport ) ##NO_TEXT. - lo_advsub->add( iv_txt = 'Object to files' iv_act = zif_abapgit_definitions=>gc_action-zip_object ) ##NO_TEXT. - lo_advsub->add( iv_txt = 'Test changed by' iv_act = c_actions-changed_by ) ##NO_TEXT. - lo_advsub->add( iv_txt = 'Page playground' iv_act = zif_abapgit_definitions=>gc_action-go_playground ) ##NO_TEXT. - lo_advsub->add( iv_txt = 'Debug info' iv_act = zif_abapgit_definitions=>gc_action-go_debuginfo ) ##NO_TEXT. - lo_advsub->add( iv_txt = 'Settings' iv_act = zif_abapgit_definitions=>gc_action-go_settings ) ##NO_TEXT. + lo_advsub->add( iv_txt = 'Repository overview' + iv_act = zif_abapgit_definitions=>gc_action-go_repo_overview ) ##NO_TEXT. + lo_advsub->add( iv_txt = 'Database util' + iv_act = zif_abapgit_definitions=>gc_action-go_db ) ##NO_TEXT. + lo_advsub->add( iv_txt = 'Package to zip' + iv_act = zif_abapgit_definitions=>gc_action-zip_package ) ##NO_TEXT. + lo_advsub->add( iv_txt = 'Transport to zip' + iv_act = zif_abapgit_definitions=>gc_action-zip_transport ) ##NO_TEXT. + lo_advsub->add( iv_txt = 'Object to files' + iv_act = zif_abapgit_definitions=>gc_action-zip_object ) ##NO_TEXT. + lo_advsub->add( iv_txt = 'Test changed by' + iv_act = c_actions-changed_by ) ##NO_TEXT. + lo_advsub->add( iv_txt = 'Page playground' + iv_act = zif_abapgit_definitions=>gc_action-go_playground ) ##NO_TEXT. + lo_advsub->add( iv_txt = 'Debug info' + iv_act = zif_abapgit_definitions=>gc_action-go_debuginfo ) ##NO_TEXT. + lo_advsub->add( iv_txt = 'Settings' + iv_act = zif_abapgit_definitions=>gc_action-go_settings ) ##NO_TEXT. - lo_helpsub->add( iv_txt = 'Tutorial' iv_act = zif_abapgit_definitions=>gc_action-go_tutorial ) ##NO_TEXT. - lo_helpsub->add( iv_txt = 'abapGit wiki' iv_act = zif_abapgit_definitions=>gc_action-abapgit_wiki ) ##NO_TEXT. + lo_helpsub->add( iv_txt = 'Tutorial' + iv_act = zif_abapgit_definitions=>gc_action-go_tutorial ) ##NO_TEXT. + lo_helpsub->add( iv_txt = 'abapGit wiki' + iv_act = zif_abapgit_definitions=>gc_action-abapgit_wiki ) ##NO_TEXT. - ro_menu->add( iv_txt = '+ Online' iv_act = zif_abapgit_definitions=>gc_action-repo_newonline ) ##NO_TEXT. - ro_menu->add( iv_txt = '+ Offline' iv_act = zif_abapgit_definitions=>gc_action-repo_newoffline ) ##NO_TEXT. - ro_menu->add( iv_txt = 'Explore' iv_act = zif_abapgit_definitions=>gc_action-go_explore ) ##NO_TEXT. + ro_menu->add( iv_txt = '+ Online' + iv_act = zif_abapgit_definitions=>gc_action-repo_newonline ) ##NO_TEXT. + ro_menu->add( iv_txt = '+ Offline' + iv_act = zif_abapgit_definitions=>gc_action-repo_newoffline ) ##NO_TEXT. + ro_menu->add( iv_txt = 'Explore' + iv_act = zif_abapgit_definitions=>gc_action-go_explore ) ##NO_TEXT. - ro_menu->add( iv_txt = 'Advanced' io_sub = lo_advsub ) ##NO_TEXT. - ro_menu->add( iv_txt = 'Help' io_sub = lo_helpsub ) ##NO_TEXT. + ro_menu->add( iv_txt = 'Advanced' + io_sub = lo_advsub ) ##NO_TEXT. + ro_menu->add( iv_txt = 'Help' + io_sub = lo_helpsub ) ##NO_TEXT. ENDMETHOD. "build main_menu @@ -217,9 +235,10 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MAIN IMPLEMENTATION. ro_html->add( '' ). ro_html->add( lo_allbar->render_as_droplist( - iv_label = zcl_abapgit_html=>icon( iv_name = 'three-bars/blue' ) - iv_right = abap_true - iv_sort = abap_true ) ). + iv_label = zcl_abapgit_html=>icon( iv_name = 'three-bars/blue' ) + iv_action = c_actions-overview + iv_right = abap_true + iv_sort = abap_true ) ). ro_html->add( '' ). ro_html->add( '' ). @@ -287,7 +306,8 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MAIN IMPLEMENTATION. METHOD zif_abapgit_gui_page~on_event. - DATA: lv_key TYPE zif_abapgit_persistence=>ty_repo-key. + DATA: lv_key TYPE zif_abapgit_persistence=>ty_repo-key, + li_repo_overview TYPE REF TO zif_abapgit_gui_page. IF NOT mo_repo_content IS INITIAL. @@ -320,6 +340,14 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MAIN IMPLEMENTATION. WHEN c_actions-changed_by. test_changed_by( ). ev_state = zif_abapgit_definitions=>gc_event_state-no_more_act. + + WHEN c_actions-overview. + + CREATE OBJECT li_repo_overview TYPE zcl_abapgit_gui_page_repo_over. + + ei_page = li_repo_overview. + ev_state = zif_abapgit_definitions=>gc_event_state-new_page. + ENDCASE. ENDMETHOD. "on_event diff --git a/src/ui/zcl_abapgit_gui_page_repo_over.clas.abap b/src/ui/zcl_abapgit_gui_page_repo_over.clas.abap new file mode 100644 index 000000000..e1c19fada --- /dev/null +++ b/src/ui/zcl_abapgit_gui_page_repo_over.clas.abap @@ -0,0 +1,448 @@ +CLASS zcl_abapgit_gui_page_repo_over DEFINITION + PUBLIC + INHERITING FROM zcl_abapgit_gui_page + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS constructor . + + METHODS zif_abapgit_gui_page~on_event + REDEFINITION . + + PROTECTED SECTION. + METHODS render_content + REDEFINITION . + + PRIVATE SECTION. + TYPES: + BEGIN OF ty_overview, + favorite TYPE string, + type TYPE string, + key TYPE string, + name TYPE string, + url TYPE string, + package TYPE string, + branch TYPE string, + END OF ty_overview, + tty_overview TYPE STANDARD TABLE OF ty_overview + WITH NON-UNIQUE DEFAULT KEY. + CONSTANTS: + BEGIN OF gc_action, + delete TYPE string VALUE 'delete', + select TYPE string VALUE 'select', + change_order_by TYPE string VALUE 'change_order_by', + direction TYPE string VALUE 'direction', + apply_filter TYPE string VALUE 'apply_filter', + END OF gc_action . + + DATA: + mv_order_by TYPE string, + mv_order_descending TYPE char01, + mv_filter TYPE string. + + METHODS: + render_text_input + IMPORTING iv_name TYPE string + iv_label TYPE string + iv_value TYPE string OPTIONAL + iv_max_length TYPE string OPTIONAL + RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html, + + parse_change_order_by + IMPORTING + it_postdata TYPE cnht_post_data_tab, + + parse_direction + IMPORTING + it_postdata TYPE cnht_post_data_tab, + + parse_filter + IMPORTING + it_postdata TYPE cnht_post_data_tab, + + add_order_by_option + IMPORTING + iv_option TYPE string + io_html TYPE REF TO zcl_abapgit_html, + + add_direction_option + IMPORTING + iv_option TYPE string + io_html TYPE REF TO zcl_abapgit_html + iv_selected TYPE abap_bool, + + apply_order_by + CHANGING + ct_overview TYPE zcl_abapgit_gui_page_repo_over=>tty_overview, + + apply_filter + CHANGING + ct_overview TYPE zcl_abapgit_gui_page_repo_over=>tty_overview, + + map_repo_list_to_overview + IMPORTING + it_repo_list TYPE zif_abapgit_persistence=>tt_repo + RETURNING + VALUE(rt_overview) TYPE zcl_abapgit_gui_page_repo_over=>tty_overview + RAISING + zcx_abapgit_exception. + +ENDCLASS. + + + +CLASS zcl_abapgit_gui_page_repo_over IMPLEMENTATION. + + + METHOD add_direction_option. + + DATA: lv_selected TYPE string. + + IF iv_selected = abap_true. + lv_selected = 'selected'. + ENDIF. + + io_html->add( || ). + + ENDMETHOD. + + + METHOD add_order_by_option. + + DATA: lv_selected TYPE string. + + IF mv_order_by = iv_option. + lv_selected = 'selected'. + ENDIF. + + io_html->add( || ). + + ENDMETHOD. + + + METHOD apply_filter. + + IF mv_filter IS NOT INITIAL. + + DELETE ct_overview WHERE key NS mv_filter + AND name NS mv_filter + AND url NS mv_filter + AND package NS mv_filter + AND branch NS mv_filter. + + ENDIF. + + ENDMETHOD. + + + METHOD apply_order_by. + + DATA: + lt_sort TYPE abap_sortorder_tab, + ls_sort LIKE LINE OF lt_sort. + + IF mv_order_by IS NOT INITIAL. + + ls_sort-name = mv_order_by. + ls_sort-descending = mv_order_descending. + ls_sort-astext = abap_true. + INSERT ls_sort INTO TABLE lt_sort. + SORT ct_overview BY (lt_sort). + + ENDIF. + + ENDMETHOD. + + + METHOD constructor. + + super->constructor( ). + ms_control-page_title = |Repository Overview|. + mv_order_by = |NAME|. + + ENDMETHOD. " constructor. + + + METHOD map_repo_list_to_overview. + + DATA: ls_overview LIKE LINE OF rt_overview, + lo_repo_srv TYPE REF TO zcl_abapgit_repo, + lo_user TYPE REF TO zcl_abapgit_persistence_user. + + FIELD-SYMBOLS: LIKE LINE OF it_repo_list. + + lo_user = zcl_abapgit_persistence_user=>get_instance( ). + + LOOP AT it_repo_list ASSIGNING . + + CLEAR: ls_overview. + lo_repo_srv = zcl_abapgit_repo_srv=>get_instance( )->get( -key ). + + ls_overview-favorite = lo_user->is_favorite_repo( -key ). + ls_overview-type = -offline. + ls_overview-key = -key. + ls_overview-name = lo_repo_srv->get_name( ). + ls_overview-url = -url. + ls_overview-package = -package. + ls_overview-branch = zcl_abapgit_git_branch_list=>get_display_name( -branch_name ). + INSERT ls_overview INTO TABLE rt_overview. + + ENDLOOP. + + ENDMETHOD. + + + METHOD parse_change_order_by. + + FIELD-SYMBOLS: TYPE cnht_post_data_line. + + READ TABLE it_postdata ASSIGNING + INDEX 1. + IF sy-subrc = 0. + FIND FIRST OCCURRENCE OF REGEX `orderBy=(.*)` + IN + SUBMATCHES mv_order_by. + ENDIF. + + mv_order_by = condense( mv_order_by ). + + ENDMETHOD. + + + METHOD parse_direction. + + DATA: lv_direction TYPE string. + + FIELD-SYMBOLS: TYPE cnht_post_data_line. + + CLEAR: mv_order_descending. + + READ TABLE it_postdata ASSIGNING + INDEX 1. + IF sy-subrc = 0. + FIND FIRST OCCURRENCE OF REGEX `direction=(.*)` + IN + SUBMATCHES lv_direction. + ENDIF. + + IF condense( lv_direction ) = 'DESCENDING'. + mv_order_descending = abap_true. + ENDIF. + + ENDMETHOD. + + + METHOD parse_filter. + + FIELD-SYMBOLS: LIKE LINE OF it_postdata. + + READ TABLE it_postdata ASSIGNING + INDEX 1. + IF sy-subrc = 0. + FIND FIRST OCCURRENCE OF REGEX `filter=(.*)` + IN + SUBMATCHES mv_filter. + ENDIF. + + mv_filter = condense( mv_filter ). + + ENDMETHOD. + + + METHOD render_content. + + DATA: lv_trclass TYPE string, + lo_persistence_repo TYPE REF TO zcl_abapgit_persistence_repo, + lt_overview TYPE tty_overview, + lv_type_icon TYPE string, + lv_favorite_icon TYPE string. + + FIELD-SYMBOLS: LIKE LINE OF lt_overview. + + CREATE OBJECT lo_persistence_repo. + + lt_overview = map_repo_list_to_overview( lo_persistence_repo->list( ) ). + + apply_order_by( CHANGING ct_overview = lt_overview ). + + apply_filter( CHANGING ct_overview = lt_overview ). + + CREATE OBJECT ro_html. + + ro_html->add( |
    | ). + + ro_html->add( || ). + + ro_html->add( |
    | ). + + ro_html->add( |Order by: | ). + + ro_html->add( || ). + + ro_html->add( render_text_input( iv_name = |filter| + iv_label = |Filter: | + iv_value = mv_filter ) ). + + ro_html->add( || ). + + ro_html->add( |
    | ). + + ro_html->add( || ). + ro_html->add( |
    | ). + + ro_html->add( |
    | ). + ro_html->add( || ). + + " Header + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( '' ). + ro_html->add( '' ). + ro_html->add( '' ). + + + LOOP AT lt_overview ASSIGNING . + CLEAR lv_trclass. + IF sy-tabix = 1. + lv_trclass = ' class="firstrow"' ##NO_TEXT. + ENDIF. + + IF -type = abap_true. + lv_type_icon = 'plug/darkgrey'. + ELSE. + lv_type_icon = 'cloud-upload/blue'. + ENDIF. + + IF -favorite = abap_true. + lv_favorite_icon = 'star/blue'. + ELSE. + lv_favorite_icon = 'star/grey'. + ENDIF. + + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ENDLOOP. + + ro_html->add( || ). + ro_html->add( |
    FavoriteTypeKeyNameUrlPackageBranch name
    | ). + ro_html->add_a( iv_act = |{ zif_abapgit_definitions=>gc_action-repo_toggle_fav }?{ -key }| + iv_txt = zcl_abapgit_html=>icon( iv_name = lv_favorite_icon + iv_class = 'pad-sides' + iv_hint = 'Click to toggle favorite' ) ). + ro_html->add( |{ zcl_abapgit_html=>icon( lv_type_icon ) }{ -key }{ zcl_abapgit_html=>a( iv_txt = -name + iv_act = |{ gc_action-select }?{ -key }| ) }{ -url }{ -package }{ -branch }| ). + ro_html->add( |
    | ). + ro_html->add( |
    | ). + + ENDMETHOD. "render_content + + + METHOD render_text_input. + + DATA lv_attrs TYPE string. + + CREATE OBJECT ro_html. + + IF iv_value IS NOT INITIAL. + lv_attrs = | value="{ iv_value }"|. + ENDIF. + + IF iv_max_length IS NOT INITIAL. + lv_attrs = | maxlength="{ iv_max_length }"|. + ENDIF. + + ro_html->add( || ). + ro_html->add( || ). + + ENDMETHOD. " render_text_input + + + METHOD zif_abapgit_gui_page~on_event. + + DATA: lv_key TYPE zif_abapgit_persistence=>ty_value. + + CASE iv_action. + WHEN gc_action-select. + + lv_key = iv_getdata. + + zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( lv_key ). + + TRY. + zcl_abapgit_repo_srv=>get_instance( )->get( lv_key )->refresh( ). + CATCH zcx_abapgit_exception ##NO_HANDLER. + ENDTRY. + + ev_state = zif_abapgit_definitions=>gc_event_state-go_back. + + WHEN gc_action-change_order_by. + + parse_change_order_by( it_postdata ). + ev_state = zif_abapgit_definitions=>gc_event_state-re_render. + + WHEN gc_action-direction. + + parse_direction( it_postdata ). + ev_state = zif_abapgit_definitions=>gc_event_state-re_render. + + WHEN gc_action-apply_filter. + + parse_filter( it_postdata ). + ev_state = zif_abapgit_definitions=>gc_event_state-re_render. + + ENDCASE. + + ENDMETHOD. +ENDCLASS. diff --git a/src/ui/zcl_abapgit_gui_page_repo_over.clas.xml b/src/ui/zcl_abapgit_gui_page_repo_over.clas.xml new file mode 100644 index 000000000..38f072849 --- /dev/null +++ b/src/ui/zcl_abapgit_gui_page_repo_over.clas.xml @@ -0,0 +1,19 @@ + + + + + + ZCL_ABAPGIT_GUI_PAGE_REPO_OVER + 1 + E + GUI - DB page + 2 + 1 + X + X + X + X + + + + diff --git a/src/ui/zcl_abapgit_gui_router.clas.abap b/src/ui/zcl_abapgit_gui_router.clas.abap index ca0c2c871..33cd01f6b 100644 --- a/src/ui/zcl_abapgit_gui_router.clas.abap +++ b/src/ui/zcl_abapgit_gui_router.clas.abap @@ -189,6 +189,9 @@ CLASS zcl_abapgit_gui_router IMPLEMENTATION. WHEN zif_abapgit_definitions=>gc_action-go_explore. " Go Explore page CREATE OBJECT ei_page TYPE zcl_abapgit_gui_page_explore. ev_state = zif_abapgit_definitions=>gc_event_state-new_page. + WHEN zif_abapgit_definitions=>gc_action-go_repo_overview. " Go Repository overview + CREATE OBJECT ei_page TYPE zcl_abapgit_gui_page_repo_over. + ev_state = zif_abapgit_definitions=>gc_event_state-new_page. WHEN zif_abapgit_definitions=>gc_action-go_db. " Go DB util page CREATE OBJECT ei_page TYPE zcl_abapgit_gui_page_db. ev_state = zif_abapgit_definitions=>gc_event_state-new_page. diff --git a/src/ui/zcl_abapgit_html_toolbar.clas.abap b/src/ui/zcl_abapgit_html_toolbar.clas.abap index 771e04f76..214b80e64 100644 --- a/src/ui/zcl_abapgit_html_toolbar.clas.abap +++ b/src/ui/zcl_abapgit_html_toolbar.clas.abap @@ -33,6 +33,7 @@ CLASS zcl_abapgit_html_toolbar DEFINITION iv_right TYPE abap_bool OPTIONAL iv_sort TYPE abap_bool OPTIONAL iv_corner TYPE abap_bool OPTIONAL + iv_action TYPE string OPTIONAL RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html. @@ -67,7 +68,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_HTML_TOOLBAR IMPLEMENTATION. +CLASS zcl_abapgit_html_toolbar IMPLEMENTATION. METHOD add. @@ -142,8 +143,8 @@ CLASS ZCL_ABAPGIT_HTML_TOOLBAR IMPLEMENTATION. ro_html->add( |
    | ). ro_html->add( '
    • ' ). ro_html->add_a( iv_txt = iv_label - iv_typ = zif_abapgit_definitions=>gc_action_type-dummy - iv_act = '' ). + iv_typ = zif_abapgit_definitions=>gc_action_type-sapevent + iv_act = iv_action ). ro_html->add( '
      ' ). ro_html->add( render_items( iv_sort = iv_sort ) ). ro_html->add( '
    ' ). diff --git a/src/zabapgit_js_common.w3mi.data.js b/src/zabapgit_js_common.w3mi.data.js index a2cff0744..5a8a73f5f 100644 --- a/src/zabapgit_js_common.w3mi.data.js +++ b/src/zabapgit_js_common.w3mi.data.js @@ -127,6 +127,20 @@ window.onTagTypeChange = function(oSelectObject){ submitSapeventForm({ 'type': sValue }, "change_tag_type", "post"); } +/********************************************************** + * Repo Overview Logic + **********************************************************/ +// somehow only functions on window are visible for the select tag +window.onOrderByChange = function(oSelectObject){ + var sValue = oSelectObject.value; + submitSapeventForm({ 'orderBy': sValue }, "change_order_by", "post"); +} + +window.onDirectionChange = function(oSelectObject){ + var sValue = oSelectObject.value; + submitSapeventForm({ 'direction': sValue }, "direction", "post"); +} + /********************************************************** * STAGE PAGE Logic **********************************************************/ diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index 77c6cdc3b..0120a2021 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -424,6 +424,7 @@ INTERFACE zif_abapgit_definitions PUBLIC. go_main TYPE string VALUE 'go_main', go_explore TYPE string VALUE 'go_explore', + go_repo_overview TYPE string VALUE 'go_repo_overview', go_db TYPE string VALUE 'go_db', go_background TYPE string VALUE 'go_background', go_background_run TYPE string VALUE 'go_background_run', From 1c59b131b7d90d6bd688bb4b58656dade488f92f Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Sun, 1 Jul 2018 15:53:56 +0000 Subject: [PATCH 116/136] add created_by and created_at to repo xml --- src/persist/zcl_abapgit_persistence_repo.clas.abap | 2 ++ src/persist/zif_abapgit_persistence.intf.abap | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/persist/zcl_abapgit_persistence_repo.clas.abap b/src/persist/zcl_abapgit_persistence_repo.clas.abap index 16dac3a55..337a6d7b2 100644 --- a/src/persist/zcl_abapgit_persistence_repo.clas.abap +++ b/src/persist/zcl_abapgit_persistence_repo.clas.abap @@ -128,6 +128,8 @@ CLASS ZCL_ABAPGIT_PERSISTENCE_REPO IMPLEMENTATION. ls_repo-sha1 = iv_branch. ls_repo-package = iv_package. ls_repo-offline = iv_offline. + ls_repo-created_by = sy-uname. + GET TIME STAMP FIELD ls_repo-created_at. ls_repo-dot_abapgit = is_dot_abapgit. lv_repo_as_xml = to_xml( ls_repo ). diff --git a/src/persist/zif_abapgit_persistence.intf.abap b/src/persist/zif_abapgit_persistence.intf.abap index 7e2d136b3..ab2e28739 100644 --- a/src/persist/zif_abapgit_persistence.intf.abap +++ b/src/persist/zif_abapgit_persistence.intf.abap @@ -23,7 +23,7 @@ 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 , + code_inspector_check_variant TYPE sci_chkv, block_commit TYPE abap_bool, END OF ty_local_settings. @@ -34,6 +34,8 @@ INTERFACE zif_abapgit_persistence PUBLIC. branch_name TYPE string, sha1 TYPE zif_abapgit_definitions=>ty_sha1, package TYPE devclass, + created_by TYPE xubname, + created_at TYPE timestampl, offline TYPE sap_bool, local_checksums TYPE ty_local_checksum_tt, dot_abapgit TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit, From 43e91a629626e1356a880c54b1c24e45f04b90e8 Mon Sep 17 00:00:00 2001 From: Fabian Lupa Date: Sun, 1 Jul 2018 18:27:07 +0200 Subject: [PATCH 117/136] Add UI for requirements in repo settings Fixes #1547 --- .../zcl_abapgit_gui_page_repo_sett.clas.abap | 67 ++++++++++++++++--- .../zcl_abapgit_html_action_utils.clas.abap | 12 ++++ src/zcl_abapgit_dot_abapgit.clas.abap | 13 ++++ 3 files changed, 82 insertions(+), 10 deletions(-) diff --git a/src/ui/zcl_abapgit_gui_page_repo_sett.clas.abap b/src/ui/zcl_abapgit_gui_page_repo_sett.clas.abap index 0af72d89d..20a6d8c4a 100644 --- a/src/ui/zcl_abapgit_gui_page_repo_sett.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_repo_sett.clas.abap @@ -14,7 +14,7 @@ CLASS zcl_abapgit_gui_page_repo_sett DEFINITION BEGIN OF c_action, save_settings TYPE string VALUE 'save_settings', END OF c_action . - DATA mo_repo TYPE REF TO zcl_abapgit_repo . + DATA mo_repo TYPE REF TO zcl_abapgit_repo. METHODS render_dot_abapgit IMPORTING @@ -91,15 +91,25 @@ CLASS zcl_abapgit_gui_page_repo_sett IMPLEMENTATION. METHOD render_dot_abapgit. - DATA: ls_dot TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit, - lv_selected TYPE string, - lt_folder_logic TYPE stringtab. - - FIELD-SYMBOLS: TYPE LINE OF stringtab. + CONSTANTS: lc_requirement_edit_count TYPE i VALUE 5. + DATA: ls_dot TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit, + lv_selected TYPE string, + lt_folder_logic TYPE stringtab, + lv_req_index TYPE i, + lv_requirement_count TYPE i. + FIELD-SYMBOLS: TYPE LINE OF stringtab, + TYPE zif_abapgit_dot_abapgit=>ty_requirement. ls_dot = mo_repo->get_dot_abapgit( )->get_data( ). + lv_requirement_count = lines( ls_dot-requirements ). + IF lv_requirement_count < lc_requirement_edit_count. + DO - lv_requirement_count + lc_requirement_edit_count TIMES. + INSERT INITIAL LINE INTO TABLE ls_dot-requirements. + ENDDO. + ENDIF. + INSERT zif_abapgit_dot_abapgit=>c_folder_logic-full INTO TABLE lt_folder_logic. @@ -130,6 +140,25 @@ CLASS zcl_abapgit_gui_page_repo_sett IMPLEMENTATION. ls_dot-starting_folder && '">' ). io_html->add( '
    ' ). + io_html->add( '

    Requirements

    ' ). + io_html->add( '' ). + io_html->add( '' ). + + LOOP AT ls_dot-requirements ASSIGNING . + lv_req_index = sy-tabix. + + io_html->add( '' ). + io_html->add( || ). + io_html->add( || ). + io_html->add( || ). + io_html->add( '' ). + ENDLOOP. + + io_html->add( '
    Software ComponentMin ReleaseMin Patch
    ' ). + ENDMETHOD. @@ -195,8 +224,10 @@ CLASS zcl_abapgit_gui_page_repo_sett IMPLEMENTATION. METHOD save_dot_abap. - DATA: lo_dot TYPE REF TO zcl_abapgit_dot_abapgit, - ls_post_field LIKE LINE OF it_post_fields. + DATA: lo_dot TYPE REF TO zcl_abapgit_dot_abapgit, + ls_post_field LIKE LINE OF it_post_fields, + lt_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt. + FIELD-SYMBOLS: TYPE zif_abapgit_dot_abapgit=>ty_requirement. lo_dot = mo_repo->get_dot_abapgit( ). @@ -209,6 +240,24 @@ CLASS zcl_abapgit_gui_page_repo_sett IMPLEMENTATION. ASSERT sy-subrc = 0. lo_dot->set_starting_folder( ls_post_field-value ). + LOOP AT it_post_fields INTO ls_post_field WHERE name CP 'req_*'. + CASE ls_post_field-name+4(3). + WHEN 'com'. + INSERT INITIAL LINE INTO TABLE lt_requirements ASSIGNING . + -component = ls_post_field-value. + WHEN 'rel'. + -min_release = ls_post_field-value. + WHEN 'pat'. + -min_patch = ls_post_field-value. + ENDCASE. + ENDLOOP. + + SORT lt_requirements BY component min_release min_patch. + DELETE lt_requirements WHERE component IS INITIAL. + DELETE ADJACENT DUPLICATES FROM lt_requirements COMPARING ALL FIELDS. + + lo_dot->set_requirements( lt_requirements ). + mo_repo->set_dot_abapgit( lo_dot ). ENDMETHOD. @@ -278,6 +327,4 @@ CLASS zcl_abapgit_gui_page_repo_sett IMPLEMENTATION. ENDCASE. ENDMETHOD. - - ENDCLASS. diff --git a/src/ui/zcl_abapgit_html_action_utils.clas.abap b/src/ui/zcl_abapgit_html_action_utils.clas.abap index 6c9e74991..b292eedaf 100644 --- a/src/ui/zcl_abapgit_html_action_utils.clas.abap +++ b/src/ui/zcl_abapgit_html_action_utils.clas.abap @@ -109,6 +109,11 @@ CLASS zcl_abapgit_html_action_utils DEFINITION !ev_seed TYPE string RAISING zcx_abapgit_exception . + CLASS-METHODS requirement_decode + IMPORTING + iv_string TYPE clike + RETURNING + VALUE(rv_requirement_index) TYPE i. PRIVATE SECTION. CLASS-METHODS unescape IMPORTING iv_string TYPE string @@ -431,4 +436,11 @@ CLASS zcl_abapgit_html_action_utils IMPLEMENTATION. ENDMETHOD. + METHOD requirement_decode. + DATA: lt_fields TYPE tihttpnvp. + + lt_fields = parse_fields_upper_case_name( iv_string ). + get_field( EXPORTING name = 'REQ' it = lt_fields CHANGING cv = rv_requirement_index ). + ENDMETHOD. + ENDCLASS. diff --git a/src/zcl_abapgit_dot_abapgit.clas.abap b/src/zcl_abapgit_dot_abapgit.clas.abap index e2b2dfeaa..36b8f6287 100644 --- a/src/zcl_abapgit_dot_abapgit.clas.abap +++ b/src/zcl_abapgit_dot_abapgit.clas.abap @@ -65,6 +65,12 @@ CLASS zcl_abapgit_dot_abapgit DEFINITION VALUE(rs_signature) TYPE zif_abapgit_definitions=>ty_file_signature RAISING zcx_abapgit_exception . + METHODS get_requirements + RETURNING + VALUE(rt_requirements) TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt. + METHODS set_requirements + IMPORTING + it_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt. PRIVATE SECTION. DATA: ms_data TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit. @@ -281,4 +287,11 @@ CLASS zcl_abapgit_dot_abapgit IMPLEMENTATION. ENDMETHOD. + METHOD get_requirements. + rt_requirements = ms_data-requirements. + ENDMETHOD. + + METHOD set_requirements. + ms_data-requirements = it_requirements. + ENDMETHOD. ENDCLASS. From 127f5a3c9c001b7e8f6404571af0acf8c71206a6 Mon Sep 17 00:00:00 2001 From: Fabian Lupa Date: Mon, 2 Jul 2018 00:51:38 +0200 Subject: [PATCH 118/136] Remove unused action decode methode --- src/ui/zcl_abapgit_html_action_utils.clas.abap | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/ui/zcl_abapgit_html_action_utils.clas.abap b/src/ui/zcl_abapgit_html_action_utils.clas.abap index b292eedaf..6c9e74991 100644 --- a/src/ui/zcl_abapgit_html_action_utils.clas.abap +++ b/src/ui/zcl_abapgit_html_action_utils.clas.abap @@ -109,11 +109,6 @@ CLASS zcl_abapgit_html_action_utils DEFINITION !ev_seed TYPE string RAISING zcx_abapgit_exception . - CLASS-METHODS requirement_decode - IMPORTING - iv_string TYPE clike - RETURNING - VALUE(rv_requirement_index) TYPE i. PRIVATE SECTION. CLASS-METHODS unescape IMPORTING iv_string TYPE string @@ -436,11 +431,4 @@ CLASS zcl_abapgit_html_action_utils IMPLEMENTATION. ENDMETHOD. - METHOD requirement_decode. - DATA: lt_fields TYPE tihttpnvp. - - lt_fields = parse_fields_upper_case_name( iv_string ). - get_field( EXPORTING name = 'REQ' it = lt_fields CHANGING cv = rv_requirement_index ). - ENDMETHOD. - ENDCLASS. From 59128df6641db9653c7a17dd7ae034c0dd0d2870 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Mon, 2 Jul 2018 10:38:23 +0000 Subject: [PATCH 119/136] downport code inspector page --- src/ui/zcl_abapgit_gui_page_code_insp.clas.abap | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/ui/zcl_abapgit_gui_page_code_insp.clas.abap b/src/ui/zcl_abapgit_gui_page_code_insp.clas.abap index 9a13225aa..899e625ac 100644 --- a/src/ui/zcl_abapgit_gui_page_code_insp.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_code_insp.clas.abap @@ -233,8 +233,7 @@ CLASS zcl_abapgit_gui_page_code_insp IMPLEMENTATION. 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. + lv_package TYPE devclass. FIELD-SYMBOLS: TYPE scir_alvlist. @@ -257,12 +256,6 @@ CLASS zcl_abapgit_gui_page_code_insp IMPLEMENTATION. lo_test = cl_ci_tests=>get_test_ref( -test ). lo_result = lo_test->get_result_node( -kind ). - lv_srcid = li_code_inspector->get_inspection( )->objs->objectsinf-srcid. - - lo_result->set_srcid( - p_info = ls_info - p_srcid = lv_srcid ). - lo_result->set_info( ls_info ). lo_result->if_ci_test~navigate( ). From 5247f1f5c5e82b59d56cb519e2f25d769f4af059 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Wed, 4 Jul 2018 06:49:03 +0200 Subject: [PATCH 120/136] docs: few more articles --- docs/other-articles-and-presentations.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/other-articles-and-presentations.md b/docs/other-articles-and-presentations.md index f0e8fa109..bdb405464 100644 --- a/docs/other-articles-and-presentations.md +++ b/docs/other-articles-and-presentations.md @@ -78,3 +78,7 @@ SAP Teched Barcelona [ABAP Code Reviews with abapGit](https://blogs.sap.com/2018/03/23/abap-code-reviews-with-abapgit/) -Eduardo Copat [Get into Git!](https://blogs.sap.com/2018/04/13/get-into-git/) - Mike Pokraka + +[ABAP – The Special Snowflake](https://blogs.sap.com/2018/07/02/abap-the-special-snowflake/) - Nigel James + +[Is SAP’s ABAP a special snowflake or has a Git run it over?](https://diginomica.com/2018/07/03/is-saps-abap-a-special-snowflake-or-has-a-git-run-it-over/) - Den Howlett From ade1b4819ca72274f929847a81f6a46732ea2f17 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Wed, 4 Jul 2018 14:12:48 +0200 Subject: [PATCH 121/136] docs: add article, https://inspiricon.de/abapgit/ --- docs/other-articles-and-presentations.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/other-articles-and-presentations.md b/docs/other-articles-and-presentations.md index bdb405464..fdefa2b2a 100644 --- a/docs/other-articles-and-presentations.md +++ b/docs/other-articles-and-presentations.md @@ -82,3 +82,5 @@ SAP Teched Barcelona [ABAP – The Special Snowflake](https://blogs.sap.com/2018/07/02/abap-the-special-snowflake/) - Nigel James [Is SAP’s ABAP a special snowflake or has a Git run it over?](https://diginomica.com/2018/07/03/is-saps-abap-a-special-snowflake-or-has-a-git-run-it-over/) - Den Howlett + +[ORGANISIERE DEINE ARBEIT MIT ABAPGIT ](https://inspiricon.de/abapgit/) -Andra Atanasoaie From 28a15545266b45fa01d39d6a8e0e041fe6f8e51d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20K=C3=A4semann?= Date: Thu, 5 Jul 2018 13:55:59 +0200 Subject: [PATCH 122/136] Limit Progress Indicator Updates Fixed an issue with the progress indicator updates, where updates of the progress indicator would flush the message queue of SAP GUI and cause a GUI crash or hang. The problem is described in SAP note #2084109 and seems to occur for large repositories (especially after installing SAP GUI 7.50 PL6) --- src/utils/zcl_abapgit_progress.clas.abap | 32 +++++++++++++++++++----- src/utils/zcl_abapgit_progress.clas.xml | 14 +++++++++++ 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/utils/zcl_abapgit_progress.clas.abap b/src/utils/zcl_abapgit_progress.clas.abap index e48c52249..5b55e9b3d 100644 --- a/src/utils/zcl_abapgit_progress.clas.abap +++ b/src/utils/zcl_abapgit_progress.clas.abap @@ -21,7 +21,10 @@ CLASS zcl_abapgit_progress DEFINITION !iv_current TYPE i RETURNING VALUE(rv_pct) TYPE i . - PRIVATE SECTION. +private section. + + data MV_CV_TIME_NEXT type SY-UZEIT . + data MV_CV_DATUM_NEXT type SY-DATUM . ENDCLASS. @@ -52,14 +55,31 @@ CLASS ZCL_ABAPGIT_PROGRESS IMPLEMENTATION. METHOD show. - DATA: lv_pct TYPE i. + DATA: lv_pct TYPE i. + DATA: lv_time TYPE t. + + CONSTANTS: c_wait_secs TYPE i VALUE 2. lv_pct = calc_pct( iv_current ). - CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' - EXPORTING - percentage = lv_pct - text = iv_text. + GET TIME. + lv_time = sy-uzeit. + IF mv_cv_time_next IS INITIAL AND mv_cv_datum_next IS INITIAL. + mv_cv_time_next = lv_time. + mv_cv_datum_next = sy-datum. + ENDIF. + + "We only do a progress indication if enough time has passed + IF lv_time >= mv_cv_time_next AND sy-datum = mv_cv_datum_next OR + sy-datum > mv_cv_datum_next. + + CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' + EXPORTING + percentage = lv_pct + text = iv_text. + mv_cv_time_next = lv_time + c_wait_secs. + + ENDIF. ENDMETHOD. ENDCLASS. diff --git a/src/utils/zcl_abapgit_progress.clas.xml b/src/utils/zcl_abapgit_progress.clas.xml index e12404479..14b78dec7 100644 --- a/src/utils/zcl_abapgit_progress.clas.xml +++ b/src/utils/zcl_abapgit_progress.clas.xml @@ -14,6 +14,20 @@ X X + + + ZCL_ABAPGIT_PROGRESS + MV_CV_DATUM_NEXT + E + Date or Earliest, Next Progress Display + + + ZCL_ABAPGIT_PROGRESS + MV_CV_TIME_NEXT + E + Time of Earliest, Next Progress Display + + From 0f740d89b7e50610de9aa3fafc64396011b67181 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=BCnter?= Date: Thu, 5 Jul 2018 20:34:46 +0200 Subject: [PATCH 123/136] Update other-articles-and-presentations.md --- docs/other-articles-and-presentations.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/other-articles-and-presentations.md b/docs/other-articles-and-presentations.md index fdefa2b2a..ab9e3a874 100644 --- a/docs/other-articles-and-presentations.md +++ b/docs/other-articles-and-presentations.md @@ -84,3 +84,5 @@ SAP Teched Barcelona [Is SAP’s ABAP a special snowflake or has a Git run it over?](https://diginomica.com/2018/07/03/is-saps-abap-a-special-snowflake-or-has-a-git-run-it-over/) - Den Howlett [ORGANISIERE DEINE ARBEIT MIT ABAPGIT ](https://inspiricon.de/abapgit/) -Andra Atanasoaie + +[Moderne ABAP Entwicklung mit abapGit](https://de.slideshare.net/ChristianGnter/moderne-abap-entwicklung-mit-abapgit) - Christian Günter From ad5ae2a185420157304252b516ac5a9b5473819e Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Thu, 28 Jun 2018 10:23:45 +0000 Subject: [PATCH 124/136] delete empty packages --- src/objects/zcl_abapgit_object_devc.clas.abap | 152 +++++++++++++--- src/zcl_abapgit_dependencies.clas.abap | 47 ++++- ...abapgit_dependencies.clas.testclasses.abap | 168 ++++++++++++++++++ src/zcl_abapgit_dependencies.clas.xml | 1 + 4 files changed, 342 insertions(+), 26 deletions(-) create mode 100644 src/zcl_abapgit_dependencies.clas.testclasses.abap diff --git a/src/objects/zcl_abapgit_object_devc.clas.abap b/src/objects/zcl_abapgit_object_devc.clas.abap index cd5f50025..20a8d8996 100644 --- a/src/objects/zcl_abapgit_object_devc.clas.abap +++ b/src/objects/zcl_abapgit_object_devc.clas.abap @@ -20,7 +20,16 @@ CLASS zcl_abapgit_object_devc DEFINITION PUBLIC RAISING zcx_abapgit_exception, set_lock IMPORTING ii_package TYPE REF TO if_package iv_lock TYPE abap_bool - RAISING zcx_abapgit_exception. + RAISING zcx_abapgit_exception, + is_empty + IMPORTING iv_package_name TYPE devclass + RETURNING VALUE(rv_is_empty) TYPE abap_bool + RAISING zcx_abapgit_exception, + load_package + IMPORTING iv_package_name TYPE devclass + RETURNING VALUE(ri_package) TYPE REF TO if_package + RAISING zcx_abapgit_exception. + DATA: mv_local_devclass TYPE devclass. ENDCLASS. @@ -39,24 +48,7 @@ CLASS zcl_abapgit_object_devc IMPLEMENTATION. METHOD get_package. IF me->zif_abapgit_object~exists( ) = abap_true. - cl_package_factory=>load_package( - EXPORTING - i_package_name = mv_local_devclass - i_force_reload = abap_true - IMPORTING - e_package = ri_package - EXCEPTIONS - object_not_existing = 1 - unexpected_error = 2 - intern_err = 3 - no_access = 4 - object_locked_and_modified = 5 - OTHERS = 6 ). - IF sy-subrc = 1. - RETURN. - ELSEIF sy-subrc <> 0. - zcx_abapgit_exception=>raise_t100( ). - ENDIF. + ri_package = load_package( mv_local_devclass ). ENDIF. ENDMETHOD. @@ -209,12 +201,83 @@ CLASS zcl_abapgit_object_devc IMPLEMENTATION. METHOD zif_abapgit_object~delete. + + DATA: li_package TYPE REF TO if_package, + lv_package TYPE devclass. + " Package deletion is a bit tricky. A package can only be deleted if there are no objects " contained in it. This includes subpackages, so first the leaf packages need to be deleted. " Unfortunately deleted objects that are still contained in an unreleased transport request " also count towards the contained objects counter. - " -> Package deletion is currently not supported by abapGit - RETURN. + " -> Currently we delete only empty packages + " + " If objects are deleted, the TADIR entry is deleted when the transport request is released. + " So before we can delete the package, the transport which deletes the objects + " in the package has to be released. + + lv_package = ms_item-obj_name. + + IF is_empty( lv_package ) = abap_true. + + li_package = load_package( lv_package ). + + IF li_package IS NOT BOUND. + RETURN. + ENDIF. + + li_package->set_changeable( + EXPORTING + i_changeable = abap_true + i_suppress_dialog = abap_true + EXCEPTIONS + object_locked_by_other_user = 1 + permission_failure = 2 + object_already_changeable = 3 + object_already_unlocked = 4 + object_just_created = 5 + object_deleted = 6 + object_modified = 7 + object_not_existing = 8 + object_invalid = 9 + unexpected_error = 10 + OTHERS = 11 ). + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise_t100( ). + ENDIF. + + li_package->delete( + EXPORTING + i_suppress_dialog = abap_true + EXCEPTIONS + object_not_empty = 1 + object_not_changeable = 2 + object_invalid = 3 + intern_err = 4 + OTHERS = 5 ). + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise_t100( ). + ENDIF. + + li_package->save( + EXPORTING + i_suppress_dialog = abap_true + EXCEPTIONS + object_invalid = 1 + object_not_changeable = 2 + cancelled_in_corr = 3 + permission_failure = 4 + unexpected_error = 5 + intern_err = 6 + OTHERS = 7 ). + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise_t100( ). + ENDIF. + + ENDIF. + ENDMETHOD. @@ -558,4 +621,51 @@ CLASS zcl_abapgit_object_devc IMPLEMENTATION. ENDMETHOD. + + METHOD is_empty. + + DATA: lv_object_name TYPE tadir-obj_name, + lt_subpackages TYPE zif_abapgit_sap_package=>ty_devclass_tt. + + lt_subpackages = zcl_abapgit_factory=>get_sap_package( iv_package_name )->list_subpackages( ). + + IF lines( lt_subpackages ) > 0. + rv_is_empty = abap_false. + RETURN. + ENDIF. + + SELECT SINGLE obj_name + FROM tadir + INTO lv_object_name + WHERE pgmid = 'R3TR' + AND NOT ( object = 'DEVC' AND obj_name = iv_package_name ) + AND devclass = iv_package_name. + rv_is_empty = boolc( sy-subrc <> 0 ). + + ENDMETHOD. + + + METHOD load_package. + + cl_package_factory=>load_package( + EXPORTING + i_package_name = iv_package_name + i_force_reload = abap_true + IMPORTING + e_package = ri_package + EXCEPTIONS + object_not_existing = 1 + unexpected_error = 2 + intern_err = 3 + no_access = 4 + object_locked_and_modified = 5 + OTHERS = 6 ). + IF sy-subrc = 1. + RETURN. + ELSEIF sy-subrc <> 0. + zcx_abapgit_exception=>raise_t100( ). + ENDIF. + + ENDMETHOD. + ENDCLASS. diff --git a/src/zcl_abapgit_dependencies.clas.abap b/src/zcl_abapgit_dependencies.clas.abap index 3131f6d8e..54de4a95b 100644 --- a/src/zcl_abapgit_dependencies.clas.abap +++ b/src/zcl_abapgit_dependencies.clas.abap @@ -22,7 +22,6 @@ CLASS zcl_abapgit_dependencies DEFINITION !ct_tadir TYPE ty_tadir_tt RAISING zcx_abapgit_exception . - PRIVATE SECTION. TYPES: @@ -51,14 +50,17 @@ CLASS zcl_abapgit_dependencies DEFINITION zcx_abapgit_exception . CLASS-METHODS get_ddls_dependencies IMPORTING - !iv_ddls_name TYPE tadir-obj_name + iv_ddls_name TYPE tadir-obj_name RETURNING VALUE(rt_dependency) TYPE tty_dedenpency . + CLASS-METHODS resolve_packages + CHANGING + ct_tadir TYPE zcl_abapgit_dependencies=>ty_tadir_tt. ENDCLASS. -CLASS ZCL_ABAPGIT_DEPENDENCIES IMPLEMENTATION. +CLASS zcl_abapgit_dependencies IMPLEMENTATION. METHOD get_ddls_dependencies. @@ -84,14 +86,16 @@ CLASS ZCL_ABAPGIT_DEPENDENCIES IMPLEMENTATION. METHOD resolve. - DATA: lv_tabclass TYPE dd02l-tabclass. + DATA: lv_tabclass TYPE dd02l-tabclass. - FIELD-SYMBOLS: LIKE LINE OF ct_tadir. + FIELD-SYMBOLS: LIKE LINE OF ct_tadir. * misuse field KORRNUM to fix deletion sequence LOOP AT ct_tadir ASSIGNING . CASE -object. + WHEN 'DEVC'. + -korrnum = '9990'. WHEN 'IATU'. -korrnum = '5500'. WHEN 'IARP'. @@ -137,6 +141,7 @@ CLASS ZCL_ABAPGIT_DEPENDENCIES IMPLEMENTATION. ENDLOOP. resolve_ddic( CHANGING ct_tadir = ct_tadir ). + resolve_packages( CHANGING ct_tadir = ct_tadir ). SORT ct_tadir BY korrnum ASCENDING. @@ -292,4 +297,36 @@ CLASS ZCL_ABAPGIT_DEPENDENCIES IMPLEMENTATION. ENDDO. ENDMETHOD. "resolve_ddic + + + METHOD resolve_packages. + + DATA: lt_subpackages TYPE zif_abapgit_sap_package=>ty_devclass_tt. + + FIELD-SYMBOLS: LIKE LINE OF ct_tadir, + LIKE LINE OF lt_subpackages, + LIKE LINE OF ct_tadir. + + " List subpackage before corresponding superpackage + + LOOP AT ct_tadir ASSIGNING + WHERE object = 'DEVC'. + + lt_subpackages = zcl_abapgit_factory=>get_sap_package( |{ -obj_name }| )->list_subpackages( ). + + LOOP AT lt_subpackages ASSIGNING . + + READ TABLE ct_tadir ASSIGNING + WITH KEY object = 'DEVC' + obj_name = . + IF sy-subrc = 0. + -korrnum = condense( |{ -korrnum - 1 }| ). + ENDIF. + + ENDLOOP. + + ENDLOOP. + + ENDMETHOD. + ENDCLASS. diff --git a/src/zcl_abapgit_dependencies.clas.testclasses.abap b/src/zcl_abapgit_dependencies.clas.testclasses.abap new file mode 100644 index 000000000..aa039edc9 --- /dev/null +++ b/src/zcl_abapgit_dependencies.clas.testclasses.abap @@ -0,0 +1,168 @@ +*"* use this source file for your ABAP unit test classes +CLASS ltd_sap_package DEFINITION FOR TESTING. + + PUBLIC SECTION. + TYPES: + tty_package TYPE STANDARD TABLE OF devclass + WITH NON-UNIQUE DEFAULT KEY. + + METHODS: + constructor + IMPORTING + iv_package TYPE devclass, + + set_sub_packages + IMPORTING + it_sub_packages TYPE tty_package. + + INTERFACES: zif_abapgit_sap_package PARTIALLY IMPLEMENTED. + + PRIVATE SECTION. + DATA: mv_package TYPE devclass, + mt_sub_packages TYPE tty_package. + +ENDCLASS. + +CLASS ltd_sap_package IMPLEMENTATION. + + METHOD constructor. + + mv_package = iv_package. + + ENDMETHOD. + + METHOD zif_abapgit_sap_package~list_subpackages. + + DATA: ls_package LIKE LINE OF rt_list. + FIELD-SYMBOLS: TYPE devclass. + + IF mv_package = 'Z_MAIN'. + + rt_list = mt_sub_packages. + + ENDIF. + + ENDMETHOD. + + + METHOD set_sub_packages. + + mt_sub_packages = it_sub_packages. + + ENDMETHOD. + +ENDCLASS. + +CLASS ltcl_resolve_packages DEFINITION FOR TESTING + DURATION SHORT + RISK LEVEL HARMLESS. + + PRIVATE SECTION. + DATA: + mt_tadir TYPE zcl_abapgit_dependencies=>ty_tadir_tt, + mt_sub_packages TYPE ltd_sap_package=>tty_package. + + METHODS: + resolve_single FOR TESTING RAISING cx_static_check, + + given_tadir + IMPORTING + iv_object TYPE tadir-object + iv_obj_name TYPE tadir-obj_name + iv_korrnum TYPE tadir-korrnum + iv_super_package TYPE devclass, + + when_packages_are_resolved, + + then_korrnum_should_be + IMPORTING + iv_line TYPE i + iv_korrnum TYPE tadir-korrnum. + +ENDCLASS. + +CLASS zcl_abapgit_dependencies DEFINITION LOCAL FRIENDS ltcl_resolve_packages. + +CLASS ltcl_resolve_packages IMPLEMENTATION. + + METHOD resolve_single. + + + given_tadir( iv_object = 'DEVC' + iv_obj_name = 'Z_MAIN' + iv_korrnum = '9990' + iv_super_package = '' ). + + given_tadir( iv_object = 'DEVC' + iv_obj_name = 'Z_SUB1' + iv_korrnum = '9990' + iv_super_package = 'Z_MAIN' ). + + given_tadir( iv_object = 'DEVC' + iv_obj_name = 'Z_SUB2' + iv_korrnum = '9990' + iv_super_package = 'Z_MAIN' ). + + when_packages_are_resolved( ). + + then_korrnum_should_be( iv_line = 1 + iv_korrnum = '9990' ). + then_korrnum_should_be( iv_line = 2 + iv_korrnum = '9989' ). + then_korrnum_should_be( iv_line = 3 + iv_korrnum = '9989' ). + + ENDMETHOD. + + + METHOD given_tadir. + + DATA: ls_tadir LIKE LINE OF mt_tadir, + lv_package TYPE devclass. + + ls_tadir-object = iv_object. + ls_tadir-obj_name = iv_obj_name. + ls_tadir-korrnum = iv_korrnum. + INSERT ls_tadir INTO TABLE mt_tadir. + + IF iv_super_package IS NOT INITIAL. + lv_package = iv_obj_name. + INSERT lv_package INTO TABLE mt_sub_packages. + ENDIF. + + ENDMETHOD. + + + METHOD when_packages_are_resolved. + + DATA: lo_mock_sap_package TYPE REF TO ltd_sap_package. + + CREATE OBJECT lo_mock_sap_package + EXPORTING + iv_package = 'Z_MAIN'. + + lo_mock_sap_package->set_sub_packages( mt_sub_packages ). + + zcl_abapgit_injector=>set_sap_package( iv_package = 'Z_MAIN' + ii_sap_package = lo_mock_sap_package ). + + zcl_abapgit_dependencies=>resolve_packages( + CHANGING + ct_tadir = mt_tadir ). + + ENDMETHOD. + + + METHOD then_korrnum_should_be. + + FIELD-SYMBOLS: LIKE LINE OF mt_tadir. + + READ TABLE mt_tadir INDEX iv_line + ASSIGNING . + + cl_abap_unit_assert=>assert_equals( exp = iv_korrnum + act = -korrnum ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/zcl_abapgit_dependencies.clas.xml b/src/zcl_abapgit_dependencies.clas.xml index 2458887eb..58a4f2c7a 100644 --- a/src/zcl_abapgit_dependencies.clas.xml +++ b/src/zcl_abapgit_dependencies.clas.xml @@ -13,6 +13,7 @@ X X X + X From e3676de797447650f51936252fabcca1bb069f13 Mon Sep 17 00:00:00 2001 From: COPAT Date: Thu, 5 Jul 2018 23:35:29 +0200 Subject: [PATCH 125/136] validate sub and super packages from repos validate sub and super packages from repos --- src/zcl_abapgit_repo_srv.clas.abap | 37 +++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/src/zcl_abapgit_repo_srv.clas.abap b/src/zcl_abapgit_repo_srv.clas.abap index 98cae9376..15a1b36f2 100644 --- a/src/zcl_abapgit_repo_srv.clas.abap +++ b/src/zcl_abapgit_repo_srv.clas.abap @@ -35,14 +35,21 @@ CLASS zcl_abapgit_repo_srv DEFINITION VALUE(rv_allowed) TYPE abap_bool . METHODS add IMPORTING - !io_repo TYPE REF TO zcl_abapgit_repo + io_repo TYPE REF TO zcl_abapgit_repo RAISING zcx_abapgit_exception . + METHODS validate_sub_super_packages + IMPORTING + iv_package TYPE devclass + it_repos TYPE zif_abapgit_persistence=>tt_repo + RAISING + zcx_abapgit_exception. + ENDCLASS. -CLASS ZCL_ABAPGIT_REPO_SRV IMPLEMENTATION. +CLASS zcl_abapgit_repo_srv IMPLEMENTATION. METHOD add. @@ -323,7 +330,6 @@ CLASS ZCL_ABAPGIT_REPO_SRV IMPLEMENTATION. DATA: lv_as4user TYPE tdevc-as4user, lt_repos TYPE zif_abapgit_persistence=>tt_repo. - IF iv_package IS INITIAL. zcx_abapgit_exception=>raise( 'add, package empty' ). ENDIF. @@ -350,5 +356,30 @@ CLASS ZCL_ABAPGIT_REPO_SRV IMPLEMENTATION. zcx_abapgit_exception=>raise( |Package { iv_package } already in use| ). ENDIF. + validate_sub_super_packages( + iv_package = iv_package + it_repos = lt_repos ). ENDMETHOD. + + METHOD validate_sub_super_packages. + DATA: + ls_repo LIKE LINE OF it_repos, + lo_package TYPE REF TO zif_abapgit_sap_package, + lt_packages TYPE zif_abapgit_sap_package=>ty_devclass_tt, + lo_repo TYPE REF TO zcl_abapgit_repo. + + LOOP AT it_repos INTO ls_repo. + lo_repo = get( ls_repo-key ). + + lo_package = zcl_abapgit_factory=>get_sap_package( ls_repo-package ). + APPEND LINES OF lo_package->list_subpackages( ) TO lt_packages. + APPEND LINES OF lo_package->list_superpackages( ) TO lt_packages. + READ TABLE lt_packages TRANSPORTING NO FIELDS + WITH KEY table_line = iv_package. + IF sy-subrc = 0. + zcx_abapgit_exception=>raise( |Repository { lo_repo->get_name( ) } already contains { iv_package } | ). + ENDIF. + ENDLOOP. + ENDMETHOD. + ENDCLASS. From 6db1b2fbfaf61ac422f893c817dce854d89109fc Mon Sep 17 00:00:00 2001 From: larshp Date: Fri, 6 Jul 2018 12:20:01 +0000 Subject: [PATCH 126/136] pretty print --- src/utils/zcl_abapgit_progress.clas.abap | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/utils/zcl_abapgit_progress.clas.abap b/src/utils/zcl_abapgit_progress.clas.abap index 5b55e9b3d..eac593c87 100644 --- a/src/utils/zcl_abapgit_progress.clas.abap +++ b/src/utils/zcl_abapgit_progress.clas.abap @@ -21,10 +21,10 @@ CLASS zcl_abapgit_progress DEFINITION !iv_current TYPE i RETURNING VALUE(rv_pct) TYPE i . -private section. + PRIVATE SECTION. - data MV_CV_TIME_NEXT type SY-UZEIT . - data MV_CV_DATUM_NEXT type SY-DATUM . + DATA mv_cv_time_next TYPE sy-uzeit . + DATA mv_cv_datum_next TYPE sy-datum . ENDCLASS. From 28f1736a41f6d9959360806787016a8720621cb6 Mon Sep 17 00:00:00 2001 From: larshp Date: Fri, 6 Jul 2018 12:35:16 +0000 Subject: [PATCH 127/136] 1.71.0 --- src/zif_abapgit_definitions.intf.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index 0120a2021..bd6287c45 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -326,7 +326,7 @@ INTERFACE zif_abapgit_definitions PUBLIC. END OF ty_s_user_settings. CONSTANTS gc_xml_version TYPE string VALUE 'v1.0.0' ##NO_TEXT. - CONSTANTS gc_abap_version TYPE string VALUE '1.70.0' ##NO_TEXT. + CONSTANTS gc_abap_version TYPE string VALUE '1.71.0' ##NO_TEXT. CONSTANTS: BEGIN OF gc_type, commit TYPE zif_abapgit_definitions=>ty_type VALUE 'commit', "#EC NOTEXT From 47a313602df3a8a89a93591893b88d28e4dfd86a Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Fri, 6 Jul 2018 14:40:07 +0200 Subject: [PATCH 128/136] v1.71.0 --- changelog.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/changelog.txt b/changelog.txt index bc864bbc2..ffea1dfba 100644 --- a/changelog.txt +++ b/changelog.txt @@ -8,6 +8,16 @@ Legend + : added - : removed +2018-07-06 v1.71.0 +------------------ +* validate sub and super packages when installing +! delete empty packages ++ UI for editing requirements +! track user which created repo ++ new repository overview page +* delete PARA after DTEL +* TABL, check existence before SELECTing + 2018-06-28 v1.70.0 ------------------ + possibility to run code inspector before staging From 7ec692389e59799ae1c3f4c01bbfbe23fec5422a Mon Sep 17 00:00:00 2001 From: mkaesemann <32765685+mkaesemann@users.noreply.github.com> Date: Fri, 6 Jul 2018 14:54:47 +0200 Subject: [PATCH 129/136] Fixed Date Calculation for Refresh Interval Detection Forgot to recalculate the date, so we don't run into problems if someone works late at night --- src/utils/zcl_abapgit_progress.clas.abap | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/utils/zcl_abapgit_progress.clas.abap b/src/utils/zcl_abapgit_progress.clas.abap index eac593c87..be23eac73 100644 --- a/src/utils/zcl_abapgit_progress.clas.abap +++ b/src/utils/zcl_abapgit_progress.clas.abap @@ -80,6 +80,12 @@ CLASS ZCL_ABAPGIT_PROGRESS IMPLEMENTATION. mv_cv_time_next = lv_time + c_wait_secs. ENDIF. + IF sy-datum > mv_cv_datum_next. + mv_cv_datum_next = sy-datum. + ENDIF. + IF mv_cv_time_next < lv_time. + mv_cv_datum_next = sy-datum + 1. + ENDIF. ENDMETHOD. ENDCLASS. From b80a10024b3f4cf95289cf78d52c1bc184428f6d Mon Sep 17 00:00:00 2001 From: mkaesemann <32765685+mkaesemann@users.noreply.github.com> Date: Fri, 6 Jul 2018 15:16:28 +0200 Subject: [PATCH 130/136] Moved progress percentage calculation into execution block Moved the progress percentage calculation into the execution block, because we don't need to calculate the percentage if we are not going to display it. --- src/utils/zcl_abapgit_progress.clas.abap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/zcl_abapgit_progress.clas.abap b/src/utils/zcl_abapgit_progress.clas.abap index be23eac73..0cd04d52d 100644 --- a/src/utils/zcl_abapgit_progress.clas.abap +++ b/src/utils/zcl_abapgit_progress.clas.abap @@ -60,8 +60,6 @@ CLASS ZCL_ABAPGIT_PROGRESS IMPLEMENTATION. CONSTANTS: c_wait_secs TYPE i VALUE 2. - lv_pct = calc_pct( iv_current ). - GET TIME. lv_time = sy-uzeit. IF mv_cv_time_next IS INITIAL AND mv_cv_datum_next IS INITIAL. @@ -73,6 +71,8 @@ CLASS ZCL_ABAPGIT_PROGRESS IMPLEMENTATION. IF lv_time >= mv_cv_time_next AND sy-datum = mv_cv_datum_next OR sy-datum > mv_cv_datum_next. + lv_pct = calc_pct( iv_current ). + CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' EXPORTING percentage = lv_pct From f7f78dfc268d01a247fe3cb6fd848da4c2bc25ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20K=C3=A4semann?= Date: Fri, 6 Jul 2018 14:24:40 +0200 Subject: [PATCH 131/136] Performance Improvement in X_TO_BITBYTE Conversion - Changed: Since X_TO_BITBYTE only converts a single byte to a bitstring, it is faster to use direct addressing instead of a loop/concatenate pair, since concatenate on characters has to process the whole char array in each run. --- src/utils/zcl_abapgit_convert.clas.abap | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/utils/zcl_abapgit_convert.clas.abap b/src/utils/zcl_abapgit_convert.clas.abap index 7e127bb93..f0922e3c3 100644 --- a/src/utils/zcl_abapgit_convert.clas.abap +++ b/src/utils/zcl_abapgit_convert.clas.abap @@ -159,10 +159,14 @@ CLASS ZCL_ABAPGIT_CONVERT IMPLEMENTATION. CLEAR rv_bitbyte. - DO 8 TIMES. - GET BIT sy-index OF iv_x INTO lv_b. - CONCATENATE rv_bitbyte lv_b INTO rv_bitbyte. - ENDDO. + GET BIT 1 OF iv_x INTO rv_bitbyte+0(1). + GET BIT 2 OF iv_x INTO rv_bitbyte+1(1). + GET BIT 3 OF iv_x INTO rv_bitbyte+2(1). + GET BIT 4 OF iv_x INTO rv_bitbyte+3(1). + GET BIT 5 OF iv_x INTO rv_bitbyte+4(1). + GET BIT 6 OF iv_x INTO rv_bitbyte+5(1). + GET BIT 7 OF iv_x INTO rv_bitbyte+6(1). + GET BIT 8 OF iv_x INTO rv_bitbyte+7(1). ENDMETHOD. "x_to_bitbyte ENDCLASS. From 73f2bdd13b7f97eb7084e5ef7d4522bba5380be4 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Fri, 6 Jul 2018 13:46:49 +0000 Subject: [PATCH 132/136] Add creator and created at to overview page --- .../zcl_abapgit_gui_page_repo_over.clas.abap | 377 +++++++++++------- 1 file changed, 243 insertions(+), 134 deletions(-) diff --git a/src/ui/zcl_abapgit_gui_page_repo_over.clas.abap b/src/ui/zcl_abapgit_gui_page_repo_over.clas.abap index e1c19fada..bd281ea2b 100644 --- a/src/ui/zcl_abapgit_gui_page_repo_over.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_repo_over.clas.abap @@ -18,13 +18,15 @@ CLASS zcl_abapgit_gui_page_repo_over DEFINITION PRIVATE SECTION. TYPES: BEGIN OF ty_overview, - favorite TYPE string, - type TYPE string, - key TYPE string, - name TYPE string, - url TYPE string, - package TYPE string, - branch TYPE string, + favorite TYPE string, + type TYPE string, + key TYPE string, + name TYPE string, + url TYPE string, + package TYPE string, + branch TYPE string, + created_by TYPE string, + created_at TYPE string, END OF ty_overview, tty_overview TYPE STANDARD TABLE OF ty_overview WITH NON-UNIQUE DEFAULT KEY. @@ -87,7 +89,33 @@ CLASS zcl_abapgit_gui_page_repo_over DEFINITION RETURNING VALUE(rt_overview) TYPE zcl_abapgit_gui_page_repo_over=>tty_overview RAISING - zcx_abapgit_exception. + zcx_abapgit_exception, + + render_table_header + IMPORTING + io_html TYPE REF TO zcl_abapgit_html, + + render_table + IMPORTING + io_html TYPE REF TO zcl_abapgit_html + it_overview TYPE zcl_abapgit_gui_page_repo_over=>tty_overview, + + render_table_body + IMPORTING + io_html TYPE REF TO zcl_abapgit_html + it_overview TYPE zcl_abapgit_gui_page_repo_over=>tty_overview, + + render_order_by + IMPORTING + io_html TYPE REF TO zcl_abapgit_html, + + render_order_by_direction + IMPORTING + io_html TYPE REF TO zcl_abapgit_html, + + render_header_bar + IMPORTING + io_html TYPE REF TO zcl_abapgit_html. ENDCLASS. @@ -128,11 +156,13 @@ CLASS zcl_abapgit_gui_page_repo_over IMPLEMENTATION. IF mv_filter IS NOT INITIAL. - DELETE ct_overview WHERE key NS mv_filter - AND name NS mv_filter - AND url NS mv_filter - AND package NS mv_filter - AND branch NS mv_filter. + DELETE ct_overview WHERE key NS mv_filter + AND name NS mv_filter + AND url NS mv_filter + AND package NS mv_filter + AND branch NS mv_filter + AND created_by NS mv_filter + AND created_at NS mv_filter. ENDIF. @@ -169,26 +199,51 @@ CLASS zcl_abapgit_gui_page_repo_over IMPLEMENTATION. METHOD map_repo_list_to_overview. - DATA: ls_overview LIKE LINE OF rt_overview, - lo_repo_srv TYPE REF TO zcl_abapgit_repo, - lo_user TYPE REF TO zcl_abapgit_persistence_user. + DATA: ls_overview LIKE LINE OF rt_overview, + lo_repo_srv TYPE REF TO zcl_abapgit_repo, + lo_user TYPE REF TO zcl_abapgit_persistence_user, + lv_time_zone TYPE timezone, + lv_date TYPE d, + lv_time TYPE t. FIELD-SYMBOLS: LIKE LINE OF it_repo_list. lo_user = zcl_abapgit_persistence_user=>get_instance( ). + CALL FUNCTION 'GET_SYSTEM_TIMEZONE' + IMPORTING + timezone = lv_time_zone + EXCEPTIONS + customizing_missing = 1 + OTHERS = 2. + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise_t100( ). + ENDIF. + LOOP AT it_repo_list ASSIGNING . CLEAR: ls_overview. lo_repo_srv = zcl_abapgit_repo_srv=>get_instance( )->get( -key ). - ls_overview-favorite = lo_user->is_favorite_repo( -key ). - ls_overview-type = -offline. - ls_overview-key = -key. - ls_overview-name = lo_repo_srv->get_name( ). - ls_overview-url = -url. - ls_overview-package = -package. - ls_overview-branch = zcl_abapgit_git_branch_list=>get_display_name( -branch_name ). + ls_overview-favorite = lo_user->is_favorite_repo( -key ). + ls_overview-type = -offline. + ls_overview-key = -key. + ls_overview-name = lo_repo_srv->get_name( ). + ls_overview-url = -url. + ls_overview-package = -package. + ls_overview-branch = zcl_abapgit_git_branch_list=>get_display_name( -branch_name ). + ls_overview-created_by = -created_by. + + IF -created_at IS NOT INITIAL. + CONVERT TIME STAMP -created_at + TIME ZONE lv_time_zone + INTO DATE lv_date + TIME lv_time. + + ls_overview-created_at = |{ lv_date DATE = USER } { lv_time TIME = USER }|. + ENDIF. + INSERT ls_overview INTO TABLE rt_overview. ENDLOOP. @@ -255,13 +310,8 @@ CLASS zcl_abapgit_gui_page_repo_over IMPLEMENTATION. METHOD render_content. - DATA: lv_trclass TYPE string, - lo_persistence_repo TYPE REF TO zcl_abapgit_persistence_repo, - lt_overview TYPE tty_overview, - lv_type_icon TYPE string, - lv_favorite_icon TYPE string. - - FIELD-SYMBOLS: LIKE LINE OF lt_overview. + DATA: lo_persistence_repo TYPE REF TO zcl_abapgit_persistence_repo, + lt_overview TYPE tty_overview. CREATE OBJECT lo_persistence_repo. @@ -278,112 +328,11 @@ CLASS zcl_abapgit_gui_page_repo_over IMPLEMENTATION. ro_html->add( |
    | ). - ro_html->add( |
    | ). + render_header_bar( ro_html ). - ro_html->add( |Order by: | ). - - ro_html->add( || ). - - ro_html->add( render_text_input( iv_name = |filter| - iv_label = |Filter: | - iv_value = mv_filter ) ). - - ro_html->add( || ). - - ro_html->add( |
    | ). - - ro_html->add( |
    | ). - ro_html->add( |
    | ). - - ro_html->add( |
    | ). - ro_html->add( || ). - - " Header - ro_html->add( || ). - ro_html->add( || ). - ro_html->add( || ). - ro_html->add( || ). - ro_html->add( || ). - ro_html->add( || ). - ro_html->add( || ). - ro_html->add( || ). - ro_html->add( || ). - ro_html->add( || ). - ro_html->add( '' ). - ro_html->add( '' ). - ro_html->add( '' ). - - - LOOP AT lt_overview ASSIGNING . - CLEAR lv_trclass. - IF sy-tabix = 1. - lv_trclass = ' class="firstrow"' ##NO_TEXT. - ENDIF. - - IF -type = abap_true. - lv_type_icon = 'plug/darkgrey'. - ELSE. - lv_type_icon = 'cloud-upload/blue'. - ENDIF. - - IF -favorite = abap_true. - lv_favorite_icon = 'star/blue'. - ELSE. - lv_favorite_icon = 'star/grey'. - ENDIF. - - ro_html->add( || ). - ro_html->add( || ). - ro_html->add( || ). - - ro_html->add( || ). - ro_html->add( || ). - ro_html->add( || ). - ro_html->add( || ). - ro_html->add( || ). - ro_html->add( || ). - ro_html->add( || ). - ENDLOOP. - - ro_html->add( || ). - ro_html->add( |
    FavoriteTypeKeyNameUrlPackageBranch name
    | ). - ro_html->add_a( iv_act = |{ zif_abapgit_definitions=>gc_action-repo_toggle_fav }?{ -key }| - iv_txt = zcl_abapgit_html=>icon( iv_name = lv_favorite_icon - iv_class = 'pad-sides' - iv_hint = 'Click to toggle favorite' ) ). - ro_html->add( |{ zcl_abapgit_html=>icon( lv_type_icon ) }{ -key }{ zcl_abapgit_html=>a( iv_txt = -name - iv_act = |{ gc_action-select }?{ -key }| ) }{ -url }{ -package }{ -branch }| ). - ro_html->add( |
    | ). ro_html->add( |
    | ). ENDMETHOD. "render_content @@ -445,4 +394,164 @@ CLASS zcl_abapgit_gui_page_repo_over IMPLEMENTATION. ENDCASE. ENDMETHOD. + + METHOD render_table_header. + + io_html->add( || ). + io_html->add( || ). + io_html->add( |Favorite| ). + io_html->add( |Type| ). + io_html->add( |Key| ). + io_html->add( |Name| ). + io_html->add( |Url| ). + io_html->add( |Package| ). + io_html->add( |Branch name| ). + io_html->add( |Creator| ). + io_html->add( |Created at| ). + io_html->add( || ). + io_html->add( '' ). + io_html->add( '' ). + io_html->add( '' ). + + ENDMETHOD. + + + METHOD render_table. + + io_html->add( |
    | ). + io_html->add( || ). + + render_table_header( io_html ). + render_table_body( io_html = io_html + it_overview = it_overview ). + + io_html->add( || ). + io_html->add( |
    | ). + + ENDMETHOD. + + + METHOD render_table_body. + + DATA: lv_trclass TYPE string, + lv_type_icon TYPE string, + lv_favorite_icon TYPE string. + + FIELD-SYMBOLS: LIKE LINE OF it_overview. + + LOOP AT it_overview ASSIGNING . + + CLEAR lv_trclass. + IF sy-tabix = 1. + lv_trclass = ' class="firstrow"' ##NO_TEXT. + ENDIF. + + IF -type = abap_true. + lv_type_icon = 'plug/darkgrey'. + ELSE. + lv_type_icon = 'cloud-upload/blue'. + ENDIF. + + IF -favorite = abap_true. + lv_favorite_icon = 'star/blue'. + ELSE. + lv_favorite_icon = 'star/grey'. + ENDIF. + + io_html->add( || ). + io_html->add( || ). + io_html->add_a( iv_act = |{ zif_abapgit_definitions=>gc_action-repo_toggle_fav }?{ -key }| + iv_txt = zcl_abapgit_html=>icon( iv_name = lv_favorite_icon + iv_class = 'pad-sides' + iv_hint = 'Click to toggle favorite' ) ). + io_html->add( || ). + io_html->add( |{ zcl_abapgit_html=>icon( lv_type_icon ) }| ). + + io_html->add( |{ -key }| ). + io_html->add( |{ zcl_abapgit_html=>a( iv_txt = -name + iv_act = |{ gc_action-select }?{ -key }| ) }| ). + io_html->add( |{ -url }| ). + io_html->add( |{ -package }| ). + io_html->add( |{ -branch }| ). + io_html->add( |{ -created_by }| ). + io_html->add( |{ -created_at }| ). + io_html->add( || ). + io_html->add( || ). + io_html->add( || ). + + ENDLOOP. + + ENDMETHOD. + + + METHOD render_order_by. + + io_html->add( |Order by: | ). + + ENDMETHOD. + + + METHOD render_order_by_direction. + + io_html->add( || ). + + ENDMETHOD. + + + METHOD render_header_bar. + + io_html->add( |
    | ). + + render_order_by( io_html ). + render_order_by_direction( io_html ). + + io_html->add( render_text_input( iv_name = |filter| + iv_label = |Filter: | + iv_value = mv_filter ) ). + + io_html->add( || ). + + io_html->add( |
    | ). + + io_html->add( || ). + io_html->add( |
    | ). + + ENDMETHOD. + ENDCLASS. From 14683c1aefecf5bc77bab5f375202e72a67c94fd Mon Sep 17 00:00:00 2001 From: larshp Date: Fri, 6 Jul 2018 13:51:01 +0000 Subject: [PATCH 133/136] PARA as DDIC, #1539 this will create the PARA object before the DTEL, tested ok via repo https://github.com/abapGit-tests/DTEL_with_PARA --- src/objects/zcl_abapgit_object_para.clas.abap | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/objects/zcl_abapgit_object_para.clas.abap b/src/objects/zcl_abapgit_object_para.clas.abap index 29e45fff7..5cc04d8ad 100644 --- a/src/objects/zcl_abapgit_object_para.clas.abap +++ b/src/objects/zcl_abapgit_object_para.clas.abap @@ -10,7 +10,7 @@ CLASS zcl_abapgit_object_para IMPLEMENTATION. METHOD zif_abapgit_object~has_changed_since. rv_changed = abap_true. - ENDMETHOD. "zif_abapgit_object~has_changed_since + ENDMETHOD. METHOD zif_abapgit_object~changed_by. * looks like "changed by user" is not stored in the database @@ -19,7 +19,9 @@ CLASS zcl_abapgit_object_para IMPLEMENTATION. METHOD zif_abapgit_object~get_metadata. rs_metadata = get_metadata( ). - ENDMETHOD. "zif_abapgit_object~get_metadata +* Data elements can refer to PARA objects + rs_metadata-ddic = abap_true. + ENDMETHOD. METHOD zif_abapgit_object~exists. @@ -30,7 +32,7 @@ CLASS zcl_abapgit_object_para IMPLEMENTATION. WHERE paramid = ms_item-obj_name. "#EC CI_GENBUFF rv_bool = boolc( sy-subrc = 0 ). - ENDMETHOD. "zif_abapgit_object~exists + ENDMETHOD. METHOD zif_abapgit_object~serialize. @@ -53,7 +55,7 @@ CLASS zcl_abapgit_object_para IMPLEMENTATION. io_xml->add( iv_name = 'TPARAT' ig_data = ls_tparat ). - ENDMETHOD. "serialize + ENDMETHOD. METHOD zif_abapgit_object~deserialize. * see fm RS_PARAMETER_ADD and RS_PARAMETER_EDIT @@ -99,7 +101,7 @@ CLASS zcl_abapgit_object_para IMPLEMENTATION. MODIFY tparat FROM ls_tparat. "#EC CI_SUBRC ASSERT sy-subrc = 0. - ENDMETHOD. "deserialize + ENDMETHOD. METHOD zif_abapgit_object~delete. @@ -117,7 +119,7 @@ CLASS zcl_abapgit_object_para IMPLEMENTATION. zcx_abapgit_exception=>raise( 'error from RS_PRAMETER_DELETE' ). ENDIF. - ENDMETHOD. "delete + ENDMETHOD. METHOD zif_abapgit_object~jump. @@ -128,7 +130,7 @@ CLASS zcl_abapgit_object_para IMPLEMENTATION. object_type = 'PARA' in_new_window = abap_true. - ENDMETHOD. "jump + ENDMETHOD. METHOD zif_abapgit_object~compare_to_remote_version. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. @@ -140,4 +142,4 @@ CLASS zcl_abapgit_object_para IMPLEMENTATION. ENDMETHOD. -ENDCLASS. "zcl_abapgit_object_para IMPLEMENTATION +ENDCLASS. From c6ebf2be1ff584153d70a4eb9c273f08f0d94655 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Fri, 6 Jul 2018 14:28:46 +0000 Subject: [PATCH 134/136] run code inspector after conflict resolution --- .../zcl_abapgit_gui_page_code_insp.clas.abap | 51 +++++++++++++++---- src/ui/zcl_abapgit_gui_page_merge.clas.abap | 24 ++++++--- 2 files changed, 60 insertions(+), 15 deletions(-) diff --git a/src/ui/zcl_abapgit_gui_page_code_insp.clas.abap b/src/ui/zcl_abapgit_gui_page_code_insp.clas.abap index 899e625ac..f28b7a014 100644 --- a/src/ui/zcl_abapgit_gui_page_code_insp.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_code_insp.clas.abap @@ -5,7 +5,8 @@ CLASS zcl_abapgit_gui_page_code_insp DEFINITION PUBLIC FINAL CREATE PUBLIC METHODS: constructor IMPORTING - io_repo TYPE REF TO zcl_abapgit_repo + io_repo TYPE REF TO zcl_abapgit_repo + io_stage TYPE REF TO zcl_abapgit_stage OPTIONAL RAISING zcx_abapgit_exception, @@ -25,12 +26,14 @@ CLASS zcl_abapgit_gui_page_code_insp DEFINITION PUBLIC FINAL CREATE PUBLIC PRIVATE SECTION. CONSTANTS: BEGIN OF c_actions, - stage TYPE string VALUE 'stage' ##NO_TEXT, - rerun TYPE string VALUE 'rerun' ##NO_TEXT, + stage TYPE string VALUE 'stage' ##NO_TEXT, + commit TYPE string VALUE 'commit' ##NO_TEXT, + rerun TYPE string VALUE 'rerun' ##NO_TEXT, END OF c_actions. DATA: - mt_result TYPE scit_alvlist. + mt_result TYPE scit_alvlist, + mo_stage TYPE REF TO zcl_abapgit_stage. METHODS: build_menu @@ -75,10 +78,24 @@ CLASS zcl_abapgit_gui_page_code_insp IMPLEMENTATION. 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. + IF mo_stage IS BOUND. + + " Staging info already available, we can directly + " offer to commit + + ro_menu->add( iv_txt = 'Commit' + iv_act = c_actions-commit + iv_cur = abap_false + iv_opt = lv_opt ) ##NO_TEXT. + + ELSE. + + ro_menu->add( iv_txt = 'Stage' + iv_act = c_actions-stage + iv_cur = abap_false + iv_opt = lv_opt ) ##NO_TEXT. + + ENDIF. ENDMETHOD. @@ -86,6 +103,7 @@ CLASS zcl_abapgit_gui_page_code_insp IMPLEMENTATION. METHOD constructor. super->constructor( ). mo_repo ?= io_repo. + mo_stage = io_stage. ms_control-page_title = 'Code Inspector'. run_code_inspector( ). ENDMETHOD. " constructor. @@ -178,14 +196,29 @@ CLASS zcl_abapgit_gui_page_code_insp IMPLEMENTATION. 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-commit. + + IF is_stage_allowed( ) = abap_true. + + CREATE OBJECT ei_page TYPE zcl_abapgit_gui_page_commit + EXPORTING + io_repo = mo_repo + io_stage = mo_stage. ev_state = zif_abapgit_definitions=>gc_event_state-new_page. ELSE. diff --git a/src/ui/zcl_abapgit_gui_page_merge.clas.abap b/src/ui/zcl_abapgit_gui_page_merge.clas.abap index bf88b8990..118d4dc3c 100644 --- a/src/ui/zcl_abapgit_gui_page_merge.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_merge.clas.abap @@ -38,7 +38,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GUI_PAGE_MERGE IMPLEMENTATION. +CLASS zcl_abapgit_gui_page_merge IMPLEMENTATION. METHOD build_menu. @@ -184,11 +184,23 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MERGE IMPLEMENTATION. zcx_abapgit_exception=>raise( 'nothing to merge' ). ENDIF. - CREATE OBJECT ei_page TYPE zcl_abapgit_gui_page_commit - EXPORTING - io_repo = mo_repo - io_stage = mo_merge->get_result( )-stage. - ev_state = zif_abapgit_definitions=>gc_event_state-new_page. + IF mo_repo->get_local_settings( )-code_inspector_check_variant IS NOT INITIAL. + + CREATE OBJECT ei_page TYPE zcl_abapgit_gui_page_code_insp + EXPORTING + io_repo = mo_repo + io_stage = mo_merge->get_result( )-stage. + ev_state = zif_abapgit_definitions=>gc_event_state-new_page. + + ELSE. + + CREATE OBJECT ei_page TYPE zcl_abapgit_gui_page_commit + EXPORTING + io_repo = mo_repo + io_stage = mo_merge->get_result( )-stage. + ev_state = zif_abapgit_definitions=>gc_event_state-new_page. + + ENDIF. WHEN c_actions-res_conflicts. CREATE OBJECT ei_page TYPE zcl_abapgit_gui_page_merge_res From e3df40eb51a61b3f4372da5b0dda8389765105cf Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sat, 7 Jul 2018 10:24:51 +0200 Subject: [PATCH 135/136] docs: add issue links to unsupported --- docs/ref-supported.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/ref-supported.md b/docs/ref-supported.md index 677ee3695..1eab3b9d5 100644 --- a/docs/ref-supported.md +++ b/docs/ref-supported.md @@ -9,6 +9,8 @@ Type | Description | Supported :------------ | :------------ | ------------: ACID | Checkpoint Group | Yes AOBJ | Archiving Object | [#804](https://github.com/larshp/abapGit/issues/804) +ASFC | Field Catalog | [#1578](https://github.com/larshp/abapGit/issues/1578) +ASIS | Archiving Information Structure | [#1579](https://github.com/larshp/abapGit/issues/1579) AUTH | Authorization Check Fields | Yes AVAS | Classification | [#1360](https://github.com/larshp/abapGit/issues/1360) BOBF | BOPF: Business Object Model | [#165](https://github.com/larshp/abapGit/issues/165) @@ -60,6 +62,8 @@ PDWS | Workflow templates | [#154](https://github.com/larshp/abapGit/issues/154) PINF | Package interface | Yes PRAG | Pragma in ABAP Source Code | Yes PROG | Program | Yes +SAJC | Application job catalog entry | [#1580](https://github.com/larshp/abapGit/issues/1580) +SAJT | Application job template | [1581](https://github.com/larshp/abapGit/issues/1581) SAMC | ABAP Messaging Channels | Yes SAPC | ABAP Push Channels | Yes SCP1 | BC Set or Customizing Profile | [#1004](https://github.com/larshp/abapGit/issues/1004) @@ -79,6 +83,7 @@ SOTS | All Concepts (OTR) of a Package - Long Texts | [#792](https://github.com/ SPLO | Format Types | Yes SPRX | Proxy Object | [#87](https://github.com/larshp/abapGit/issues/87) SUCU | Authorization Groups (TBRG_AUTH) | [#1434](https://github.com/larshp/abapGit/issues/1434) +SUSH | Assignment: Service --> Authorization Objects | [#1582](https://github.com/larshp/abapGit/issues/1582) SRFC | RFC Service | Yes SSFO | SAP Smart Form | Yes SSST | SAP Smart Style | Yes From 361a4b067a98635012c5eea146623d1dd78d39b2 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sat, 7 Jul 2018 10:40:27 +0200 Subject: [PATCH 136/136] docs: unit testing, #1390 --- docs/collections/_development/tests.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/collections/_development/tests.md b/docs/collections/_development/tests.md index 8f33ec891..27bd84f39 100644 --- a/docs/collections/_development/tests.md +++ b/docs/collections/_development/tests.md @@ -3,5 +3,8 @@ title: Unit Tests order: 70 --- -* Todo: Describe dependency lookup approach -* Todo: describe dangerous flag \ No newline at end of file +abapGit uses dependency lookup as an approach for writing unit tests, see example in ZCL_ABAPGIT_TADIR, ZCL_ABAPGIT_FACTORY, and ZCL_ABAPGIT_INJECTOR + +Unit tests that create and delete objects in the system are categorized as dangerous, these tests can be enabled via Advanced -> Settings + +Use organization https://github.com/abapGit-tests for storing serialization test cases