diff --git a/zagit.abap b/zagit.abap index bc35a306d..d7fef08c2 100644 --- a/zagit.abap +++ b/zagit.abap @@ -40,19 +40,18 @@ TYPES: BEGIN OF st_repo, url TYPE string, branch_name TYPE string, END OF st_repo. -*TYPES: tt_repos TYPE STANDARD TABLE OF st_repo WITH DEFAULT KEY. TYPES: BEGIN OF st_repo_sha1, - url TYPE string, + url TYPE string, branch_name TYPE string, - sha1 TYPE string, + sha1 TYPE string, END OF st_repo_sha1. TYPES: tt_repos_sha1 TYPE STANDARD TABLE OF st_repo_sha1 WITH DEFAULT KEY. TYPES: BEGIN OF st_result, - type TYPE rseuap-obj_type, - name TYPE rseuap-obj_name, - action TYPE string, + obj_type TYPE rseuap-obj_type, + obj_name TYPE rseuap-obj_name, + match TYPE abap_bool, END OF st_result. TYPES: tt_results TYPE STANDARD TABLE OF st_result WITH DEFAULT KEY. @@ -499,9 +498,7 @@ CLASS lcl_serialize DEFINITION FINAL. RETURNING value(rt_files) TYPE tt_files RAISING lcx_exception. - CLASS-METHODS deserialize - IMPORTING it_files TYPE tt_files - iv_updated TYPE abap_bool + CLASS-METHODS status IMPORTING it_files TYPE tt_files RETURNING value(rt_results) TYPE tt_results RAISING lcx_exception. @@ -520,8 +517,7 @@ CLASS lcl_serialize DEFINITION FINAL. CLASS-METHODS compare_files IMPORTING it_repo TYPE tt_files it_sap TYPE tt_files - iv_updated TYPE abap_bool - RETURNING value(rv_action) TYPE string + RETURNING value(rv_match) TYPE abap_bool RAISING lcx_exception. ENDCLASS. "lcl_serialize DEFINITION @@ -570,18 +566,14 @@ CLASS lcl_serialize IMPLEMENTATION. ENDMETHOD. "serialize -* todo, change name to analyze? - METHOD deserialize. - -* not exist in sap = 'create' -* match = 'match' -* newer in repo = 'update' -* newer in sap = 'commit' + METHOD status. DATA: lv_pre TYPE rseuap-obj_name, lt_files TYPE tt_files, ls_result LIKE LINE OF rt_results, lv_type TYPE string, + lv_status TYPE string, + lv_match TYPE abap_bool, lv_ext TYPE string. FIELD-SYMBOLS: LIKE LINE OF it_files. @@ -597,24 +589,21 @@ CLASS lcl_serialize IMPLEMENTATION. ENDIF. CLEAR ls_result. - ls_result-type = lv_type. - ls_result-name = lv_pre. + ls_result-obj_type = lv_type. + ls_result-obj_name = lv_pre. CASE lv_type. WHEN 'PROG'. IF prog_exists( lv_pre ) = abap_true. lt_files = prog_serialize( lv_pre ). - ls_result-action = compare_files( it_repo = it_files it_sap = lt_files iv_updated = iv_updated ). - ELSE. - ls_result-action = 'create'. + ls_result-match = compare_files( it_repo = it_files it_sap = lt_files ). ENDIF. ENDCASE. APPEND ls_result TO rt_results. - ENDLOOP. -* how to handle deleted in repo? +* todo, how to handle deleted in repo? ENDMETHOD. "deserialize @@ -629,16 +618,12 @@ CLASS lcl_serialize IMPLEMENTATION. data = -data TRANSPORTING NO FIELDS. IF sy-subrc <> 0. - IF iv_updated = abap_true. - rv_action = 'update'. - ELSE. - rv_action = 'commit'. - ENDIF. + rv_match = abap_false. RETURN. ENDIF. ENDLOOP. - rv_action = 'match'. + rv_match = abap_true. ENDMETHOD. "compare_files @@ -1585,11 +1570,25 @@ ENDCLASS. "lcl_pack IMPLEMENTATION CLASS lcl_persistence DEFINITION FINAL. PUBLIC SECTION. - CLASS-METHODS add IMPORTING is_repo TYPE st_repo_sha1. +* CLASS-METHODS add +* class-methods delete CLASS-METHODS list RETURNING value(rt_repos) TYPE tt_repos_sha1 RAISING lcx_exception. + CLASS-METHODS update IMPORTING is_repo TYPE st_repo + iv_branch TYPE t_sha1 + RAISING lcx_exception. + + PRIVATE SECTION. + CLASS-METHODS read_text RETURNING value(rt_repos) TYPE tt_repos_sha1 + RAISING lcx_exception. + + CLASS-METHODS save_text IMPORTING it_repos TYPE tt_repos_sha1 + RAISING lcx_exception. + + CLASS-METHODS header RETURNING value(rs_header) TYPE thead. + ENDCLASS. "lcl_persistence DEFINITION *----------------------------------------------------------------------* @@ -1599,26 +1598,108 @@ ENDCLASS. "lcl_persistence DEFINITION *----------------------------------------------------------------------* CLASS lcl_persistence IMPLEMENTATION. - METHOD add. -* todo - BREAK-POINT. - RETURN. - ENDMETHOD. "add + METHOD header. + rs_header-tdid = 'ST'. + rs_header-tdspras = 'E'. + rs_header-tdname = 'ZABAPGIT'. + rs_header-tdobject = 'TEXT'. + ENDMETHOD. "header + + METHOD save_text. + + DATA: lt_lines TYPE TABLE OF tline, + ls_header TYPE thead. + + FIELD-SYMBOLS: LIKE LINE OF it_repos, + LIKE LINE OF lt_lines. + + + LOOP AT it_repos ASSIGNING . + APPEND INITIAL LINE TO lt_lines ASSIGNING . + -tdformat = '*'. + -tdline = -url. + APPEND INITIAL LINE TO lt_lines ASSIGNING . + -tdformat = '*'. + -tdline = -branch_name. + APPEND INITIAL LINE TO lt_lines ASSIGNING . + -tdformat = '*'. + -tdline = -sha1. + ENDLOOP. + + ls_header = header( ). + + CALL FUNCTION 'SAVE_TEXT' + EXPORTING + header = ls_header + TABLES + lines = lt_lines + EXCEPTIONS + id = 1 + language = 2 + name = 3 + object = 4 + OTHERS = 5. + IF sy-subrc <> 0. + ROLLBACK WORK. + RAISE EXCEPTION TYPE lcx_exception + EXPORTING + iv_text = 'error from SAVE_TEXT'. "#EC NOTEXT + ENDIF. + + COMMIT WORK. + + ENDMETHOD. "save_text + + METHOD update. + + DATA: lt_repos TYPE tt_repos_sha1. + + FIELD-SYMBOLS: LIKE LINE OF lt_repos. + + + IF iv_branch IS INITIAL. + RAISE EXCEPTION TYPE lcx_exception + EXPORTING + iv_text = 'update, sha empty'. "#EC NOTEXT + ENDIF. + + lt_repos = list( ). + + READ TABLE lt_repos ASSIGNING + WITH KEY url = is_repo-url branch_name = is_repo-branch_name. + IF sy-subrc <> 0. + RAISE EXCEPTION TYPE lcx_exception + EXPORTING + iv_text = 'persist update, repo not found'. "#EC NOTEXT + ENDIF. + + -sha1 = iv_branch. + + save_text( lt_repos ). + + ENDMETHOD. "update METHOD list. + rt_repos = read_text( ). + ENDMETHOD. "list - DATA: lt_lines TYPE TABLE OF tline, - ls_repo TYPE st_repo_sha1. + METHOD read_text. + + DATA: lt_lines TYPE TABLE OF tline, + ls_header TYPE thead, + ls_repo TYPE st_repo_sha1. FIELD-SYMBOLS: LIKE LINE OF lt_lines. + ls_header = header( ). + CALL FUNCTION 'READ_TEXT' EXPORTING - id = 'ST' - language = 'E' - name = 'ZABAPGIT' - object = 'TEXT' + id = ls_header-tdid + language = ls_header-tdspras + name = ls_header-tdname + object = ls_header-tdobject TABLES lines = lt_lines EXCEPTIONS @@ -2043,6 +2124,11 @@ CLASS lcl_porcelain DEFINITION FINAL. ev_branch TYPE t_sha1 RAISING lcx_exception. + CLASS-METHODS push IMPORTING is_repo TYPE st_repo + it_files TYPE tt_files + RETURNING value(rv_branch) TYPE t_sha1 + RAISING lcx_exception. + CLASS-METHODS add IMPORTING is_repo TYPE st_repo it_files TYPE tt_files RAISING lcx_exception. @@ -2063,6 +2149,12 @@ ENDCLASS. "lcl_porcelain DEFINITION *----------------------------------------------------------------------* CLASS lcl_porcelain IMPLEMENTATION. + METHOD push. + +* todo + + ENDMETHOD. "push + METHOD add. * todo, only supports adding files to root of repository @@ -2286,6 +2378,14 @@ CLASS lcl_gui DEFINITION FINAL. IMPORTING is_repo TYPE st_repo RAISING lcx_exception. + CLASS-METHODS: pull + IMPORTING is_repo TYPE st_repo + RAISING lcx_exception. + + CLASS-METHODS: commit + IMPORTING is_repo TYPE st_repo + RAISING lcx_exception. + CLASS-METHODS: struct_encode IMPORTING ig_structure TYPE any RETURNING value(rv_string) TYPE string. @@ -2304,6 +2404,60 @@ ENDCLASS. "lcl_gui DEFINITION *----------------------------------------------------------------------* CLASS lcl_gui IMPLEMENTATION. + METHOD pull. + + DATA: lt_files TYPE tt_files, + lt_objects TYPE tt_objects, + lv_branch TYPE t_sha1. + + + lcl_porcelain=>pull( EXPORTING is_repo = is_repo + IMPORTING et_files = lt_files + ev_branch = lv_branch ). + +* todo +*lcl_serialize=>deserialize( ). + + lcl_persistence=>update( is_repo = is_repo + iv_branch = lv_branch ). + + view( render( ) ). + + ENDMETHOD. "pull + + METHOD commit. + + DATA: lv_branch TYPE t_sha1, + lt_results TYPE tt_results, + lt_push TYPE tt_files, + lt_files TYPE tt_files. + + FIELD-SYMBOLS: LIKE LINE OF lt_results. + + + lcl_porcelain=>pull( EXPORTING is_repo = is_repo + IMPORTING et_files = lt_files + ev_branch = lv_branch ). + + lt_results = lcl_serialize=>status( lt_files ). + + CLEAR lt_files[]. + LOOP AT lt_results ASSIGNING WHERE match = abap_false. + lt_files = lcl_serialize=>serialize( iv_obj_type = -obj_type + iv_obj_name = -obj_name ). + APPEND LINES OF lt_files TO lt_push. + ENDLOOP. + +* todo +* porcelain=>push + + lcl_persistence=>update( is_repo = is_repo + iv_branch = lv_branch ). + + view( render( ) ). + + ENDMETHOD. "commit + METHOD struct_decode. DATA: lt_fields TYPE tihttpnvp, @@ -2368,13 +2522,21 @@ CLASS lcl_gui IMPLEMENTATION. go_html_viewer->show_url( 'http://larshp.github.io/abapGit/explore.html' ). WHEN 'abapgithome'. cl_gui_frontend_services=>execute( - document = 'https://github.com/larshp/abapGit' ). + document = 'https://github.com/larshp/abapGit' ). WHEN 'add'. struct_decode( EXPORTING iv_string = getdata CHANGING cg_structure = ls_repo ). add( ls_repo ). WHEN 'refresh'. view( render( ) ). + WHEN 'commit'. + struct_decode( EXPORTING iv_string = getdata + CHANGING cg_structure = ls_repo ). + commit( ls_repo ). + WHEN 'pull'. + struct_decode( EXPORTING iv_string = getdata + CHANGING cg_structure = ls_repo ). + pull( ls_repo ). WHEN OTHERS. RAISE EXCEPTION TYPE lcx_exception EXPORTING @@ -2408,6 +2570,8 @@ CLASS lcl_gui IMPLEMENTATION. lcl_porcelain=>add( is_repo = is_repo it_files = lt_files ). + view( render( ) ). + ENDMETHOD. "add METHOD install. @@ -2495,6 +2659,7 @@ CLASS lcl_gui IMPLEMENTATION. DATA: lt_files TYPE tt_files, ls_repo TYPE st_repo, lv_branch TYPE t_sha1, + lv_status TYPE string, lv_updated TYPE abap_bool, lt_results TYPE tt_results. @@ -2525,27 +2690,41 @@ CLASS lcl_gui IMPLEMENTATION. ENDLOOP. rv_html = rv_html && '' && gc_newline. - rv_html = rv_html && 'add'. rv_html = rv_html && '
'. + lt_results = lcl_serialize=>status( lt_files ). IF lv_branch <> is_repo-sha1. - lv_updated = abap_true. + lv_status = 'pull'. ELSE. - lv_updated = abap_false. + READ TABLE lt_results WITH KEY match = abap_false TRANSPORTING NO FIELDS. + IF sy-subrc = 0. + lv_status = 'commit'. + ELSE. + lv_status = 'match'. + ENDIF. ENDIF. - lt_results = lcl_serialize=>deserialize( it_files = lt_files - iv_updated = lv_updated ). + LOOP AT lt_results ASSIGNING . rv_html = rv_html && - -type && - ' ' && - -name && - ' ' && - -action && + -obj_type && ' ' && + -obj_name && '
'. ENDLOOP. + CASE lv_status. + WHEN 'match'. + rv_html = rv_html && 'add'. + WHEN 'commit'. + rv_html = rv_html && 'commit'. + WHEN 'pull'. + rv_html = rv_html && 'pull'. + WHEN OTHERS. + RAISE EXCEPTION TYPE lcx_exception + EXPORTING + iv_text = 'status unknown'. "#EC NOTEXT + ENDCASE. + ENDMETHOD. "render_repo METHOD run.