abapGit/src/background/zcl_abapgit_background_push_au.clas.abap
Lars Hvam b42f3bc485
Refactoring (#3134)
* fully type constants

* moving to single line

* move to single line

* enable keep_single_parameter_on_one_line
2019-12-28 12:11:32 +01:00

248 lines
6.8 KiB
ABAP

CLASS zcl_abapgit_background_push_au DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES zif_abapgit_background .
PROTECTED SECTION.
DATA mi_log TYPE REF TO zif_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: <ls_local> LIKE LINE OF is_files-local.
LOOP AT is_files-local ASSIGNING <ls_local>.
lv_str = |{ <ls_local>-item-obj_type } { <ls_local>-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: <ls_changed> LIKE LINE OF lt_changed,
<ls_remote> LIKE LINE OF ls_files-remote,
<ls_local> LIKE LINE OF ls_files-local.
ls_files = zcl_abapgit_factory=>get_stage_logic( )->get( io_repo ).
LOOP AT ls_files-local ASSIGNING <ls_local>.
lv_changed_by = zcl_abapgit_objects=>changed_by( <ls_local>-item ).
APPEND lv_changed_by TO lt_users.
APPEND INITIAL LINE TO lt_changed ASSIGNING <ls_changed>.
<ls_changed>-changed_by = lv_changed_by.
<ls_changed>-filename = <ls_local>-file-filename.
<ls_changed>-path = <ls_local>-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 <ls_local>.
READ TABLE lt_changed WITH KEY
path = <ls_local>-file-path
filename = <ls_local>-file-filename
changed_by = lv_changed_by
TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
mi_log->add_info( |stage: {
ls_comment-committer-name } {
<ls_local>-file-path } {
<ls_local>-file-filename }| ).
lo_stage->add( iv_path = <ls_local>-file-path
iv_filename = <ls_local>-file-filename
iv_data = <ls_local>-file-data ).
APPEND <ls_local> TO ls_user_files-local.
LOOP AT ls_files-remote ASSIGNING <ls_remote>
WHERE filename = <ls_local>-file-filename
AND path <> <ls_local>-file-path
AND filename <> 'package.devc.xml'.
mi_log->add_info( |rm: { <ls_remote>-path } { <ls_remote>-filename }| ).
* rm old file when object has moved
lo_stage->rm(
iv_path = <ls_remote>-path
iv_filename = <ls_remote>-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: <ls_remote> 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 <ls_remote>.
mi_log->add_info( |removed: { <ls_remote>-path } { <ls_remote>-filename }| ).
lo_stage->rm( iv_path = <ls_remote>-path
iv_filename = <ls_remote>-filename ).
CONCATENATE ls_comment-comment zif_abapgit_definitions=>c_newline <ls_remote>-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.
mi_log = ii_log.
ls_files = zcl_abapgit_factory=>get_stage_logic( )->get( io_repo ).
IF lines( ls_files-local ) = 0 AND lines( ls_files-remote ) = 0.
ii_log->add_info( 'Nothing to stage' ) ##NO_TEXT.
RETURN.
ENDIF.
push_auto( io_repo ).
ENDMETHOD.
ENDCLASS.