diff --git a/src/zabapgit.prog.abap b/src/zabapgit.prog.abap index 4a561cb42..ebb165793 100644 --- a/src/zabapgit.prog.abap +++ b/src/zabapgit.prog.abap @@ -3,7 +3,7 @@ REPORT zabapgit LINE-SIZE 100. * See http://www.abapgit.org CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT - gc_abap_version TYPE string VALUE 'v1.17.20'. "#EC NOTEXT + gc_abap_version TYPE string VALUE 'v1.18.4'. "#EC NOTEXT ******************************************************************************** * The MIT License (MIT) @@ -36,6 +36,7 @@ SELECTION-SCREEN END OF SCREEN 1001. INCLUDE zabapgit_password_dialog. " !!! Contains SELECTION SCREEN INCLUDE zabapgit_definitions. +INCLUDE zabapgit_macros. INCLUDE zabapgit_exceptions. INCLUDE zabapgit_zlib. INCLUDE zabapgit_html. diff --git a/src/zabapgit_definitions.prog.abap b/src/zabapgit_definitions.prog.abap index 340e64e16..075f6415e 100644 --- a/src/zabapgit_definitions.prog.abap +++ b/src/zabapgit_definitions.prog.abap @@ -28,6 +28,7 @@ TYPES: BEGIN OF ty_comment, TYPES: BEGIN OF ty_item, obj_type TYPE tadir-object, obj_name TYPE tadir-obj_name, + devclass TYPE devclass, END OF ty_item. TYPES: BEGIN OF ty_file_item, @@ -159,6 +160,7 @@ CONSTANTS: BEGIN OF gc_action, zip_export TYPE string VALUE 'zip_export', zip_package TYPE string VALUE 'zip_package', zip_transport TYPE string VALUE 'zip_transport', + zip_object TYPE string VALUE 'zip_object', git_pull TYPE string VALUE 'git_pull', git_reset TYPE string VALUE 'git_reset', diff --git a/src/zabapgit_file_status.prog.abap b/src/zabapgit_file_status.prog.abap index 105c3b2dd..23b7f409e 100644 --- a/src/zabapgit_file_status.prog.abap +++ b/src/zabapgit_file_status.prog.abap @@ -95,7 +95,8 @@ CLASS lcl_file_status IMPLEMENTATION. ls_item-obj_name = lv_pre. CLEAR lt_files. - LOOP AT lt_local ASSIGNING WHERE item = ls_item. + LOOP AT lt_local ASSIGNING + WHERE item-obj_type = ls_item-obj_type AND item-obj_name = ls_item-obj_name. APPEND -file TO lt_files. ENDLOOP. diff --git a/src/zabapgit_gui.prog.abap b/src/zabapgit_gui.prog.abap index 1bfa828e0..dc15db32e 100644 --- a/src/zabapgit_gui.prog.abap +++ b/src/zabapgit_gui.prog.abap @@ -126,7 +126,7 @@ CLASS lcl_gui IMPLEMENTATION. WHEN gc_event_state-no_more_act. " Do nothing, handling completed WHEN OTHERS. - lcx_exception=>raise( 'Unknown action' ). + lcx_exception=>raise( |Unknown action: { action }| ). ENDCASE. CATCH lcx_exception INTO lx_exception. diff --git a/src/zabapgit_gui_router.prog.abap b/src/zabapgit_gui_router.prog.abap index f28481242..b540f923e 100644 --- a/src/zabapgit_gui_router.prog.abap +++ b/src/zabapgit_gui_router.prog.abap @@ -158,6 +158,9 @@ CLASS lcl_gui_router IMPLEMENTATION. WHEN gc_action-zip_transport. " Export transport as ZIP lcl_transport=>zip( ). ev_state = gc_event_state-no_more_act. + WHEN gc_action-zip_object. " Export object as ZIP + lcl_zip=>export_object( ). + ev_state = gc_event_state-no_more_act. " Remote origin manipulations WHEN gc_action-repo_remote_attach. " Remote attach diff --git a/src/zabapgit_object_acid.prog.abap b/src/zabapgit_object_acid.prog.abap index a840bd035..10607a865 100644 --- a/src/zabapgit_object_acid.prog.abap +++ b/src/zabapgit_object_acid.prog.abap @@ -27,6 +27,10 @@ ENDCLASS. "lcl_object_acid DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_acid IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~get_metadata. rs_metadata = get_metadata( ). ENDMETHOD. "lif_object~get_metadata diff --git a/src/zabapgit_object_auth.prog.abap b/src/zabapgit_object_auth.prog.abap index de8abb6ff..b0a07c348 100644 --- a/src/zabapgit_object_auth.prog.abap +++ b/src/zabapgit_object_auth.prog.abap @@ -22,6 +22,10 @@ ENDCLASS. "lcl_object_auth DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_auth IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~get_metadata. rs_metadata = get_metadata( ). ENDMETHOD. "lif_object~get_metadata diff --git a/src/zabapgit_object_clas.prog.abap b/src/zabapgit_object_clas.prog.abap index 899fc66e3..1561da156 100644 --- a/src/zabapgit_object_clas.prog.abap +++ b/src/zabapgit_object_clas.prog.abap @@ -121,6 +121,49 @@ ENDCLASS. "lcl_object_intf DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_clas IMPLEMENTATION. + METHOD lif_object~has_changed_since. + + DATA: lv_clsname TYPE seoclsname, + lv_program TYPE program, + lt_incl TYPE seoincl_t. + + FIELD-SYMBOLS LIKE LINE OF lt_incl. + + lv_clsname = ms_item-obj_name. + + CASE ms_item-obj_type. + WHEN 'CLAS'. + TRY. + CALL METHOD cl_oo_classname_service=>('GET_ALL_CLASS_INCLUDES') + EXPORTING + class_name = lv_clsname + RECEIVING + result = lt_incl. + CATCH cx_sy_dyn_call_illegal_method. +* method does not exist in 702, just report everything as changed + rv_changed = abap_true. + ENDTRY. + LOOP AT lt_incl ASSIGNING . + rv_changed = check_prog_changed_since( + iv_program = + iv_timestamp = iv_timestamp + iv_skip_gui = abap_true ). + IF rv_changed = abap_true. + RETURN. + ENDIF. + ENDLOOP. + WHEN 'INTF'. + lv_program = cl_oo_classname_service=>get_interfacepool_name( lv_clsname ). + rv_changed = check_prog_changed_since( + iv_program = lv_program + iv_timestamp = iv_timestamp + iv_skip_gui = abap_true ). + WHEN OTHERS. + lcx_exception=>raise( 'class delete, unknown type' ). + ENDCASE. + + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~get_metadata. rs_metadata = get_metadata( ). ENDMETHOD. "lif_object~get_metadata diff --git a/src/zabapgit_object_doct.prog.abap b/src/zabapgit_object_doct.prog.abap index 68d6a8a4d..93558019a 100644 --- a/src/zabapgit_object_doct.prog.abap +++ b/src/zabapgit_object_doct.prog.abap @@ -32,6 +32,10 @@ ENDCLASS. "lcl_object_msag DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_doct IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~get_metadata. rs_metadata = get_metadata( ). rs_metadata-delete_tadir = abap_true. diff --git a/src/zabapgit_object_docv.prog.abap b/src/zabapgit_object_docv.prog.abap index 3b17f0345..b5a316fba 100644 --- a/src/zabapgit_object_docv.prog.abap +++ b/src/zabapgit_object_docv.prog.abap @@ -31,6 +31,10 @@ ENDCLASS. "lcl_object_msag DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_docv IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. rv_user = read( )-head-tdluser. ENDMETHOD. "lif_object~changed_by diff --git a/src/zabapgit_object_doma.prog.abap b/src/zabapgit_object_doma.prog.abap index cce6ddc68..747d1beeb 100644 --- a/src/zabapgit_object_doma.prog.abap +++ b/src/zabapgit_object_doma.prog.abap @@ -22,6 +22,22 @@ ENDCLASS. "lcl_object_doma DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_doma IMPLEMENTATION. + METHOD lif_object~has_changed_since. + + DATA: lv_date TYPE dats, + lv_time TYPE tims, + lv_ts TYPE timestamp. + + SELECT SINGLE as4date as4time FROM dd01l + INTO (lv_date, lv_time) + WHERE domname = ms_item-obj_name + AND as4local = 'A' + AND as4vers = '0000'. + + _object_check_timestamp lv_date lv_time. + + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. SELECT SINGLE as4user FROM dd01l INTO rv_user diff --git a/src/zabapgit_object_dtel.prog.abap b/src/zabapgit_object_dtel.prog.abap index 22f1f0baa..37bd08de5 100644 --- a/src/zabapgit_object_dtel.prog.abap +++ b/src/zabapgit_object_dtel.prog.abap @@ -22,6 +22,22 @@ ENDCLASS. "lcl_object_dtel DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_dtel IMPLEMENTATION. + METHOD lif_object~has_changed_since. + + DATA: lv_date TYPE dats, + lv_time TYPE tims, + lv_ts TYPE timestamp. + + SELECT SINGLE as4date as4time FROM dd04l + INTO (lv_date, lv_time) + WHERE rollname = ms_item-obj_name + AND as4local = 'A' + AND as4vers = '0000'. + + _object_check_timestamp lv_date lv_time. + + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. SELECT SINGLE as4user FROM dd04l INTO rv_user @@ -111,6 +127,18 @@ CLASS lcl_object_dtel IMPLEMENTATION. ls_dd04v-as4date, ls_dd04v-as4time. + IF ls_dd04v-refkind = 'D'. +* clear values inherited from domain + CLEAR: ls_dd04v-datatype, + ls_dd04v-leng, + ls_dd04v-decimals, + ls_dd04v-outputlen, + ls_dd04v-lowercase, + ls_dd04v-signflag, + ls_dd04v-convexit, + ls_dd04v-entitytab. + ENDIF. + io_xml->add( iv_name = 'DD04V' ig_data = ls_dd04v ). io_xml->add( iv_name = 'TPARA' diff --git a/src/zabapgit_object_enho.prog.abap b/src/zabapgit_object_enho.prog.abap index d895fb6cd..a089cd30f 100644 --- a/src/zabapgit_object_enho.prog.abap +++ b/src/zabapgit_object_enho.prog.abap @@ -43,6 +43,10 @@ ENDCLASS. "lcl_object_enho DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_enho IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~get_metadata. rs_metadata = get_metadata( ). ENDMETHOD. "lif_object~get_metadata diff --git a/src/zabapgit_object_enhs.prog.abap b/src/zabapgit_object_enhs.prog.abap index 10d60f91b..1a5eebb78 100644 --- a/src/zabapgit_object_enhs.prog.abap +++ b/src/zabapgit_object_enhs.prog.abap @@ -17,6 +17,10 @@ ENDCLASS. "lcl_object_enhs *----------------------------------------------------------------------* CLASS lcl_object_enhs IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. rv_user = c_user_unknown. " todo ENDMETHOD. diff --git a/src/zabapgit_object_enqu.prog.abap b/src/zabapgit_object_enqu.prog.abap index 1177b01fc..802845b5f 100644 --- a/src/zabapgit_object_enqu.prog.abap +++ b/src/zabapgit_object_enqu.prog.abap @@ -22,6 +22,22 @@ ENDCLASS. "lcl_object_dtel DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_enqu IMPLEMENTATION. + METHOD lif_object~has_changed_since. + + DATA: lv_date TYPE dats, + lv_time TYPE tims, + lv_ts TYPE timestamp. + + SELECT SINGLE as4date as4time FROM dd25l + INTO (lv_date, lv_time) + WHERE viewname = ms_item-obj_name + AND as4local = 'A' + AND as4vers = '0000'. + + _object_check_timestamp lv_date lv_time. + + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. rv_user = c_user_unknown. " todo ENDMETHOD. diff --git a/src/zabapgit_object_ensc.prog.abap b/src/zabapgit_object_ensc.prog.abap index 2379dd1f6..730d7a48c 100644 --- a/src/zabapgit_object_ensc.prog.abap +++ b/src/zabapgit_object_ensc.prog.abap @@ -14,6 +14,10 @@ ENDCLASS. "lcl_object_ensc *----------------------------------------------------------------------* CLASS lcl_object_ensc IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. rv_user = c_user_unknown. " todo ENDMETHOD. diff --git a/src/zabapgit_object_fugr.prog.abap b/src/zabapgit_object_fugr.prog.abap index 2deffaf72..d8f0f107b 100644 --- a/src/zabapgit_object_fugr.prog.abap +++ b/src/zabapgit_object_fugr.prog.abap @@ -84,6 +84,38 @@ CLASS lcl_object_fugr IMPLEMENTATION. * function group SIFP * function group SUNI + METHOD lif_object~has_changed_since. + + DATA: lt_functab TYPE ty_rs38l_incl_tt, + lt_includes TYPE rso_t_objnm. + + FIELD-SYMBOLS: LIKE LINE OF lt_functab, + LIKE LINE OF lt_includes. + + lt_includes = includes( ). " Main prog also included here + + LOOP AT lt_includes ASSIGNING . + rv_changed = check_prog_changed_since( + iv_program = + iv_timestamp = iv_timestamp ). + IF rv_changed = abap_true. + RETURN. + ENDIF. + ENDLOOP. + + lt_functab = functions( ). + + LOOP AT lt_functab ASSIGNING . + rv_changed = check_prog_changed_since( + iv_program = -include + iv_timestamp = iv_timestamp ). + IF rv_changed = abap_true. + RETURN. + ENDIF. + ENDLOOP. + + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. rv_user = c_user_unknown. " todo ENDMETHOD. diff --git a/src/zabapgit_object_iarp.prog.abap b/src/zabapgit_object_iarp.prog.abap index 356326b09..66ae8b2f3 100644 --- a/src/zabapgit_object_iarp.prog.abap +++ b/src/zabapgit_object_iarp.prog.abap @@ -33,6 +33,10 @@ ENDCLASS. "lcl_object_dtel DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_iarp IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. rv_user = c_user_unknown. " todo ENDMETHOD. diff --git a/src/zabapgit_object_iasp.prog.abap b/src/zabapgit_object_iasp.prog.abap index add9d0522..f1a345829 100644 --- a/src/zabapgit_object_iasp.prog.abap +++ b/src/zabapgit_object_iasp.prog.abap @@ -33,6 +33,10 @@ ENDCLASS. "lcl_object_dtel DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_iasp IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. rv_user = c_user_unknown. " todo ENDMETHOD. diff --git a/src/zabapgit_object_iatu.prog.abap b/src/zabapgit_object_iatu.prog.abap index 9cddad81e..f0b5a4a7e 100644 --- a/src/zabapgit_object_iatu.prog.abap +++ b/src/zabapgit_object_iatu.prog.abap @@ -33,6 +33,10 @@ ENDCLASS. "lcl_object_iatu DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_iatu IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. rv_user = c_user_unknown. " todo ENDMETHOD. diff --git a/src/zabapgit_object_msag.prog.abap b/src/zabapgit_object_msag.prog.abap index 9a6f05607..c846270d1 100644 --- a/src/zabapgit_object_msag.prog.abap +++ b/src/zabapgit_object_msag.prog.abap @@ -22,6 +22,10 @@ ENDCLASS. "lcl_object_msag DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_msag IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. SELECT SINGLE lastuser FROM t100a INTO rv_user diff --git a/src/zabapgit_object_nrob.prog.abap b/src/zabapgit_object_nrob.prog.abap index e3934a7ff..b1aa46c79 100644 --- a/src/zabapgit_object_nrob.prog.abap +++ b/src/zabapgit_object_nrob.prog.abap @@ -13,6 +13,11 @@ CLASS lcl_object_nrob DEFINITION INHERITING FROM lcl_objects_super FINAL. INTERFACES lif_object. ALIASES mo_files FOR lif_object~mo_files. + PRIVATE SECTION. + METHODS: + delete_intervals IMPORTING iv_object TYPE inri-object + RAISING lcx_exception. + ENDCLASS. "lcl_object_nrob DEFINITION *----------------------------------------------------------------------* @@ -22,6 +27,10 @@ ENDCLASS. "lcl_object_nrob DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_nrob IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. DATA: lv_objectid TYPE cdhdr-objectid, @@ -59,6 +68,7 @@ CLASS lcl_object_nrob IMPLEMENTATION. METHOD lif_object~get_metadata. rs_metadata = get_metadata( ). + rs_metadata-late_deser = abap_true. ENDMETHOD. "lif_object~get_metadata METHOD lif_object~exists. @@ -161,6 +171,73 @@ CLASS lcl_object_nrob IMPLEMENTATION. ENDMETHOD. "deserialize + METHOD delete_intervals. + + DATA: lv_error TYPE c LENGTH 1, + ls_error TYPE inrer, + lt_list TYPE STANDARD TABLE OF inriv WITH DEFAULT KEY, + lt_error_iv TYPE STANDARD TABLE OF inriv WITH DEFAULT KEY. + + FIELD-SYMBOLS: LIKE LINE OF lt_list. + + + CALL FUNCTION 'NUMBER_RANGE_INTERVAL_LIST' + EXPORTING + object = iv_object + TABLES + interval = lt_list + EXCEPTIONS + nr_range_nr1_not_found = 1 + nr_range_nr1_not_intern = 2 + nr_range_nr2_must_be_space = 3 + nr_range_nr2_not_extern = 4 + nr_range_nr2_not_found = 5 + object_not_found = 6 + subobject_must_be_space = 7 + subobject_not_found = 8 + OTHERS = 9. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from NUMBER_RANGE_INTERVAL_LIST' ). + ENDIF. + + IF lines( lt_list ) = 0. + RETURN. + ENDIF. + + LOOP AT lt_list ASSIGNING . + CLEAR -nrlevel. + -procind = 'D'. + ENDLOOP. + + CALL FUNCTION 'NUMBER_RANGE_INTERVAL_UPDATE' + EXPORTING + object = iv_object + IMPORTING + error = ls_error + error_occured = lv_error + TABLES + error_iv = lt_error_iv + interval = lt_list + EXCEPTIONS + object_not_found = 1 + OTHERS = 2. + IF sy-subrc <> 0 OR lv_error = abap_true. + lcx_exception=>raise( 'error from NUMBER_RANGE_INTERVAL_UPDATE' ). + ENDIF. + + CALL FUNCTION 'NUMBER_RANGE_UPDATE_CLOSE' + EXPORTING + object = iv_object + EXCEPTIONS + no_changes_made = 1 + object_not_initialized = 2 + OTHERS = 3. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from NUMBER_RANGE_UPDATE_CLOSE' ). + ENDIF. + + ENDMETHOD. + METHOD lif_object~delete. DATA: lv_object TYPE tnro-object. @@ -168,6 +245,8 @@ CLASS lcl_object_nrob IMPLEMENTATION. lv_object = ms_item-obj_name. + delete_intervals( lv_object ). + CALL FUNCTION 'NUMBER_RANGE_OBJECT_DELETE' EXPORTING language = mv_language diff --git a/src/zabapgit_object_para.prog.abap b/src/zabapgit_object_para.prog.abap index 968f87445..4523cc560 100644 --- a/src/zabapgit_object_para.prog.abap +++ b/src/zabapgit_object_para.prog.abap @@ -22,6 +22,10 @@ ENDCLASS. "lcl_object_para DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_para IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. * looks like "changed by user" is not stored in the database rv_user = c_user_unknown. diff --git a/src/zabapgit_object_pinf.prog.abap b/src/zabapgit_object_pinf.prog.abap index bcf4b7a61..857d750f2 100644 --- a/src/zabapgit_object_pinf.prog.abap +++ b/src/zabapgit_object_pinf.prog.abap @@ -47,6 +47,10 @@ ENDCLASS. "lcl_object_PINF DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_pinf IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. SELECT SINGLE changed_by FROM intf INTO rv_user diff --git a/src/zabapgit_object_prog.prog.abap b/src/zabapgit_object_prog.prog.abap index 03961ac65..d04c51d5b 100644 --- a/src/zabapgit_object_prog.prog.abap +++ b/src/zabapgit_object_prog.prog.abap @@ -28,6 +28,14 @@ ENDCLASS. "lcl_object_prog DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_prog IMPLEMENTATION. + METHOD lif_object~has_changed_since. + + rv_changed = check_prog_changed_since( + iv_program = ms_item-obj_name + iv_timestamp = iv_timestamp ). + + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. SELECT SINGLE unam FROM reposrc INTO rv_user WHERE progname = ms_item-obj_name diff --git a/src/zabapgit_object_sfbf.prog.abap b/src/zabapgit_object_sfbf.prog.abap index 22700d2cc..4af733532 100644 --- a/src/zabapgit_object_sfbf.prog.abap +++ b/src/zabapgit_object_sfbf.prog.abap @@ -27,6 +27,10 @@ ENDCLASS. "lcl_object_SFBF DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_sfbf IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. rv_user = get( )->get_header_data( )-changedby. diff --git a/src/zabapgit_object_sfbs.prog.abap b/src/zabapgit_object_sfbs.prog.abap index fe506fbd3..e3e4c28da 100644 --- a/src/zabapgit_object_sfbs.prog.abap +++ b/src/zabapgit_object_sfbs.prog.abap @@ -27,6 +27,10 @@ ENDCLASS. "lcl_object_SFBS DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_sfbs IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. rv_user = get( )->get_header_data( )-changedby. diff --git a/src/zabapgit_object_sfsw.prog.abap b/src/zabapgit_object_sfsw.prog.abap index e3808237d..cff1206f2 100644 --- a/src/zabapgit_object_sfsw.prog.abap +++ b/src/zabapgit_object_sfsw.prog.abap @@ -27,6 +27,10 @@ ENDCLASS. "lcl_object_sfsw DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_sfsw IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. rv_user = get( )->get_header_data( )-changedby. diff --git a/src/zabapgit_object_shi3.prog.abap b/src/zabapgit_object_shi3.prog.abap index 4201d8f6d..e1b2bce82 100644 --- a/src/zabapgit_object_shi3.prog.abap +++ b/src/zabapgit_object_shi3.prog.abap @@ -54,6 +54,10 @@ ENDCLASS. "lcl_object_shi3 DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_shi3 IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. rv_user = c_user_unknown. " todo ENDMETHOD. diff --git a/src/zabapgit_object_shlp.prog.abap b/src/zabapgit_object_shlp.prog.abap index b2e9287b4..ba905258f 100644 --- a/src/zabapgit_object_shlp.prog.abap +++ b/src/zabapgit_object_shlp.prog.abap @@ -22,6 +22,21 @@ ENDCLASS. "lcl_object_dtel DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_shlp IMPLEMENTATION. + METHOD lif_object~has_changed_since. + + DATA: lv_date TYPE dats, + lv_time TYPE tims, + lv_ts TYPE timestamp. + + SELECT SINGLE as4date as4time FROM dd30l + INTO (lv_date, lv_time) + WHERE shlpname = ms_item-obj_name + AND as4local = 'A'. + + _object_check_timestamp lv_date lv_time. + + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. SELECT SINGLE as4user FROM dd30l INTO rv_user @@ -87,6 +102,8 @@ CLASS lcl_object_shlp IMPLEMENTATION. lt_dd32p TYPE TABLE OF dd32p, lt_dd33v TYPE TABLE OF dd33v. + FIELD-SYMBOLS: LIKE LINE OF lt_dd32p. + lv_name = ms_item-obj_name. @@ -115,6 +132,21 @@ CLASS lcl_object_shlp IMPLEMENTATION. ls_dd30v-as4date, ls_dd30v-as4time. + LOOP AT lt_dd32p ASSIGNING . +* clear information inherited from domain + CLEAR: -domname, + -headlen, + -scrlen1, + -scrlen2, + -datatype, + -leng, + -outputlen, + -decimals, + -lowercase, + -signflag, + -convexit. + ENDLOOP. + io_xml->add( iv_name = 'DD30V' ig_data = ls_dd30v ). io_xml->add( ig_data = lt_dd31v diff --git a/src/zabapgit_object_sicf.prog.abap b/src/zabapgit_object_sicf.prog.abap index f52120d69..343a4e4f4 100644 --- a/src/zabapgit_object_sicf.prog.abap +++ b/src/zabapgit_object_sicf.prog.abap @@ -62,6 +62,10 @@ ENDCLASS. "lcl_object_sicf DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_sicf IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. DATA: ls_icfservice TYPE icfservice. diff --git a/src/zabapgit_object_smim.prog.abap b/src/zabapgit_object_smim.prog.abap index 4155ca697..ce83ec3be 100644 --- a/src/zabapgit_object_smim.prog.abap +++ b/src/zabapgit_object_smim.prog.abap @@ -42,6 +42,10 @@ ENDCLASS. "lcl_object_smim DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_smim IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. DATA: lv_loio TYPE sdok_docid. @@ -188,7 +192,7 @@ CLASS lcl_object_smim IMPLEMENTATION. permission_failure = 4 OTHERS = 5 ). IF sy-subrc <> 0. - lcx_exception=>raise( 'error from mime api->get' ). + lcx_exception=>raise( 'error from mime api->get:' && sy-msgv1 ). ENDIF. lv_filename = get_filename( lv_url ). diff --git a/src/zabapgit_object_splo.prog.abap b/src/zabapgit_object_splo.prog.abap index a16c253c9..784192728 100644 --- a/src/zabapgit_object_splo.prog.abap +++ b/src/zabapgit_object_splo.prog.abap @@ -22,6 +22,10 @@ ENDCLASS. "lcl_object_splo DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_splo IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. SELECT SINGLE chgname1 FROM tsp1d INTO rv_user diff --git a/src/zabapgit_object_ssfo.prog.abap b/src/zabapgit_object_ssfo.prog.abap index f56418b96..fc0c3b8cd 100644 --- a/src/zabapgit_object_ssfo.prog.abap +++ b/src/zabapgit_object_ssfo.prog.abap @@ -22,6 +22,10 @@ ENDCLASS. "lcl_object_dtel DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_ssfo IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. SELECT SINGLE lastuser FROM stxfadm INTO rv_user diff --git a/src/zabapgit_object_ssst.prog.abap b/src/zabapgit_object_ssst.prog.abap index 47d16a37b..97a64a3c9 100644 --- a/src/zabapgit_object_ssst.prog.abap +++ b/src/zabapgit_object_ssst.prog.abap @@ -27,6 +27,10 @@ ENDCLASS. "lcl_object_ssst DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_ssst IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. SELECT SINGLE lastuser FROM stxsadm INTO rv_user diff --git a/src/zabapgit_object_susc.prog.abap b/src/zabapgit_object_susc.prog.abap index 863dc6cfb..165a100f0 100644 --- a/src/zabapgit_object_susc.prog.abap +++ b/src/zabapgit_object_susc.prog.abap @@ -22,6 +22,10 @@ ENDCLASS. "lcl_object_susc DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_susc IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. rv_user = c_user_unknown. " todo ENDMETHOD. diff --git a/src/zabapgit_object_suso.prog.abap b/src/zabapgit_object_suso.prog.abap index 06f9e0d12..208c75eb8 100644 --- a/src/zabapgit_object_suso.prog.abap +++ b/src/zabapgit_object_suso.prog.abap @@ -22,6 +22,10 @@ ENDCLASS. "lcl_object_suso DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_suso IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. rv_user = c_user_unknown. " todo ENDMETHOD. diff --git a/src/zabapgit_object_tabl.prog.abap b/src/zabapgit_object_tabl.prog.abap index 8f130178a..6b1e4ce03 100644 --- a/src/zabapgit_object_tabl.prog.abap +++ b/src/zabapgit_object_tabl.prog.abap @@ -22,6 +22,43 @@ ENDCLASS. "lcl_object_dtel DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_tabl IMPLEMENTATION. + METHOD lif_object~has_changed_since. + + DATA: lv_date TYPE dats, + lv_time TYPE tims, + lv_ts TYPE timestamp, + lt_indexes TYPE STANDARD TABLE OF dd09l. + + FIELD-SYMBOLS LIKE LINE OF lt_indexes. + + SELECT SINGLE as4date as4time FROM dd02l " Table + INTO (lv_date, lv_time) + WHERE tabname = ms_item-obj_name + AND as4local = 'A' + AND as4vers = '0000'. + + _object_check_timestamp lv_date lv_time. + + SELECT SINGLE as4date as4time FROM dd09l " Table tech settings + INTO (lv_date, lv_time) + WHERE tabname = ms_item-obj_name + AND as4local = 'A' + AND as4vers = '0000'. + + _object_check_timestamp lv_date lv_time. + + SELECT as4date as4time FROM dd12l " Table tech settings + INTO CORRESPONDING FIELDS OF TABLE lt_indexes + WHERE sqltab = ms_item-obj_name + AND as4local = 'A' + AND as4vers = '0000' ##TOO_MANY_ITAB_FIELDS. + + LOOP AT lt_indexes ASSIGNING . + _object_check_timestamp -as4date -as4time. + ENDLOOP. + + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. SELECT SINGLE as4user FROM dd02l INTO rv_user @@ -92,9 +129,12 @@ CLASS lcl_object_tabl IMPLEMENTATION. lt_dd12v TYPE dd12vtab, lt_dd17v TYPE dd17vtab, lt_dd35v TYPE TABLE OF dd35v, + lv_index LIKE sy-index, lt_dd36m TYPE dd36mttyp. FIELD-SYMBOLS: LIKE LINE OF lt_dd12v, + LIKE LINE OF lt_dd05m, + LIKE LINE OF lt_dd36m, LIKE LINE OF lt_dd03p. @@ -139,6 +179,11 @@ CLASS lcl_object_tabl IMPLEMENTATION. -as4time. ENDLOOP. +* remove nested structures + DELETE lt_dd03p WHERE depth <> '00'. +* remove fields from .INCLUDEs + DELETE lt_dd03p WHERE adminfield <> '0'. + LOOP AT lt_dd03p ASSIGNING WHERE NOT rollname IS INITIAL. CLEAR: -ddlanguage, -dtelmaster, @@ -163,6 +208,8 @@ CLASS lcl_object_tabl IMPLEMENTATION. -datatype, -leng, -outputlen, + -deffdname, + -convexit, -entitytab, -dommaster, -domname3l. @@ -180,6 +227,26 @@ CLASS lcl_object_tabl IMPLEMENTATION. ENDIF. ENDLOOP. +* remove foreign keys inherited from .INCLUDEs + DELETE lt_dd08v WHERE noinherit = 'N'. + LOOP AT lt_dd05m ASSIGNING . + lv_index = sy-tabix. + READ TABLE lt_dd08v WITH KEY fieldname = -fieldname TRANSPORTING NO FIELDS. + IF sy-subrc <> 0. + DELETE lt_dd05m INDEX lv_index. + ENDIF. + ENDLOOP. + +* remove inherited search helps + DELETE lt_dd35v WHERE shlpinher = abap_true. + LOOP AT lt_dd36m ASSIGNING . + lv_index = sy-tabix. + READ TABLE lt_dd35v WITH KEY fieldname = -fieldname TRANSPORTING NO FIELDS. + IF sy-subrc <> 0. + DELETE lt_dd36m INDEX lv_index. + ENDIF. + ENDLOOP. + io_xml->add( iv_name = 'DD02V' ig_data = ls_dd02v ). io_xml->add( iv_name = 'DD09L' diff --git a/src/zabapgit_object_tobj.prog.abap b/src/zabapgit_object_tobj.prog.abap index 2dd8e159c..39198e726 100644 --- a/src/zabapgit_object_tobj.prog.abap +++ b/src/zabapgit_object_tobj.prog.abap @@ -22,6 +22,10 @@ ENDCLASS. "lcl_object_tobj DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_tobj IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. rv_user = c_user_unknown. " todo ENDMETHOD. diff --git a/src/zabapgit_object_tran.prog.abap b/src/zabapgit_object_tran.prog.abap index eba7dc246..a483192f2 100644 --- a/src/zabapgit_object_tran.prog.abap +++ b/src/zabapgit_object_tran.prog.abap @@ -47,6 +47,10 @@ ENDCLASS. "lcl_object_TRAN DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_tran IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. rv_user = c_user_unknown. " todo ENDMETHOD. diff --git a/src/zabapgit_object_ttyp.prog.abap b/src/zabapgit_object_ttyp.prog.abap index 1c7ca97ab..ec2421f99 100644 --- a/src/zabapgit_object_ttyp.prog.abap +++ b/src/zabapgit_object_ttyp.prog.abap @@ -22,6 +22,21 @@ ENDCLASS. "lcl_object_dtel DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_ttyp IMPLEMENTATION. + METHOD lif_object~has_changed_since. + + DATA: lv_date TYPE dats, + lv_time TYPE tims, + lv_ts TYPE timestamp. + + SELECT SINGLE as4date as4time FROM dd40l + INTO (lv_date, lv_time) + WHERE typename = ms_item-obj_name + AND as4local = 'A'. + + _object_check_timestamp lv_date lv_time. + + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. SELECT SINGLE as4user FROM dd40l INTO rv_user @@ -113,6 +128,10 @@ CLASS lcl_object_ttyp IMPLEMENTATION. ls_dd40v-as4date, ls_dd40v-as4time. + IF NOT ls_dd40v-rowkind IS INITIAL. + CLEAR ls_dd40v-typelen. + ENDIF. + io_xml->add( iv_name = 'DD40V' ig_data = ls_dd40v ). io_xml->add( iv_name = 'DD42V' diff --git a/src/zabapgit_object_type.prog.abap b/src/zabapgit_object_type.prog.abap index b03973692..5a47d8ed9 100644 --- a/src/zabapgit_object_type.prog.abap +++ b/src/zabapgit_object_type.prog.abap @@ -35,6 +35,10 @@ ENDCLASS. "lcl_object_type DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_type IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. rv_user = c_user_unknown. " todo ENDMETHOD. diff --git a/src/zabapgit_object_vcls.prog.abap b/src/zabapgit_object_vcls.prog.abap index 49fce52fc..e6ad172aa 100644 --- a/src/zabapgit_object_vcls.prog.abap +++ b/src/zabapgit_object_vcls.prog.abap @@ -26,6 +26,10 @@ ENDCLASS. "lcl_object_vcls DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_vcls IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. rv_user = c_user_unknown. " todo ENDMETHOD. diff --git a/src/zabapgit_object_view.prog.abap b/src/zabapgit_object_view.prog.abap index 987bf43f2..b8b773741 100644 --- a/src/zabapgit_object_view.prog.abap +++ b/src/zabapgit_object_view.prog.abap @@ -22,6 +22,30 @@ ENDCLASS. "lcl_object_dtel DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_view IMPLEMENTATION. + METHOD lif_object~has_changed_since. + + DATA: lv_date TYPE dats, + lv_time TYPE tims, + lv_ts TYPE timestamp. + + SELECT SINGLE as4date as4time FROM dd25l " View + INTO (lv_date, lv_time) + WHERE viewname = ms_item-obj_name + AND as4local = 'A' + AND as4vers = '0000'. + + _object_check_timestamp lv_date lv_time. + + SELECT SINGLE as4date as4time FROM dd09l " Table tech settings + INTO (lv_date, lv_time) + WHERE tabname = ms_item-obj_name + AND as4local = 'A' + AND as4vers = '0000'. + + _object_check_timestamp lv_date lv_time. + + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. SELECT SINGLE as4user FROM dd25l INTO rv_user diff --git a/src/zabapgit_object_w3xx.prog.abap b/src/zabapgit_object_w3xx.prog.abap index 6c4b83b37..c69b5355c 100644 --- a/src/zabapgit_object_w3xx.prog.abap +++ b/src/zabapgit_object_w3xx.prog.abap @@ -24,6 +24,10 @@ ENDCLASS. "lcl_object_W3SUPER DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_w3super IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. rv_user = c_user_unknown. " todo ENDMETHOD. diff --git a/src/zabapgit_object_wdya.prog.abap b/src/zabapgit_object_wdya.prog.abap index 47953fccd..954f78795 100644 --- a/src/zabapgit_object_wdya.prog.abap +++ b/src/zabapgit_object_wdya.prog.abap @@ -34,6 +34,10 @@ ENDCLASS. "lcl_object_wdya DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_wdya IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. rv_user = c_user_unknown. " todo ENDMETHOD. diff --git a/src/zabapgit_object_wdyn.prog.abap b/src/zabapgit_object_wdyn.prog.abap index 53e05e70a..42f603e28 100644 --- a/src/zabapgit_object_wdyn.prog.abap +++ b/src/zabapgit_object_wdyn.prog.abap @@ -68,6 +68,10 @@ ENDCLASS. "lcl_object_wdyn DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_wdyn IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. rv_user = c_user_unknown. " todo ENDMETHOD. diff --git a/src/zabapgit_object_webi.prog.abap b/src/zabapgit_object_webi.prog.abap index 8c4026924..d74dc4d56 100644 --- a/src/zabapgit_object_webi.prog.abap +++ b/src/zabapgit_object_webi.prog.abap @@ -62,6 +62,10 @@ ENDCLASS. "lcl_object_SFBS DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_webi IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. rv_user = c_user_unknown. " todo ENDMETHOD. "lif_object~changed_by diff --git a/src/zabapgit_object_xslt.prog.abap b/src/zabapgit_object_xslt.prog.abap index 5afd418da..93ec498cd 100644 --- a/src/zabapgit_object_xslt.prog.abap +++ b/src/zabapgit_object_xslt.prog.abap @@ -28,6 +28,10 @@ ENDCLASS. "lcl_object_xslt DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_xslt IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~changed_by. rv_user = c_user_unknown. " todo ENDMETHOD. diff --git a/src/zabapgit_objects.prog.abap b/src/zabapgit_objects.prog.abap index d4c687a2e..a3e110ea4 100644 --- a/src/zabapgit_objects.prog.abap +++ b/src/zabapgit_objects.prog.abap @@ -230,7 +230,11 @@ INTERFACE lif_object. jump RAISING lcx_exception, get_metadata - RETURNING VALUE(rs_metadata) TYPE ty_metadata. + RETURNING VALUE(rs_metadata) TYPE ty_metadata, + has_changed_since + IMPORTING iv_timestamp TYPE timestamp + RETURNING VALUE(rv_changed) TYPE abap_bool + RAISING lcx_exception. DATA: mo_files TYPE REF TO lcl_objects_files. @@ -435,6 +439,7 @@ ENDCLASS. "lcl_objects_files IMPLEMENTATION CLASS lcl_objects_super DEFINITION ABSTRACT. PUBLIC SECTION. + METHODS: constructor IMPORTING @@ -497,6 +502,10 @@ ENDCLASS. "lcl_objects_bridge DEFINITION *----------------------------------------------------------------------* CLASS lcl_objects_bridge IMPLEMENTATION. + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + METHOD lif_object~get_metadata. CALL METHOD mo_plugin->('ZIF_ABAPGIT_PLUGIN~GET_METADATA') @@ -706,6 +715,7 @@ CLASS lcl_objects_program DEFINITION INHERITING FROM lcl_objects_super. RAISING lcx_exception. PROTECTED SECTION. + TYPES: ty_spaces_tt TYPE STANDARD TABLE OF i WITH DEFAULT KEY. TYPES: BEGIN OF ty_tpool. @@ -759,6 +769,12 @@ CLASS lcl_objects_program DEFINITION INHERITING FROM lcl_objects_super. is_cua TYPE ty_cua RAISING lcx_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 @@ -1309,6 +1325,55 @@ CLASS lcl_objects_program IMPLEMENTATION. ENDMETHOD. "deserialize_cua + METHOD check_prog_changed_since. + + DATA: lv_date TYPE dats, + lv_time TYPE tims, + lv_ts TYPE timestamp, + 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'. + + _object_check_timestamp lv_date lv_time. + + SELECT SINGLE udat utime FROM repotext " Program text pool + INTO (lv_date, lv_time) + WHERE progname = iv_program + AND r3state = 'A'. + + _object_check_timestamp lv_date lv_time. + + 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 ##TOO_MANY_ITAB_FIELDS. + + LOOP AT lt_screens ASSIGNING . + _object_check_timestamp -dgen -tgen. + ENDLOOP. + + SELECT vdatum vzeit FROM eudb " GUI + INTO CORRESPONDING FIELDS OF TABLE lt_eudb + WHERE relid = 'CU' + AND name = iv_program + AND srtf2 = 0 ##TOO_MANY_ITAB_FIELDS. + + LOOP AT lt_eudb ASSIGNING . + _object_check_timestamp -vdatum -vzeit. + ENDLOOP. + + ENDMETHOD. "check_prog_changed_since + ENDCLASS. "lcl_objects_program IMPLEMENTATION *----------------------------------------------------------------------* @@ -1435,6 +1500,12 @@ CLASS lcl_objects DEFINITION FINAL. RETURNING VALUE(rv_user) TYPE xubname RAISING lcx_exception. + CLASS-METHODS has_changed_since + IMPORTING is_item TYPE ty_item + iv_timestamp TYPE timestamp + RETURNING VALUE(rv_changed) TYPE abap_bool + RAISING lcx_exception. + CLASS-METHODS is_supported IMPORTING is_item TYPE ty_item RETURNING VALUE(rv_bool) TYPE abap_bool. diff --git a/src/zabapgit_objects_impl.prog.abap b/src/zabapgit_objects_impl.prog.abap index 92e8809d3..0bc5a7209 100644 --- a/src/zabapgit_objects_impl.prog.abap +++ b/src/zabapgit_objects_impl.prog.abap @@ -172,6 +172,19 @@ CLASS lcl_objects IMPLEMENTATION. ENDMETHOD. "create_object + METHOD has_changed_since. + rv_changed = abap_true. " Assume changed + + IF is_supported( is_item ) = abap_false. + RETURN. " Will requre serialize which will log the error + ENDIF. + + rv_changed = create_object( + is_item = is_item + iv_language = gc_english )->has_changed_since( iv_timestamp ). + + ENDMETHOD. "has_changed_since + METHOD is_supported. TRY. diff --git a/src/zabapgit_page_branch_overview.prog.abap b/src/zabapgit_page_branch_overview.prog.abap index bd6bfd4a9..1c820ea70 100644 --- a/src/zabapgit_page_branch_overview.prog.abap +++ b/src/zabapgit_page_branch_overview.prog.abap @@ -193,7 +193,7 @@ CLASS lcl_branch_overview IMPLEMENTATION. SPLIT ls_raw-body AT gc_newline INTO ls_commit-message lv_trash. * unix time stamps are in same time zone, so ignore the zone, - FIND REGEX '^([\w\s]+) <(.*)> (\d{10}) .\d{4}$' IN ls_raw-author + FIND REGEX '^([\w\s\.@]+) <(.*)> (\d{10}) .\d{4}$' IN ls_raw-author SUBMATCHES ls_commit-author ls_commit-email diff --git a/src/zabapgit_page_main.prog.abap b/src/zabapgit_page_main.prog.abap index 7ce2e6d75..793076547 100644 --- a/src/zabapgit_page_main.prog.abap +++ b/src/zabapgit_page_main.prog.abap @@ -170,6 +170,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. lo_betasub->add( iv_txt = 'Database util' iv_act = gc_action-go_db ) ##NO_TEXT. lo_betasub->add( iv_txt = 'Package to zip' iv_act = gc_action-zip_package ) ##NO_TEXT. lo_betasub->add( iv_txt = 'Transport to zip' iv_act = gc_action-zip_transport ) ##NO_TEXT. + lo_betasub->add( iv_txt = 'Object to zip' iv_act = gc_action-zip_object ) ##NO_TEXT. lo_betasub->add( iv_txt = 'Page playground' iv_act = gc_action-go_playground ) ##NO_TEXT. lo_betasub->add( iv_txt = 'Debug info' iv_act = gc_action-go_debuginfo ) ##NO_TEXT. diff --git a/src/zabapgit_page_stage.prog.abap b/src/zabapgit_page_stage.prog.abap index adce12564..248cf4ce0 100644 --- a/src/zabapgit_page_stage.prog.abap +++ b/src/zabapgit_page_stage.prog.abap @@ -20,7 +20,8 @@ CLASS lcl_gui_page_stage DEFINITION FINAL INHERITING FROM lcl_gui_page_super. PRIVATE SECTION. DATA: mo_repo TYPE REF TO lcl_repo_online, ms_files TYPE ty_stage_files, - mo_stage TYPE REF TO lcl_stage. + mo_stage TYPE REF TO lcl_stage, + mv_ts TYPE timestamp. METHODS: render_list @@ -56,6 +57,8 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. iv_branch_name = io_repo->get_branch_name( ) iv_branch_sha1 = io_repo->get_sha1_remote( ). + GET TIME STAMP FIELD mv_ts. + ENDMETHOD. METHOD lif_gui_page~on_event. @@ -228,7 +231,7 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. CREATE OBJECT ro_html. ro_html->add( '
' ). - ro_html->add_anchor( iv_act = 'commit();' + ro_html->add_anchor( iv_act = |commit('{ c_action-stage_commit }');| iv_typ = gc_action_type-onclick iv_id = 'act_commit' iv_style = 'display: none' @@ -279,12 +282,51 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. CREATE OBJECT ro_html. - " Hook global click listener on table, global action counter - _add 'document.getElementById("stage_tab").addEventListener("click", onEvent);'. + " Globals & initialization + ro_html->add( |var gPageID = "stage{ mv_ts }";| ). _add 'var gChoiceCount = 0;'. + _add 'setHook();'. + + " Hook global click listener on table, global action counter + _add 'function setHook() {'. + _add ' var stageTab = document.getElementById("stage_tab");'. + _add ' if (stageTab.addEventListener) {'. + _add ' stageTab.addEventListener("click", onEvent);'. + _add ' } else {'. + _add ' stageTab.attachEvent("onclick", onEvent);'. " = 0; i--) {'. + _add ' var tr = stage.rows[i];'. + _add ' if (tr.parentNode.tagName == "THEAD") continue;'. + _add ' var context = tr.parentNode.className;'. + _add ' var cmd = data[tr.cells[1].innerText];'. + _add ' if (!cmd) continue;'. + _add ' formatTR(tr, cmd, context);'. + _add ' if (countChoiceImpact(cmd) > 0) gChoiceCount++;'. + _add ' }'. + _add ' updateMenu();'. + _add '}'. " Event handler, change status _add 'function onEvent(event) {'. + _add ' if (!event.target) {'. " affects menu update after + _add 'function countChoiceImpact(cmd) {'. + _add ' if ("ARI".indexOf(cmd) > -1) return 1;'. + _add ' else if ("?".indexOf(cmd) > -1) return -1;'. + _add ' else alert("Unknown command");'. + _add '}'. + " Re-format table line _add 'function formatTR(tr, cmd, context) {'. _add ' var cmdReset = "reset"; '. @@ -324,9 +374,9 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. _add '}'. " Commit change to the server - _add 'function commit() {'. + _add 'function commit(action) {'. _add ' var data = collectData();'. - ro_html->add( | submitForm(data, "{ c_action-stage_commit }");| ). + _add ' submitForm(data, action);'. _add '}'. " Extract data from the table diff --git a/src/zabapgit_popups.prog.abap b/src/zabapgit_popups.prog.abap index e0f6d7535..bdb88aa44 100644 --- a/src/zabapgit_popups.prog.abap +++ b/src/zabapgit_popups.prog.abap @@ -18,7 +18,10 @@ CLASS lcl_popups DEFINITION. CLASS-METHODS: popup_package_export RETURNING VALUE(rv_package) TYPE devclass - RAISING lcx_exception, + RAISING lcx_exception, + popup_object + RETURNING VALUE(rs_tadir) TYPE tadir + RAISING lcx_exception, create_branch_popup EXPORTING ev_name TYPE string ev_cancel TYPE abap_bool @@ -43,19 +46,19 @@ CLASS lcl_popups DEFINITION. 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 + RETURNING VALUE(rs_popup) TYPE ty_popup RAISING lcx_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 + 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 lcx_exception. ENDCLASS. @@ -72,6 +75,51 @@ CLASS lcl_popups IMPLEMENTATION. END-OF-DEFINITION. + METHOD popup_object. + + DATA: lv_returncode TYPE c, + lt_fields TYPE TABLE OF sval. + + FIELD-SYMBOLS: LIKE LINE OF lt_fields. + + " TAB FLD LABEL DEF ATTR + _add_dialog_fld 'TADIR' 'OBJECT' 'Type' '' ''. + _add_dialog_fld 'TADIR' 'OBJ_NAME' 'Name' '' ''. + + CALL FUNCTION 'POPUP_GET_VALUES' + EXPORTING + no_value_check = abap_true + popup_title = 'Object' "#EC NOTEXT + IMPORTING + returncode = lv_returncode + TABLES + fields = lt_fields + EXCEPTIONS + error_in_fields = 1 + OTHERS = 2. + IF sy-subrc <> 0. + lcx_exception=>raise( 'Error from POPUP_GET_VALUES' ). + ENDIF. + + IF lv_returncode = 'A'. + RETURN. + ENDIF. + + READ TABLE lt_fields INDEX 1 ASSIGNING . + ASSERT sy-subrc = 0. + TRANSLATE -value TO UPPER CASE. + rs_tadir-object = -value. + + READ TABLE lt_fields INDEX 2 ASSIGNING . + ASSERT sy-subrc = 0. + TRANSLATE -value TO UPPER CASE. + rs_tadir-obj_name = -value. + + rs_tadir = lcl_tadir=>read_single( iv_object = rs_tadir-object + iv_obj_name = rs_tadir-obj_name ). + + ENDMETHOD. + METHOD popup_package_export. DATA: lv_returncode TYPE c, diff --git a/src/zabapgit_repo.prog.abap b/src/zabapgit_repo.prog.abap index ba68c567b..6dee4476e 100644 --- a/src/zabapgit_repo.prog.abap +++ b/src/zabapgit_repo.prog.abap @@ -38,7 +38,9 @@ CLASS lcl_repo DEFINITION ABSTRACT FRIENDS lcl_repo_srv. deserialize RAISING lcx_exception, refresh + IMPORTING iv_drop_cache TYPE abap_bool DEFAULT abap_false RAISING lcx_exception, + refresh_local, " For testing purposes, maybe removed later build_local_checksums RETURNING VALUE(rt_checksums) TYPE lcl_persistence_repo=>ty_local_checksum_tt RAISING lcx_exception, @@ -48,10 +50,12 @@ CLASS lcl_repo DEFINITION ABSTRACT FRIENDS lcl_repo_srv. PROTECTED SECTION. - DATA: mt_local TYPE ty_files_item_tt, - mt_remote TYPE ty_files_tt, - mo_dot_abapgit TYPE REF TO lcl_dot_abapgit, - ms_data TYPE lcl_persistence_repo=>ty_repo. + DATA: mt_local TYPE ty_files_item_tt, + mt_remote TYPE ty_files_tt, + mo_dot_abapgit TYPE REF TO lcl_dot_abapgit, + mv_do_local_refresh TYPE abap_bool, + mv_last_serialization TYPE timestamp, + ms_data TYPE lcl_persistence_repo=>ty_repo. METHODS: find_dot_abapgit diff --git a/src/zabapgit_repo_impl.prog.abap b/src/zabapgit_repo_impl.prog.abap index 5aa3702a3..9b8cebb80 100644 --- a/src/zabapgit_repo_impl.prog.abap +++ b/src/zabapgit_repo_impl.prog.abap @@ -62,13 +62,15 @@ CLASS lcl_repo_online IMPLEMENTATION. set( iv_sha1 = mv_branch ). + CLEAR mt_status. " Reset status + COMMIT WORK AND WAIT. ENDMETHOD. "deserialize METHOD refresh. - super->refresh( ). + super->refresh( iv_drop_cache ). CLEAR mt_status. lcl_progress=>show( iv_key = 'Fetch' @@ -369,7 +371,7 @@ CLASS lcl_repo IMPLEMENTATION. lcl_objects=>deserialize( me ). - CLEAR mt_local. + CLEAR: mt_local, mv_last_serialization. set( it_checksums = build_local_checksums( ) ). @@ -385,12 +387,17 @@ CLASS lcl_repo IMPLEMENTATION. ls_item TYPE ty_item, lt_files TYPE ty_files_tt. + DATA: lt_cache TYPE SORTED TABLE OF ty_file_item + WITH NON-UNIQUE KEY item. + FIELD-SYMBOLS: LIKE LINE OF lt_files, LIKE LINE OF rt_files, + LIKE LINE OF lt_cache, LIKE LINE OF lt_tadir. - IF lines( mt_local ) > 0. + " Serialization happened before and no refresh request + IF mv_last_serialization IS NOT INITIAL AND mv_do_local_refresh = abap_false. rt_files = mt_local. RETURN. ENDIF. @@ -405,16 +412,34 @@ CLASS lcl_repo IMPLEMENTATION. -file-sha1 = lcl_hash=>sha1( iv_type = gc_type-blob iv_data = -file-data ). + lt_cache = mt_local. lt_tadir = lcl_tadir=>read( get_package( ) ). LOOP AT lt_tadir ASSIGNING . + + ls_item-obj_type = -object. + ls_item-obj_name = -obj_name. + ls_item-devclass = -devclass. + + IF mv_last_serialization IS NOT INITIAL. " Try to fetch from cache + READ TABLE lt_cache TRANSPORTING NO FIELDS + WITH KEY item = ls_item. " type+name+package key + " There is something in cache and the object is unchanged + IF sy-subrc = 0 + AND abap_false = lcl_objects=>has_changed_since( is_item = ls_item + iv_timestamp = mv_last_serialization ). + LOOP AT lt_cache ASSIGNING WHERE item = ls_item. + APPEND TO rt_files. + ENDLOOP. + + CONTINUE. + ENDIF. + ENDIF. + lcl_progress=>show( iv_key = 'Serialize' iv_current = sy-tabix iv_total = lines( lt_tadir ) iv_text = -obj_name ) ##NO_TEXT. - ls_item-obj_type = -object. - ls_item-obj_name = -obj_name. - lt_files = lcl_objects=>serialize( is_item = ls_item iv_language = get_master_language( ) @@ -429,7 +454,9 @@ CLASS lcl_repo IMPLEMENTATION. ENDLOOP. ENDLOOP. - mt_local = rt_files. + GET TIME STAMP FIELD mv_last_serialization. + mt_local = rt_files. + mv_do_local_refresh = abap_false. " Fulfill refresh ENDMETHOD. @@ -453,9 +480,19 @@ CLASS lcl_repo IMPLEMENTATION. ENDMETHOD. METHOD refresh. - CLEAR mt_local. + + mv_do_local_refresh = abap_true. + + IF iv_drop_cache = abap_true. + CLEAR: mv_last_serialization, mt_local. + ENDIF. + ENDMETHOD. "refresh + METHOD refresh_local. " For testing purposes, maybe removed later + mv_do_local_refresh = abap_true. + ENDMETHOD. "refresh_local + METHOD get_package. rv_package = ms_data-package. ENDMETHOD. "get_package diff --git a/src/zabapgit_util.prog.abap b/src/zabapgit_util.prog.abap index ba9584157..9672d95e1 100644 --- a/src/zabapgit_util.prog.abap +++ b/src/zabapgit_util.prog.abap @@ -963,21 +963,11 @@ CLASS lcl_progress DEFINITION FINAL. iv_text TYPE csequence. PRIVATE SECTION. - TYPES: BEGIN OF ty_stack, - key TYPE string, - current TYPE i, - total TYPE i, - text TYPE string, - END OF ty_stack. - - CLASS-DATA: - gt_stack TYPE STANDARD TABLE OF ty_stack WITH DEFAULT KEY. - CLASS-METHODS: calc_pct - RETURNING VALUE(rv_pct) TYPE i, - build_text - RETURNING VALUE(rv_text) TYPE string. + IMPORTING iv_current TYPE i + iv_total TYPE i + RETURNING VALUE(rv_pct) TYPE i. ENDCLASS. @@ -988,66 +978,24 @@ CLASS lcl_progress IMPLEMENTATION. DATA: lv_pct TYPE i, lv_text TYPE string. - FIELD-SYMBOLS: LIKE LINE OF gt_stack. -* assumption: -* all callers must end with calling this method with iv_current = iv_total -* to clear the progress of that sub element - ASSERT lines( gt_stack ) < 10. - - READ TABLE gt_stack INDEX lines( gt_stack ) ASSIGNING . - IF sy-subrc <> 0 OR -key <> iv_key. - APPEND INITIAL LINE TO gt_stack ASSIGNING . - ENDIF. - -key = iv_key. - -current = iv_current. - -total = iv_total. - -text = iv_text. - - lv_pct = calc_pct( ). - lv_text = build_text( ). + lv_pct = calc_pct( iv_current = iv_current + iv_total = iv_total ). + CONCATENATE iv_key '-' iv_text INTO lv_text SEPARATED BY space. CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' EXPORTING percentage = lv_pct text = lv_text. - IF iv_current = iv_total. - DELETE gt_stack INDEX lines( gt_stack ). - ENDIF. - - ENDMETHOD. - - METHOD build_text. - - FIELD-SYMBOLS: LIKE LINE OF gt_stack. - - - LOOP AT gt_stack ASSIGNING . - IF sy-tabix = 1. - rv_text = |{ -key } { -text }|. - ELSE. - rv_text = |{ rv_text } - { -key } { -text }|. - - IF -current <> 1 AND -total <> 1. - rv_text = |{ rv_text } ({ -current }/{ -total })|. - ENDIF. - ENDIF. - ENDLOOP. - ENDMETHOD. METHOD calc_pct. DATA: lv_f TYPE f. - FIELD-SYMBOLS: LIKE LINE OF gt_stack. - - READ TABLE gt_stack ASSIGNING INDEX 1. - ASSERT sy-subrc = 0. - - lv_f = ( -current / -total ) * 100. + lv_f = ( iv_current / iv_total ) * 100. rv_pct = lv_f. IF rv_pct = 100. diff --git a/src/zabapgit_zip.prog.abap b/src/zabapgit_zip.prog.abap index d3754257e..942d95961 100644 --- a/src/zabapgit_zip.prog.abap +++ b/src/zabapgit_zip.prog.abap @@ -22,6 +22,9 @@ CLASS lcl_zip DEFINITION FINAL. CLASS-METHODS export_package RAISING lcx_exception lcx_cancel. + CLASS-METHODS export_object + RAISING lcx_exception lcx_cancel. + PRIVATE SECTION. CLASS-METHODS file_upload RETURNING VALUE(rv_xstr) TYPE xstring @@ -455,4 +458,32 @@ CLASS lcl_zip IMPLEMENTATION. ENDMETHOD. "export_package + METHOD export_object. + + DATA: lo_repo TYPE REF TO lcl_repo_offline, + ls_data TYPE lcl_persistence_repo=>ty_repo, + lt_tadir TYPE scts_tadir, + ls_tadir TYPE tadir. + + + ls_tadir = lcl_popups=>popup_object( ). + IF ls_tadir IS INITIAL. + RAISE EXCEPTION TYPE lcx_cancel. + ENDIF. + + ls_data-key = 'TZIP'. + ls_data-package = ls_tadir-devclass. + ls_data-master_language = sy-langu. + + CREATE OBJECT lo_repo + EXPORTING + is_data = ls_data. + + APPEND ls_tadir TO lt_tadir. + + lcl_zip=>export( io_repo = lo_repo + it_filter = lt_tadir ). + + ENDMETHOD. "export_package + ENDCLASS. "lcl_zip IMPLEMENTATION \ No newline at end of file