CLASS zcl_abapgit_background_push_au DEFINITION PUBLIC FINAL CREATE PUBLIC . PUBLIC SECTION. INTERFACES zif_abapgit_background . PROTECTED SECTION. DATA mo_log TYPE REF TO zcl_abapgit_log . METHODS build_comment IMPORTING !is_files TYPE zif_abapgit_definitions=>ty_stage_files RETURNING VALUE(rv_comment) TYPE string . METHODS push_auto IMPORTING !io_repo TYPE REF TO zcl_abapgit_repo_online RAISING zcx_abapgit_exception . METHODS determine_user_details IMPORTING !iv_changed_by TYPE xubname RETURNING VALUE(rs_user) TYPE zif_abapgit_definitions=>ty_git_user . METHODS push_deletions IMPORTING !io_repo TYPE REF TO zcl_abapgit_repo_online !is_files TYPE zif_abapgit_definitions=>ty_stage_files RAISING zcx_abapgit_exception . PRIVATE SECTION. ENDCLASS. CLASS ZCL_ABAPGIT_BACKGROUND_PUSH_AU IMPLEMENTATION. METHOD build_comment. DATA: lt_objects TYPE STANDARD TABLE OF string WITH DEFAULT KEY, lv_str TYPE string. FIELD-SYMBOLS: LIKE LINE OF is_files-local. LOOP AT is_files-local ASSIGNING . lv_str = |{ -item-obj_type } { -item-obj_name }|. APPEND lv_str TO lt_objects. ENDLOOP. SORT lt_objects AS TEXT. DELETE ADJACENT DUPLICATES FROM lt_objects. IF lines( lt_objects ) = 1. rv_comment = |BG: { lv_str }|. ELSE. rv_comment = 'BG: Multiple objects' ##NO_TEXT. LOOP AT lt_objects INTO lv_str. CONCATENATE rv_comment zif_abapgit_definitions=>c_newline lv_str INTO rv_comment. ENDLOOP. ENDIF. ENDMETHOD. METHOD determine_user_details. DATA: lo_user_master_record TYPE REF TO zcl_abapgit_user_master_record. lo_user_master_record = zcl_abapgit_user_master_record=>get_instance( iv_changed_by ). rs_user-name = lo_user_master_record->get_name( ). rs_user-email = lo_user_master_record->get_email( ). * If no email, fall back to localhost/default email IF rs_user-email IS INITIAL. rs_user-email = |{ iv_changed_by }@localhost|. ENDIF. * If no full name maintained, just use changed by user name IF rs_user-name IS INITIAL. rs_user-name = iv_changed_by. ENDIF. ENDMETHOD. METHOD push_auto. TYPES: BEGIN OF ty_changed, filename TYPE string, path TYPE string, changed_by TYPE xubname, END OF ty_changed. DATA: ls_comment TYPE zif_abapgit_definitions=>ty_comment, ls_files TYPE zif_abapgit_definitions=>ty_stage_files, lt_changed TYPE STANDARD TABLE OF ty_changed WITH DEFAULT KEY, lt_users TYPE STANDARD TABLE OF xubname WITH DEFAULT KEY, ls_user_files LIKE ls_files, lv_changed_by LIKE LINE OF lt_users, lo_stage TYPE REF TO zcl_abapgit_stage. FIELD-SYMBOLS: LIKE LINE OF lt_changed, LIKE LINE OF ls_files-remote, LIKE LINE OF ls_files-local. ls_files = zcl_abapgit_factory=>get_stage_logic( )->get( io_repo ). LOOP AT ls_files-local ASSIGNING . lv_changed_by = zcl_abapgit_objects=>changed_by( -item ). APPEND lv_changed_by TO lt_users. APPEND INITIAL LINE TO lt_changed ASSIGNING . -changed_by = lv_changed_by. -filename = -file-filename. -path = -file-path. ENDLOOP. SORT lt_users ASCENDING. DELETE ADJACENT DUPLICATES FROM lt_users. LOOP AT lt_users INTO lv_changed_by. CLEAR: ls_comment. * Fill user details ls_comment-committer = determine_user_details( lv_changed_by ). CREATE OBJECT lo_stage. CLEAR ls_user_files. LOOP AT ls_files-local ASSIGNING . READ TABLE lt_changed WITH KEY path = -file-path filename = -file-filename changed_by = lv_changed_by TRANSPORTING NO FIELDS. IF sy-subrc = 0. mo_log->add_info( |stage: { ls_comment-committer-name } { -file-path } { -file-filename }| ). lo_stage->add( iv_path = -file-path iv_filename = -file-filename iv_data = -file-data ). APPEND TO ls_user_files-local. LOOP AT ls_files-remote ASSIGNING WHERE filename = -file-filename AND path <> -file-path AND filename <> 'package.devc.xml'. mo_log->add_info( |rm: { -path } { -filename }| ). * rm old file when object has moved lo_stage->rm( iv_path = -path iv_filename = -filename ). EXIT. " assumption: only one file ENDLOOP. ENDIF. ENDLOOP. ls_comment-comment = build_comment( ls_user_files ). io_repo->push( is_comment = ls_comment io_stage = lo_stage ). ENDLOOP. IF lines( ls_files-remote ) > 0. push_deletions( io_repo = io_repo is_files = ls_files ). ENDIF. ENDMETHOD. METHOD push_deletions. DATA: lo_stage TYPE REF TO zcl_abapgit_stage, ls_comment TYPE zif_abapgit_definitions=>ty_comment. FIELD-SYMBOLS: LIKE LINE OF is_files-remote. ASSERT lines( is_files-remote ) > 0. CREATE OBJECT lo_stage. ls_comment-comment = 'BG: Deletion' ##NO_TEXT. LOOP AT is_files-remote ASSIGNING . mo_log->add_info( |removed: { -path } { -filename }| ). lo_stage->rm( iv_path = -path iv_filename = -filename ). CONCATENATE ls_comment-comment zif_abapgit_definitions=>c_newline -filename INTO ls_comment-comment. ENDLOOP. ls_comment-committer-name = 'Deletion' ##NO_TEXT. ls_comment-committer-email = 'deletion@localhost'. io_repo->push( is_comment = ls_comment io_stage = lo_stage ). ENDMETHOD. METHOD zif_abapgit_background~get_description. rv_description = 'Automatic push, auto author' ##NO_TEXT. ENDMETHOD. METHOD zif_abapgit_background~get_settings. RETURN. ENDMETHOD. METHOD zif_abapgit_background~run. DATA: ls_files TYPE zif_abapgit_definitions=>ty_stage_files. mo_log = io_log. ls_files = zcl_abapgit_factory=>get_stage_logic( )->get( io_repo ). IF lines( ls_files-local ) = 0 AND lines( ls_files-remote ) = 0. io_log->add_info( 'Nothing to stage' ) ##NO_TEXT. RETURN. ENDIF. push_auto( io_repo ). ENDMETHOD. ENDCLASS.