diff --git a/src/git/zcl_abapgit_git_pack.clas.testclasses.abap b/src/git/zcl_abapgit_git_pack.clas.testclasses.abap index bae77c2a9..b1339d7c2 100644 --- a/src/git/zcl_abapgit_git_pack.clas.testclasses.abap +++ b/src/git/zcl_abapgit_git_pack.clas.testclasses.abap @@ -318,3 +318,147 @@ CLASS ltcl_pack IMPLEMENTATION. ENDMETHOD. ENDCLASS. + +CLASS ltcl_git_pack_decode_commit DEFINITION FOR TESTING + RISK LEVEL HARMLESS DURATION SHORT FINAL. + + PUBLIC SECTION. + METHODS: + decode1 FOR TESTING + RAISING zcx_abapgit_exception, + decode2 FOR TESTING + RAISING zcx_abapgit_exception, + decode3 FOR TESTING + RAISING zcx_abapgit_exception. + + PRIVATE SECTION. + DATA: ms_raw TYPE zcl_abapgit_git_pack=>ty_commit, + mv_str TYPE string. + + METHODS: + setup, + decode + RAISING zcx_abapgit_exception, + add + IMPORTING iv_string TYPE string. + +ENDCLASS. + +CLASS ltcl_git_pack_decode_commit IMPLEMENTATION. + + METHOD setup. + CLEAR ms_raw. + CLEAR mv_str. + ENDMETHOD. + + METHOD add. + + CONCATENATE mv_str iv_string zif_abapgit_definitions=>gc_newline INTO mv_str. + + ENDMETHOD. + + METHOD decode. + + DATA: lv_xstr TYPE xstring. + + + lv_xstr = zcl_abapgit_convert=>string_to_xstring_utf8( mv_str ). + + ms_raw = zcl_abapgit_git_pack=>decode_commit( lv_xstr ). + + ENDMETHOD. + + METHOD decode1. + + add( 'tree tree' ). + add( 'parent parent1' ). + add( 'parent parent2' ). + add( 'author author' ). + add( 'committer committer' ). + add( '' ). + add( 'comment' ). + + decode( ). + + cl_abap_unit_assert=>assert_equals( + act = ms_raw-tree + exp = 'tree' ). + cl_abap_unit_assert=>assert_equals( + act = ms_raw-author + exp = 'author' ). + cl_abap_unit_assert=>assert_equals( + act = ms_raw-committer + exp = 'committer' ). + cl_abap_unit_assert=>assert_equals( + act = ms_raw-parent + exp = 'parent1' ). + cl_abap_unit_assert=>assert_equals( + act = ms_raw-parent2 + exp = 'parent2' ). + + cl_abap_unit_assert=>assert_char_cp( + act = ms_raw-body + exp = 'comment+' ). + + ENDMETHOD. + + METHOD decode2. + + add( 'tree tree' ). + add( 'author author' ). + add( 'committer committer' ). + add( '' ). + add( 'comment' ). + + decode( ). + + cl_abap_unit_assert=>assert_equals( + act = ms_raw-tree + exp = 'tree' ). + cl_abap_unit_assert=>assert_equals( + act = ms_raw-author + exp = 'author' ). + cl_abap_unit_assert=>assert_equals( + act = ms_raw-committer + exp = 'committer' ). + cl_abap_unit_assert=>assert_equals( + act = ms_raw-parent + exp = '' ). + + cl_abap_unit_assert=>assert_char_cp( + act = ms_raw-body + exp = 'comment+' ). + + ENDMETHOD. + + METHOD decode3. + + add( 'tree tree' ). + add( 'parent parent1' ). + add( 'author author' ). + add( 'committer committer' ). + add( '' ). + add( 'comment' ). + + decode( ). + + cl_abap_unit_assert=>assert_equals( + act = ms_raw-tree + exp = 'tree' ). + cl_abap_unit_assert=>assert_equals( + act = ms_raw-author + exp = 'author' ). + cl_abap_unit_assert=>assert_equals( + act = ms_raw-committer + exp = 'committer' ). + cl_abap_unit_assert=>assert_equals( + act = ms_raw-parent + exp = 'parent1' ). + + cl_abap_unit_assert=>assert_char_cp( + act = ms_raw-body + exp = 'comment+' ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/utils/zcl_abapgit_url.clas.testclasses.abap b/src/utils/zcl_abapgit_url.clas.testclasses.abap new file mode 100644 index 000000000..165fc1bba --- /dev/null +++ b/src/utils/zcl_abapgit_url.clas.testclasses.abap @@ -0,0 +1,62 @@ +CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. + + PRIVATE SECTION. + + METHODS: + repo_host FOR TESTING RAISING zcx_abapgit_exception, + repo_name1 FOR TESTING RAISING zcx_abapgit_exception, + repo_name2 FOR TESTING RAISING zcx_abapgit_exception, + repo_error FOR TESTING. + +ENDCLASS. "ltcl_Test + + +CLASS ltcl_test IMPLEMENTATION. + + METHOD repo_error. + + TRY. + zcl_abapgit_url=>host( 'not a real url' ). "#EC NOTEXT + cl_abap_unit_assert=>fail( ). + CATCH zcx_abapgit_exception. "#EC NO_HANDLER + ENDTRY. + + ENDMETHOD. "repo_error + + METHOD repo_host. + + DATA: lv_host TYPE string. + + lv_host = zcl_abapgit_url=>host( 'https://github.com/larshp/Foobar.git' ). + + cl_abap_unit_assert=>assert_equals( + exp = 'https://github.com' + act = lv_host ). + + ENDMETHOD. "repo_url + + METHOD repo_name1. + + DATA: lv_name TYPE string. + + lv_name = zcl_abapgit_url=>name( 'https://github.com/larshp/Foobar.git' ). + + cl_abap_unit_assert=>assert_equals( + exp = 'Foobar' + act = lv_name ). + + ENDMETHOD. + + METHOD repo_name2. + + DATA: lv_name TYPE string. + + lv_name = zcl_abapgit_url=>name( 'https://git.hanatrial.ondemand.com/p12345trial/yay' ). + + cl_abap_unit_assert=>assert_equals( + exp = 'yay' + act = lv_name ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/utils/zcl_abapgit_url.clas.xml b/src/utils/zcl_abapgit_url.clas.xml index af3b50b09..eb1223065 100644 --- a/src/utils/zcl_abapgit_url.clas.xml +++ b/src/utils/zcl_abapgit_url.clas.xml @@ -13,6 +13,7 @@ X X X + X diff --git a/src/zabapgit_git.prog.abap b/src/zabapgit_git.prog.abap index ab31ec686..8c8fcd622 100644 --- a/src/zabapgit_git.prog.abap +++ b/src/zabapgit_git.prog.abap @@ -41,7 +41,7 @@ CLASS lcl_git_transport DEFINITION FINAL. CLASS-METHODS branch_list IMPORTING iv_url TYPE string iv_service TYPE string - EXPORTING eo_client TYPE REF TO lcl_http_client + EXPORTING eo_client TYPE REF TO zcl_abapgit_http_client eo_branch_list TYPE REF TO zcl_abapgit_git_branch_list RAISING zcx_abapgit_exception. @@ -49,7 +49,7 @@ CLASS lcl_git_transport DEFINITION FINAL. IMPORTING iv_url TYPE string iv_service TYPE string iv_branch_name TYPE string - EXPORTING eo_client TYPE REF TO lcl_http_client + EXPORTING eo_client TYPE REF TO zcl_abapgit_http_client ev_branch TYPE zif_abapgit_definitions=>ty_sha1 RAISING zcx_abapgit_exception. @@ -87,7 +87,7 @@ CLASS lcl_git_transport IMPLEMENTATION. METHOD branches. - DATA: lo_client TYPE REF TO lcl_http_client. + DATA: lo_client TYPE REF TO zcl_abapgit_http_client. lcl_git_transport=>branch_list( @@ -121,7 +121,7 @@ CLASS lcl_git_transport IMPLEMENTATION. METHOD receive_pack. - DATA: lo_client TYPE REF TO lcl_http_client, + DATA: lo_client TYPE REF TO zcl_abapgit_http_client, lv_cmd_pkt TYPE string, lv_line TYPE string, lv_tmp TYPE xstring, @@ -214,7 +214,7 @@ CLASS lcl_git_transport IMPLEMENTATION. METHOD upload_pack. - DATA: lo_client TYPE REF TO lcl_http_client, + DATA: lo_client TYPE REF TO zcl_abapgit_http_client, lv_buffer TYPE string, lv_xstring TYPE xstring, lv_line TYPE string, diff --git a/src/zabapgit_http.prog.abap b/src/zabapgit_http.prog.abap index 771b1d982..19ee87d50 100644 --- a/src/zabapgit_http.prog.abap +++ b/src/zabapgit_http.prog.abap @@ -50,167 +50,6 @@ CLASS lcl_proxy_auth IMPLEMENTATION. ENDCLASS. -CLASS lcl_http_client DEFINITION FINAL. - - PUBLIC SECTION. - - METHODS: - constructor - IMPORTING ii_client TYPE REF TO if_http_client, - close, - set_digest - IMPORTING io_digest TYPE REF TO zcl_abapgit_http_digest, - send_receive_close - IMPORTING - iv_data TYPE xstring - RETURNING - VALUE(rv_data) TYPE xstring - RAISING zcx_abapgit_exception, - get_cdata - RETURNING VALUE(rv_value) TYPE string, - check_http_200 - RAISING zcx_abapgit_exception, - send_receive - RAISING zcx_abapgit_exception, - set_headers - IMPORTING iv_url TYPE string - iv_service TYPE string - RAISING zcx_abapgit_exception. - - PRIVATE SECTION. - DATA: mi_client TYPE REF TO if_http_client, - mo_digest TYPE REF TO zcl_abapgit_http_digest. - -ENDCLASS. - -CLASS lcl_http_client IMPLEMENTATION. - - METHOD constructor. - mi_client = ii_client. - ENDMETHOD. - - METHOD set_digest. - mo_digest = io_digest. - ENDMETHOD. - - METHOD send_receive_close. - -* do not use set_cdata as it modifies the Content-Type header field - mi_client->request->set_data( iv_data ). - send_receive( ). - check_http_200( ). - rv_data = mi_client->response->get_data( ). - mi_client->close( ). - - ENDMETHOD. - - METHOD get_cdata. - rv_value = mi_client->response->get_cdata( ). - ENDMETHOD. - - METHOD close. - mi_client->close( ). - ENDMETHOD. - - METHOD set_headers. - - DATA: lv_value TYPE string. - - - mi_client->request->set_header_field( - name = '~request_method' - value = 'POST' ). - - lv_value = zcl_abapgit_url=>path_name( iv_url ) && - '/git-' && - iv_service && - '-pack'. - mi_client->request->set_header_field( - name = '~request_uri' - value = lv_value ). - - lv_value = 'application/x-git-' - && iv_service && '-pack-request'. "#EC NOTEXT - mi_client->request->set_header_field( - name = 'Content-Type' - value = lv_value ). "#EC NOTEXT - - lv_value = 'application/x-git-' - && iv_service && '-pack-result'. "#EC NOTEXT - mi_client->request->set_header_field( - name = 'Accept' - value = lv_value ). "#EC NOTEXT - - IF mo_digest IS BOUND. - mo_digest->run( mi_client ). - ENDIF. - - ENDMETHOD. "set_headers - - METHOD send_receive. - - DATA: lv_text TYPE string, - lv_code TYPE i, - lv_message TYPE string. - - mi_client->send( ). - mi_client->receive( - EXCEPTIONS - http_communication_failure = 1 - http_invalid_state = 2 - http_processing_failed = 3 - OTHERS = 4 ). - - IF sy-subrc <> 0. - " in case of HTTP_COMMUNICATION_FAILURE - " make sure: - " a) SSL is setup properly in STRUST - " b) no firewalls - " check trace file in transaction SMICM - - mi_client->get_last_error( - IMPORTING - code = lv_code - message = lv_message ). - - lv_text = |HTTP error { lv_code } occured: { lv_message }|. - - zcx_abapgit_exception=>raise( lv_text ). - ENDIF. - - ENDMETHOD. "send_receive - - METHOD check_http_200. - - DATA: lv_code TYPE i, - lv_text TYPE string. - - - mi_client->response->get_status( - IMPORTING - code = lv_code ). - CASE lv_code. - WHEN 200. - RETURN. - WHEN 302. - zcx_abapgit_exception=>raise( 'HTTP redirect, check URL' ). - WHEN 401. - zcx_abapgit_exception=>raise( 'HTTP 401, unauthorized' ). - WHEN 403. - zcx_abapgit_exception=>raise( 'HTTP 403, forbidden' ). - WHEN 404. - zcx_abapgit_exception=>raise( 'HTTP 404, not found' ). - WHEN 415. - zcx_abapgit_exception=>raise( 'HTTP 415, unsupported media type' ). - WHEN OTHERS. - lv_text = mi_client->response->get_cdata( ). - zcx_abapgit_exception=>raise( |HTTP error code: { lv_code }, { lv_text }| ). - ENDCASE. - - ENDMETHOD. "http_200 - -ENDCLASS. - CLASS lcl_http DEFINITION FINAL. PUBLIC SECTION. @@ -224,7 +63,7 @@ CLASS lcl_http DEFINITION FINAL. create_by_url IMPORTING iv_url TYPE string iv_service TYPE string - RETURNING VALUE(ro_client) TYPE REF TO lcl_http_client + RETURNING VALUE(ro_client) TYPE REF TO zcl_abapgit_http_client RAISING zcx_abapgit_exception. PRIVATE SECTION. @@ -238,7 +77,7 @@ CLASS lcl_http DEFINITION FINAL. RETURNING VALUE(rv_bool) TYPE abap_bool, acquire_login_details IMPORTING ii_client TYPE REF TO if_http_client - io_client TYPE REF TO lcl_http_client + io_client TYPE REF TO zcl_abapgit_http_client iv_url TYPE string RETURNING VALUE(rv_scheme) TYPE string RAISING zcx_abapgit_exception. diff --git a/src/zabapgit_objects.prog.abap b/src/zabapgit_objects.prog.abap index 870906ef2..df6bb5c1e 100644 --- a/src/zabapgit_objects.prog.abap +++ b/src/zabapgit_objects.prog.abap @@ -2,84 +2,6 @@ *& Include ZABAPGIT_OBJECTS *&---------------------------------------------------------------------* -*"Null Object Pattern -*CLASS lcl_comparison_null DEFINITION FINAL. -* PUBLIC SECTION. -* INTERFACES zif_abapgit_comparison_result. -*ENDCLASS. -* -*CLASS lcl_comparison_null IMPLEMENTATION. -* -* METHOD zif_abapgit_comparison_result~is_result_complete_halt. -* rv_response = abap_false. -* ENDMETHOD. -* -* METHOD zif_abapgit_comparison_result~show_confirmation_dialog. -* RETURN. -* ENDMETHOD. -* -*ENDCLASS. - -*----------------------------------------------------------------------* -* CLASS lcl_objects_super DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -*CLASS lcl_objects_super DEFINITION ABSTRACT. -* -* PUBLIC SECTION. -* -* METHODS: -* constructor -* IMPORTING -* is_item TYPE zif_abapgit_definitions=>ty_item -* iv_language TYPE spras. -* -* CLASS-METHODS: -* jump_adt -* IMPORTING i_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name -* i_obj_type TYPE zif_abapgit_definitions=>ty_item-obj_type -* RAISING zcx_abapgit_exception. -* -* CONSTANTS: c_user_unknown TYPE xubname VALUE 'UNKNOWN'. -* -* PROTECTED SECTION. -* -* DATA: ms_item TYPE zif_abapgit_definitions=>ty_item, -* mv_language TYPE spras. -* -* METHODS: -* check_timestamp -* IMPORTING -* iv_timestamp TYPE timestamp -* iv_date TYPE datum -* iv_time TYPE uzeit -* RETURNING -* VALUE(rv_changed) TYPE abap_bool, -* get_metadata -* RETURNING VALUE(rs_metadata) TYPE zif_abapgit_definitions=>ty_metadata, -* corr_insert -* IMPORTING iv_package TYPE devclass -* RAISING zcx_abapgit_exception, -* tadir_insert -* IMPORTING iv_package TYPE devclass -* RAISING zcx_abapgit_exception, -* jump_se11 -* IMPORTING iv_radio TYPE string -* iv_field TYPE string -* RAISING zcx_abapgit_exception. -* -* PRIVATE SECTION. -* -* CLASS-METHODS: -* is_adt_jump_possible -* IMPORTING io_object TYPE REF TO cl_wb_object -* io_adt TYPE REF TO object -* RETURNING VALUE(r_is_adt_jump_possible) TYPE abap_bool -* RAISING zcx_abapgit_exception. -* -*ENDCLASS. "lcl_objects_super DEFINITION - ********************************************************************** * Enable plugins @@ -271,1471 +193,6 @@ ENDCLASS. "lcl_objects_bridge IMPLEMENTATION ********************************************************************** -*CLASS lcl_objects_program DEFINITION INHERITING FROM lcl_objects_super. -* -* PUBLIC SECTION. -* TYPES: BEGIN OF ty_progdir, -* name TYPE progdir-name, -* state TYPE progdir-state, -* sqlx TYPE progdir-sqlx, -* edtx TYPE progdir-edtx, -* varcl TYPE progdir-varcl, -* dbapl TYPE progdir-dbapl, -* dbna TYPE progdir-dbna, -* clas TYPE progdir-clas, -* type TYPE progdir-type, -* occurs TYPE progdir-occurs, -* subc TYPE progdir-subc, -* appl TYPE progdir-appl, -* secu TYPE progdir-secu, -* cnam TYPE progdir-cnam, -* cdat TYPE progdir-cdat, -* unam TYPE progdir-unam, -* udat TYPE progdir-udat, -* vern TYPE progdir-vern, -* levl TYPE progdir-levl, -* rstat TYPE progdir-rstat, -* rmand TYPE progdir-rmand, -* rload TYPE progdir-rload, -* fixpt TYPE progdir-fixpt, -* sset TYPE progdir-sset, -* sdate TYPE progdir-sdate, -* stime TYPE progdir-stime, -* idate TYPE progdir-idate, -* itime TYPE progdir-itime, -* ldbname TYPE progdir-ldbname, -* uccheck TYPE progdir-uccheck, -* END OF ty_progdir. -* -* METHODS serialize_program -* IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_output OPTIONAL -* is_item TYPE zif_abapgit_definitions=>ty_item -* io_files TYPE REF TO zcl_abapgit_objects_files -* iv_program TYPE programm OPTIONAL -* iv_extra TYPE clike OPTIONAL -* RAISING zcx_abapgit_exception. -* -* METHODS read_progdir -* IMPORTING iv_program TYPE programm -* RETURNING VALUE(rs_progdir) TYPE ty_progdir. -* -* METHODS deserialize_program -* IMPORTING is_progdir TYPE ty_progdir -* it_source TYPE abaptxt255_tab -* it_tpool TYPE textpool_table -* iv_package TYPE devclass -* RAISING zcx_abapgit_exception. -* -* PROTECTED SECTION. -* -* TYPES: ty_spaces_tt TYPE STANDARD TABLE OF i WITH DEFAULT KEY. -* -* TYPES: BEGIN OF ty_dynpro, -* header TYPE rpy_dyhead, -* containers TYPE dycatt_tab, -* fields TYPE dyfatc_tab, -* flow_logic TYPE swydyflow, -* spaces TYPE ty_spaces_tt, -* END OF ty_dynpro. -* -* TYPES: ty_dynpro_tt TYPE STANDARD TABLE OF ty_dynpro WITH DEFAULT KEY. -* -* TYPES: BEGIN OF ty_cua, -* adm TYPE rsmpe_adm, -* sta TYPE STANDARD TABLE OF rsmpe_stat WITH DEFAULT KEY, -* fun TYPE STANDARD TABLE OF rsmpe_funt WITH DEFAULT KEY, -* men TYPE STANDARD TABLE OF rsmpe_men WITH DEFAULT KEY, -* mtx TYPE STANDARD TABLE OF rsmpe_mnlt WITH DEFAULT KEY, -* act TYPE STANDARD TABLE OF rsmpe_act WITH DEFAULT KEY, -* but TYPE STANDARD TABLE OF rsmpe_but WITH DEFAULT KEY, -* pfk TYPE STANDARD TABLE OF rsmpe_pfk WITH DEFAULT KEY, -* set TYPE STANDARD TABLE OF rsmpe_staf WITH DEFAULT KEY, -* doc TYPE STANDARD TABLE OF rsmpe_atrt WITH DEFAULT KEY, -* tit TYPE STANDARD TABLE OF rsmpe_titt WITH DEFAULT KEY, -* biv TYPE STANDARD TABLE OF rsmpe_buts WITH DEFAULT KEY, -* END OF ty_cua. -* -* METHODS serialize_dynpros -* IMPORTING iv_program_name TYPE programm -* RETURNING VALUE(rt_dynpro) TYPE ty_dynpro_tt -* RAISING zcx_abapgit_exception. -* -* METHODS serialize_cua -* IMPORTING iv_program_name TYPE programm -* RETURNING VALUE(rs_cua) TYPE ty_cua -* RAISING zcx_abapgit_exception. -* -* METHODS deserialize_dynpros -* IMPORTING it_dynpros TYPE ty_dynpro_tt -* RAISING zcx_abapgit_exception. -* -* METHODS deserialize_textpool -* IMPORTING iv_program TYPE programm -* it_tpool TYPE textpool_table -* iv_language TYPE langu OPTIONAL -* iv_is_include TYPE abap_bool DEFAULT abap_false -* RAISING zcx_abapgit_exception. -* -* METHODS deserialize_cua -* IMPORTING iv_program_name TYPE programm -* is_cua TYPE ty_cua -* RAISING zcx_abapgit_exception. -* -* METHODS check_prog_changed_since -* IMPORTING iv_program TYPE programm -* iv_timestamp TYPE timestamp -* iv_skip_gui TYPE abap_bool DEFAULT abap_false -* RETURNING VALUE(rv_changed) TYPE abap_bool. -* -* CLASS-METHODS: -* add_tpool -* IMPORTING it_tpool TYPE textpool_table -* RETURNING VALUE(rt_tpool) TYPE zif_abapgit_definitions=>ty_tpool_tt, -* read_tpool -* IMPORTING it_tpool TYPE zif_abapgit_definitions=>ty_tpool_tt -* RETURNING VALUE(rt_tpool) TYPE zif_abapgit_definitions=>ty_tpool_tt. -* -* PRIVATE SECTION. -* METHODS: -* condense_flow -* EXPORTING et_spaces TYPE ty_spaces_tt -* CHANGING ct_flow TYPE swydyflow, -* uncondense_flow -* IMPORTING it_flow TYPE swydyflow -* it_spaces TYPE ty_spaces_tt -* RETURNING VALUE(rt_flow) TYPE swydyflow. -* -* -*ENDCLASS. "lcl_objects_program DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_objects_program IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -*CLASS lcl_objects_program IMPLEMENTATION. -* -* METHOD condense_flow. -* -* DATA: lv_spaces LIKE LINE OF et_spaces. -* -* FIELD-SYMBOLS: LIKE LINE OF ct_flow. -* -* -* CLEAR et_spaces. -* -* LOOP AT ct_flow ASSIGNING . -* lv_spaces = 0. -* -* WHILE NOT -line IS INITIAL AND -line(1) = space. -* lv_spaces = lv_spaces + 1. -* -line = -line+1. -* ENDWHILE. -* -* APPEND lv_spaces TO et_spaces. -* ENDLOOP. -* -* ENDMETHOD. -* -* METHOD uncondense_flow. -* -* DATA: lv_spaces LIKE LINE OF it_spaces. -* -* FIELD-SYMBOLS: LIKE LINE OF it_flow, -* LIKE LINE OF rt_flow. -* -* -* LOOP AT it_flow ASSIGNING . -* APPEND INITIAL LINE TO rt_flow ASSIGNING . -* -line = -line. -* -* READ TABLE it_spaces INDEX sy-tabix INTO lv_spaces. -* IF sy-subrc = 0. -* SHIFT -line RIGHT BY lv_spaces PLACES IN CHARACTER MODE. -* ENDIF. -* ENDLOOP. -* -* ENDMETHOD. -* -* METHOD serialize_program. -* -* DATA: ls_progdir TYPE ty_progdir, -* lv_program_name TYPE programm, -* lt_dynpros TYPE ty_dynpro_tt, -* ls_cua TYPE ty_cua, -* lt_source TYPE TABLE OF abaptxt255, -* lt_tpool TYPE textpool_table, -* ls_tpool LIKE LINE OF lt_tpool, -* lo_xml TYPE REF TO zcl_abapgit_xml_output. -* -* IF iv_program IS INITIAL. -* lv_program_name = is_item-obj_name. -* ELSE. -* lv_program_name = iv_program. -* ENDIF. -* -* zcl_abapgit_language=>set_current_language( mv_language ). -* -* CALL FUNCTION 'RPY_PROGRAM_READ' -* EXPORTING -* program_name = lv_program_name -* with_lowercase = abap_true -* TABLES -* source_extended = lt_source -* textelements = lt_tpool -* EXCEPTIONS -* cancelled = 1 -* not_found = 2 -* permission_error = 3 -* OTHERS = 4. -* -* IF sy-subrc = 2. -* zcl_abapgit_language=>restore_login_language( ). -* RETURN. -* ELSEIF sy-subrc <> 0. -* zcl_abapgit_language=>restore_login_language( ). -* zcx_abapgit_exception=>raise( 'Error reading program' ). -* ENDIF. -* -* zcl_abapgit_language=>restore_login_language( ). -* -* ls_progdir = read_progdir( lv_program_name ). -* -* IF io_xml IS BOUND. -* lo_xml = io_xml. -* ELSE. -* CREATE OBJECT lo_xml. -* ENDIF. -* -* lo_xml->add( iv_name = 'PROGDIR' -* ig_data = ls_progdir ). -* IF ls_progdir-subc = '1' OR ls_progdir-subc = 'M'. -* lt_dynpros = serialize_dynpros( lv_program_name ). -* lo_xml->add( iv_name = 'DYNPROS' -* ig_data = lt_dynpros ). -* -* ls_cua = serialize_cua( lv_program_name ). -* IF NOT ls_cua IS INITIAL. -* lo_xml->add( iv_name = 'CUA' -* ig_data = ls_cua ). -* ENDIF. -* ENDIF. -* -* READ TABLE lt_tpool WITH KEY id = 'R' INTO ls_tpool. -* IF sy-subrc = 0 AND ls_tpool-key = '' AND ls_tpool-length = 0. -* DELETE lt_tpool INDEX sy-tabix. -* ENDIF. -* -* lo_xml->add( iv_name = 'TPOOL' -* ig_data = add_tpool( lt_tpool ) ). -* -* IF NOT io_xml IS BOUND. -* io_files->add_xml( iv_extra = iv_extra -* io_xml = lo_xml ). -* ENDIF. -* -* io_files->add_abap( iv_extra = iv_extra -* it_abap = lt_source ). -* -* ENDMETHOD. "serialize_program -* -* METHOD deserialize_program. -* -* DATA: lv_exists TYPE sap_bool, -* lv_progname TYPE reposrc-progname, -* ls_tpool LIKE LINE OF it_tpool, -* lv_title TYPE rglif-title, -* ls_progdir_new TYPE progdir. -* -* FIELD-SYMBOLS: TYPE any. -* -* -* CALL FUNCTION 'RS_CORR_INSERT' -* EXPORTING -* object = is_progdir-name -* object_class = 'ABAP' -* devclass = iv_package -* master_language = mv_language -* mode = 'INSERT' -* EXCEPTIONS -* cancelled = 1 -* permission_failure = 2 -* unknown_objectclass = 3 -* OTHERS = 4. -* IF sy-subrc = 1. -* zcx_abapgit_exception=>raise( 'Cancelled' ). -* ELSEIF sy-subrc <> 0. -* zcx_abapgit_exception=>raise( 'error from RS_CORR_INSERT' ). -* ENDIF. -* -* READ TABLE it_tpool INTO ls_tpool WITH KEY id = 'R'. "#EC CI_SUBRC -* IF sy-subrc = 0. -** there is a bug in RPY_PROGRAM_UPDATE, the header line of TTAB is not -** cleared, so the title length might be inherited from a different program. -* ASSIGN ('(SAPLSIFP)TTAB') TO . -* IF sy-subrc = 0. -* CLEAR . -* ENDIF. -* -* lv_title = ls_tpool-entry. -* ENDIF. -* -* SELECT SINGLE progname FROM reposrc INTO lv_progname -* WHERE progname = is_progdir-name -* AND r3state = 'A'. -* IF sy-subrc = 0. -* lv_exists = abap_true. -* ELSE. -* lv_exists = abap_false. -* ENDIF. -* -* IF lv_exists = abap_true. -* zcl_abapgit_language=>set_current_language( mv_language ). -* -* CALL FUNCTION 'RPY_PROGRAM_UPDATE' -* EXPORTING -* program_name = is_progdir-name -* title_string = lv_title -* save_inactive = 'I' -* TABLES -* source_extended = it_source -* EXCEPTIONS -* cancelled = 1 -* permission_error = 2 -* not_found = 3 -* OTHERS = 4. -* -* IF sy-subrc <> 0. -* zcl_abapgit_language=>restore_login_language( ). -* -* IF sy-msgid = 'EU' AND sy-msgno = '510'. -* zcx_abapgit_exception=>raise( 'User is currently editing program' ). -* ELSE. -* zcx_abapgit_exception=>raise( 'PROG, error updating' ). -* ENDIF. -* ENDIF. -* -* zcl_abapgit_language=>restore_login_language( ). -* ELSE. -** 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. -* ENDIF. -* ENDIF. -* -* IF NOT it_tpool[] IS INITIAL. -* INSERT TEXTPOOL is_progdir-name -* FROM it_tpool -* LANGUAGE mv_language -* STATE 'I'. -* IF sy-subrc <> 0. -* zcx_abapgit_exception=>raise( 'error from INSERT TEXTPOOL' ). -* ENDIF. -* ENDIF. -* -* CALL FUNCTION 'READ_PROGDIR' -* EXPORTING -* i_progname = is_progdir-name -* i_state = 'I' -* IMPORTING -* e_progdir = ls_progdir_new -* EXCEPTIONS -* not_exists = 1 -* OTHERS = 2. -* IF sy-subrc <> 0. -* zcx_abapgit_exception=>raise( 'not found in PROGDIR' ). -* ENDIF. -* -** todo, package? -* -* ls_progdir_new-ldbname = is_progdir-ldbname. -* ls_progdir_new-dbna = is_progdir-dbna. -* ls_progdir_new-dbapl = is_progdir-dbapl. -* ls_progdir_new-rload = is_progdir-rload. -* ls_progdir_new-fixpt = is_progdir-fixpt. -* ls_progdir_new-varcl = is_progdir-varcl. -* ls_progdir_new-appl = is_progdir-appl. -* ls_progdir_new-rstat = is_progdir-rstat. -* -* CALL FUNCTION 'UPDATE_PROGDIR' -* EXPORTING -* i_progdir = ls_progdir_new -* i_progname = ls_progdir_new-name -* i_state = ls_progdir_new-state -* EXCEPTIONS -* not_executed = 1 -* OTHERS = 2. -* IF sy-subrc <> 0. -* zcx_abapgit_exception=>raise( 'PROG, error inserting' ). -* ENDIF. -* -* SELECT SINGLE * FROM progdir INTO ls_progdir_new -* WHERE name = ls_progdir_new-name -* AND state = ls_progdir_new-state. -* IF sy-subrc = 0 AND is_progdir-varcl = space AND ls_progdir_new-varcl = abap_true. -** function module UPDATE_PROGDIR does not update VARCL -* UPDATE progdir SET varcl = is_progdir-varcl -* WHERE name = ls_progdir_new-name -* AND state = ls_progdir_new-state. "#EC CI_SUBRC -* ENDIF. -* -* zcl_abapgit_objects_activation=>add( -* iv_type = 'REPS' -* iv_name = is_progdir-name ). -* -* ENDMETHOD. "deserialize_program -* -* METHOD read_progdir. -* -* DATA: ls_sapdir TYPE progdir. -* -* -* CALL FUNCTION 'READ_PROGDIR' -* EXPORTING -* i_progname = iv_program -* i_state = 'A' -* IMPORTING -* e_progdir = ls_sapdir. -* MOVE-CORRESPONDING ls_sapdir TO rs_progdir. -* -* CLEAR: rs_progdir-edtx, -* rs_progdir-cnam, -* rs_progdir-cdat, -* rs_progdir-unam, -* rs_progdir-udat, -* rs_progdir-levl, -* rs_progdir-vern, -* rs_progdir-rmand, -* rs_progdir-sdate, -* rs_progdir-stime, -* rs_progdir-idate, -* rs_progdir-itime. -* -* ENDMETHOD. "read_progdir -* -* METHOD serialize_cua. -* -* CALL FUNCTION 'RS_CUA_INTERNAL_FETCH' -* EXPORTING -* program = iv_program_name -* language = mv_language -* state = 'A' -* IMPORTING -* adm = rs_cua-adm -* TABLES -* sta = rs_cua-sta -* fun = rs_cua-fun -* men = rs_cua-men -* mtx = rs_cua-mtx -* act = rs_cua-act -* but = rs_cua-but -* pfk = rs_cua-pfk -* set = rs_cua-set -* doc = rs_cua-doc -* tit = rs_cua-tit -* biv = rs_cua-biv -* EXCEPTIONS -* not_found = 1 -* unknown_version = 2 -* OTHERS = 3. -* IF sy-subrc <> 0. -* zcx_abapgit_exception=>raise( 'error from RS_CUA_INTERNAL_FETCH' ). -* ENDIF. -* -* ENDMETHOD. "serialize_cua -* -* METHOD serialize_dynpros. -* -* DATA: ls_header TYPE rpy_dyhead, -* lt_containers TYPE dycatt_tab, -* lt_fields_to_containers TYPE dyfatc_tab, -* lt_flow_logic TYPE swydyflow, -* lt_d020s TYPE TABLE OF d020s. -* -* FIELD-SYMBOLS: LIKE LINE OF lt_d020s, -* TYPE scrpostyle, -* LIKE LINE OF lt_fields_to_containers, -* LIKE LINE OF rt_dynpro. -* -* -* CALL FUNCTION 'RS_SCREEN_LIST' -* EXPORTING -* dynnr = '' -* progname = iv_program_name -* TABLES -* dynpros = lt_d020s -* EXCEPTIONS -* not_found = 1 -* OTHERS = 2. -* IF sy-subrc = 2. -* zcx_abapgit_exception=>raise( 'error from screen_list' ). -* ENDIF. -* -** loop dynpros and skip generated selection screens -* LOOP AT lt_d020s ASSIGNING WHERE type <> 'S'. -* -* CALL FUNCTION 'RPY_DYNPRO_READ' -* EXPORTING -* progname = iv_program_name -* dynnr = -dnum -* IMPORTING -* header = ls_header -* TABLES -* containers = lt_containers -* fields_to_containers = lt_fields_to_containers -* flow_logic = lt_flow_logic -* EXCEPTIONS -* cancelled = 1 -* not_found = 2 -* permission_error = 3 -* OTHERS = 4. -* IF sy-subrc <> 0. -* zcx_abapgit_exception=>raise( 'Error while reading dynpro' ). -* ENDIF. -* -* LOOP AT lt_fields_to_containers ASSIGNING . -** output style is a NUMC field, the XML conversion will fail if it contains invalid value -** field does not exist in all versions -* ASSIGN COMPONENT 'OUTPUTSTYLE' OF STRUCTURE TO . -* IF sy-subrc = 0 AND = ' '. -* CLEAR . -* ENDIF. -* ENDLOOP. -* -* APPEND INITIAL LINE TO rt_dynpro ASSIGNING . -* -header = ls_header. -* -containers = lt_containers. -* -fields = lt_fields_to_containers. -* -* condense_flow( IMPORTING et_spaces = -spaces -* CHANGING ct_flow = lt_flow_logic ). -* -flow_logic = lt_flow_logic. -* -* ENDLOOP. -* -* ENDMETHOD. "serialize_dynpros -* -* -* METHOD deserialize_dynpros. -* -* DATA: lv_name TYPE dwinactiv-obj_name, -* ls_dynpro LIKE LINE OF it_dynpros. -* -* -** ls_dynpro is changed by the function module, a field-symbol will cause -** the program to dump since it_dynpros cannot be changed -* LOOP AT it_dynpros INTO ls_dynpro. -* -* ls_dynpro-flow_logic = uncondense_flow( -* it_flow = ls_dynpro-flow_logic -* it_spaces = ls_dynpro-spaces ). -* -* CALL FUNCTION 'RPY_DYNPRO_INSERT' -* EXPORTING -* header = ls_dynpro-header -* suppress_exist_checks = abap_true -* TABLES -* containers = ls_dynpro-containers -* fields_to_containers = ls_dynpro-fields -* flow_logic = ls_dynpro-flow_logic -* EXCEPTIONS -* cancelled = 1 -* already_exists = 2 -* program_not_exists = 3 -* not_executed = 4 -* missing_required_field = 5 -* illegal_field_value = 6 -* field_not_allowed = 7 -* not_generated = 8 -* illegal_field_position = 9 -* OTHERS = 10. -* IF sy-subrc <> 2 AND sy-subrc <> 0. -* zcx_abapgit_exception=>raise( 'error from RPY_DYNPRO_INSERT' ). -* ENDIF. -** todo, RPY_DYNPRO_UPDATE? -* -* CONCATENATE ls_dynpro-header-program ls_dynpro-header-screen -* INTO lv_name RESPECTING BLANKS. -* ASSERT NOT lv_name IS INITIAL. -* -* zcl_abapgit_objects_activation=>add( -* iv_type = 'DYNP' -* iv_name = lv_name ). -* -* ENDLOOP. -* -* ENDMETHOD. "deserialize_dynpros -* -* METHOD add_tpool. -* -* FIELD-SYMBOLS: LIKE LINE OF it_tpool, -* LIKE LINE OF rt_tpool. -* -* -* LOOP AT it_tpool ASSIGNING . -* APPEND INITIAL LINE TO rt_tpool ASSIGNING . -* MOVE-CORRESPONDING TO . -* IF -id = 'S'. -* -split = -entry. -* -entry = -entry+8. -* ENDIF. -* ENDLOOP. -* -* ENDMETHOD. "add_tpool -* -* METHOD read_tpool. -* -* FIELD-SYMBOLS: LIKE LINE OF it_tpool, -* LIKE LINE OF rt_tpool. -* -* -* LOOP AT it_tpool ASSIGNING . -* APPEND INITIAL LINE TO rt_tpool ASSIGNING . -* MOVE-CORRESPONDING TO . -* IF -id = 'S'. -* CONCATENATE -split -entry -* INTO -entry -* RESPECTING BLANKS. -* ENDIF. -* ENDLOOP. -* -* ENDMETHOD. "read_tpool -* -* METHOD deserialize_textpool. -* -* DATA lv_language TYPE langu. -* DATA lv_state TYPE c. -* DATA lv_delete TYPE abap_bool. -* -* IF iv_language IS INITIAL. -* lv_language = mv_language. -* ELSE. -* lv_language = iv_language. -* ENDIF. -* -* IF lv_language = mv_language. -* lv_state = 'I'. "Textpool in master language needs to be activated -* ELSE. -* lv_state = 'A'. "Translations are always active -* ENDIF. -* -* IF it_tpool IS INITIAL. -* IF iv_is_include = abap_false OR lv_state = 'A'. -* DELETE TEXTPOOL iv_program "Remove initial description from textpool if -* LANGUAGE iv_program "original program does not have a textpool -* STATE lv_state. -* -* lv_delete = abap_true. -* ELSE. -* INSERT TEXTPOOL iv_program "In case of includes: Deletion of textpool in -* FROM it_tpool "master language cannot be activated because -* LANGUAGE lv_language "this woul activate the deletion of the textpool -* STATE lv_state. "of the mail program -> insert empty textpool -* ENDIF. -* ELSE. -* IF lines( it_tpool ) = 1 AND lv_language = mv_language. -* READ TABLE it_tpool WITH KEY id = 'R' TRANSPORTING NO FIELDS. -* IF sy-subrc = 0. -* RETURN. "No action because description in master language is already there -* ENDIF. -* ENDIF. -* -* INSERT TEXTPOOL iv_program -* FROM it_tpool -* LANGUAGE lv_language -* STATE lv_state. -* IF sy-subrc <> 0. -* zcx_abapgit_exception=>raise( 'error from INSERT TEXTPOOL' ). -* ENDIF. -* ENDIF. -* -* IF lv_state = 'I'. "Textpool in master language needs to be activated -* zcl_abapgit_objects_activation=>add( -* iv_type = 'REPT' -* iv_name = iv_program -* iv_delete = lv_delete ). -* ENDIF. -* ENDMETHOD. "deserialize_textpool -* -* METHOD deserialize_cua. -* -* DATA: ls_tr_key TYPE trkey. -* -* -* IF lines( is_cua-sta ) = 0 -* AND lines( is_cua-fun ) = 0 -* AND lines( is_cua-men ) = 0 -* AND lines( is_cua-mtx ) = 0 -* AND lines( is_cua-act ) = 0 -* AND lines( is_cua-but ) = 0 -* AND lines( is_cua-pfk ) = 0 -* AND lines( is_cua-set ) = 0 -* AND lines( is_cua-doc ) = 0 -* AND lines( is_cua-tit ) = 0 -* AND lines( is_cua-biv ) = 0. -* RETURN. -* ENDIF. -* -* SELECT SINGLE devclass INTO ls_tr_key-devclass -* FROM tadir -* WHERE pgmid = 'R3TR' -* AND object = ms_item-obj_type -* AND obj_name = ms_item-obj_name. "#EC CI_GENBUFF -* IF sy-subrc <> 0. -* zcx_abapgit_exception=>raise( 'not found in tadir' ). -* ENDIF. -* -* ls_tr_key-obj_type = ms_item-obj_type. -* ls_tr_key-obj_name = ms_item-obj_name. -* ls_tr_key-sub_type = 'CUAD'. -* ls_tr_key-sub_name = iv_program_name. -* -* sy-tcode = 'SE41' ##write_ok. " evil hack, workaround to handle fixes in note 2159455 -* CALL FUNCTION 'RS_CUA_INTERNAL_WRITE' -* EXPORTING -* program = iv_program_name -* language = mv_language -* tr_key = ls_tr_key -* adm = is_cua-adm -* state = 'I' -* TABLES -* sta = is_cua-sta -* fun = is_cua-fun -* men = is_cua-men -* mtx = is_cua-mtx -* act = is_cua-act -* but = is_cua-but -* pfk = is_cua-pfk -* set = is_cua-set -* doc = is_cua-doc -* tit = is_cua-tit -* biv = is_cua-biv -* EXCEPTIONS -* not_found = 1 -* OTHERS = 2. -* IF sy-subrc <> 0. -** if moving code from SAPlink, see https://github.com/larshp/abapGit/issues/562 -* zcx_abapgit_exception=>raise( 'error from RS_CUA_INTERNAL_WRITE' ). -* ENDIF. -* -* zcl_abapgit_objects_activation=>add( -* iv_type = 'CUAD' -* iv_name = iv_program_name ). -* -* ENDMETHOD. "deserialize_cua -* -* METHOD check_prog_changed_since. -* -* DATA: lv_date TYPE dats, -* lv_time TYPE tims, -* lt_screens TYPE STANDARD TABLE OF d020s, -* lt_eudb TYPE STANDARD TABLE OF eudb. -* -* FIELD-SYMBOLS: LIKE LINE OF lt_screens, -* LIKE LINE OF lt_eudb. -* -* SELECT SINGLE udat utime FROM reposrc " Program -* INTO (lv_date, lv_time) -* WHERE progname = iv_program -* AND r3state = 'A'. -* -* rv_changed = check_timestamp( -* iv_timestamp = iv_timestamp -* iv_date = lv_date -* iv_time = lv_time ). -* IF rv_changed = abap_true. -* RETURN. -* ENDIF. -* -* SELECT SINGLE udat utime FROM repotext " Program text pool -* INTO (lv_date, lv_time) -* WHERE progname = iv_program -* AND r3state = 'A'. -* -* IF sy-subrc = 0. " Text not found ? Assuming no changes, see #404 -* rv_changed = check_timestamp( -* iv_timestamp = iv_timestamp -* iv_date = lv_date -* iv_time = lv_time ). -* IF rv_changed = abap_true. -* RETURN. -* ENDIF. -* ENDIF. -* -* IF iv_skip_gui = abap_true. -* RETURN. -* ENDIF. -* -* SELECT dgen tgen FROM d020s " Screens -* INTO CORRESPONDING FIELDS OF TABLE lt_screens -* WHERE prog = iv_program -* ORDER BY PRIMARY KEY ##TOO_MANY_ITAB_FIELDS. "#EC CI_SUBRC -* -* LOOP AT lt_screens ASSIGNING . -* rv_changed = check_timestamp( -* iv_timestamp = iv_timestamp -* iv_date = -dgen -* iv_time = -tgen ). -* IF rv_changed = abap_true. -* RETURN. -* ENDIF. -* ENDLOOP. -* -* SELECT vdatum vzeit FROM eudb " GUI -* INTO CORRESPONDING FIELDS OF TABLE lt_eudb -* WHERE relid = 'CU' -* AND name = iv_program -* AND srtf2 = 0 -* ORDER BY PRIMARY KEY ##TOO_MANY_ITAB_FIELDS. "#EC CI_SUBRC -* -* LOOP AT lt_eudb ASSIGNING . -* rv_changed = check_timestamp( -* iv_timestamp = iv_timestamp -* iv_date = -vdatum -* iv_time = -vzeit ). -* IF rv_changed = abap_true. -* RETURN. -* ENDIF. -* ENDLOOP. -* -* ENDMETHOD. "check_prog_changed_since -* -*ENDCLASS. "lcl_objects_program IMPLEMENTATION - -*----------------------------------------------------------------------* -* CLASS lcl_objects_super IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -*CLASS lcl_objects_super IMPLEMENTATION. -* -* METHOD constructor. -* ms_item = is_item. -* ASSERT NOT ms_item IS INITIAL. -* mv_language = iv_language. -* ASSERT NOT mv_language IS INITIAL. -* ENDMETHOD. "constructor -* -* METHOD jump_se11. -* -* DATA: lt_bdcdata TYPE TABLE OF bdcdata. -* -* FIELD-SYMBOLS: LIKE LINE OF lt_bdcdata. -* -* -* APPEND INITIAL LINE TO lt_bdcdata ASSIGNING . -* -program = 'SAPLSD_ENTRY'. -* -dynpro = '1000'. -* -dynbegin = abap_true. -* -* APPEND INITIAL LINE TO lt_bdcdata ASSIGNING . -* -fnam = 'BDC_OKCODE'. -* -fval = '=WB_DISPLAY'. -* -* APPEND INITIAL LINE TO lt_bdcdata ASSIGNING . -* -fnam = iv_radio. -* -fval = abap_true. -* -* APPEND INITIAL LINE TO lt_bdcdata ASSIGNING . -* -fnam = iv_field. -* -fval = ms_item-obj_name. -* -* CALL FUNCTION 'ABAP4_CALL_TRANSACTION' -* STARTING NEW TASK 'GIT' -* EXPORTING -* tcode = 'SE11' -* mode_val = 'E' -* TABLES -* using_tab = lt_bdcdata -* EXCEPTIONS -* system_failure = 1 -* communication_failure = 2 -* resource_failure = 3 -* OTHERS = 4 -* ##fm_subrc_ok. "#EC CI_SUBRC -* -* ENDMETHOD. "jump_se11 -* -* METHOD jump_adt. -* -* DATA: adt_link TYPE string, -* obj_type TYPE trobjtype, -* obj_name TYPE trobj_name, -* li_object TYPE REF TO cl_wb_object, -* li_adt TYPE REF TO object, -* li_adt_uri_mapper TYPE REF TO object, -* li_adt_objref TYPE REF TO object ##needed. -* -* FIELD-SYMBOLS: TYPE string. -* -* obj_name = i_obj_name. -* obj_type = i_obj_type. -* -* TRY. -* cl_wb_object=>create_from_transport_key( EXPORTING p_object = obj_type p_obj_name = obj_name -* RECEIVING p_wb_object = li_object -* EXCEPTIONS OTHERS = 1 ). -* IF sy-subrc <> 0. -* zcx_abapgit_exception=>raise( 'ADT Jump Error' ). -* ENDIF. -* -* CALL METHOD ('CL_ADT_TOOLS_CORE_FACTORY')=>('GET_INSTANCE') -* RECEIVING -* result = li_adt. -* -* IF is_adt_jump_possible( io_object = li_object -* io_adt = li_adt ) = abap_false. -* zcx_abapgit_exception=>raise( 'ADT Jump Error' ). -* ENDIF. -* -* CALL METHOD li_adt->('IF_ADT_TOOLS_CORE_FACTORY~GET_URI_MAPPER') -* RECEIVING -* result = li_adt_uri_mapper. -* -* CALL METHOD li_adt_uri_mapper->('IF_ADT_URI_MAPPER~MAP_WB_OBJECT_TO_OBJREF') -* EXPORTING -* wb_object = li_object -* RECEIVING -* result = li_adt_objref. -* -* ASSIGN ('li_adt_objref->ref_data-uri') TO . -* ASSERT sy-subrc = 0. -* -* CONCATENATE 'adt://' sy-sysid INTO adt_link. -* -* cl_gui_frontend_services=>execute( EXPORTING document = adt_link -* EXCEPTIONS OTHERS = 1 ). -* -* IF sy-subrc <> 0. -* zcx_abapgit_exception=>raise( 'ADT Jump Error' ). -* ENDIF. -* -* CATCH cx_root. -* zcx_abapgit_exception=>raise( 'ADT Jump Error' ). -* ENDTRY. -* -* ENDMETHOD. -* -* METHOD check_timestamp. -* -* DATA: lv_ts TYPE timestamp. -* -* IF sy-subrc = 0 AND iv_date IS NOT INITIAL AND iv_time IS NOT INITIAL. -* cl_abap_tstmp=>systemtstmp_syst2utc( -* EXPORTING syst_date = iv_date -* syst_time = iv_time -* IMPORTING utc_tstmp = lv_ts ). -* IF lv_ts < iv_timestamp. -* rv_changed = abap_false. " Unchanged -* ELSE. -* rv_changed = abap_true. -* ENDIF. -* ELSE. " Not found? => changed -* rv_changed = abap_true. -* ENDIF. -* -* ENDMETHOD. -* -* METHOD get_metadata. -* rs_metadata-class = -* cl_abap_classdescr=>describe_by_object_ref( me )->get_relative_name( ). -* rs_metadata-version = 'v1.0.0' ##no_text. -* ENDMETHOD. "get_metadata -* -* METHOD tadir_insert. -* -* CALL FUNCTION 'TR_TADIR_INTERFACE' -* EXPORTING -* wi_test_modus = abap_false -* wi_tadir_pgmid = 'R3TR' -* wi_tadir_object = ms_item-obj_type -* wi_tadir_obj_name = ms_item-obj_name -* wi_tadir_author = sy-uname -* wi_tadir_devclass = iv_package -* wi_tadir_masterlang = mv_language -* iv_delflag = abap_false -* EXCEPTIONS -* OTHERS = 1. -* IF sy-subrc <> 0. -* zcx_abapgit_exception=>raise( 'error from TR_TADIR_INTERFACE' ). -* ENDIF. -* -* ENDMETHOD. -* -* METHOD corr_insert. -* -* DATA: ls_object TYPE ddenqs. -* -* -* ls_object-objtype = ms_item-obj_type. -* ls_object-objname = ms_item-obj_name. -* -* CALL FUNCTION 'RS_CORR_INSERT' -* EXPORTING -* object = ls_object -* object_class = 'DICT' -* devclass = iv_package -* master_language = mv_language -* mode = 'INSERT' -* EXCEPTIONS -* cancelled = 1 -* permission_failure = 2 -* unknown_objectclass = 3 -* OTHERS = 4. -* IF sy-subrc = 1. -* zcx_abapgit_exception=>raise( 'Cancelled' ). -* ELSEIF sy-subrc <> 0. -* zcx_abapgit_exception=>raise( 'error from RS_CORR_INSERT' ). -* ENDIF. -* -* ENDMETHOD. "corr_insert -* -* -* METHOD is_adt_jump_possible. -* -* DATA: li_wb_request TYPE REF TO cl_wb_request, -* li_adt_uri_mapper_vit TYPE REF TO object, -* is_vit_wb_request TYPE abap_bool. -* -* cl_wb_request=>create_from_object_ref( -* EXPORTING -* p_wb_object = io_object -* RECEIVING -* p_wb_request = li_wb_request -* EXCEPTIONS -* illegal_operation = 1 -* cancelled = 2 -* OTHERS = 3 ). -* -* IF sy-subrc <> 0. -* zcx_abapgit_exception=>raise( 'ADT Jump Error' ). -* ENDIF. -* -* TRY. -* CALL METHOD io_adt->('IF_ADT_TOOLS_CORE_FACTORY~GET_URI_MAPPER_VIT') -* RECEIVING -* result = li_adt_uri_mapper_vit. -* -* CALL METHOD li_adt_uri_mapper_vit->('IF_ADT_URI_MAPPER_VIT~IS_VIT_WB_REQUEST') -* EXPORTING -* wb_request = li_wb_request -* RECEIVING -* result = is_vit_wb_request. -* -* IF is_vit_wb_request = abap_true. -* r_is_adt_jump_possible = abap_false. -* ELSE. -* r_is_adt_jump_possible = abap_true. -* ENDIF. -* -* CATCH cx_root. -* zcx_abapgit_exception=>raise( 'ADT Jump Error' ). -* ENDTRY. -* -* ENDMETHOD. -* -*ENDCLASS. "lcl_objects_super IMPLEMENTATION - -*CLASS lcl_objects_saxx_super DEFINITION ABSTRACT -* INHERITING FROM lcl_objects_super. -** common class for SAPC and SAMC objects -* -* PUBLIC SECTION. -* INTERFACES: -* zif_abapgit_object. -* -* PROTECTED SECTION. -* METHODS: -* get_persistence_class_name ABSTRACT -* RETURNING -* VALUE(r_persistence_class_name) TYPE seoclsname, -* -* get_data_class_name ABSTRACT -* RETURNING -* VALUE(r_data_class_name) TYPE seoclsname, -* -* get_data_structure_name ABSTRACT -* RETURNING -* VALUE(r_data_structure_name) TYPE string. -* -* PRIVATE SECTION. -* DATA: mo_persistence TYPE REF TO if_wb_object_persist, -* mo_appl_obj_data TYPE REF TO if_wb_object_data_model, -* mv_data_structure_name TYPE string, -* mv_appl_obj_cls_name TYPE seoclsname, -* mv_persistence_cls_name TYPE seoclsname. -* -* METHODS: -* create_channel_objects -* RAISING -* zcx_abapgit_exception, -* -* get_data -* EXPORTING -* p_data TYPE any -* RAISING -* zcx_abapgit_exception, -* -* lock -* RAISING -* zcx_abapgit_exception, -* -* unlock -* RAISING -* zcx_abapgit_exception, -* -* get_names. -* -*ENDCLASS. -* -*CLASS lcl_objects_saxx_super IMPLEMENTATION. -* -* METHOD zif_abapgit_object~has_changed_since. -* rv_changed = abap_true. -* ENDMETHOD. -* -* METHOD zif_abapgit_object~changed_by. -* -* DATA: lr_data TYPE REF TO data. -* -* FIELD-SYMBOLS: TYPE any, -* TYPE any, -* TYPE any. -* -* create_channel_objects( ). -* -* TRY. -* CREATE DATA lr_data TYPE (mv_data_structure_name). -* ASSIGN lr_data->* TO . -* -* CATCH cx_root. -* zcx_abapgit_exception=>raise( |{ ms_item-obj_name } not supported| ). -* ENDTRY. -* -* get_data( -* IMPORTING -* p_data = ). -* -* ASSIGN COMPONENT 'HEADER' OF STRUCTURE TO . -* ASSERT sy-subrc = 0. -* ASSIGN COMPONENT 'CHANGED_BY' OF STRUCTURE TO . -* ASSERT sy-subrc = 0. -* -* IF IS NOT INITIAL. -* rv_user = . -* ELSE. -* rv_user = c_user_unknown. -* ENDIF. -* -* ENDMETHOD. -* -* METHOD zif_abapgit_object~get_metadata. -* rs_metadata = get_metadata( ). -* rs_metadata-delete_tadir = abap_true. -* ENDMETHOD. -* -* METHOD zif_abapgit_object~exists. -* -* DATA: object_key TYPE seu_objkey. -* -* create_channel_objects( ). -* -* object_key = ms_item-obj_name. -* -* TRY. -* mo_persistence->get( p_object_key = object_key -* p_version = 'A' -* p_existence_check_only = abap_true ). -* -* CATCH cx_swb_object_does_not_exist cx_swb_exception. -* rv_bool = abap_false. -* RETURN. -* ENDTRY. -* -* rv_bool = abap_true. -* -* ENDMETHOD. -* -* METHOD zif_abapgit_object~serialize. -* -* DATA: lr_data TYPE REF TO data. -* -* FIELD-SYMBOLS: TYPE any, -* TYPE any, -* TYPE any. -* -* create_channel_objects( ). -* -* TRY. -* CREATE DATA lr_data TYPE (mv_data_structure_name). -* ASSIGN lr_data->* TO . -* -* CATCH cx_root. -* zcx_abapgit_exception=>raise( |{ ms_item-obj_type } not supported| ). -* ENDTRY. -* -* get_data( -* IMPORTING -* p_data = ). -* -* ASSIGN COMPONENT 'HEADER' OF STRUCTURE TO . -* ASSERT sy-subrc = 0. -* -* ASSIGN COMPONENT 'CHANGED_ON' OF STRUCTURE TO . -* ASSERT sy-subrc = 0. -* CLEAR . -* -* ASSIGN COMPONENT 'CHANGED_BY' OF STRUCTURE TO . -* ASSERT sy-subrc = 0. -* CLEAR . -* -* ASSIGN COMPONENT 'CHANGED_AT' OF STRUCTURE TO . -* ASSERT sy-subrc = 0. -* CLEAR . -* -* ASSIGN COMPONENT 'CHANGED_CLNT' OF STRUCTURE TO . -* ASSERT sy-subrc = 0. -* CLEAR . -* -* ASSIGN COMPONENT 'CREATED_ON' OF STRUCTURE TO . -* ASSERT sy-subrc = 0. -* CLEAR . -* -* ASSIGN COMPONENT 'CREATED_BY' OF STRUCTURE TO . -* ASSERT sy-subrc = 0. -* CLEAR . -* -* ASSIGN COMPONENT 'CREATED_AT' OF STRUCTURE TO . -* ASSERT sy-subrc = 0. -* CLEAR . -* -* ASSIGN COMPONENT 'CREATED_CLNT' OF STRUCTURE TO . -* ASSERT sy-subrc = 0. -* CLEAR . -* -* io_xml->add( iv_name = ms_item-obj_type -* ig_data = ). -* -* ENDMETHOD. -* -* METHOD zif_abapgit_object~deserialize. -* -* DATA: lr_data TYPE REF TO data. -* -* FIELD-SYMBOLS: TYPE any. -* -* create_channel_objects( ). -* -* TRY. -* CREATE DATA lr_data TYPE (mv_data_structure_name). -* ASSIGN lr_data->* TO . -* -* CATCH cx_root. -* zcx_abapgit_exception=>raise( |{ ms_item-obj_type } not supported| ). -* ENDTRY. -* -* io_xml->read( -* EXPORTING -* iv_name = ms_item-obj_type -* CHANGING -* cg_data = ). -* -* IF zif_abapgit_object~exists( ) = abap_true. -* zif_abapgit_object~delete( ). -* ENDIF. -* -* TRY. -* lock( ). -* -* CALL FUNCTION 'RS_CORR_INSERT' -* EXPORTING -* object = ms_item-obj_name -* object_class = ms_item-obj_type -* mode = 'I' -* global_lock = abap_true -* devclass = iv_package -* master_language = mv_language -* EXCEPTIONS -* cancelled = 1 -* permission_failure = 2 -* unknown_objectclass = 3 -* OTHERS = 4. -* -* IF sy-subrc <> 0. -* zcx_abapgit_exception=>raise( |Error occured while creating { ms_item-obj_type }| ). -* ENDIF. -* -* mo_appl_obj_data->set_data( ). -* -* mo_persistence->save( mo_appl_obj_data ). -* -* unlock( ). -* -* CATCH cx_swb_exception. -* zcx_abapgit_exception=>raise( |Error occured while creating { ms_item-obj_type }| ). -* ENDTRY. -* -* ENDMETHOD. -* -* METHOD zif_abapgit_object~delete. -* -* DATA: object_key TYPE seu_objkey. -* -* create_channel_objects( ). -* -* object_key = ms_item-obj_name. -* -* TRY. -* lock( ). -* -* mo_persistence->delete( object_key ). -* -* unlock( ). -* -* CATCH cx_swb_exception. -* zcx_abapgit_exception=>raise( |Error occured while deleting { ms_item-obj_type }| ). -* ENDTRY. -* -* 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. -* -* ENDMETHOD. -* -* METHOD zif_abapgit_object~compare_to_remote_version. -* CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null. -* ENDMETHOD. -* -* METHOD create_channel_objects. -* -* get_names( ). -* -* TRY. -* IF mo_appl_obj_data IS NOT BOUND. -* CREATE OBJECT mo_appl_obj_data TYPE (mv_appl_obj_cls_name). -* ENDIF. -* -* IF mo_persistence IS NOT BOUND. -* CREATE OBJECT mo_persistence TYPE (mv_persistence_cls_name). -* ENDIF. -* -* CATCH cx_root. -* zcx_abapgit_exception=>raise( |{ ms_item-obj_type } not supported| ). -* ENDTRY. -* -* ENDMETHOD. -* -* METHOD get_data. -* -* DATA: object_key TYPE seu_objkey. -* -* object_key = ms_item-obj_name. -* -* TRY. -* mo_persistence->get( -* EXPORTING -* p_object_key = object_key -* p_version = 'A' -* CHANGING -* p_object_data = mo_appl_obj_data ). -* -* CATCH cx_root. -* zcx_abapgit_exception=>raise( |{ ms_item-obj_type } not supported| ). -* ENDTRY. -* -* mo_appl_obj_data->get_data( -* IMPORTING -* p_data = p_data ). -* -* ENDMETHOD. -* -* METHOD lock. -* -* DATA: objname TYPE trobj_name, -* object_key TYPE seu_objkey, -* objtype TYPE trobjtype. -* -* objname = ms_item-obj_name. -* object_key = ms_item-obj_name. -* objtype = ms_item-obj_type. -* -* mo_persistence->lock( -* EXPORTING -* p_objname_tr = objname -* p_object_key = object_key -* p_objtype_tr = objtype -* EXCEPTIONS -* foreign_lock = 1 -* error_occurred = 2 -* OTHERS = 3 ). -* -* IF sy-subrc <> 0. -* zcx_abapgit_exception=>raise( |Error occured while locking { ms_item-obj_type } | && objname ). -* ENDIF. -* -* ENDMETHOD. "lock -* -* METHOD unlock. -* -* DATA: objname TYPE trobj_name, -* object_key TYPE seu_objkey, -* objtype TYPE trobjtype. -* -* objname = ms_item-obj_name. -* object_key = ms_item-obj_name. -* objtype = ms_item-obj_type. -* -* mo_persistence->unlock( p_objname_tr = objname -* p_object_key = object_key -* p_objtype_tr = objtype ). -* -* ENDMETHOD. "unlock -* -* METHOD get_names. -* -* IF mv_data_structure_name IS INITIAL. -* mv_data_structure_name = get_data_structure_name( ). -* ENDIF. -* -* IF mv_appl_obj_cls_name IS INITIAL. -* mv_appl_obj_cls_name = get_data_class_name( ). -* ENDIF. -* -* IF mv_persistence_cls_name IS INITIAL. -* mv_persistence_cls_name = get_persistence_class_name( ). -* ENDIF. -* -* ENDMETHOD. -* -*ENDCLASS. - *----------------------------------------------------------------------* * CLASS lcl_object DEFINITION *----------------------------------------------------------------------* diff --git a/src/zabapgit_skip_objects.prog.abap b/src/zabapgit_skip_objects.prog.abap index f9d4c4708..fdb6f427e 100644 --- a/src/zabapgit_skip_objects.prog.abap +++ b/src/zabapgit_skip_objects.prog.abap @@ -2,44 +2,4 @@ *& Include zabapgit_skip_objects *&---------------------------------------------------------------------* -CLASS lcl_skip_objects IMPLEMENTATION. - METHOD skip_sadl_generated_objects. - DATA: ls_tadir_class LIKE LINE OF rt_tadir, - ls_tadir LIKE LINE OF rt_tadir, - lt_lines_to_delete TYPE zif_abapgit_definitions=>ty_tadir_tt. - - rt_tadir = it_tadir. - LOOP AT it_tadir INTO ls_tadir WHERE object = 'DDLS'. - LOOP AT rt_tadir INTO ls_tadir_class - WHERE object = 'CLAS' AND obj_name CS ls_tadir-obj_name. - - IF has_sadl_superclass( ls_tadir_class ) = abap_true. - APPEND ls_tadir_class TO lt_lines_to_delete. - ENDIF. - ENDLOOP. - ENDLOOP. - - DELETE ADJACENT DUPLICATES FROM lt_lines_to_delete. - LOOP AT lt_lines_to_delete INTO ls_tadir_class. - DELETE TABLE rt_tadir FROM ls_tadir_class. - IF io_log IS BOUND. - io_log->add( - iv_msg = |{ ls_tadir_class-obj_name } skipped: generated by SADL| - iv_type = 'W' ). - ENDIF. - ENDLOOP. - ENDMETHOD. - - METHOD has_sadl_superclass. - DATA: lo_oo_functions TYPE REF TO zif_abapgit_oo_object_fnc, - lv_class_name TYPE seoclsname, - lv_superclass TYPE seoclsname. - - lo_oo_functions = zcl_abapgit_oo_factory=>make( is_class-object ). - lv_class_name = is_class-obj_name. - lv_superclass = lo_oo_functions->read_superclass( lv_class_name ). - IF lv_superclass = 'CL_SADL_GTK_EXPOSURE_MPC'. - rv_return = abap_true. - ENDIF. - ENDMETHOD. -ENDCLASS. +* todo, include to be deleted diff --git a/src/zabapgit_tadir.prog.abap b/src/zabapgit_tadir.prog.abap index 5dc82dd4a..4bf5bc377 100644 --- a/src/zabapgit_tadir.prog.abap +++ b/src/zabapgit_tadir.prog.abap @@ -7,23 +7,6 @@ *----------------------------------------------------------------------* * *----------------------------------------------------------------------* -CLASS lcl_skip_objects DEFINITION. - PUBLIC SECTION. - METHODS: - skip_sadl_generated_objects - IMPORTING - it_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt - io_log TYPE REF TO zcl_abapgit_log OPTIONAL - RETURNING - VALUE(rt_tadir) TYPE zif_abapgit_definitions=>ty_tadir_tt. - PRIVATE SECTION. - METHODS: - has_sadl_superclass - IMPORTING - is_class TYPE zif_abapgit_definitions=>ty_tadir - RETURNING - VALUE(rv_return) TYPE abap_bool. -ENDCLASS. CLASS lcl_tadir DEFINITION FINAL. @@ -161,7 +144,7 @@ CLASS lcl_tadir IMPLEMENTATION. DATA: lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt, lt_tdevc TYPE STANDARD TABLE OF tdevc, lv_path TYPE string, - lo_skip_objects TYPE REF TO lcl_skip_objects, + lo_skip_objects TYPE REF TO zcl_abapgit_skip_objects, lt_excludes TYPE RANGE OF trobjtype, ls_exclude LIKE LINE OF lt_excludes. diff --git a/src/zabapgit_transport.prog.abap b/src/zabapgit_transport.prog.abap index 6d992ade3..fcf79764d 100644 --- a/src/zabapgit_transport.prog.abap +++ b/src/zabapgit_transport.prog.abap @@ -176,81 +176,6 @@ CLASS lcl_transport IMPLEMENTATION. ENDMETHOD. ENDCLASS. -CLASS lcl_transport_objects DEFINITION. - "Under test at ltcl_transport_objects - PUBLIC SECTION. - METHODS constructor - IMPORTING - it_transport_objects TYPE scts_tadir. - METHODS to_stage - IMPORTING - io_stage TYPE REF TO zcl_abapgit_stage - is_stage_objects TYPE zif_abapgit_definitions=>ty_stage_files - it_object_statuses TYPE zif_abapgit_definitions=>ty_results_tt - RAISING - zcx_abapgit_exception. - PRIVATE SECTION. - DATA mt_transport_objects TYPE scts_tadir. -ENDCLASS. - -CLASS lcl_transport_objects IMPLEMENTATION. - METHOD constructor. - mt_transport_objects = it_transport_objects. - ENDMETHOD. - - METHOD to_stage. - DATA: ls_transport_object TYPE tadir, - ls_local_file TYPE zif_abapgit_definitions=>ty_file_item, - ls_object_status TYPE zif_abapgit_definitions=>ty_result. - - LOOP AT mt_transport_objects INTO ls_transport_object. - LOOP AT it_object_statuses INTO ls_object_status - WHERE obj_name = ls_transport_object-obj_name - AND obj_type = ls_transport_object-object - AND NOT lstate IS INITIAL. - - CASE ls_object_status-lstate. - WHEN zif_abapgit_definitions=>gc_state-added OR zif_abapgit_definitions=>gc_state-modified. - IF ls_transport_object-delflag = abap_true. - zcx_abapgit_exception=>raise( |Object { ls_transport_object-obj_name - } should be added/modified, but has deletion flag in transport| ). - ENDIF. - - READ TABLE is_stage_objects-local - INTO ls_local_file - WITH KEY item-obj_name = ls_transport_object-obj_name - item-obj_type = ls_transport_object-object - file-filename = ls_object_status-filename. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( |Object { ls_transport_object-obj_name - } not found in the local repository files| ). - ENDIF. - - io_stage->add( - iv_path = ls_local_file-file-path - iv_filename = ls_local_file-file-filename - iv_data = ls_local_file-file-data ). - WHEN zif_abapgit_definitions=>gc_state-deleted. - IF ls_transport_object-delflag = abap_false. - zcx_abapgit_exception=>raise( |Object { ls_transport_object-obj_name - } should be removed, but has NO deletion flag in transport| ). - ENDIF. - io_stage->rm( - iv_path = ls_object_status-path - iv_filename = ls_object_status-filename ). - WHEN OTHERS. - ASSERT 0 = 1. "Unexpected state - ENDCASE. - ENDLOOP. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( |Object { ls_transport_object-obj_name - } not found in the local repository files| ). - ENDIF. - ENDLOOP. - ENDMETHOD. - -ENDCLASS. - CLASS lcl_transport_2_branch DEFINITION. PUBLIC SECTION. METHODS: @@ -341,7 +266,7 @@ CLASS lcl_transport_2_branch IMPLEMENTATION. ENDMETHOD. METHOD stage_transport_objects. - DATA lo_transport_objects TYPE REF TO lcl_transport_objects. + DATA lo_transport_objects TYPE REF TO zcl_abapgit_transport_objects. CREATE OBJECT lo_transport_objects EXPORTING it_transport_objects = it_transport_objects. diff --git a/src/zabapgit_unit_test.prog.abap b/src/zabapgit_unit_test.prog.abap index 6f08cc6cf..2105c008f 100644 --- a/src/zabapgit_unit_test.prog.abap +++ b/src/zabapgit_unit_test.prog.abap @@ -312,78 +312,6 @@ CLASS ltcl_git_porcelain IMPLEMENTATION. ENDCLASS. -*----------------------------------------------------------------------* -* CLASS ltcl_url DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS ltcl_url DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. - - PRIVATE SECTION. - - METHODS: - repo_host FOR TESTING RAISING zcx_abapgit_exception, - repo_name1 FOR TESTING RAISING zcx_abapgit_exception, - repo_name2 FOR TESTING RAISING zcx_abapgit_exception, - repo_error FOR TESTING. - -ENDCLASS. "ltcl_url DEFINITION - -*----------------------------------------------------------------------* -* CLASS ltcl_url IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS ltcl_url IMPLEMENTATION. - - METHOD repo_error. - - TRY. - zcl_abapgit_url=>host( 'not a real url' ). "#EC NOTEXT - cl_abap_unit_assert=>fail( ). - CATCH zcx_abapgit_exception. "#EC NO_HANDLER - ENDTRY. - - ENDMETHOD. "repo_error - - METHOD repo_host. - - DATA: lv_host TYPE string. - - lv_host = zcl_abapgit_url=>host( 'https://github.com/larshp/Foobar.git' ). - - cl_abap_unit_assert=>assert_equals( - exp = 'https://github.com' - act = lv_host ). - - ENDMETHOD. "repo_url - - METHOD repo_name1. - - DATA: lv_name TYPE string. - - lv_name = zcl_abapgit_url=>name( 'https://github.com/larshp/Foobar.git' ). - - cl_abap_unit_assert=>assert_equals( - exp = 'Foobar' - act = lv_name ). - - ENDMETHOD. - - METHOD repo_name2. - - DATA: lv_name TYPE string. - - lv_name = zcl_abapgit_url=>name( 'https://git.hanatrial.ondemand.com/p12345trial/yay' ). - - cl_abap_unit_assert=>assert_equals( - exp = 'yay' - act = lv_name ). - - ENDMETHOD. - -ENDCLASS. "ltcl_url IMPLEMENTATION - *----------------------------------------------------------------------* * CLASS ltcl_object_types DEFINITION *----------------------------------------------------------------------* @@ -459,150 +387,6 @@ CLASS ltcl_object_types IMPLEMENTATION. ENDCLASS. "ltcl_object_types IMPLEMENTATION -CLASS ltcl_git_pack_decode_commit DEFINITION FOR TESTING - RISK LEVEL HARMLESS DURATION SHORT FINAL. - - PUBLIC SECTION. - METHODS: - decode1 FOR TESTING - RAISING zcx_abapgit_exception, - decode2 FOR TESTING - RAISING zcx_abapgit_exception, - decode3 FOR TESTING - RAISING zcx_abapgit_exception. - - PRIVATE SECTION. - DATA: ms_raw TYPE zcl_abapgit_git_pack=>ty_commit, - mv_str TYPE string. - - METHODS: - setup, - decode - RAISING zcx_abapgit_exception, - add - IMPORTING iv_string TYPE string. - -ENDCLASS. - -CLASS ltcl_git_pack_decode_commit IMPLEMENTATION. - - METHOD setup. - CLEAR ms_raw. - CLEAR mv_str. - ENDMETHOD. - - METHOD add. - - CONCATENATE mv_str iv_string zif_abapgit_definitions=>gc_newline INTO mv_str. - - ENDMETHOD. - - METHOD decode. - - DATA: lv_xstr TYPE xstring. - - - lv_xstr = zcl_abapgit_convert=>string_to_xstring_utf8( mv_str ). - - ms_raw = zcl_abapgit_git_pack=>decode_commit( lv_xstr ). - - ENDMETHOD. - - METHOD decode1. - - add( 'tree tree' ). - add( 'parent parent1' ). - add( 'parent parent2' ). - add( 'author author' ). - add( 'committer committer' ). - add( '' ). - add( 'comment' ). - - decode( ). - - cl_abap_unit_assert=>assert_equals( - act = ms_raw-tree - exp = 'tree' ). - cl_abap_unit_assert=>assert_equals( - act = ms_raw-author - exp = 'author' ). - cl_abap_unit_assert=>assert_equals( - act = ms_raw-committer - exp = 'committer' ). - cl_abap_unit_assert=>assert_equals( - act = ms_raw-parent - exp = 'parent1' ). - cl_abap_unit_assert=>assert_equals( - act = ms_raw-parent2 - exp = 'parent2' ). - - cl_abap_unit_assert=>assert_char_cp( - act = ms_raw-body - exp = 'comment+' ). - - ENDMETHOD. - - METHOD decode2. - - add( 'tree tree' ). - add( 'author author' ). - add( 'committer committer' ). - add( '' ). - add( 'comment' ). - - decode( ). - - cl_abap_unit_assert=>assert_equals( - act = ms_raw-tree - exp = 'tree' ). - cl_abap_unit_assert=>assert_equals( - act = ms_raw-author - exp = 'author' ). - cl_abap_unit_assert=>assert_equals( - act = ms_raw-committer - exp = 'committer' ). - cl_abap_unit_assert=>assert_equals( - act = ms_raw-parent - exp = '' ). - - cl_abap_unit_assert=>assert_char_cp( - act = ms_raw-body - exp = 'comment+' ). - - ENDMETHOD. - - METHOD decode3. - - add( 'tree tree' ). - add( 'parent parent1' ). - add( 'author author' ). - add( 'committer committer' ). - add( '' ). - add( 'comment' ). - - decode( ). - - cl_abap_unit_assert=>assert_equals( - act = ms_raw-tree - exp = 'tree' ). - cl_abap_unit_assert=>assert_equals( - act = ms_raw-author - exp = 'author' ). - cl_abap_unit_assert=>assert_equals( - act = ms_raw-committer - exp = 'committer' ). - cl_abap_unit_assert=>assert_equals( - act = ms_raw-parent - exp = 'parent1' ). - - cl_abap_unit_assert=>assert_char_cp( - act = ms_raw-body - exp = 'comment+' ). - - ENDMETHOD. - -ENDCLASS. - *----------------------------------------------------------------------* * CLASS ltcl_serialize DEFINITION *----------------------------------------------------------------------* diff --git a/src/zabapgit_unit_test_transport.prog.abap b/src/zabapgit_unit_test_transport.prog.abap index f2c8e85a0..b961ee7eb 100644 --- a/src/zabapgit_unit_test_transport.prog.abap +++ b/src/zabapgit_unit_test_transport.prog.abap @@ -2,363 +2,4 @@ *& Include ZABAPGIT_UNIT_TEST_TRANSPORT *&---------------------------------------------------------------------* - -CLASS ltcl_transport_objects DEFINITION FOR TESTING. - PRIVATE SECTION. - METHODS: - add_new_to_local_files FOR TESTING RAISING cx_static_check, - modified_to_new_local_files FOR TESTING RAISING cx_static_check, - transport_not_in_repository FOR TESTING RAISING cx_static_check, - object_not_in_local_files FOR TESTING RAISING cx_static_check, - cant_be_added_with_del_flag FOR TESTING RAISING cx_static_check, - cant_be_modified_with_del_flag FOR TESTING RAISING cx_static_check, - deleted_to_removed_files FOR TESTING RAISING cx_static_check, - shouldnt_remove_no_delflag FOR TESTING RAISING cx_static_check, - should_add_all_local_files FOR TESTING RAISING cx_static_check, - should_delete_all_related FOR TESTING RAISING cx_static_check, - setup, - given_the_transport_object - IMPORTING iv_obj_name TYPE string - iv_obj_type TYPE string - iv_delflag TYPE abap_bool OPTIONAL, - given_the_object_status - IMPORTING - iv_obj_name TYPE string OPTIONAL - iv_obj_type TYPE string OPTIONAL - iv_filename TYPE string OPTIONAL - iv_path TYPE string OPTIONAL - iv_lstate TYPE char1, - given_the_local_file - IMPORTING iv_obj_name TYPE string - iv_obj_type TYPE string - iv_filename TYPE string - iv_path TYPE string - iv_data TYPE string - RETURNING VALUE(rs_local_file) TYPE zif_abapgit_definitions=>ty_file_item, - when_staging - RAISING zcx_abapgit_exception, - then_file_should_be_added - IMPORTING - is_local_file TYPE zif_abapgit_definitions=>ty_file_item, - then_it_should_raise_exception - IMPORTING - with_text TYPE string, - then_it_should_remove_at_stage - IMPORTING - iv_filename TYPE string - iv_path TYPE string. - - DATA: mo_transport_objects TYPE REF TO lcl_transport_objects, - mt_transport_objects TYPE scts_tadir, - mt_object_statuses TYPE zif_abapgit_definitions=>ty_results_tt, - ms_stage_objects TYPE zif_abapgit_definitions=>ty_stage_files, - mo_stage TYPE REF TO zcl_abapgit_stage. - -ENDCLASS. - -CLASS ltcl_transport_objects IMPLEMENTATION. - METHOD setup. - CREATE OBJECT mo_stage - EXPORTING - iv_branch_name = 'A_branch_name' - iv_branch_sha1 = 'Branch_SH1'. - ENDMETHOD. - METHOD add_new_to_local_files. - DATA ls_local_file TYPE zif_abapgit_definitions=>ty_file_item. - - given_the_transport_object( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' ). - - given_the_object_status( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' - iv_filename = 'CL_FOO.abap' - iv_lstate = zif_abapgit_definitions=>gc_state-added ). - - ls_local_file = given_the_local_file( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' - iv_filename = 'CL_FOO.abap' - iv_path = '/path' - iv_data = 'data' ). - - when_staging( ). - - then_file_should_be_added( ls_local_file ). - ENDMETHOD. - METHOD modified_to_new_local_files. - DATA ls_local_file TYPE zif_abapgit_definitions=>ty_file_item. - given_the_transport_object( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' ). - - given_the_object_status( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' - iv_filename = 'CL_FOO.abap' - iv_lstate = zif_abapgit_definitions=>gc_state-modified ). - - ls_local_file = given_the_local_file( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' - iv_filename = 'CL_FOO.abap' - iv_path = '/path' - iv_data = 'data' ). - - when_staging( ). - - then_file_should_be_added( ls_local_file ). - ENDMETHOD. - METHOD should_add_all_local_files. - "Not only .abap, but also .xml and other includes - DATA ls_abap_local_file TYPE zif_abapgit_definitions=>ty_file_item. - DATA ls_xml_local_file TYPE zif_abapgit_definitions=>ty_file_item. - - given_the_transport_object( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' ). - - given_the_object_status( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' - iv_filename = 'CL_FOO.abap' - iv_lstate = zif_abapgit_definitions=>gc_state-modified ). - - given_the_object_status( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' - iv_filename = 'CL_FOO.xml' - iv_lstate = zif_abapgit_definitions=>gc_state-modified ). - - ls_abap_local_file = given_the_local_file( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' - iv_filename = 'CL_FOO.abap' - iv_path = '/path' - iv_data = 'data' ). - - ls_xml_local_file = given_the_local_file( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' - iv_filename = 'CL_FOO.xml' - iv_path = '/path' - iv_data = 'data' ). - - when_staging( ). - - then_file_should_be_added( ls_abap_local_file ). - then_file_should_be_added( ls_xml_local_file ). - ENDMETHOD. - METHOD transport_not_in_repository. - given_the_transport_object( - iv_obj_name = 'CL_A_CLASS_NOT_IN_REPO' - iv_obj_type = 'CLAS' ). - - given_the_object_status( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' - iv_lstate = zif_abapgit_definitions=>gc_state-added ). - - then_it_should_raise_exception( - with_text = 'Object CL_A_CLASS_NOT_IN_REPO not found in the local repository files' ). - ENDMETHOD. - - METHOD object_not_in_local_files. - - given_the_transport_object( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' ). - - given_the_object_status( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' - iv_lstate = zif_abapgit_definitions=>gc_state-added ). - - given_the_local_file( - iv_obj_name = 'CL_ANOTHER_LOCAL_FILE' - iv_obj_type = 'CLAS' - iv_filename = 'CL_FOO.abap' - iv_path = '/path' - iv_data = 'data' ). - - then_it_should_raise_exception( - with_text = 'Object CL_FOO not found in the local repository files' ). - ENDMETHOD. - - METHOD cant_be_added_with_del_flag. - given_the_transport_object( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' - iv_delflag = abap_true ). - - given_the_object_status( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' - iv_lstate = zif_abapgit_definitions=>gc_state-added ). - - then_it_should_raise_exception( - with_text = 'Object CL_FOO should be added/modified, but has deletion flag in transport' ). - ENDMETHOD. - - METHOD cant_be_modified_with_del_flag. - given_the_transport_object( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' - iv_delflag = abap_true ). - - given_the_object_status( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' - iv_lstate = zif_abapgit_definitions=>gc_state-modified ). - - then_it_should_raise_exception( - with_text = 'Object CL_FOO should be added/modified, but has deletion flag in transport' ). - ENDMETHOD. - METHOD deleted_to_removed_files. - given_the_transport_object( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' - iv_delflag = abap_true ). - - given_the_object_status( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' - iv_filename = 'CL_FOO.abap' - iv_path = '/a_path' - iv_lstate = zif_abapgit_definitions=>gc_state-deleted ). - - when_staging( ). - - then_it_should_remove_at_stage( - iv_filename = 'CL_FOO.abap' - iv_path = '/a_path' ). - ENDMETHOD. - - METHOD should_delete_all_related. - "i.e. Should also delete the XMLs related to the transport objects - given_the_transport_object( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' - iv_delflag = abap_true ). - - given_the_object_status( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' - iv_filename = 'CL_FOO.abap' - iv_path = '/a_path' - iv_lstate = zif_abapgit_definitions=>gc_state-deleted ). - - given_the_object_status( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' - iv_filename = 'CL_FOO.xml' - iv_path = '/a_path' - iv_lstate = zif_abapgit_definitions=>gc_state-deleted ). - - when_staging( ). - - then_it_should_remove_at_stage( - iv_filename = 'CL_FOO.abap' - iv_path = '/a_path' ). - - then_it_should_remove_at_stage( - iv_filename = 'CL_FOO.xml' - iv_path = '/a_path' ). - ENDMETHOD. - - METHOD shouldnt_remove_no_delflag. - given_the_transport_object( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' - iv_delflag = abap_false ). - - given_the_object_status( - iv_obj_name = 'CL_FOO' - iv_obj_type = 'CLAS' - iv_filename = 'CL_FOO.abap' - iv_path = '/a_path' - iv_lstate = zif_abapgit_definitions=>gc_state-deleted ). - - then_it_should_raise_exception( - with_text = 'Object CL_FOO should be removed, but has NO deletion flag in transport' ). - ENDMETHOD. - - METHOD given_the_transport_object. - DATA ls_transport_object TYPE tadir. - ls_transport_object-obj_name = iv_obj_name. - ls_transport_object-object = iv_obj_type. - ls_transport_object-delflag = iv_delflag. - APPEND ls_transport_object TO mt_transport_objects. - ENDMETHOD. - - METHOD given_the_object_status. - DATA ls_object_status TYPE zif_abapgit_definitions=>ty_result. - ls_object_status-obj_name = iv_obj_name. - ls_object_status-obj_type = iv_obj_type. - ls_object_status-filename = iv_filename. - ls_object_status-path = iv_path. - ls_object_status-lstate = iv_lstate. - APPEND ls_object_status TO mt_object_statuses. - ENDMETHOD. - - METHOD given_the_local_file. - rs_local_file-item-obj_name = iv_obj_name. - rs_local_file-item-obj_type = iv_obj_type. - rs_local_file-file-filename = iv_filename. - rs_local_file-file-path = iv_path. - rs_local_file-file-data = iv_data. - APPEND rs_local_file TO ms_stage_objects-local. - ENDMETHOD. - - METHOD when_staging. - CREATE OBJECT mo_transport_objects - EXPORTING - it_transport_objects = mt_transport_objects. - mo_transport_objects->to_stage( - io_stage = mo_stage - is_stage_objects = ms_stage_objects - it_object_statuses = mt_object_statuses ). - ENDMETHOD. - - METHOD then_file_should_be_added. - DATA: lt_staged_objects TYPE zcl_abapgit_stage=>ty_stage_tt. - lt_staged_objects = mo_stage->get_all( ). - - READ TABLE lt_staged_objects TRANSPORTING NO FIELDS - WITH KEY file-filename = is_local_file-file-filename - file-path = is_local_file-file-path - file-data = is_local_file-file-data - method = zcl_abapgit_stage=>c_method-add. - IF sy-subrc <> 0. - cl_abap_unit_assert=>fail( |Object { is_local_file-file-filename } not added to stage| ). - ENDIF. - ENDMETHOD. - - METHOD then_it_should_raise_exception. - DATA: lo_exception TYPE REF TO zcx_abapgit_exception. - TRY. - when_staging( ). - cl_abap_unit_assert=>fail( 'Should have raised exception'). - CATCH zcx_abapgit_exception INTO lo_exception. - cl_abap_unit_assert=>assert_equals( - act = lo_exception->text - exp = with_text ). - ENDTRY. - ENDMETHOD. - - METHOD then_it_should_remove_at_stage. - - DATA: lt_staged_objects TYPE zcl_abapgit_stage=>ty_stage_tt. - - lt_staged_objects = mo_stage->get_all( ). - - READ TABLE lt_staged_objects TRANSPORTING NO FIELDS - WITH KEY file-filename = iv_filename - file-path = iv_path. - IF sy-subrc <> 0. - cl_abap_unit_assert=>fail( |Object { iv_filename } not removed in stage| ). - ENDIF. - ENDMETHOD. - -ENDCLASS. +* todo, include to be deleted diff --git a/src/zcl_abapgit_http_client.clas.abap b/src/zcl_abapgit_http_client.clas.abap new file mode 100644 index 000000000..a91332f91 --- /dev/null +++ b/src/zcl_abapgit_http_client.clas.abap @@ -0,0 +1,169 @@ +CLASS zcl_abapgit_http_client DEFINITION PUBLIC CREATE PUBLIC. + + PUBLIC SECTION. + + METHODS: + constructor + IMPORTING ii_client TYPE REF TO if_http_client, + close, + set_digest + IMPORTING io_digest TYPE REF TO zcl_abapgit_http_digest, + send_receive_close + IMPORTING + iv_data TYPE xstring + RETURNING + VALUE(rv_data) TYPE xstring + RAISING zcx_abapgit_exception, + get_cdata + RETURNING VALUE(rv_value) TYPE string, + check_http_200 + RAISING zcx_abapgit_exception, + send_receive + RAISING zcx_abapgit_exception, + set_headers + IMPORTING iv_url TYPE string + iv_service TYPE string + RAISING zcx_abapgit_exception. + + PRIVATE SECTION. + DATA: mi_client TYPE REF TO if_http_client, + mo_digest TYPE REF TO zcl_abapgit_http_digest. + +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_HTTP_CLIENT IMPLEMENTATION. + + + METHOD check_http_200. + + DATA: lv_code TYPE i, + lv_text TYPE string. + + + mi_client->response->get_status( + IMPORTING + code = lv_code ). + CASE lv_code. + WHEN 200. + RETURN. + WHEN 302. + zcx_abapgit_exception=>raise( 'HTTP redirect, check URL' ). + WHEN 401. + zcx_abapgit_exception=>raise( 'HTTP 401, unauthorized' ). + WHEN 403. + zcx_abapgit_exception=>raise( 'HTTP 403, forbidden' ). + WHEN 404. + zcx_abapgit_exception=>raise( 'HTTP 404, not found' ). + WHEN 415. + zcx_abapgit_exception=>raise( 'HTTP 415, unsupported media type' ). + WHEN OTHERS. + lv_text = mi_client->response->get_cdata( ). + zcx_abapgit_exception=>raise( |HTTP error code: { lv_code }, { lv_text }| ). + ENDCASE. + + ENDMETHOD. "http_200 + + + METHOD close. + mi_client->close( ). + ENDMETHOD. + + + METHOD constructor. + mi_client = ii_client. + ENDMETHOD. + + + METHOD get_cdata. + rv_value = mi_client->response->get_cdata( ). + ENDMETHOD. + + + METHOD send_receive. + + DATA: lv_text TYPE string, + lv_code TYPE i, + lv_message TYPE string. + + mi_client->send( ). + mi_client->receive( + EXCEPTIONS + http_communication_failure = 1 + http_invalid_state = 2 + http_processing_failed = 3 + OTHERS = 4 ). + + IF sy-subrc <> 0. + " in case of HTTP_COMMUNICATION_FAILURE + " make sure: + " a) SSL is setup properly in STRUST + " b) no firewalls + " check trace file in transaction SMICM + + mi_client->get_last_error( + IMPORTING + code = lv_code + message = lv_message ). + + lv_text = |HTTP error { lv_code } occured: { lv_message }|. + + zcx_abapgit_exception=>raise( lv_text ). + ENDIF. + + ENDMETHOD. "send_receive + + + METHOD send_receive_close. + +* do not use set_cdata as it modifies the Content-Type header field + mi_client->request->set_data( iv_data ). + send_receive( ). + check_http_200( ). + rv_data = mi_client->response->get_data( ). + mi_client->close( ). + + ENDMETHOD. + + + METHOD set_digest. + mo_digest = io_digest. + ENDMETHOD. + + + METHOD set_headers. + + DATA: lv_value TYPE string. + + + mi_client->request->set_header_field( + name = '~request_method' + value = 'POST' ). + + lv_value = zcl_abapgit_url=>path_name( iv_url ) && + '/git-' && + iv_service && + '-pack'. + mi_client->request->set_header_field( + name = '~request_uri' + value = lv_value ). + + lv_value = 'application/x-git-' + && iv_service && '-pack-request'. "#EC NOTEXT + mi_client->request->set_header_field( + name = 'Content-Type' + value = lv_value ). "#EC NOTEXT + + lv_value = 'application/x-git-' + && iv_service && '-pack-result'. "#EC NOTEXT + mi_client->request->set_header_field( + name = 'Accept' + value = lv_value ). "#EC NOTEXT + + IF mo_digest IS BOUND. + mo_digest->run( mi_client ). + ENDIF. + + ENDMETHOD. "set_headers +ENDCLASS. diff --git a/src/zcl_abapgit_http_client.clas.xml b/src/zcl_abapgit_http_client.clas.xml new file mode 100644 index 000000000..78ec517d6 --- /dev/null +++ b/src/zcl_abapgit_http_client.clas.xml @@ -0,0 +1,18 @@ + + + + + + ZCL_ABAPGIT_HTTP_CLIENT + 1 + E + http client + 2 + 1 + X + X + X + + + + diff --git a/src/zcl_abapgit_skip_objects.clas.abap b/src/zcl_abapgit_skip_objects.clas.abap new file mode 100644 index 000000000..84c136bdf --- /dev/null +++ b/src/zcl_abapgit_skip_objects.clas.abap @@ -0,0 +1,66 @@ +CLASS zcl_abapgit_skip_objects DEFINITION PUBLIC FINAL CREATE PUBLIC. + + PUBLIC SECTION. + METHODS: + skip_sadl_generated_objects + IMPORTING + it_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt + io_log TYPE REF TO zcl_abapgit_log OPTIONAL + RETURNING + VALUE(rt_tadir) TYPE zif_abapgit_definitions=>ty_tadir_tt. + PRIVATE SECTION. + METHODS: + has_sadl_superclass + IMPORTING + is_class TYPE zif_abapgit_definitions=>ty_tadir + RETURNING + VALUE(rv_return) TYPE abap_bool. + +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_SKIP_OBJECTS IMPLEMENTATION. + + + METHOD has_sadl_superclass. + DATA: lo_oo_functions TYPE REF TO zif_abapgit_oo_object_fnc, + lv_class_name TYPE seoclsname, + lv_superclass TYPE seoclsname. + + lo_oo_functions = zcl_abapgit_oo_factory=>make( is_class-object ). + lv_class_name = is_class-obj_name. + lv_superclass = lo_oo_functions->read_superclass( lv_class_name ). + IF lv_superclass = 'CL_SADL_GTK_EXPOSURE_MPC'. + rv_return = abap_true. + ENDIF. + ENDMETHOD. + + + METHOD skip_sadl_generated_objects. + DATA: ls_tadir_class LIKE LINE OF rt_tadir, + ls_tadir LIKE LINE OF rt_tadir, + lt_lines_to_delete TYPE zif_abapgit_definitions=>ty_tadir_tt. + + rt_tadir = it_tadir. + LOOP AT it_tadir INTO ls_tadir WHERE object = 'DDLS'. + LOOP AT rt_tadir INTO ls_tadir_class + WHERE object = 'CLAS' AND obj_name CS ls_tadir-obj_name. + + IF has_sadl_superclass( ls_tadir_class ) = abap_true. + APPEND ls_tadir_class TO lt_lines_to_delete. + ENDIF. + ENDLOOP. + ENDLOOP. + + DELETE ADJACENT DUPLICATES FROM lt_lines_to_delete. + LOOP AT lt_lines_to_delete INTO ls_tadir_class. + DELETE TABLE rt_tadir FROM ls_tadir_class. + IF io_log IS BOUND. + io_log->add( + iv_msg = |{ ls_tadir_class-obj_name } skipped: generated by SADL| + iv_type = 'W' ). + ENDIF. + ENDLOOP. + ENDMETHOD. +ENDCLASS. diff --git a/src/zcl_abapgit_skip_objects.clas.xml b/src/zcl_abapgit_skip_objects.clas.xml new file mode 100644 index 000000000..b5000a835 --- /dev/null +++ b/src/zcl_abapgit_skip_objects.clas.xml @@ -0,0 +1,19 @@ + + + + + + ZCL_ABAPGIT_SKIP_OBJECTS + 1 + E + Skip objects + 2 + 1 + X + X + X + X + + + + diff --git a/src/zcl_abapgit_transport_objects.clas.abap b/src/zcl_abapgit_transport_objects.clas.abap new file mode 100644 index 000000000..6dd664176 --- /dev/null +++ b/src/zcl_abapgit_transport_objects.clas.abap @@ -0,0 +1,83 @@ +CLASS zcl_abapgit_transport_objects DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS constructor + IMPORTING + !it_transport_objects TYPE scts_tadir . + METHODS to_stage + IMPORTING + !io_stage TYPE REF TO zcl_abapgit_stage + !is_stage_objects TYPE zif_abapgit_definitions=>ty_stage_files + !it_object_statuses TYPE zif_abapgit_definitions=>ty_results_tt + RAISING + zcx_abapgit_exception . + PRIVATE SECTION. + DATA mt_transport_objects TYPE scts_tadir. + +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_TRANSPORT_OBJECTS IMPLEMENTATION. + + + METHOD constructor. + mt_transport_objects = it_transport_objects. + ENDMETHOD. + + + METHOD to_stage. + DATA: ls_transport_object TYPE tadir, + ls_local_file TYPE zif_abapgit_definitions=>ty_file_item, + ls_object_status TYPE zif_abapgit_definitions=>ty_result. + + LOOP AT mt_transport_objects INTO ls_transport_object. + LOOP AT it_object_statuses INTO ls_object_status + WHERE obj_name = ls_transport_object-obj_name + AND obj_type = ls_transport_object-object + AND NOT lstate IS INITIAL. + + CASE ls_object_status-lstate. + WHEN zif_abapgit_definitions=>gc_state-added OR zif_abapgit_definitions=>gc_state-modified. + IF ls_transport_object-delflag = abap_true. + zcx_abapgit_exception=>raise( |Object { ls_transport_object-obj_name + } should be added/modified, but has deletion flag in transport| ). + ENDIF. + + READ TABLE is_stage_objects-local + INTO ls_local_file + WITH KEY item-obj_name = ls_transport_object-obj_name + item-obj_type = ls_transport_object-object + file-filename = ls_object_status-filename. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |Object { ls_transport_object-obj_name + } not found in the local repository files| ). + ENDIF. + + io_stage->add( + iv_path = ls_local_file-file-path + iv_filename = ls_local_file-file-filename + iv_data = ls_local_file-file-data ). + WHEN zif_abapgit_definitions=>gc_state-deleted. + IF ls_transport_object-delflag = abap_false. + zcx_abapgit_exception=>raise( |Object { ls_transport_object-obj_name + } should be removed, but has NO deletion flag in transport| ). + ENDIF. + io_stage->rm( + iv_path = ls_object_status-path + iv_filename = ls_object_status-filename ). + WHEN OTHERS. + ASSERT 0 = 1. "Unexpected state + ENDCASE. + ENDLOOP. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |Object { ls_transport_object-obj_name + } not found in the local repository files| ). + ENDIF. + ENDLOOP. + ENDMETHOD. +ENDCLASS. diff --git a/src/zcl_abapgit_transport_objects.clas.testclasses.abap b/src/zcl_abapgit_transport_objects.clas.testclasses.abap new file mode 100644 index 000000000..a7a8ef96e --- /dev/null +++ b/src/zcl_abapgit_transport_objects.clas.testclasses.abap @@ -0,0 +1,363 @@ + +CLASS ltcl_transport_objects DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. + + PRIVATE SECTION. + METHODS: + add_new_to_local_files FOR TESTING RAISING cx_static_check, + modified_to_new_local_files FOR TESTING RAISING cx_static_check, + transport_not_in_repository FOR TESTING RAISING cx_static_check, + object_not_in_local_files FOR TESTING RAISING cx_static_check, + cant_be_added_with_del_flag FOR TESTING RAISING cx_static_check, + cant_be_modified_with_del_flag FOR TESTING RAISING cx_static_check, + deleted_to_removed_files FOR TESTING RAISING cx_static_check, + shouldnt_remove_no_delflag FOR TESTING RAISING cx_static_check, + should_add_all_local_files FOR TESTING RAISING cx_static_check, + should_delete_all_related FOR TESTING RAISING cx_static_check, + setup, + given_the_transport_object + IMPORTING iv_obj_name TYPE string + iv_obj_type TYPE string + iv_delflag TYPE abap_bool OPTIONAL, + given_the_object_status + IMPORTING + iv_obj_name TYPE string OPTIONAL + iv_obj_type TYPE string OPTIONAL + iv_filename TYPE string OPTIONAL + iv_path TYPE string OPTIONAL + iv_lstate TYPE char1, + given_the_local_file + IMPORTING iv_obj_name TYPE string + iv_obj_type TYPE string + iv_filename TYPE string + iv_path TYPE string + iv_data TYPE string + RETURNING VALUE(rs_local_file) TYPE zif_abapgit_definitions=>ty_file_item, + when_staging + RAISING zcx_abapgit_exception, + then_file_should_be_added + IMPORTING + is_local_file TYPE zif_abapgit_definitions=>ty_file_item, + then_it_should_raise_exception + IMPORTING + with_text TYPE string, + then_it_should_remove_at_stage + IMPORTING + iv_filename TYPE string + iv_path TYPE string. + + DATA: mo_transport_objects TYPE REF TO zcl_abapgit_transport_objects, + mt_transport_objects TYPE scts_tadir, + mt_object_statuses TYPE zif_abapgit_definitions=>ty_results_tt, + ms_stage_objects TYPE zif_abapgit_definitions=>ty_stage_files, + mo_stage TYPE REF TO zcl_abapgit_stage. + +ENDCLASS. "ltcl_Transport_Objects + + +CLASS ltcl_transport_objects IMPLEMENTATION. + + METHOD setup. + CREATE OBJECT mo_stage + EXPORTING + iv_branch_name = 'A_branch_name' + iv_branch_sha1 = 'Branch_SH1'. + ENDMETHOD. + METHOD add_new_to_local_files. + DATA ls_local_file TYPE zif_abapgit_definitions=>ty_file_item. + + given_the_transport_object( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' ). + + given_the_object_status( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' + iv_filename = 'CL_FOO.abap' + iv_lstate = zif_abapgit_definitions=>gc_state-added ). + + ls_local_file = given_the_local_file( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' + iv_filename = 'CL_FOO.abap' + iv_path = '/path' + iv_data = 'data' ). + + when_staging( ). + + then_file_should_be_added( ls_local_file ). + ENDMETHOD. + METHOD modified_to_new_local_files. + DATA ls_local_file TYPE zif_abapgit_definitions=>ty_file_item. + given_the_transport_object( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' ). + + given_the_object_status( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' + iv_filename = 'CL_FOO.abap' + iv_lstate = zif_abapgit_definitions=>gc_state-modified ). + + ls_local_file = given_the_local_file( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' + iv_filename = 'CL_FOO.abap' + iv_path = '/path' + iv_data = 'data' ). + + when_staging( ). + + then_file_should_be_added( ls_local_file ). + ENDMETHOD. + METHOD should_add_all_local_files. + "Not only .abap, but also .xml and other includes + DATA ls_abap_local_file TYPE zif_abapgit_definitions=>ty_file_item. + DATA ls_xml_local_file TYPE zif_abapgit_definitions=>ty_file_item. + + given_the_transport_object( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' ). + + given_the_object_status( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' + iv_filename = 'CL_FOO.abap' + iv_lstate = zif_abapgit_definitions=>gc_state-modified ). + + given_the_object_status( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' + iv_filename = 'CL_FOO.xml' + iv_lstate = zif_abapgit_definitions=>gc_state-modified ). + + ls_abap_local_file = given_the_local_file( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' + iv_filename = 'CL_FOO.abap' + iv_path = '/path' + iv_data = 'data' ). + + ls_xml_local_file = given_the_local_file( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' + iv_filename = 'CL_FOO.xml' + iv_path = '/path' + iv_data = 'data' ). + + when_staging( ). + + then_file_should_be_added( ls_abap_local_file ). + then_file_should_be_added( ls_xml_local_file ). + ENDMETHOD. + METHOD transport_not_in_repository. + given_the_transport_object( + iv_obj_name = 'CL_A_CLASS_NOT_IN_REPO' + iv_obj_type = 'CLAS' ). + + given_the_object_status( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' + iv_lstate = zif_abapgit_definitions=>gc_state-added ). + + then_it_should_raise_exception( + with_text = 'Object CL_A_CLASS_NOT_IN_REPO not found in the local repository files' ). + ENDMETHOD. + + METHOD object_not_in_local_files. + + given_the_transport_object( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' ). + + given_the_object_status( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' + iv_lstate = zif_abapgit_definitions=>gc_state-added ). + + given_the_local_file( + iv_obj_name = 'CL_ANOTHER_LOCAL_FILE' + iv_obj_type = 'CLAS' + iv_filename = 'CL_FOO.abap' + iv_path = '/path' + iv_data = 'data' ). + + then_it_should_raise_exception( + with_text = 'Object CL_FOO not found in the local repository files' ). + ENDMETHOD. + + METHOD cant_be_added_with_del_flag. + given_the_transport_object( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' + iv_delflag = abap_true ). + + given_the_object_status( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' + iv_lstate = zif_abapgit_definitions=>gc_state-added ). + + then_it_should_raise_exception( + with_text = 'Object CL_FOO should be added/modified, but has deletion flag in transport' ). + ENDMETHOD. + + METHOD cant_be_modified_with_del_flag. + given_the_transport_object( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' + iv_delflag = abap_true ). + + given_the_object_status( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' + iv_lstate = zif_abapgit_definitions=>gc_state-modified ). + + then_it_should_raise_exception( + with_text = 'Object CL_FOO should be added/modified, but has deletion flag in transport' ). + ENDMETHOD. + METHOD deleted_to_removed_files. + given_the_transport_object( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' + iv_delflag = abap_true ). + + given_the_object_status( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' + iv_filename = 'CL_FOO.abap' + iv_path = '/a_path' + iv_lstate = zif_abapgit_definitions=>gc_state-deleted ). + + when_staging( ). + + then_it_should_remove_at_stage( + iv_filename = 'CL_FOO.abap' + iv_path = '/a_path' ). + ENDMETHOD. + + METHOD should_delete_all_related. + "i.e. Should also delete the XMLs related to the transport objects + given_the_transport_object( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' + iv_delflag = abap_true ). + + given_the_object_status( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' + iv_filename = 'CL_FOO.abap' + iv_path = '/a_path' + iv_lstate = zif_abapgit_definitions=>gc_state-deleted ). + + given_the_object_status( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' + iv_filename = 'CL_FOO.xml' + iv_path = '/a_path' + iv_lstate = zif_abapgit_definitions=>gc_state-deleted ). + + when_staging( ). + + then_it_should_remove_at_stage( + iv_filename = 'CL_FOO.abap' + iv_path = '/a_path' ). + + then_it_should_remove_at_stage( + iv_filename = 'CL_FOO.xml' + iv_path = '/a_path' ). + ENDMETHOD. + + METHOD shouldnt_remove_no_delflag. + given_the_transport_object( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' + iv_delflag = abap_false ). + + given_the_object_status( + iv_obj_name = 'CL_FOO' + iv_obj_type = 'CLAS' + iv_filename = 'CL_FOO.abap' + iv_path = '/a_path' + iv_lstate = zif_abapgit_definitions=>gc_state-deleted ). + + then_it_should_raise_exception( + with_text = 'Object CL_FOO should be removed, but has NO deletion flag in transport' ). + ENDMETHOD. + + METHOD given_the_transport_object. + DATA ls_transport_object TYPE tadir. + ls_transport_object-obj_name = iv_obj_name. + ls_transport_object-object = iv_obj_type. + ls_transport_object-delflag = iv_delflag. + APPEND ls_transport_object TO mt_transport_objects. + ENDMETHOD. + + METHOD given_the_object_status. + DATA ls_object_status TYPE zif_abapgit_definitions=>ty_result. + ls_object_status-obj_name = iv_obj_name. + ls_object_status-obj_type = iv_obj_type. + ls_object_status-filename = iv_filename. + ls_object_status-path = iv_path. + ls_object_status-lstate = iv_lstate. + APPEND ls_object_status TO mt_object_statuses. + ENDMETHOD. + + METHOD given_the_local_file. + rs_local_file-item-obj_name = iv_obj_name. + rs_local_file-item-obj_type = iv_obj_type. + rs_local_file-file-filename = iv_filename. + rs_local_file-file-path = iv_path. + rs_local_file-file-data = iv_data. + APPEND rs_local_file TO ms_stage_objects-local. + ENDMETHOD. + + METHOD when_staging. + CREATE OBJECT mo_transport_objects + EXPORTING + it_transport_objects = mt_transport_objects. + mo_transport_objects->to_stage( + io_stage = mo_stage + is_stage_objects = ms_stage_objects + it_object_statuses = mt_object_statuses ). + ENDMETHOD. + + METHOD then_file_should_be_added. + DATA: lt_staged_objects TYPE zcl_abapgit_stage=>ty_stage_tt. + lt_staged_objects = mo_stage->get_all( ). + + READ TABLE lt_staged_objects TRANSPORTING NO FIELDS + WITH KEY file-filename = is_local_file-file-filename + file-path = is_local_file-file-path + file-data = is_local_file-file-data + method = zcl_abapgit_stage=>c_method-add. + IF sy-subrc <> 0. + cl_abap_unit_assert=>fail( |Object { is_local_file-file-filename } not added to stage| ). + ENDIF. + ENDMETHOD. + + METHOD then_it_should_raise_exception. + DATA: lo_exception TYPE REF TO zcx_abapgit_exception. + TRY. + when_staging( ). + cl_abap_unit_assert=>fail( 'Should have raised exception'). + CATCH zcx_abapgit_exception INTO lo_exception. + cl_abap_unit_assert=>assert_equals( + act = lo_exception->text + exp = with_text ). + ENDTRY. + ENDMETHOD. + + METHOD then_it_should_remove_at_stage. + + DATA: lt_staged_objects TYPE zcl_abapgit_stage=>ty_stage_tt. + + lt_staged_objects = mo_stage->get_all( ). + + READ TABLE lt_staged_objects TRANSPORTING NO FIELDS + WITH KEY file-filename = iv_filename + file-path = iv_path. + IF sy-subrc <> 0. + cl_abap_unit_assert=>fail( |Object { iv_filename } not removed in stage| ). + ENDIF. + ENDMETHOD. + +ENDCLASS. diff --git a/src/zcl_abapgit_transport_objects.clas.xml b/src/zcl_abapgit_transport_objects.clas.xml new file mode 100644 index 000000000..6d1657167 --- /dev/null +++ b/src/zcl_abapgit_transport_objects.clas.xml @@ -0,0 +1,20 @@ + + + + + + ZCL_ABAPGIT_TRANSPORT_OBJECTS + 1 + E + Transport objects + 2 + 1 + X + X + X + X + X + + + +