deserialize dynpro and xml->table_read

This commit is contained in:
Lars Hvam 2014-07-08 11:55:22 +02:00
parent bff8e3caed
commit 6a8773ddf9

View File

@ -278,32 +278,54 @@ ENDCLASS. "lcl_user IMPLEMENTATION
CLASS lcl_xml DEFINITION FINAL. CLASS lcl_xml DEFINITION FINAL.
PUBLIC SECTION. PUBLIC SECTION.
METHODS constructor IMPORTING iv_xml TYPE string OPTIONAL METHODS constructor IMPORTING iv_xml TYPE string OPTIONAL
RAISING lcx_exception. RAISING lcx_exception.
METHODS structure_add IMPORTING ig_structure TYPE data METHODS element_add IMPORTING ig_element TYPE data
ii_root TYPE REF TO if_ixml_element OPTIONAL ii_root TYPE REF TO if_ixml_element OPTIONAL
RAISING lcx_exception. RAISING lcx_exception.
METHODS element_add IMPORTING ig_element TYPE data * todo, METHODS element_read
ii_root TYPE REF TO if_ixml_element OPTIONAL
RAISING lcx_exception.
METHODS structure_read CHANGING cg_structure TYPE data. METHODS structure_add IMPORTING ig_structure TYPE data
ii_root TYPE REF TO if_ixml_element OPTIONAL
RAISING lcx_exception.
METHODS render RETURNING value(rv_string) TYPE string. METHODS structure_read IMPORTING ii_root TYPE REF TO if_ixml_element OPTIONAL
CHANGING cg_structure TYPE data
RAISING lcx_exception.
METHODS table_add IMPORTING it_table TYPE STANDARD TABLE METHODS table_add IMPORTING it_table TYPE STANDARD TABLE
RAISING lcx_exception. ii_root TYPE REF TO if_ixml_element OPTIONAL
RAISING lcx_exception.
* todo METHODS table_read IMPORTING ii_root TYPE REF TO if_ixml_element OPTIONAL
* methods table_read CHANGING ct_table TYPE STANDARD TABLE
RAISING lcx_exception.
METHODS xml_render RETURNING value(rv_string) TYPE string.
METHODS xml_element IMPORTING iv_name TYPE string
RETURNING value(ri_element) TYPE REF TO if_ixml_element.
METHODS xml_add IMPORTING ii_element TYPE REF TO if_ixml_element.
METHODS xml_find IMPORTING ii_root TYPE REF TO if_ixml_element OPTIONAL
iv_name TYPE string
RETURNING value(ri_element) TYPE REF TO if_ixml_element.
PRIVATE SECTION. PRIVATE SECTION.
DATA: mi_ixml TYPE REF TO if_ixml, DATA: mi_ixml TYPE REF TO if_ixml,
mi_xml_doc TYPE REF TO if_ixml_document, mi_xml_doc TYPE REF TO if_ixml_document,
mi_root TYPE REF TO if_ixml_element. mi_root TYPE REF TO if_ixml_element.
METHODS special_names CHANGING cv_name TYPE string.
METHODS error IMPORTING ii_parser TYPE REF TO if_ixml_parser
RAISING lcx_exception.
ENDCLASS. "lcl_xml DEFINITION ENDCLASS. "lcl_xml DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
@ -313,11 +335,45 @@ ENDCLASS. "lcl_xml DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_xml IMPLEMENTATION. CLASS lcl_xml IMPLEMENTATION.
METHOD xml_find.
IF ii_root IS BOUND.
ri_element = ii_root->find_from_name( depth = 0 name = iv_name ).
IF NOT ri_element IS BOUND.
RETURN.
ENDIF.
ii_root->remove_child( ri_element ).
ELSE.
ri_element = mi_root->find_from_name( depth = 0 name = iv_name ).
IF NOT ri_element IS BOUND.
RETURN.
ENDIF.
mi_root->remove_child( ri_element ).
ENDIF.
ENDMETHOD. "xml_find
METHOD xml_element.
ri_element = mi_xml_doc->create_element( iv_name ).
ENDMETHOD. "xml_element
METHOD special_names.
IF cv_name(1) = '*'.
CONCATENATE 'STAR' cv_name+1 INTO cv_name.
ELSEIF cv_name(1) = '2'.
CONCATENATE 'TWO' cv_name+1 INTO cv_name.
ENDIF.
ENDMETHOD. "special_names
METHOD structure_read. METHOD structure_read.
DATA: lv_name TYPE string, DATA: lv_name TYPE string,
li_struct TYPE REF TO if_ixml_element,
lv_value TYPE string, lv_value TYPE string,
li_struct TYPE REF TO if_ixml_element,
lo_descr_ref TYPE REF TO cl_abap_structdescr. lo_descr_ref TYPE REF TO cl_abap_structdescr.
FIELD-SYMBOLS: <lg_any> TYPE any, FIELD-SYMBOLS: <lg_any> TYPE any,
@ -326,14 +382,22 @@ CLASS lcl_xml IMPLEMENTATION.
lo_descr_ref ?= cl_abap_typedescr=>describe_by_data( cg_structure ). lo_descr_ref ?= cl_abap_typedescr=>describe_by_data( cg_structure ).
lv_name = lo_descr_ref->get_relative_name( ). lv_name = lo_descr_ref->get_relative_name( ).
IF lv_name IS INITIAL.
_raise 'no name'.
ENDIF.
li_struct = mi_root->find_from_name( depth = 0 name = lv_name ). li_struct = xml_find( ii_root = ii_root
iv_name = lv_name ).
IF NOT li_struct IS BOUND.
RETURN.
ENDIF.
LOOP AT lo_descr_ref->components ASSIGNING <ls_comp>. LOOP AT lo_descr_ref->components ASSIGNING <ls_comp>.
ASSIGN COMPONENT <ls_comp>-name OF STRUCTURE cg_structure TO <lg_any>. ASSIGN COMPONENT <ls_comp>-name OF STRUCTURE cg_structure TO <lg_any>.
lv_name = <ls_comp>-name. lv_name = <ls_comp>-name.
special_names( CHANGING cv_name = lv_name ).
lv_value = li_struct->find_from_name( depth = 0 name = lv_name )->get_value( ). lv_value = li_struct->find_from_name( depth = 0 name = lv_name )->get_value( ).
<lg_any> = lv_value. <lg_any> = lv_value.
@ -341,6 +405,84 @@ CLASS lcl_xml IMPLEMENTATION.
ENDMETHOD. "structure_read ENDMETHOD. "structure_read
METHOD table_read.
DATA: lv_name TYPE string,
li_root TYPE REF TO if_ixml_element,
lv_kind TYPE abap_typecategory,
lo_table_descr TYPE REF TO cl_abap_tabledescr.
FIELD-SYMBOLS: <lg_line> TYPE any.
lo_table_descr ?= cl_abap_typedescr=>describe_by_data( ct_table ).
lv_name = lo_table_descr->get_relative_name( ).
IF lv_name IS INITIAL.
_raise 'no name'.
ENDIF.
li_root = xml_find( ii_root = ii_root
iv_name = lv_name ).
IF NOT li_root IS BOUND.
RETURN.
ENDIF.
* IF ii_root IS BOUND.
* li_root = ii_root->find_from_name( depth = 0 name = lv_name ).
* ELSE.
* li_root = mi_root->find_from_name( depth = 0 name = lv_name ).
* ENDIF.
lv_kind = lo_table_descr->get_table_line_type( )->kind.
DO.
APPEND INITIAL LINE TO ct_table ASSIGNING <lg_line>.
CASE lv_kind.
WHEN cl_abap_typedescr=>kind_struct.
structure_read( EXPORTING ii_root = li_root
CHANGING cg_structure = <lg_line> ).
WHEN OTHERS.
_raise 'unknown kind'.
ENDCASE.
IF <lg_line> IS INITIAL.
DELETE ct_table INDEX lines( ct_table ).
ASSERT sy-subrc = 0.
EXIT. " current loop
ENDIF.
ENDDO.
ENDMETHOD. "table_read
METHOD error.
DATA: lv_error TYPE i,
lv_txt1 TYPE string,
lv_txt2 TYPE string,
lv_txt3 TYPE string,
li_error TYPE REF TO if_ixml_parse_error.
IF ii_parser->num_errors( ) <> 0.
DO ii_parser->num_errors( ) TIMES.
lv_error = sy-index - 1.
li_error = ii_parser->get_error( lv_error ).
lv_txt1 = 'Column:' && li_error->get_column( ). "#EC NOTEXT
lv_txt2 = 'Line:' && li_error->get_line( ). "#EC NOTEXT
lv_txt3 = li_error->get_reason( ).
CALL FUNCTION 'POPUP_TO_INFORM'
EXPORTING
titel = 'Error from XLM parser' "#EC NOTEXT
txt1 = lv_txt1
txt2 = lv_txt2
txt3 = lv_txt3.
ENDDO.
ENDIF.
_raise 'Error while parsing XML'.
ENDMETHOD. "error
METHOD constructor. METHOD constructor.
DATA: li_stream_factory TYPE REF TO if_ixml_stream_factory, DATA: li_stream_factory TYPE REF TO if_ixml_stream_factory,
@ -358,7 +500,7 @@ CLASS lcl_xml IMPLEMENTATION.
istream = li_istream istream = li_istream
document = mi_xml_doc ). document = mi_xml_doc ).
IF li_parser->parse( ) <> 0. IF li_parser->parse( ) <> 0.
_raise 'Error while parsing XML'. error( li_parser ).
ENDIF. ENDIF.
li_istream->close( ). li_istream->close( ).
@ -405,10 +547,18 @@ CLASS lcl_xml IMPLEMENTATION.
ENDCASE. ENDCASE.
ENDLOOP. ENDLOOP.
mi_root->append_child( li_table ). IF ii_root IS SUPPLIED.
ii_root->append_child( li_table ).
ELSE.
mi_root->append_child( li_table ).
ENDIF.
ENDMETHOD. "table_add ENDMETHOD. "table_add
METHOD xml_add.
mi_root->append_child( ii_element ).
ENDMETHOD. "xml_add
METHOD element_add. METHOD element_add.
DATA: lo_descr TYPE REF TO cl_abap_elemdescr, DATA: lo_descr TYPE REF TO cl_abap_elemdescr,
@ -465,8 +615,9 @@ CLASS lcl_xml IMPLEMENTATION.
ASSIGN COMPONENT <ls_comp>-name OF STRUCTURE ig_structure TO <lg_any>. ASSIGN COMPONENT <ls_comp>-name OF STRUCTURE ig_structure TO <lg_any>.
lv_string = <ls_comp>-name. lv_name = <ls_comp>-name.
li_element = mi_xml_doc->create_element( lv_string ). special_names( CHANGING cv_name = lv_name ).
li_element = mi_xml_doc->create_element( lv_name ).
lv_string = <lg_any>. lv_string = <lg_any>.
li_text = mi_xml_doc->create_text( lv_string ). li_text = mi_xml_doc->create_text( lv_string ).
@ -484,7 +635,7 @@ CLASS lcl_xml IMPLEMENTATION.
ENDMETHOD. "structure_to_xml ENDMETHOD. "structure_to_xml
METHOD render. METHOD xml_render.
DATA: li_ostream TYPE REF TO if_ixml_ostream, DATA: li_ostream TYPE REF TO if_ixml_ostream,
li_renderer TYPE REF TO if_ixml_renderer, li_renderer TYPE REF TO if_ixml_renderer,
@ -697,7 +848,7 @@ CLASS lcl_convert IMPLEMENTATION.
METHOD xstring_to_int. METHOD xstring_to_int.
DATA: lv_xstring TYPE xstring, DATA: lv_xstring TYPE xstring,
lv_x TYPE x. lv_x TYPE x.
lv_xstring = iv_xstring. lv_xstring = iv_xstring.
@ -711,8 +862,8 @@ CLASS lcl_convert IMPLEMENTATION.
METHOD xstring_to_string_utf8. METHOD xstring_to_string_utf8.
DATA: lv_len TYPE i, DATA: lv_len TYPE i,
lo_obj TYPE REF TO cl_abap_conv_in_ce. lo_obj TYPE REF TO cl_abap_conv_in_ce.
TRY. TRY.
@ -824,11 +975,19 @@ CLASS lcl_serialize_prog DEFINITION FINAL.
io_xml TYPE REF TO lcl_xml io_xml TYPE REF TO lcl_xml
RAISING lcx_exception. RAISING lcx_exception.
CLASS-METHODS: deserialize_dynpros IMPORTING io_xml TYPE REF TO lcl_xml
RAISING lcx_exception.
CLASS-METHODS: serialize_includes IMPORTING iv_program_name TYPE programm CLASS-METHODS: serialize_includes IMPORTING iv_program_name TYPE programm
io_xml TYPE REF TO lcl_xml io_xml TYPE REF TO lcl_xml
CHANGING ct_files TYPE tt_files CHANGING ct_files TYPE tt_files
RAISING lcx_exception. RAISING lcx_exception.
CLASS-METHODS: deserialize_abap IMPORTING iv_obj_name TYPE tadir-obj_name
io_xml TYPE REF TO lcl_xml
iv_abap TYPE string
RAISING lcx_exception.
ENDCLASS. "lcl_serialize_prog DEFINITION ENDCLASS. "lcl_serialize_prog DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
@ -897,7 +1056,7 @@ CLASS lcl_serialize_prog IMPLEMENTATION.
io_xml = lo_xml ). io_xml = lo_xml ).
ENDIF. ENDIF.
lv_xml = lo_xml->render( ). lv_xml = lo_xml->xml_render( ).
CLEAR ls_file. CLEAR ls_file.
ls_file-path = '/'. ls_file-path = '/'.
@ -937,6 +1096,13 @@ CLASS lcl_serialize_prog IMPLEMENTATION.
_raise 'Error from get_all_includes'. _raise 'Error from get_all_includes'.
ENDIF. ENDIF.
LOOP AT lt_includes ASSIGNING <lv_include>.
IF NOT <lv_include> CP 'Z*' AND NOT <lv_include> CP 'Y*'.
DELETE lt_includes INDEX sy-tabix.
ENDIF.
ENDLOOP.
* todo, not sure it is needed to add this to the xml
io_xml->table_add( lt_includes ). io_xml->table_add( lt_includes ).
LOOP AT lt_includes ASSIGNING <lv_include>. LOOP AT lt_includes ASSIGNING <lv_include>.
@ -952,6 +1118,7 @@ CLASS lcl_serialize_prog IMPLEMENTATION.
lt_containers TYPE dycatt_tab, lt_containers TYPE dycatt_tab,
lt_fields_to_containers TYPE dyfatc_tab, lt_fields_to_containers TYPE dyfatc_tab,
lt_flow_logic TYPE swydyflow, lt_flow_logic TYPE swydyflow,
li_element TYPE REF TO if_ixml_element,
lt_dynpros TYPE TABLE OF d020s. lt_dynpros TYPE TABLE OF d020s.
FIELD-SYMBOLS: <ls_dynpro> LIKE LINE OF lt_dynpros. FIELD-SYMBOLS: <ls_dynpro> LIKE LINE OF lt_dynpros.
@ -971,6 +1138,9 @@ CLASS lcl_serialize_prog IMPLEMENTATION.
ENDIF. ENDIF.
LOOP AT lt_dynpros ASSIGNING <ls_dynpro>. LOOP AT lt_dynpros ASSIGNING <ls_dynpro>.
li_element = io_xml->xml_element( 'SCREEN' ).
CALL FUNCTION 'RPY_DYNPRO_READ' CALL FUNCTION 'RPY_DYNPRO_READ'
EXPORTING EXPORTING
progname = iv_program_name progname = iv_program_name
@ -990,10 +1160,17 @@ CLASS lcl_serialize_prog IMPLEMENTATION.
_raise 'Error while reading dynpro'. _raise 'Error while reading dynpro'.
ENDIF. ENDIF.
io_xml->structure_add( ls_header ). io_xml->structure_add( ig_structure = ls_header
io_xml->table_add( lt_containers ). ii_root = li_element ).
io_xml->table_add( lt_fields_to_containers ).
io_xml->table_add( lt_flow_logic ). io_xml->table_add( it_table = lt_containers
ii_root = li_element ).
io_xml->table_add( it_table = lt_fields_to_containers
ii_root = li_element ).
io_xml->table_add( it_table = lt_flow_logic
ii_root = li_element ).
io_xml->xml_add( li_element ).
ENDLOOP. ENDLOOP.
@ -1001,28 +1178,25 @@ CLASS lcl_serialize_prog IMPLEMENTATION.
METHOD lif_serialize~deserialize. METHOD lif_serialize~deserialize.
DATA: lv_name TYPE string, DATA: lv_filename TYPE string,
lv_xml TYPE string, lv_xml TYPE string,
ls_progdir TYPE progdir, lo_xml TYPE REF TO lcl_xml,
ls_progdir_new TYPE progdir, lv_abap TYPE string.
lo_xml TYPE REF TO lcl_xml,
lt_source TYPE TABLE OF abaptxt255,
lv_abap TYPE string.
FIELD-SYMBOLS: <ls_xml> LIKE LINE OF it_files, FIELD-SYMBOLS: <ls_xml> LIKE LINE OF it_files,
<ls_abap> LIKE LINE OF it_files. <ls_abap> LIKE LINE OF it_files.
lv_name = iv_obj_name && '.prog.xml'. "#EC NOTEXT lv_filename = iv_obj_name && '.prog.xml'. "#EC NOTEXT
TRANSLATE lv_name TO LOWER CASE. TRANSLATE lv_filename TO LOWER CASE.
READ TABLE it_files ASSIGNING <ls_xml> WITH KEY filename = lv_name. READ TABLE it_files ASSIGNING <ls_xml> WITH KEY filename = lv_filename.
IF sy-subrc <> 0. IF sy-subrc <> 0.
_raise 'PROG, xml not found'. _raise 'PROG, xml not found'.
ENDIF. ENDIF.
lv_name = iv_obj_name && '.prog.abap'. "#EC NOTEXT lv_filename = iv_obj_name && '.prog.abap'. "#EC NOTEXT
TRANSLATE lv_name TO LOWER CASE. TRANSLATE lv_filename TO LOWER CASE.
READ TABLE it_files ASSIGNING <ls_abap> WITH KEY filename = lv_name. READ TABLE it_files ASSIGNING <ls_abap> WITH KEY filename = lv_filename.
IF sy-subrc <> 0. IF sy-subrc <> 0.
_raise 'PROG, abap not found'. _raise 'PROG, abap not found'.
ENDIF. ENDIF.
@ -1033,9 +1207,54 @@ CLASS lcl_serialize_prog IMPLEMENTATION.
CREATE OBJECT lo_xml CREATE OBJECT lo_xml
EXPORTING EXPORTING
iv_xml = lv_xml. iv_xml = lv_xml.
lo_xml->structure_read( CHANGING cg_structure = ls_progdir ).
SPLIT lv_abap AT gc_newline INTO TABLE lt_source. deserialize_abap( iv_obj_name = iv_obj_name
io_xml = lo_xml
iv_abap = lv_abap ).
deserialize_dynpros( lo_xml ).
ENDMETHOD. "lif_serialize~deserialize
METHOD deserialize_dynpros.
DATA: li_element TYPE REF TO if_ixml_element,
ls_header TYPE rpy_dyhead,
lt_containers TYPE dycatt_tab,
lt_fields_to_containers TYPE dyfatc_tab,
lt_flow_logic TYPE swydyflow.
DO.
li_element = io_xml->xml_find( 'SCREEN' ).
IF NOT li_element IS BOUND.
EXIT. " current loop
ENDIF.
io_xml->structure_read( EXPORTING ii_root = li_element
CHANGING cg_structure = ls_header ).
io_xml->table_read( EXPORTING ii_root = li_element
CHANGING ct_table = lt_containers ).
io_xml->table_read( EXPORTING ii_root = li_element
CHANGING ct_table = lt_fields_to_containers ).
io_xml->table_read( EXPORTING ii_root = li_element
CHANGING ct_table = lt_flow_logic ).
BREAK-POINT.
ENDDO.
ENDMETHOD. "deserialize_dynpros
METHOD deserialize_abap.
DATA: lt_source TYPE TABLE OF abaptxt255,
ls_progdir TYPE progdir,
ls_progdir_new TYPE progdir.
io_xml->structure_read( CHANGING cg_structure = ls_progdir ).
SPLIT iv_abap AT gc_newline INTO TABLE lt_source.
IF exists( iv_obj_name ) = abap_true. IF exists( iv_obj_name ) = abap_true.
CALL FUNCTION 'RPY_PROGRAM_UPDATE' CALL FUNCTION 'RPY_PROGRAM_UPDATE'
@ -1480,6 +1699,10 @@ CLASS lcl_pack IMPLEMENTATION.
ELSEIF lv_bits(21) = '000000000000000000000'. ELSEIF lv_bits(21) = '000000000000000000000'.
CONCATENATE '1' lv_type lv_bits+28(4) INTO lv_result. CONCATENATE '1' lv_type lv_bits+28(4) INTO lv_result.
CONCATENATE lv_result '0' lv_bits+21(7) INTO lv_result. CONCATENATE lv_result '0' lv_bits+21(7) INTO lv_result.
ELSEIF lv_bits(14) = '00000000000000'.
CONCATENATE '1' lv_type lv_bits+28(4) INTO lv_result.
CONCATENATE lv_result '1' lv_bits+21(7) INTO lv_result.
CONCATENATE lv_result '0' lv_bits+14(7) INTO lv_result.
ELSE. ELSE.
* use shifting? * use shifting?
_raise 'Todo, encoding length'. _raise 'Todo, encoding length'.
@ -2659,12 +2882,6 @@ CLASS lcl_porcelain DEFINITION FINAL.
RETURNING value(rv_branch) TYPE t_sha1 RETURNING value(rv_branch) TYPE t_sha1
RAISING lcx_exception. RAISING lcx_exception.
* todo, new files can/should be handled by push, so add is obsolete?
CLASS-METHODS add IMPORTING is_repo TYPE st_repo
is_comment TYPE st_comment
it_files TYPE tt_files
RAISING lcx_exception.
PRIVATE SECTION. PRIVATE SECTION.
CLASS-METHODS walk IMPORTING it_objects TYPE tt_objects CLASS-METHODS walk IMPORTING it_objects TYPE tt_objects
iv_sha1 TYPE t_sha1 iv_sha1 TYPE t_sha1
@ -2753,6 +2970,9 @@ CLASS lcl_porcelain IMPLEMENTATION.
DATA: lt_objects TYPE tt_objects, DATA: lt_objects TYPE tt_objects,
lt_nodes TYPE tt_nodes, lt_nodes TYPE tt_nodes,
lt_files LIKE it_files,
lv_sha1 TYPE t_sha1,
lv_index TYPE i,
lv_branch TYPE t_sha1. lv_branch TYPE t_sha1.
FIELD-SYMBOLS: <ls_file> LIKE LINE OF it_files, FIELD-SYMBOLS: <ls_file> LIKE LINE OF it_files,
@ -2766,22 +2986,34 @@ CLASS lcl_porcelain IMPLEMENTATION.
lt_nodes = root_tree( it_objects = lt_objects lt_nodes = root_tree( it_objects = lt_objects
iv_branch = lv_branch ). iv_branch = lv_branch ).
LOOP AT it_files ASSIGNING <ls_file>. lt_files[] = it_files[].
LOOP AT lt_files ASSIGNING <ls_file>.
lv_index = sy-tabix.
READ TABLE lt_nodes ASSIGNING <ls_node> WITH KEY name = <ls_file>-filename. READ TABLE lt_nodes ASSIGNING <ls_node> WITH KEY name = <ls_file>-filename.
IF sy-subrc <> 0. IF sy-subrc <> 0.
* in case of new files, eg. when adding include to report * new files
APPEND INITIAL LINE TO lt_nodes ASSIGNING <ls_node>. APPEND INITIAL LINE TO lt_nodes ASSIGNING <ls_node>.
<ls_node>-chmod = gc_chmod_file. <ls_node>-chmod = gc_chmod_file.
<ls_node>-name = <ls_file>-filename. <ls_node>-name = <ls_file>-filename.
ENDIF. ENDIF.
<ls_node>-sha1 = lcl_hash=>sha1( iv_type = gc_blob iv_data = <ls_file>-data ). lv_sha1 = lcl_hash=>sha1( iv_type = gc_blob iv_data = <ls_file>-data ).
IF <ls_node>-sha1 <> lv_sha1.
<ls_node>-sha1 = lv_sha1.
ELSE.
DELETE lt_files INDEX lv_index.
ENDIF.
ENDLOOP. ENDLOOP.
IF lt_files[] IS INITIAL.
_raise 'no files'.
ENDIF.
rv_branch = receive_pack( is_comment = is_comment rv_branch = receive_pack( is_comment = is_comment
is_repo = is_repo is_repo = is_repo
it_nodes = lt_nodes it_nodes = lt_nodes
it_files = it_files it_files = lt_files
iv_branch = lv_branch ). iv_branch = lv_branch ).
ENDMETHOD. "push ENDMETHOD. "push
@ -2806,51 +3038,6 @@ CLASS lcl_porcelain IMPLEMENTATION.
ENDMETHOD. "root_tree ENDMETHOD. "root_tree
METHOD add.
* todo, works with root files
DATA: lt_files TYPE tt_files,
lt_objects TYPE tt_objects,
lt_nodes TYPE tt_nodes,
lv_branch TYPE t_sha1.
FIELD-SYMBOLS: <ls_file> TYPE st_file,
<ls_node> LIKE LINE OF lt_nodes.
* first check if files already exist in repository
lcl_porcelain=>pull( EXPORTING is_repo = is_repo
IMPORTING et_files = lt_files
et_objects = lt_objects
ev_branch = lv_branch ).
LOOP AT it_files ASSIGNING <ls_file>.
READ TABLE lt_files WITH KEY path = <ls_file>-path filename = <ls_file>-filename
TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
_raise 'already in repository'.
ENDIF.
ENDLOOP.
lt_nodes = root_tree( it_objects = lt_objects
iv_branch = lv_branch ).
LOOP AT it_files ASSIGNING <ls_file>.
APPEND INITIAL LINE TO lt_nodes ASSIGNING <ls_node>.
<ls_node>-chmod = gc_chmod_file.
<ls_node>-name = <ls_file>-filename.
<ls_node>-sha1 = lcl_hash=>sha1( iv_type = gc_blob iv_data = <ls_file>-data ).
ENDLOOP.
receive_pack( is_comment = is_comment
is_repo = is_repo
it_nodes = lt_nodes
it_files = it_files
iv_branch = lv_branch ).
ENDMETHOD. "add
METHOD pull. METHOD pull.
DATA: ls_object LIKE LINE OF et_objects, DATA: ls_object LIKE LINE OF et_objects,
@ -3242,9 +3429,9 @@ CLASS lcl_gui IMPLEMENTATION.
RETURN. RETURN.
ENDIF. ENDIF.
lcl_porcelain=>add( is_comment = ls_comment lcl_porcelain=>push( is_comment = ls_comment
is_repo = is_repo is_repo = is_repo
it_files = lt_files ). it_files = lt_files ).
view( render( ) ). view( render( ) ).
@ -3455,6 +3642,9 @@ CLASS lcl_gui IMPLEMENTATION.
_raise 'status unknown'. _raise 'status unknown'.
ENDCASE. ENDCASE.
* todo, remove:
rv_html = rv_html && '&nbsp;<a href="sapevent:pull?' && struct_encode( ls_repo ) && '">pull</a>'.
ENDMETHOD. "render_repo ENDMETHOD. "render_repo
METHOD run. METHOD run.