From 8e8d68cc7109cd965fc792699827eb1d4d4acb67 Mon Sep 17 00:00:00 2001 From: larshp Date: Sat, 29 Oct 2016 10:03:59 +0000 Subject: [PATCH 01/10] ENHS: changed_by and add tool type Add tool type to XML, to allow for adding additional tool types in the future implement code to find changed_by user --- src/zabapgit_object_enhs.prog.abap | 55 +++++++++++++++++++----------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/src/zabapgit_object_enhs.prog.abap b/src/zabapgit_object_enhs.prog.abap index 1a5eebb78..08202f76e 100644 --- a/src/zabapgit_object_enhs.prog.abap +++ b/src/zabapgit_object_enhs.prog.abap @@ -6,6 +6,7 @@ * CLASS lcl_object_enhs DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_enhs DEFINITION INHERITING FROM lcl_objects_super FINAL. + PUBLIC SECTION. INTERFACES lif_object. ALIASES mo_files FOR lif_object~mo_files. @@ -22,10 +23,20 @@ CLASS lcl_object_enhs IMPLEMENTATION. ENDMETHOD. "lif_object~has_changed_since METHOD lif_object~changed_by. - rv_user = c_user_unknown. " todo + + DATA: lv_spot_name TYPE enhspotname, + li_spot_ref TYPE REF TO if_enh_spot_tool. + + + lv_spot_name = ms_item-obj_name. + + li_spot_ref = cl_enh_factory=>get_enhancement_spot( lv_spot_name ). + li_spot_ref->get_attributes( IMPORTING changedby = rv_user ). + ENDMETHOD. METHOD lif_object~deserialize. + DATA: lv_message TYPE string, lv_parent TYPE enhspotcompositename, lv_spot_name TYPE enhspotname, @@ -86,22 +97,24 @@ CLASS lcl_object_enhs IMPLEMENTATION. ENDMETHOD. "deserialize METHOD lif_object~serialize. - DATA: lv_message TYPE string, - lv_spot_name TYPE enhspotname, + + DATA: lv_spot_name TYPE enhspotname, lv_enh_shtext TYPE string, lv_parent TYPE enhspotcompositename, lt_enh_badi TYPE enh_badi_data_it, + lv_tool TYPE enhspottooltype, lx_root TYPE REF TO cx_root, li_spot_ref TYPE REF TO if_enh_spot_tool, lo_badidef_tool TYPE REF TO cl_enh_tool_badi_def. + lv_spot_name = ms_item-obj_name. TRY. li_spot_ref = cl_enh_factory=>get_enhancement_spot( lv_spot_name ). + lv_tool = li_spot_ref->get_tool( ). lo_badidef_tool ?= li_spot_ref. - lv_enh_shtext = lo_badidef_tool->if_enh_object_docu~get_shorttext( ). "get parent = composite enhs (ENHC) @@ -109,6 +122,8 @@ CLASS lcl_object_enhs IMPLEMENTATION. "get subsequent BADI definitions lt_enh_badi = lo_badidef_tool->get_badi_defs( ). + io_xml->add( ig_data = lv_tool + iv_name = 'TOOL' ). io_xml->add( ig_data = lv_parent iv_name = 'PARENT_COMP' ). io_xml->add( ig_data = lv_enh_shtext @@ -117,9 +132,8 @@ CLASS lcl_object_enhs IMPLEMENTATION. iv_name = 'BADI_DATA' ). CATCH cx_enh_root INTO lx_root. - lv_message = `Error occured while serializing EHNS: ` - && lx_root->get_text( ) ##NO_TEXT. - lcx_exception=>raise( lv_message ). + lcx_exception=>raise( `Error occured while serializing EHNS: ` + && lx_root->get_text( ) ) ##NO_TEXT. ENDTRY. ENDMETHOD. "serialize @@ -127,6 +141,7 @@ CLASS lcl_object_enhs IMPLEMENTATION. METHOD lif_object~exists. DATA: lv_spot_name TYPE enhspotname, + lv_tool TYPE enhspottooltype, li_spot_ref TYPE REF TO if_enh_spot_tool. @@ -135,12 +150,14 @@ CLASS lcl_object_enhs IMPLEMENTATION. TRY. li_spot_ref = cl_enh_factory=>get_enhancement_spot( lv_spot_name ). -* Check that is is realy a BAdI - IF li_spot_ref->get_tool( ) = cl_enh_tool_badi_def=>tooltype. - rv_bool = abap_true. - ELSE. - rv_bool = abap_false. - ENDIF. + lv_tool = li_spot_ref->get_tool( ). + CASE lv_tool. + WHEN cl_enh_tool_badi_def=>tooltype. + rv_bool = abap_true. + WHEN OTHERS. +* todo: implement additional tool types + rv_bool = abap_false. + ENDCASE. CATCH cx_enh_root. rv_bool = abap_false. ENDTRY. @@ -148,6 +165,7 @@ CLASS lcl_object_enhs IMPLEMENTATION. ENDMETHOD. "exists METHOD lif_object~delete. + DATA: lv_spot_name TYPE enhspotname, lv_message TYPE string, lx_root TYPE REF TO cx_root, @@ -159,19 +177,18 @@ CLASS lcl_object_enhs IMPLEMENTATION. TRY. li_spot_ref = cl_enh_factory=>get_enhancement_spot( spot_name = lv_spot_name - lock = 'X' ). + lock = abap_true ). IF li_spot_ref IS BOUND. lo_badidef_tool ?= li_spot_ref. lo_badidef_tool->if_enh_object~delete( - nevertheless_delete = 'X' - run_dark = 'X' ). + nevertheless_delete = abap_true + run_dark = abap_true ). ENDIF. lo_badidef_tool->if_enh_object~unlock( ). CATCH cx_enh_root INTO lx_root. - lv_message = `Error occured while deleting EHNS: ` - && lx_root->get_text( ) ##NO_TEXT. - lcx_exception=>raise( lv_message ). + lcx_exception=>raise( `Error occured while deleting EHNS: ` + && lx_root->get_text( ) ) ##NO_TEXT. ENDTRY. ENDMETHOD. "delete From 47e91752fe96a64174c429946efda9877211a9dc Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 30 Oct 2016 07:25:53 +0000 Subject: [PATCH 02/10] ENHO: fix, not updated at refresh --- src/zabapgit_object_enho.prog.abap | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/zabapgit_object_enho.prog.abap b/src/zabapgit_object_enho.prog.abap index 7a393c386..038007568 100644 --- a/src/zabapgit_object_enho.prog.abap +++ b/src/zabapgit_object_enho.prog.abap @@ -82,7 +82,9 @@ CLASS lcl_object_enho IMPLEMENTATION. lv_enh_id = ms_item-obj_name. TRY. - li_enh_tool = cl_enh_factory=>get_enhancement( lv_enh_id ). + li_enh_tool = cl_enh_factory=>get_enhancement( + enhancement_id = lv_enh_id + bypassing_buffer = abap_true ). CATCH cx_enh_root. lcx_exception=>raise( 'Error from CL_ENH_FACTORY' ). ENDTRY. From 48d83fe675a922f6fe3f28afac7913b948a292cf Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 30 Oct 2016 07:38:13 +0000 Subject: [PATCH 03/10] ENHS: catch exception --- src/zabapgit_object_enhs.prog.abap | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/zabapgit_object_enhs.prog.abap b/src/zabapgit_object_enhs.prog.abap index 08202f76e..31a624b15 100644 --- a/src/zabapgit_object_enhs.prog.abap +++ b/src/zabapgit_object_enhs.prog.abap @@ -30,8 +30,12 @@ CLASS lcl_object_enhs IMPLEMENTATION. lv_spot_name = ms_item-obj_name. - li_spot_ref = cl_enh_factory=>get_enhancement_spot( lv_spot_name ). - li_spot_ref->get_attributes( IMPORTING changedby = rv_user ). + TRY. + li_spot_ref = cl_enh_factory=>get_enhancement_spot( lv_spot_name ). + li_spot_ref->get_attributes( IMPORTING changedby = rv_user ). + CATCH cx_enh_root. + rv_user = c_user_unknown. + ENDTRY. ENDMETHOD. @@ -141,7 +145,7 @@ CLASS lcl_object_enhs IMPLEMENTATION. METHOD lif_object~exists. DATA: lv_spot_name TYPE enhspotname, - lv_tool TYPE enhspottooltype, + lv_tool TYPE enhspottooltype, li_spot_ref TYPE REF TO if_enh_spot_tool. From de35b72db005243de3a963aaefe1e276272a016d Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 30 Oct 2016 08:23:21 +0000 Subject: [PATCH 04/10] ENHO: handle spaces, #359 --- src/zabapgit.prog.abap | 2 +- src/zabapgit_object_enho.prog.abap | 76 ++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/src/zabapgit.prog.abap b/src/zabapgit.prog.abap index bbeadffc3..c2f0038c0 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.18.6'. "#EC NOTEXT + gc_abap_version TYPE string VALUE 'v1.18.7'. "#EC NOTEXT ******************************************************************************** * The MIT License (MIT) diff --git a/src/zabapgit_object_enho.prog.abap b/src/zabapgit_object_enho.prog.abap index 038007568..63137394a 100644 --- a/src/zabapgit_object_enho.prog.abap +++ b/src/zabapgit_object_enho.prog.abap @@ -14,6 +14,13 @@ CLASS lcl_object_enho DEFINITION INHERITING FROM lcl_objects_super FINAL. ALIASES mo_files FOR lif_object~mo_files. PRIVATE SECTION. + TYPES: BEGIN OF ty_spaces, + full_name TYPE string. + TYPES: spaces TYPE STANDARD TABLE OF i WITH DEFAULT KEY, + END OF ty_spaces. + + TYPES: ty_spaces_tt TYPE STANDARD TABLE OF ty_spaces WITH DEFAULT KEY. + METHODS deserialize_badi IMPORTING io_xml TYPE REF TO lcl_xml_input iv_package TYPE devclass @@ -34,6 +41,15 @@ CLASS lcl_object_enho DEFINITION INHERITING FROM lcl_objects_super FINAL. ii_enh_tool TYPE REF TO if_enh_tool RAISING lcx_exception. + METHODS hook_impl_serialize + EXPORTING et_spaces TYPE ty_spaces_tt + CHANGING ct_impl TYPE enh_hook_impl_it + RAISING lcx_exception. + METHODS hook_impl_deserialize + IMPORTING it_spaces TYPE ty_spaces_tt + CHANGING ct_impl TYPE enh_hook_impl_it + RAISING lcx_exception. + ENDCLASS. "lcl_object_enho DEFINITION *----------------------------------------------------------------------* @@ -55,6 +71,53 @@ CLASS lcl_object_enho IMPLEMENTATION. rv_user = c_user_unknown. " todo ENDMETHOD. + METHOD hook_impl_serialize. +* handle normalization of XML values +* i.e. remove leading spaces + + FIELD-SYMBOLS: LIKE LINE OF ct_impl, + LIKE LINE OF et_spaces, + TYPE i, + TYPE string. + + + LOOP AT ct_impl ASSIGNING . + APPEND INITIAL LINE TO et_spaces ASSIGNING . + -full_name = -full_name. + LOOP AT -source ASSIGNING . + APPEND INITIAL LINE TO -spaces ASSIGNING . + WHILE strlen( ) >= 1 AND (1) = ` `. + = +1. + = + 1. + ENDWHILE. + ENDLOOP. + ENDLOOP. + ENDMETHOD. + + METHOD hook_impl_deserialize. + + FIELD-SYMBOLS: LIKE LINE OF ct_impl, + TYPE string, + TYPE i, + LIKE LINE OF it_spaces. + + + LOOP AT ct_impl ASSIGNING . + READ TABLE it_spaces ASSIGNING WITH KEY full_name = -full_name. + IF sy-subrc = 0. + LOOP AT -source ASSIGNING . + READ TABLE -spaces ASSIGNING INDEX sy-tabix. + IF sy-subrc = 0 AND > 0. + DO TIMES. + CONCATENATE space INTO RESPECTING BLANKS. + ENDDO. + ENDIF. + ENDLOOP. + ENDIF. + ENDLOOP. + + ENDMETHOD. + METHOD lif_object~exists. DATA: ls_tadir TYPE tadir. @@ -198,6 +261,7 @@ CLASS lcl_object_enho IMPLEMENTATION. lv_enhname TYPE enhname, lv_package TYPE devclass, ls_original_object TYPE enh_hook_admin, + lt_spaces TYPE ty_spaces_tt, lt_enhancements TYPE enh_hook_impl_it. FIELD-SYMBOLS: LIKE LINE OF lt_enhancements. @@ -209,6 +273,11 @@ CLASS lcl_object_enho IMPLEMENTATION. CHANGING cg_data = ls_original_object ). io_xml->read( EXPORTING iv_name = 'ENHANCEMENTS' CHANGING cg_data = lt_enhancements ). + io_xml->read( EXPORTING iv_name = 'SPACES' + CHANGING cg_data = lt_spaces ). + + hook_impl_deserialize( EXPORTING it_spaces = lt_spaces + CHANGING ct_impl = lt_enhancements ). lv_enhname = ms_item-obj_name. lv_package = iv_package. @@ -281,6 +350,7 @@ CLASS lcl_object_enho IMPLEMENTATION. DATA: lv_shorttext TYPE string, lo_hook_impl TYPE REF TO cl_enh_tool_hook_impl, ls_original_object TYPE enh_hook_admin, + lt_spaces TYPE ty_spaces_tt, lt_enhancements TYPE enh_hook_impl_it. @@ -298,6 +368,10 @@ CLASS lcl_object_enho IMPLEMENTATION. ls_original_object-include_bound = lo_hook_impl->get_include_bound( ). lt_enhancements = lo_hook_impl->get_hook_impls( ). + hook_impl_serialize( + IMPORTING et_spaces = lt_spaces + CHANGING ct_impl = lt_enhancements ). + io_xml->add( iv_name = 'TOOL' ig_data = iv_tool ). io_xml->add( ig_data = lv_shorttext @@ -306,6 +380,8 @@ CLASS lcl_object_enho IMPLEMENTATION. iv_name = 'ORIGINAL_OBJECT' ). io_xml->add( iv_name = 'ENHANCEMENTS' ig_data = lt_enhancements ). + io_xml->add( iv_name = 'SPACES' + ig_data = lt_spaces ). ENDMETHOD. "serialize_hook From d6258d9ea85efd5fcd989c87999dbc3c2dc4880a Mon Sep 17 00:00:00 2001 From: sbcgua Date: Wed, 2 Nov 2016 10:46:32 +0200 Subject: [PATCH 05/10] i18n texts, doma, dtel (#402) * cherrypick cache repo results (#280) * lcl_gui_view_repo_content - code reorg #280 * fix * folders part 1 #280 * cherrypick refresh * cherrypick 2 pretty print * cherrypick log style * cherrypick lock icon * cherrypick background icon and toc marker * cherrypick macro include * unit test for lcl_path and fixes * folders part2 #280 * changes_only at user profile #280 * fix empty package * fix dump on type change * new repo, remove fixes, close #393, close #394 * merge fix * all repo diff at stage page * fix menu double rendering #398 * hide current folder in plain list mode #400 * i18n texts, doma, dtel * linter fixes * remove is_language_installed check --- src/zabapgit_object_doma.prog.abap | 175 +++++++++++++++++++++++++++- src/zabapgit_object_dtel.prog.abap | 131 ++++++++++++++++++++- src/zabapgit_objects.prog.abap | 7 ++ src/zabapgit_objects_impl.prog.abap | 12 ++ 4 files changed, 313 insertions(+), 12 deletions(-) diff --git a/src/zabapgit_object_doma.prog.abap b/src/zabapgit_object_doma.prog.abap index 747d1beeb..5d723e48d 100644 --- a/src/zabapgit_object_doma.prog.abap +++ b/src/zabapgit_object_doma.prog.abap @@ -13,6 +13,34 @@ CLASS lcl_object_doma DEFINITION INHERITING FROM lcl_objects_super FINAL. INTERFACES lif_object. ALIASES mo_files FOR lif_object~mo_files. + PRIVATE SECTION. + + TYPES: BEGIN OF ty_dd01_texts, + ddlanguage TYPE dd01v-ddlanguage, + ddtext TYPE dd01v-ddtext, + END OF ty_dd01_texts, + BEGIN OF ty_dd07_texts, + valpos TYPE dd07v-valpos, + ddlanguage TYPE dd07v-ddlanguage, + domvalue_l TYPE dd07v-domvalue_l, + domvalue_h TYPE dd07v-domvalue_h, + ddtext TYPE dd07v-ddtext, + domval_ld TYPE dd07v-domval_ld, + domval_hd TYPE dd07v-domval_hd, + END OF ty_dd07_texts, + tt_dd01_texts TYPE STANDARD TABLE OF ty_dd01_texts, + tt_dd07_texts TYPE STANDARD TABLE OF ty_dd07_texts. + + METHODS: + serialize_texts + IMPORTING io_xml TYPE REF TO lcl_xml_output + RAISING lcx_exception, + deserialize_texts + IMPORTING io_xml TYPE REF TO lcl_xml_input + is_dd01v TYPE dd01v + it_dd07v TYPE dd07v_tab + RAISING lcx_exception. + ENDCLASS. "lcl_object_doma DEFINITION *----------------------------------------------------------------------* @@ -118,12 +146,9 @@ CLASS lcl_object_doma IMPLEMENTATION. EXCEPTIONS illegal_input = 1 OTHERS = 2. - IF sy-subrc <> 0. + IF sy-subrc <> 0 OR ls_dd01v IS INITIAL. lcx_exception=>raise( 'error from DDIF_DOMA_GET' ). ENDIF. - IF ls_dd01v IS INITIAL. - RETURN. " does not exist - ENDIF. CLEAR: ls_dd01v-as4user, ls_dd01v-as4date, @@ -134,6 +159,8 @@ CLASS lcl_object_doma IMPLEMENTATION. io_xml->add( iv_name = 'DD07V_TAB' ig_data = lt_dd07v ). + serialize_texts( io_xml ). + ENDMETHOD. "serialize METHOD lif_object~deserialize. @@ -144,8 +171,8 @@ CLASS lcl_object_doma IMPLEMENTATION. * fm TR_TADIR_INTERFACE * fm RS_CORR_INSERT ? - DATA: ls_dd01v TYPE dd01v, - lv_name TYPE ddobjname, + DATA: lv_name TYPE ddobjname, + ls_dd01v TYPE dd01v, lt_dd07v TYPE TABLE OF dd07v. @@ -175,8 +202,144 @@ CLASS lcl_object_doma IMPLEMENTATION. lcx_exception=>raise( 'error from DDIF_DOMA_PUT' ). ENDIF. + deserialize_texts( io_xml = io_xml + is_dd01v = ls_dd01v + it_dd07v = lt_dd07v ). + lcl_objects_activation=>add_item( ms_item ). ENDMETHOD. "deserialize + METHOD serialize_texts. + + DATA: lv_name TYPE ddobjname, + lv_index TYPE i, + ls_dd01v TYPE dd01v, + lt_dd07v TYPE TABLE OF dd07v, + lt_i18n_langs TYPE TABLE OF langu, + lt_dd01_texts TYPE tt_dd01_texts, + lt_dd07_texts TYPE tt_dd07_texts. + + FIELD-SYMBOLS: LIKE LINE OF lt_i18n_langs, + LIKE LINE OF lt_dd07v, + LIKE LINE OF lt_dd01_texts, + LIKE LINE OF lt_dd07_texts. + + lv_name = ms_item-obj_name. + + " Collect additional languages + SELECT DISTINCT ddlanguage as langu INTO TABLE lt_i18n_langs + FROM dd01v + WHERE domname = lv_name + AND ddlanguage <> mv_language. " Skip master lang - it was serialized already + + LOOP AT lt_i18n_langs ASSIGNING . + lv_index = sy-tabix. + + CALL FUNCTION 'DDIF_DOMA_GET' + EXPORTING + name = lv_name + langu = + IMPORTING + dd01v_wa = ls_dd01v + TABLES + dd07v_tab = lt_dd07v + EXCEPTIONS + illegal_input = 1 + OTHERS = 2. + IF sy-subrc <> 0 OR ls_dd01v-ddlanguage IS INITIAL. + DELETE lt_i18n_langs INDEX lv_index. " Don't save this lang + CONTINUE. + ENDIF. + + APPEND INITIAL LINE TO lt_dd01_texts ASSIGNING . + MOVE-CORRESPONDING ls_dd01v TO . + + LOOP AT lt_dd07v ASSIGNING . + APPEND INITIAL LINE TO lt_dd07_texts ASSIGNING . + MOVE-CORRESPONDING TO . + ENDLOOP. + + ENDLOOP. + + IF lines( lt_i18n_langs ) > 1. + io_xml->add( iv_name = 'I18N_LANGS' + ig_data = lt_i18n_langs ). + + io_xml->add( iv_name = 'DD01_TEXTS' + ig_data = lt_dd01_texts ). + + io_xml->add( iv_name = 'DD07_TEXTS' + ig_data = lt_dd07_texts ). + ENDIF. + + ENDMETHOD. "serialize_texts + + METHOD deserialize_texts. + + DATA: lv_name TYPE ddobjname, + ls_dd01v_tmp TYPE dd01v, + lt_dd07v_tmp TYPE TABLE OF dd07v, + lt_i18n_langs TYPE TABLE OF langu, + lt_dd01_texts TYPE tt_dd01_texts, + lt_dd07_texts TYPE tt_dd07_texts. + + FIELD-SYMBOLS: LIKE LINE OF lt_i18n_langs, + LIKE LINE OF it_dd07v, + LIKE LINE OF lt_dd01_texts, + LIKE LINE OF lt_dd07_texts. + + lv_name = ms_item-obj_name. + + io_xml->read( EXPORTING iv_name = 'I18N_LANGS' + CHANGING cg_data = lt_i18n_langs ). + + io_xml->read( EXPORTING iv_name = 'DD01_TEXTS' + CHANGING cg_data = lt_dd01_texts ). + + io_xml->read( EXPORTING iv_name = 'DD07_TEXTS' + CHANGING cg_data = lt_dd07_texts ). + + SORT: lt_i18n_langs, lt_dd07_texts BY ddlanguage. " Optimization + + LOOP AT lt_i18n_langs ASSIGNING . + + " Domain description + ls_dd01v_tmp = is_dd01v. + READ TABLE lt_dd01_texts ASSIGNING WITH KEY ddlanguage = . + IF sy-subrc > 0. + lcx_exception=>raise( |DD01_TEXTS cannot find lang { } in XML| ). + ENDIF. + MOVE-CORRESPONDING TO ls_dd01v_tmp. + + " Domain values + lt_dd07v_tmp = it_dd07v. + LOOP AT lt_dd07v_tmp ASSIGNING . + READ TABLE lt_dd07_texts ASSIGNING + WITH KEY ddlanguage = valpos = -valpos. + CHECK sy-subrc = 0. " ! no translation -> master translation remain (maybe not OK) + MOVE-CORRESPONDING TO . + DELETE lt_dd07_texts INDEX sy-tabix. " Optimization + ENDLOOP. + + CALL FUNCTION 'DDIF_DOMA_PUT' + EXPORTING + name = lv_name + dd01v_wa = ls_dd01v_tmp + TABLES + dd07v_tab = lt_dd07v_tmp + EXCEPTIONS + doma_not_found = 1 + name_inconsistent = 2 + doma_inconsistent = 3 + put_failure = 4 + put_refused = 5 + OTHERS = 6. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from DDIF_DOMA_PUT @TEXTS' ). + ENDIF. + ENDLOOP. + + ENDMETHOD. "deserialize_texts + ENDCLASS. "lcl_object_doma IMPLEMENTATION \ No newline at end of file diff --git a/src/zabapgit_object_dtel.prog.abap b/src/zabapgit_object_dtel.prog.abap index 37bd08de5..92d6730c3 100644 --- a/src/zabapgit_object_dtel.prog.abap +++ b/src/zabapgit_object_dtel.prog.abap @@ -13,6 +13,27 @@ CLASS lcl_object_dtel DEFINITION INHERITING FROM lcl_objects_super FINAL. INTERFACES lif_object. ALIASES mo_files FOR lif_object~mo_files. + PRIVATE SECTION. + + TYPES: BEGIN OF ty_dd04_texts, + ddlanguage TYPE dd04t-ddlanguage, + ddtext TYPE dd04t-ddtext, + reptext TYPE dd04t-reptext, + scrtext_s TYPE dd04t-scrtext_s, + scrtext_m TYPE dd04t-scrtext_m, + scrtext_l TYPE dd04t-scrtext_l, + END OF ty_dd04_texts, + tt_dd04_texts TYPE STANDARD TABLE OF ty_dd04_texts. + + METHODS: + serialize_texts + IMPORTING io_xml TYPE REF TO lcl_xml_output + RAISING lcx_exception, + deserialize_texts + IMPORTING io_xml TYPE REF TO lcl_xml_input + is_dd04v TYPE dd04v + RAISING lcx_exception. + ENDCLASS. "lcl_object_dtel DEFINITION *----------------------------------------------------------------------* @@ -78,9 +99,9 @@ CLASS lcl_object_dtel IMPLEMENTATION. DATA: lv_objname TYPE rsedd0-ddobjname. - lv_objname = ms_item-obj_name. + CALL FUNCTION 'RS_DD_DELETE_OBJ' EXPORTING no_ask = abap_true @@ -103,9 +124,9 @@ CLASS lcl_object_dtel IMPLEMENTATION. ls_dd04v TYPE dd04v, ls_tpara TYPE tpara. - lv_name = ms_item-obj_name. + CALL FUNCTION 'DDIF_DTEL_GET' EXPORTING name = lv_name @@ -116,12 +137,9 @@ CLASS lcl_object_dtel IMPLEMENTATION. EXCEPTIONS illegal_input = 1 OTHERS = 2. - IF sy-subrc <> 0. + IF sy-subrc <> 0 or ls_dd04v IS INITIAL. lcx_exception=>raise( 'Error from DDIF_DTEL_GET' ). ENDIF. - IF ls_dd04v IS INITIAL. - RETURN. " does not exist - ENDIF. CLEAR: ls_dd04v-as4user, ls_dd04v-as4date, @@ -144,6 +162,8 @@ CLASS lcl_object_dtel IMPLEMENTATION. io_xml->add( iv_name = 'TPARA' ig_data = ls_tpara ). + serialize_texts( io_xml ). + ENDMETHOD. "serialize METHOD lif_object~deserialize. @@ -177,8 +197,107 @@ CLASS lcl_object_dtel IMPLEMENTATION. lcx_exception=>raise( 'error from DDIF_DTEL_PUT' ). ENDIF. + deserialize_texts( io_xml = io_xml + is_dd04v = ls_dd04v ). + lcl_objects_activation=>add_item( ms_item ). ENDMETHOD. "deserialize + METHOD serialize_texts. + + DATA: lv_name TYPE ddobjname, + lv_index TYPE i, + ls_dd04v TYPE dd04v, + ls_tpara TYPE tpara, + lt_dd04_texts TYPE tt_dd04_texts, + lt_i18n_langs TYPE TABLE OF langu. + FIELD-SYMBOLS: LIKE LINE OF lt_i18n_langs, + TYPE ty_dd04_texts. + + lv_name = ms_item-obj_name. + + " Collect additional languages + SELECT DISTINCT ddlanguage as langu INTO TABLE lt_i18n_langs + FROM dd04v + WHERE rollname = lv_name + AND ddlanguage <> mv_language. " Skip master lang - it was serialized already + + LOOP AT lt_i18n_langs ASSIGNING . + lv_index = sy-tabix. + CALL FUNCTION 'DDIF_DTEL_GET' + EXPORTING + name = lv_name + langu = + IMPORTING + dd04v_wa = ls_dd04v + tpara_wa = ls_tpara + EXCEPTIONS + illegal_input = 1 + OTHERS = 2. + IF sy-subrc <> 0 OR ls_dd04v-ddlanguage IS INITIAL. + DELETE lt_i18n_langs INDEX lv_index. " Don't save this lang + CONTINUE. + ENDIF. + + APPEND INITIAL LINE TO lt_dd04_texts ASSIGNING . + MOVE-CORRESPONDING ls_dd04v TO . + + ENDLOOP. + + IF lines( lt_i18n_langs ) > 0. + io_xml->add( iv_name = 'I18N_LANGS' + ig_data = lt_i18n_langs ). + + io_xml->add( iv_name = 'DD04_TEXTS' + ig_data = lt_dd04_texts ). + ENDIF. + + ENDMETHOD. + + METHOD deserialize_texts. + + DATA: lv_name TYPE ddobjname, + ls_dd04v_tmp TYPE dd04v, + lt_i18n_langs TYPE TABLE OF langu, + lt_dd04_texts TYPE tt_dd04_texts. + FIELD-SYMBOLS: LIKE LINE OF lt_i18n_langs, + TYPE ty_dd04_texts. + + lv_name = ms_item-obj_name. + + io_xml->read( EXPORTING iv_name = 'I18N_LANGS' + CHANGING cg_data = lt_i18n_langs ). + + io_xml->read( EXPORTING iv_name = 'DD04_TEXTS' + CHANGING cg_data = lt_dd04_texts ). + + SORT: lt_i18n_langs, lt_dd04_texts BY ddlanguage. " Optimization + LOOP AT lt_i18n_langs ASSIGNING . + + " Data element description + ls_dd04v_tmp = is_dd04v. + READ TABLE lt_dd04_texts ASSIGNING WITH KEY ddlanguage = . + IF sy-subrc > 0. + lcx_exception=>raise( |DD04_TEXTS cannot find lang { } in XML| ). + ENDIF. + MOVE-CORRESPONDING TO ls_dd04v_tmp. + CALL FUNCTION 'DDIF_DTEL_PUT' + EXPORTING + name = lv_name + dd04v_wa = ls_dd04v_tmp + EXCEPTIONS + dtel_not_found = 1 + name_inconsistent = 2 + dtel_inconsistent = 3 + put_failure = 4 + put_refused = 5 + OTHERS = 6. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from DDIF_DTEL_PUT @TEXTS' ). + ENDIF. + ENDLOOP. + + ENDMETHOD. + ENDCLASS. "lcl_object_dtel IMPLEMENTATION \ No newline at end of file diff --git a/src/zabapgit_objects.prog.abap b/src/zabapgit_objects.prog.abap index a3e110ea4..2d6b72a3b 100644 --- a/src/zabapgit_objects.prog.abap +++ b/src/zabapgit_objects.prog.abap @@ -1517,7 +1517,14 @@ CLASS lcl_objects DEFINITION FINAL. CLASS-METHODS supported_list RETURNING VALUE(rt_types) TYPE ty_types_tt. + CLASS-METHODS is_language_installed + IMPORTING iv_language TYPE langu + RETURNING VALUE(rv_yes) TYPE abap_bool. + PRIVATE SECTION. + + CLASS-DATA: mv_langs_installed type scplangs. + CLASS-METHODS check_duplicates IMPORTING it_files TYPE ty_files_tt RAISING lcx_exception. diff --git a/src/zabapgit_objects_impl.prog.abap b/src/zabapgit_objects_impl.prog.abap index 4cb47a21f..0f64bbb3c 100644 --- a/src/zabapgit_objects_impl.prog.abap +++ b/src/zabapgit_objects_impl.prog.abap @@ -221,6 +221,18 @@ CLASS lcl_objects IMPLEMENTATION. ENDMETHOD. "supported_list + METHOD is_language_installed. + + IF mv_langs_installed IS INITIAL. + CALL FUNCTION 'RSAQ_READ_INSTALLED_LANGUAGES' + IMPORTING + inst_languages = mv_langs_installed. + ENDIF. + + rv_yes = boolc( mv_langs_installed CA iv_language ). + + ENDMETHOD. "is_language_installed + METHOD exists. DATA: li_obj TYPE REF TO lif_object. From 4b5b835f1b8782a8126507259c830f5f4e83980f Mon Sep 17 00:00:00 2001 From: larshp Date: Wed, 2 Nov 2016 08:49:32 +0000 Subject: [PATCH 06/10] bump version to v1.19.0, and fix #406 --- src/zabapgit.prog.abap | 2 +- src/zabapgit_object_dtel.prog.abap | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/zabapgit.prog.abap b/src/zabapgit.prog.abap index c2f0038c0..e9609ae73 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.18.7'. "#EC NOTEXT + gc_abap_version TYPE string VALUE 'v1.19.0'. "#EC NOTEXT ******************************************************************************** * The MIT License (MIT) diff --git a/src/zabapgit_object_dtel.prog.abap b/src/zabapgit_object_dtel.prog.abap index 92d6730c3..2af768331 100644 --- a/src/zabapgit_object_dtel.prog.abap +++ b/src/zabapgit_object_dtel.prog.abap @@ -137,7 +137,7 @@ CLASS lcl_object_dtel IMPLEMENTATION. EXCEPTIONS illegal_input = 1 OTHERS = 2. - IF sy-subrc <> 0 or ls_dd04v IS INITIAL. + IF sy-subrc <> 0 OR ls_dd04v IS INITIAL. lcx_exception=>raise( 'Error from DDIF_DTEL_GET' ). ENDIF. @@ -151,6 +151,7 @@ CLASS lcl_object_dtel IMPLEMENTATION. ls_dd04v-leng, ls_dd04v-decimals, ls_dd04v-outputlen, + ls_dd04v-valexi, ls_dd04v-lowercase, ls_dd04v-signflag, ls_dd04v-convexit, @@ -218,7 +219,7 @@ CLASS lcl_object_dtel IMPLEMENTATION. lv_name = ms_item-obj_name. " Collect additional languages - SELECT DISTINCT ddlanguage as langu INTO TABLE lt_i18n_langs + SELECT DISTINCT ddlanguage AS langu INTO TABLE lt_i18n_langs FROM dd04v WHERE rollname = lv_name AND ddlanguage <> mv_language. " Skip master lang - it was serialized already From 15619130cd92b60bfafd598fb16b8d7387d33122 Mon Sep 17 00:00:00 2001 From: sbcgua Date: Sun, 6 Nov 2016 13:52:51 +0200 Subject: [PATCH 07/10] file sha1 at local checksums #407 --- src/zabapgit_definitions.prog.abap | 9 +++++++-- src/zabapgit_objects_impl.prog.abap | 2 +- src/zabapgit_persistence.prog.abap | 5 +++-- src/zabapgit_repo.prog.abap | 2 ++ src/zabapgit_repo_impl.prog.abap | 18 +++++++++++++----- src/zabapgit_view_repo.prog.abap | 5 +++++ 6 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/zabapgit_definitions.prog.abap b/src/zabapgit_definitions.prog.abap index 075f6415e..914c242e9 100644 --- a/src/zabapgit_definitions.prog.abap +++ b/src/zabapgit_definitions.prog.abap @@ -8,13 +8,18 @@ TYPES: ty_type TYPE c LENGTH 6, ty_bitbyte TYPE c LENGTH 8, ty_sha1 TYPE c LENGTH 40. -TYPES: BEGIN OF ty_file, +TYPES: BEGIN OF ty_file_signature, path TYPE string, filename TYPE string, - data TYPE xstring, sha1 TYPE ty_sha1, + END OF ty_file_signature. + +TYPES: BEGIN OF ty_file. + INCLUDE TYPE ty_file_signature. +TYPES: data TYPE xstring, END OF ty_file. TYPES: ty_files_tt TYPE STANDARD TABLE OF ty_file WITH DEFAULT KEY. +TYPES: ty_file_signatures_tt TYPE STANDARD TABLE OF ty_file_signature WITH DEFAULT KEY. TYPES: ty_string_tt TYPE STANDARD TABLE OF string WITH DEFAULT KEY. TYPES: tt_w3urls TYPE STANDARD TABLE OF w3url WITH DEFAULT KEY. diff --git a/src/zabapgit_objects_impl.prog.abap b/src/zabapgit_objects_impl.prog.abap index 0f64bbb3c..ee79b7b5a 100644 --- a/src/zabapgit_objects_impl.prog.abap +++ b/src/zabapgit_objects_impl.prog.abap @@ -22,7 +22,7 @@ CLASS lcl_objects IMPLEMENTATION. LIKE LINE OF ct_results. - lt_before = io_repo->get_local_checksums( ). + lt_before = io_repo->get_local_checksums( ). lt_current = io_repo->build_local_checksums( ). LOOP AT ct_results ASSIGNING . diff --git a/src/zabapgit_persistence.prog.abap b/src/zabapgit_persistence.prog.abap index 9a4bf77c5..7e987ddff 100644 --- a/src/zabapgit_persistence.prog.abap +++ b/src/zabapgit_persistence.prog.abap @@ -91,8 +91,9 @@ CLASS lcl_persistence_repo DEFINITION FINAL. PUBLIC SECTION. TYPES: BEGIN OF ty_local_checksum, - item TYPE ty_item, - sha1 TYPE ty_sha1, + item TYPE ty_item, + sha1 TYPE ty_sha1, + files TYPE ty_file_signatures_tt, END OF ty_local_checksum. TYPES: ty_local_checksum_tt TYPE STANDARD TABLE OF ty_local_checksum WITH DEFAULT KEY. diff --git a/src/zabapgit_repo.prog.abap b/src/zabapgit_repo.prog.abap index 6dee4476e..8d680bee6 100644 --- a/src/zabapgit_repo.prog.abap +++ b/src/zabapgit_repo.prog.abap @@ -44,6 +44,8 @@ CLASS lcl_repo DEFINITION ABSTRACT FRIENDS lcl_repo_srv. build_local_checksums RETURNING VALUE(rt_checksums) TYPE lcl_persistence_repo=>ty_local_checksum_tt RAISING lcx_exception, + refresh_local_checksums + RAISING lcx_exception, is_offline RETURNING VALUE(rv_offline) TYPE abap_bool RAISING lcx_exception. diff --git a/src/zabapgit_repo_impl.prog.abap b/src/zabapgit_repo_impl.prog.abap index 9b8cebb80..052f5725e 100644 --- a/src/zabapgit_repo_impl.prog.abap +++ b/src/zabapgit_repo_impl.prog.abap @@ -332,26 +332,30 @@ CLASS lcl_repo IMPLEMENTATION. METHOD build_local_checksums. DATA: lv_xstring TYPE xstring, - lt_local TYPE ty_files_item_tt. + lt_local TYPE SORTED TABLE OF ty_file_item WITH NON-UNIQUE KEY item. FIELD-SYMBOLS: LIKE LINE OF lt_local, LIKE LINE OF rt_checksums, + LIKE LINE OF -files, LIKE LINE OF lt_local. - lt_local = get_files_local( ). + DELETE lt_local WHERE item IS INITIAL. - LOOP AT lt_local ASSIGNING WHERE NOT item IS INITIAL. + LOOP AT lt_local ASSIGNING . CLEAR lv_xstring. + APPEND INITIAL LINE TO rt_checksums ASSIGNING . LOOP AT lt_local ASSIGNING WHERE item = -item. CONCATENATE lv_xstring -file-data INTO lv_xstring IN BYTE MODE. + APPEND INITIAL LINE TO -files ASSIGNING . + MOVE-CORRESPONDING -file TO . ENDLOOP. - APPEND INITIAL LINE TO rt_checksums ASSIGNING . - -item = -item. ASSERT NOT lv_xstring IS INITIAL. + + -item = -item. -sha1 = lcl_hash=>sha1_raw( lv_xstring ). DELETE lt_local WHERE item = -item. @@ -360,6 +364,10 @@ CLASS lcl_repo IMPLEMENTATION. ENDMETHOD. + METHOD refresh_local_checksums. + set( it_checksums = build_local_checksums( ) ). + ENDMETHOD. "refresh_local_checksums + METHOD deserialize. IF mo_dot_abapgit IS INITIAL. diff --git a/src/zabapgit_view_repo.prog.abap b/src/zabapgit_view_repo.prog.abap index a25d2ed13..bf89e3f4c 100644 --- a/src/zabapgit_view_repo.prog.abap +++ b/src/zabapgit_view_repo.prog.abap @@ -312,6 +312,9 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. WHEN c_actions-toggle_changes. " Toggle changes only view mv_changes_only = lcl_app=>user( )->toggle_changes_only( ). ev_state = gc_event_state-re_render. + WHEN 'update_checksums'. + mo_repo->refresh_local_checksums( ). + ev_state = gc_event_state-re_render. ENDCASE. ENDMETHOD. "lif_gui_page~on_event @@ -460,6 +463,8 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. iv_act = |{ gc_action-repo_remote_change }?{ lv_key }| ). lo_tb_advanced->add( iv_txt = 'Make off-line' iv_act = |{ gc_action-repo_remote_detach }?{ lv_key }| ). + lo_tb_advanced->add( iv_txt = 'Update local checksums' + iv_act = |update_checksums| ). ELSE. lo_tb_advanced->add( iv_txt = 'Make on-line' iv_act = |{ gc_action-repo_remote_attach }?{ lv_key }| ). From 99d76e7174cd4b5b034aaec205a02bac83895d4b Mon Sep 17 00:00:00 2001 From: sbcgua Date: Sun, 6 Nov 2016 23:09:34 +0200 Subject: [PATCH 08/10] linter fix --- src/zabapgit_definitions.prog.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zabapgit_definitions.prog.abap b/src/zabapgit_definitions.prog.abap index 914c242e9..5367313ce 100644 --- a/src/zabapgit_definitions.prog.abap +++ b/src/zabapgit_definitions.prog.abap @@ -15,7 +15,7 @@ TYPES: BEGIN OF ty_file_signature, END OF ty_file_signature. TYPES: BEGIN OF ty_file. - INCLUDE TYPE ty_file_signature. + INCLUDE TYPE ty_file_signature. TYPES: data TYPE xstring, END OF ty_file. TYPES: ty_files_tt TYPE STANDARD TABLE OF ty_file WITH DEFAULT KEY. From 9063a2d6a64e15b49a4cc2f1b1bb27c4f469ab92 Mon Sep 17 00:00:00 2001 From: EduardoCopat Date: Thu, 10 Nov 2016 16:40:49 +0100 Subject: [PATCH 09/10] Settings (proxy) #412 (#414) * Added empty settings page Also added it in the Advanced meun * Added Settings HTML structure * Provide settings persistence I put the unit tests in the persistence include rather than the unit test include * Triggering settings save on UI event * Plug-in the proxy settings into CL_HTTP_CLIENT Also, removed a break point... * abaplint fixes * abaplint fixes #2 --- src/zabapgit_app.prog.abap | 7 +- src/zabapgit_app_impl.prog.abap | 7 + src/zabapgit_definitions.prog.abap | 1 + src/zabapgit_git.prog.abap | 10 +- src/zabapgit_gui_pages.prog.abap | 3 +- src/zabapgit_gui_router.prog.abap | 5 +- src/zabapgit_html_action_utils.prog.abap | 14 -- src/zabapgit_page_main.prog.abap | 1 + src/zabapgit_page_settings.prog.abap | 169 +++++++++++++++ src/zabapgit_page_settings.prog.xml | 48 +++++ src/zabapgit_persistence.prog.abap | 261 +++++++++++++++++++++-- src/zabapgit_unit_test.prog.abap | 1 - 12 files changed, 492 insertions(+), 35 deletions(-) create mode 100644 src/zabapgit_page_settings.prog.abap create mode 100644 src/zabapgit_page_settings.prog.xml diff --git a/src/zabapgit_app.prog.abap b/src/zabapgit_app.prog.abap index 639cddca6..26f17a1b2 100644 --- a/src/zabapgit_app.prog.abap +++ b/src/zabapgit_app.prog.abap @@ -6,6 +6,7 @@ CLASS lcl_gui DEFINITION DEFERRED. CLASS lcl_persistence_user DEFINITION DEFERRED. CLASS lcl_repo_srv DEFINITION DEFERRED. CLASS lcl_persistence_db DEFINITION DEFERRED. +CLASS lcl_persistence_settings DEFINITION DEFERRED. *----------------------------------------------------------------------* * CLASS lcl_app DEFINITION @@ -31,10 +32,14 @@ CLASS lcl_app DEFINITION FINAL. CLASS-METHODS db RETURNING VALUE(ro_db) TYPE REF TO lcl_persistence_db. + CLASS-METHODS settings + RETURNING VALUE(ro_settings) TYPE REF TO lcl_persistence_settings. + PRIVATE SECTION. CLASS-DATA: go_gui TYPE REF TO lcl_gui, go_current_user TYPE REF TO lcl_persistence_user, go_db TYPE REF TO lcl_persistence_db, - go_repo_srv TYPE REF TO lcl_repo_srv. + go_repo_srv TYPE REF TO lcl_repo_srv, + go_settings TYPE REF TO lcl_persistence_settings. ENDCLASS. "lcl_app \ No newline at end of file diff --git a/src/zabapgit_app_impl.prog.abap b/src/zabapgit_app_impl.prog.abap index c9d95128e..9af5079b0 100644 --- a/src/zabapgit_app_impl.prog.abap +++ b/src/zabapgit_app_impl.prog.abap @@ -60,4 +60,11 @@ CLASS lcl_app IMPLEMENTATION. ENDMETHOD. "repo_srv + METHOD settings. + IF go_settings IS NOT BOUND. + CREATE OBJECT go_settings. + ENDIF. + ro_settings = go_settings. + ENDMETHOD. + ENDCLASS. "lcl_app \ No newline at end of file diff --git a/src/zabapgit_definitions.prog.abap b/src/zabapgit_definitions.prog.abap index 075f6415e..58343edfb 100644 --- a/src/zabapgit_definitions.prog.abap +++ b/src/zabapgit_definitions.prog.abap @@ -186,5 +186,6 @@ CONSTANTS: BEGIN OF gc_action, go_branch_overview TYPE string VALUE 'go_branch_overview', go_playground TYPE string VALUE 'go_playground', go_debuginfo TYPE string VALUE 'go_debuginfo', + go_settings type string value 'go_settings', jump TYPE string VALUE 'jump', END OF gc_action. \ No newline at end of file diff --git a/src/zabapgit_git.prog.abap b/src/zabapgit_git.prog.abap index 4aa359c21..c80967bbf 100644 --- a/src/zabapgit_git.prog.abap +++ b/src/zabapgit_git.prog.abap @@ -337,13 +337,17 @@ CLASS lcl_git_transport IMPLEMENTATION. DATA: lv_data TYPE string, lv_uri TYPE string, - lv_expect_potentual_auth TYPE abap_bool. + lv_expect_potentual_auth TYPE abap_bool, + lo_settings TYPE REF TO lcl_settings. + lo_settings = lcl_app=>settings( )->read( ). cl_http_client=>create_by_url( EXPORTING - url = lcl_url=>host( iv_url ) - ssl_id = 'ANONYM' + url = lcl_url=>host( iv_url ) + ssl_id = 'ANONYM' + proxy_host = lo_settings->get_proxy_url( ) + proxy_service = lo_settings->get_proxy_port( ) IMPORTING client = ei_client ). diff --git a/src/zabapgit_gui_pages.prog.abap b/src/zabapgit_gui_pages.prog.abap index ba388c6ae..46343076e 100644 --- a/src/zabapgit_gui_pages.prog.abap +++ b/src/zabapgit_gui_pages.prog.abap @@ -15,4 +15,5 @@ INCLUDE zabapgit_page_diff. INCLUDE zabapgit_page_explore. INCLUDE zabapgit_page_main. INCLUDE zabapgit_page_stage. -INCLUDE zabapgit_page_debug. \ No newline at end of file +INCLUDE zabapgit_page_debug. +INCLUDE zabapgit_page_settings. \ No newline at end of file diff --git a/src/zabapgit_gui_router.prog.abap b/src/zabapgit_gui_router.prog.abap index 0d8689f81..58b254941 100644 --- a/src/zabapgit_gui_router.prog.abap +++ b/src/zabapgit_gui_router.prog.abap @@ -73,11 +73,12 @@ CLASS lcl_gui_router IMPLEMENTATION. CASE iv_action. " General routing - WHEN gc_action-go_main " Go Main page + WHEN gc_action-go_main " Go Main page OR gc_action-go_explore " Go Explore page OR gc_action-go_db " Go DB util page OR gc_action-go_background_run " Go background run page - OR gc_action-go_debuginfo. " Go debug info page + OR gc_action-go_debuginfo " Go debug info page + OR gc_action-go_settings. " Go settings page ei_page = get_page_by_name( iv_action ). ev_state = gc_event_state-new_page. WHEN gc_action-go_background. " Go Background page diff --git a/src/zabapgit_html_action_utils.prog.abap b/src/zabapgit_html_action_utils.prog.abap index 4c6838765..8fd1ed7bb 100644 --- a/src/zabapgit_html_action_utils.prog.abap +++ b/src/zabapgit_html_action_utils.prog.abap @@ -74,10 +74,6 @@ CLASS lcl_html_action_utils DEFINITION FINAL. IMPORTING it_postdata TYPE cnht_post_data_tab EXPORTING es_fields TYPE any. -* CLASS-METHODS repo_key_encode -* IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key -* RETURNING VALUE(rv_string) TYPE string. - CLASS-METHODS decode_bg_update IMPORTING iv_getdata TYPE clike RETURNING VALUE(rs_fields) TYPE lcl_persistence_background=>ty_background. @@ -311,16 +307,6 @@ CLASS lcl_html_action_utils IMPLEMENTATION. ENDMETHOD. "parse_commit_request -* METHOD repo_key_encode. -* -* DATA: lt_fields TYPE tihttpnvp. -* -* add_field( EXPORTING name = 'KEY' iv = iv_key CHANGING ct = lt_fields ). -* -* rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). -* -* ENDMETHOD. "repo_key_encode - METHOD decode_bg_update. DATA: lt_fields TYPE tihttpnvp. diff --git a/src/zabapgit_page_main.prog.abap b/src/zabapgit_page_main.prog.abap index f62a63e44..09c7140e4 100644 --- a/src/zabapgit_page_main.prog.abap +++ b/src/zabapgit_page_main.prog.abap @@ -179,6 +179,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. lo_betasub->add( iv_txt = 'Object to files' 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. + lo_betasub->add( iv_txt = 'Settings' iv_act = gc_action-go_settings ) ##NO_TEXT. ro_menu->add( iv_txt = 'Clone' iv_act = gc_action-repo_clone ) ##NO_TEXT. ro_menu->add( iv_txt = 'Explore' iv_act = gc_action-go_explore ) ##NO_TEXT. diff --git a/src/zabapgit_page_settings.prog.abap b/src/zabapgit_page_settings.prog.abap new file mode 100644 index 000000000..5fc857fb7 --- /dev/null +++ b/src/zabapgit_page_settings.prog.abap @@ -0,0 +1,169 @@ +*&---------------------------------------------------------------------* +*& Include ZABAPGIT_PAGE_SETTINGS +*&---------------------------------------------------------------------* + +CLASS lcl_gui_page_settings DEFINITION FINAL INHERITING FROM lcl_gui_page_super. + PUBLIC SECTION. + METHODS lif_gui_page~render REDEFINITION. + METHODS lif_gui_page~on_event REDEFINITION. + CONSTANTS: + BEGIN OF c_action, + save_settings TYPE string VALUE 'save_settings', + END OF c_action. + PRIVATE SECTION. + METHODS styles + RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + METHODS render_proxy + RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + METHODS render_form_begin + RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + METHODS render_form_end + RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + METHODS build_settings + IMPORTING + it_post_fields TYPE tihttpnvp. + METHODS validate_settings. + METHODS parse_post + IMPORTING + it_postdata TYPE cnht_post_data_tab + RETURNING + VALUE(rt_post_fields) TYPE tihttpnvp. + METHODS persist_settings + RAISING + lcx_exception. + METHODS read_settings. + DATA: + mo_settings TYPE REF TO lcl_settings, + mv_error TYPE abap_bool. +ENDCLASS. + +CLASS lcl_gui_page_settings IMPLEMENTATION. + + METHOD lif_gui_page~render. + CREATE OBJECT ro_html. + + read_settings( ). + + ro_html->add( header( io_include_style = styles( ) ) ). + ro_html->add( title( 'Settings' ) ). + + ro_html->add( render_form_begin( ) ). + ro_html->add( render_proxy( ) ). + ro_html->add( render_form_end( ) ). + ENDMETHOD. + + METHOD styles. + CREATE OBJECT ro_html. + + _add '/* settings STYLES */'. + _add 'div.settings_container {'. + _add ' padding: 0.5em;'. + _add ' font-size: 10pt;'. + _add ' color: #444;'. + _add ' background-color: #f2f2f2;'. + _add '}'. + ENDMETHOD. + + METHOD render_proxy. + CREATE OBJECT ro_html. + ro_html->add( |

Proxy

| ). + ro_html->add( || ). + ro_html->add( |
| ). + ro_html->add( `` ). + ro_html->add( |
| ). + ro_html->add( || ). + ro_html->add( |
| ). + ro_html->add( `` ). + ro_html->add( |
| ). + ro_html->add( |
| ). + ENDMETHOD. + + METHOD lif_gui_page~on_event. + DATA: + lt_post_fields TYPE tihttpnvp. + CASE iv_action. + WHEN c_action-save_settings. + lt_post_fields = parse_post( it_postdata ). + + build_settings( lt_post_fields ). + + validate_settings( ). + + IF mv_error = abap_true. + MESSAGE 'Error when saving settings. Open an issue at https://github.com/larshp/abapGit' TYPE 'E'. + ELSE. + persist_settings( ). + ENDIF. + + ev_state = gc_event_state-go_back. + ENDCASE. + ENDMETHOD. + + + METHOD build_settings. + DATA ls_post_field TYPE ihttpnvp. + + CREATE OBJECT mo_settings. + READ TABLE it_post_fields INTO ls_post_field WITH KEY name = 'proxy_url'. + IF sy-subrc <> 0. + mv_error = abap_true. + ENDIF. + mo_settings->set_proxy_url( ls_post_field-value ). + + READ TABLE it_post_fields INTO ls_post_field WITH KEY name = 'proxy_port'. + IF sy-subrc <> 0. + mv_error = abap_true. + ENDIF. + mo_settings->set_proxy_port( ls_post_field-value ). + ENDMETHOD. + + + METHOD validate_settings. + IF ( mo_settings->get_proxy_url( ) IS NOT INITIAL AND mo_settings->get_proxy_port( ) IS INITIAL ) OR + ( mo_settings->get_proxy_url( ) IS INITIAL AND mo_settings->get_proxy_port( ) IS NOT INITIAL ). + MESSAGE 'If specifying proxy, specify both URL and port' TYPE 'W'. + ENDIF. + ENDMETHOD. + + + METHOD parse_post. + DATA lv_serialized_post_data TYPE string. + + CONCATENATE LINES OF it_postdata INTO lv_serialized_post_data. + rt_post_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_serialized_post_data ). + ENDMETHOD. + + + METHOD persist_settings. + + DATA lo_settings_persistence TYPE REF TO lcl_persistence_settings. + + lo_settings_persistence = lcl_app=>settings( ). + lo_settings_persistence->modify( mo_settings ). + MESSAGE 'Settings succesfully saved' TYPE 'S'. + + ENDMETHOD. + + METHOD render_form_begin. + CREATE OBJECT ro_html. + ro_html->add( '
' ). + ro_html->add( `
` ). + ENDMETHOD. + + METHOD render_form_end. + CREATE OBJECT ro_html. + ro_html->add( '' ). + ro_html->add( '
' ). + ro_html->add( '
' ). + ENDMETHOD. + + + METHOD read_settings. + + DATA lo_settings_persistence TYPE REF TO lcl_persistence_settings. + lo_settings_persistence = lcl_app=>settings( ). + mo_settings = lo_settings_persistence->read( ). + + ENDMETHOD. + +ENDCLASS. \ No newline at end of file diff --git a/src/zabapgit_page_settings.prog.xml b/src/zabapgit_page_settings.prog.xml new file mode 100644 index 000000000..8506d80c5 --- /dev/null +++ b/src/zabapgit_page_settings.prog.xml @@ -0,0 +1,48 @@ + + + + + + ZABAPGIT_PAGE_SETTINGS + A + + + X + + + + + + I + + + + 0000-00-00 + + 0000-00-00 + + + + + E + + + 0000-00-00 + + 0000-00-00 + + + X + + + + R + + Include ZABAPGIT_PAGE_SETTINGS + 30 + + + + + + diff --git a/src/zabapgit_persistence.prog.abap b/src/zabapgit_persistence.prog.abap index 9a4bf77c5..2a8d9efbf 100644 --- a/src/zabapgit_persistence.prog.abap +++ b/src/zabapgit_persistence.prog.abap @@ -1,4 +1,4 @@ -*&---------------------------------------------------------------------* +*&---------------------------- *& Include ZABAPGIT_PERSISTENCE *&---------------------------------------------------------------------* @@ -147,8 +147,8 @@ CLASS lcl_persistence_repo DEFINITION FINAL. RAISING lcx_exception. METHODS update_offline - IMPORTING iv_key TYPE ty_repo-key - iv_offline TYPE ty_repo_xml-offline + IMPORTING iv_key TYPE ty_repo-key + iv_offline TYPE ty_repo_xml-offline RAISING lcx_exception. METHODS add @@ -240,7 +240,7 @@ CLASS lcl_persistence_background DEFINITION FINAL. RAISING lcx_exception. METHODS exists - IMPORTING iv_key TYPE ty_background-key + IMPORTING iv_key TYPE ty_background-key RETURNING VALUE(rv_yes) TYPE abap_bool RAISING lcx_exception. @@ -384,22 +384,22 @@ CLASS lcl_persistence_user DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app. RAISING lcx_exception. METHODS set_repo_username - IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url + IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url iv_username TYPE string RAISING lcx_exception. METHODS get_repo_username - IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url + IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url RETURNING VALUE(rv_username) TYPE string RAISING lcx_exception. METHODS set_repo_email - IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url + IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url iv_email TYPE string RAISING lcx_exception. METHODS get_repo_email - IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url + IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url RETURNING VALUE(rv_email) TYPE string RAISING lcx_exception. @@ -425,9 +425,9 @@ CLASS lcl_persistence_user DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app. DATA: mv_user TYPE xubname. TYPES: BEGIN OF ty_repo_config, - url TYPE lcl_persistence_repo=>ty_repo-url, - username TYPE string, - email TYPE string, + url TYPE lcl_persistence_repo=>ty_repo-url, + username TYPE string, + email TYPE string, END OF ty_repo_config. TYPES: ty_repo_config_tt TYPE STANDARD TABLE OF ty_repo_config WITH DEFAULT KEY. @@ -461,12 +461,12 @@ CLASS lcl_persistence_user DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app. RAISING lcx_exception. METHODS read_repo_config - IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url + IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url RETURNING VALUE(rs_repo_config) TYPE ty_repo_config RAISING lcx_exception. METHODS update_repo_config - IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url + IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url is_repo_config TYPE ty_repo_config RAISING lcx_exception. @@ -1345,4 +1345,239 @@ CLASS lcl_persistence_migrate IMPLEMENTATION. ENDMETHOD. +ENDCLASS. + +CLASS lcl_settings DEFINITION FINAL. + + PUBLIC SECTION. + METHODS set_proxy_url + IMPORTING + iv_url TYPE string. + METHODS set_proxy_port + IMPORTING + iv_port TYPE string. + METHODS get_proxy_url + RETURNING + VALUE(rv_proxy_url) TYPE string. + METHODS get_proxy_port + RETURNING + VALUE(rv_port) TYPE string. + PROTECTED SECTION. + + PRIVATE SECTION. + DATA mv_proxy_url TYPE string. + DATA mv_proxy_port TYPE string. + + +ENDCLASS. + +CLASS lcl_settings IMPLEMENTATION. + + + METHOD set_proxy_url. + mv_proxy_url = iv_url. + ENDMETHOD. + + METHOD get_proxy_url. + rv_proxy_url = mv_proxy_url. + ENDMETHOD. + + METHOD set_proxy_port. + mv_proxy_port = iv_port. + ENDMETHOD. + + METHOD get_proxy_port. + rv_port = mv_proxy_port. + ENDMETHOD. + +ENDCLASS. + + +CLASS lcl_persistence_settings DEFINITION FINAL. + + PUBLIC SECTION. + METHODS modify + IMPORTING + io_settings TYPE REF TO lcl_settings + RAISING + lcx_exception. + METHODS read + RETURNING + VALUE(ro_settings) TYPE REF TO lcl_settings. + + PROTECTED SECTION. + + PRIVATE SECTION. + +ENDCLASS. + +CLASS lcl_persistence_settings IMPLEMENTATION. + + + METHOD modify. + lcl_app=>db( )->modify( + iv_type = 'SETTINGS' + iv_value = 'PROXY_URL' + iv_data = io_settings->get_proxy_url( ) ). + + lcl_app=>db( )->modify( + iv_type = 'SETTINGS' + iv_value = 'PROXY_PORT' + iv_data = io_settings->get_proxy_port( ) ). + ENDMETHOD. + + + METHOD read. + CREATE OBJECT ro_settings. + TRY. + ro_settings->set_proxy_url( + lcl_app=>db( )->read( + iv_type = 'SETTINGS' + iv_value = 'PROXY_URL' + ) ). + CATCH lcx_not_found. + ro_settings->set_proxy_url( '' ). + ENDTRY. + TRY. + ro_settings->set_proxy_port( + lcl_app=>db( )->read( + iv_type = 'SETTINGS' + iv_value = 'PROXY_PORT' + ) ). + CATCH lcx_not_found. + ro_settings->set_proxy_port( '' ). + ENDTRY. + ENDMETHOD. + +ENDCLASS. + +CLASS ltcl_persistence_settings DEFINITION FINAL FOR TESTING + DURATION SHORT + RISK LEVEL HARMLESS. + + PRIVATE SECTION. + METHODS: + setup, + modify_settings_proxy_url FOR TESTING, + modify_settings_proxy_port FOR TESTING, + read_settings FOR TESTING, + read_not_found_url FOR TESTING, + read_not_found_port FOR TESTING. + DATA: + mo_persistence_settings TYPE REF TO lcl_persistence_settings, + mo_settings TYPE REF TO lcl_settings. +ENDCLASS. + +CLASS ltcl_persistence_settings IMPLEMENTATION. + METHOD setup. + CREATE OBJECT mo_persistence_settings. + "These tests may fail if you are locking the entries (e.g. the ZABAPGIT transaction is open) + ENDMETHOD. + + METHOD modify_settings_proxy_url. + DATA lv_proxy_url TYPE string. + TRY. + CREATE OBJECT mo_settings. + mo_settings->set_proxy_url( 'http://proxy' ). + + mo_persistence_settings->modify( mo_settings ). + + lv_proxy_url = lcl_app=>db( )->read( + iv_type = 'SETTINGS' + iv_value = 'PROXY_URL' ). + + cl_abap_unit_assert=>assert_equals( + act = lv_proxy_url + exp = 'http://proxy' ). + CATCH cx_root. + cl_abap_unit_assert=>fail( 'Unexpected exception' ). + ENDTRY. + ENDMETHOD. + + METHOD modify_settings_proxy_port. + DATA lv_proxy_port TYPE string. + TRY. + CREATE OBJECT mo_settings. + mo_settings->set_proxy_port( '8080' ). + + mo_persistence_settings->modify( mo_settings ). + + lv_proxy_port = lcl_app=>db( )->read( + iv_type = 'SETTINGS' + iv_value = 'PROXY_PORT' ). + + cl_abap_unit_assert=>assert_equals( + act = lv_proxy_port + exp = '8080' ). + CATCH cx_root. + cl_abap_unit_assert=>fail( 'Unexpected exception' ). + ENDTRY. + ENDMETHOD. + + METHOD read_settings. + TRY. + lcl_app=>db( )->modify( + iv_type = 'SETTINGS' + iv_value = 'PROXY_URL' + iv_data = 'A_URL' ). + + lcl_app=>db( )->modify( + iv_type = 'SETTINGS' + iv_value = 'PROXY_PORT' + iv_data = '1000' ). + + mo_settings = mo_persistence_settings->read( ). + + cl_abap_unit_assert=>assert_equals( + act = mo_settings->get_proxy_url( ) + exp = 'A_URL' ). + cl_abap_unit_assert=>assert_equals( + act = mo_settings->get_proxy_port( ) + exp = '1000' ). + CATCH cx_root. + cl_abap_unit_assert=>fail( 'Unexpected exception' ). + ENDTRY. + ENDMETHOD. + + METHOD read_not_found_port. + TRY. + lcl_app=>db( )->modify( + iv_type = 'SETTINGS' + iv_value = 'PROXY_URL' + iv_data = 'A_URL' ). + lcl_app=>db( )->modify( + iv_type = 'SETTINGS' + iv_value = 'PROXY_PORT' + iv_data = '' ). + + mo_settings = mo_persistence_settings->read( ). + + cl_abap_unit_assert=>assert_equals( + act = mo_settings->get_proxy_port( ) + exp = '' ). + CATCH cx_root. + cl_abap_unit_assert=>fail( 'Unexpected exception' ). + ENDTRY. + ENDMETHOD. + + METHOD read_not_found_url. + TRY. + lcl_app=>db( )->modify( + iv_type = 'SETTINGS' + iv_value = 'PROXY_PORT' + iv_data = '1000' ). + lcl_app=>db( )->modify( + iv_type = 'SETTINGS' + iv_value = 'PROXY_URL' + iv_data = '' ). + mo_settings = mo_persistence_settings->read( ). + + cl_abap_unit_assert=>assert_equals( + act = mo_settings->get_proxy_url( ) + exp = '' ). + CATCH cx_root. + cl_abap_unit_assert=>fail( 'Unexpected exception' ). + ENDTRY. + ENDMETHOD. + ENDCLASS. \ No newline at end of file diff --git a/src/zabapgit_unit_test.prog.abap b/src/zabapgit_unit_test.prog.abap index 9c8f61b24..114207f29 100644 --- a/src/zabapgit_unit_test.prog.abap +++ b/src/zabapgit_unit_test.prog.abap @@ -1745,5 +1745,4 @@ CLASS ltcl_path IMPLEMENTATION. ENDMETHOD. - ENDCLASS. "ltcl_path \ No newline at end of file From 053e4f41852680e3db8cced4c19a5302d338fbd4 Mon Sep 17 00:00:00 2001 From: larshp Date: Thu, 10 Nov 2016 16:27:34 +0000 Subject: [PATCH 10/10] bugfix, do not show error when removing last repo --- src/zabapgit.prog.abap | 2 +- src/zabapgit_page_main.prog.abap | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/zabapgit.prog.abap b/src/zabapgit.prog.abap index e9609ae73..c9b84e01d 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.19.0'. "#EC NOTEXT + gc_abap_version TYPE string VALUE 'v1.19.1'. "#EC NOTEXT ******************************************************************************** * The MIT License (MIT) diff --git a/src/zabapgit_page_main.prog.abap b/src/zabapgit_page_main.prog.abap index 09c7140e4..013f4d185 100644 --- a/src/zabapgit_page_main.prog.abap +++ b/src/zabapgit_page_main.prog.abap @@ -159,8 +159,10 @@ CLASS lcl_gui_page_main IMPLEMENTATION. ENDIF. ENDIF. - IF lv_show_old <> mv_show. - CREATE OBJECT mo_repo_content EXPORTING iv_key = mv_show. " Reinit content state + IF lv_show_old <> mv_show AND NOT mv_show IS INITIAL. + CREATE OBJECT mo_repo_content + EXPORTING + iv_key = mv_show. " Reinit content state ENDIF. ENDMETHOD. "retrieve_active_repo