Merge remote-tracking branch 'refs/remotes/larshp/master'

This commit is contained in:
EduardoCopat 2017-03-23 10:11:35 +01:00
commit 407416b1bb
32 changed files with 1002 additions and 200 deletions

View File

@ -1,5 +1,6 @@
[![Build Status](https://travis-ci.org/larshp/abapGit.svg?branch=master)](https://travis-ci.org/larshp/abapGit)
[![abaplint](http://abaplint.org/badges/larshp/abapGit)](http://abaplint.org/project/larshp/abapGit)
[![Slack](https://abapgit-slackinviter.herokuapp.com/badge.svg)](https://abapgit-slackinviter.herokuapp.com/)
# abapGit #

View File

@ -8,6 +8,20 @@ Legend
+ : added
- : removed
2017-03-23 v1.33.2
------------------
* fix Microsoft TFS zlib decompression error
* downport of new requirements feature
* fix for SMIM document class
2017-03-21 v1.33.1
------------------
* reset TADIR-DELFLAG resetting or pulling object again
2017-03-20 v1.33.0
------------------
+ possibility to define software component requirements for repo
2017-03-07 v1.32.0
------------------
+ user interface changed for diff and staging pages

View File

@ -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.32.0'. "#EC NOTEXT
gc_abap_version TYPE string VALUE 'v1.33.2'. "#EC NOTEXT
********************************************************************************
* The MIT License (MIT)
@ -49,6 +49,7 @@ INCLUDE zabapgit_dot_abapgit.
INCLUDE zabapgit_persistence.
INCLUDE zabapgit_sap_package.
INCLUDE zabapgit_folder_logic.
INCLUDE zabapgit_requirements.
INCLUDE zabapgit_stage.
INCLUDE zabapgit_git_helpers.

View File

@ -446,20 +446,22 @@ CLASS lcl_2fa_github_authenticator IMPLEMENTATION.
ENDMETHOD.
METHOD parse_repo_from_url.
CONSTANTS: lc_search_regex TYPE string VALUE 'https?:\/\/(www\.)?github.com\/(.*)$'.
DATA: lo_regex TYPE REF TO cl_abap_regex,
lo_matcher TYPE REF TO cl_abap_matcher.
CREATE OBJECT lo_regex
EXPORTING
pattern = lc_search_regex.
lo_matcher = lo_regex->create_matcher( text = iv_url ).
IF lo_matcher->match( ) = abap_true.
rv_repo_name = lo_matcher->get_submatch( 1 ).
ELSE.
rv_repo_name = '???' ##NO_TEXT.
ENDIF.
* method not used?
ASSERT 0 = 1.
* CONSTANTS: lc_search_regex TYPE string VALUE 'https?:\/\/(www\.)?github.com\/(.*)$'.
* DATA: lo_regex TYPE REF TO cl_abap_regex,
* lo_matcher TYPE REF TO cl_abap_matcher.
*
* CREATE OBJECT lo_regex
* EXPORTING
* pattern = lc_search_regex.
*
* lo_matcher = lo_regex->create_matcher( text = iv_url ).
* IF lo_matcher->match( ) = abap_true.
* rv_repo_name = lo_matcher->get_submatch( 1 ).
* ELSE.
* rv_repo_name = '???' ##NO_TEXT.
* ENDIF.
ENDMETHOD.
METHOD get_service_id_from_url.
@ -468,7 +470,6 @@ CLASS lcl_2fa_github_authenticator IMPLEMENTATION.
METHOD is_2fa_required.
DATA: li_client TYPE REF TO if_http_client,
lv_header_value TYPE string,
lo_settings TYPE REF TO lcl_settings.
lo_settings = lcl_app=>settings( )->read( ).

View File

@ -197,6 +197,7 @@ CONSTANTS: BEGIN OF gc_action,
repo_clone TYPE string VALUE 'repo_clone',
repo_refresh TYPE string VALUE 'repo_refresh',
repo_remove TYPE string VALUE 'repo_remove',
repo_settings TYPE string VALUE 'repo_settings',
repo_purge TYPE string VALUE 'repo_purge',
repo_newoffline TYPE string VALUE 'repo_newoffline',
repo_remote_attach TYPE string VALUE 'repo_remote_attach',

View File

@ -12,11 +12,18 @@ CLASS lcl_dot_abapgit DEFINITION FINAL FRIENDS ltcl_dot_abapgit.
full TYPE string VALUE 'FULL',
END OF c_folder_logic.
TYPES: BEGIN OF ty_dot_abapgit,
TYPES: BEGIN OF ty_requirement,
component TYPE dlvunit,
min_release TYPE saprelease,
min_patch TYPE sappatchlv,
END OF ty_requirement,
ty_requirement_tt TYPE STANDARD TABLE OF ty_requirement WITH DEFAULT KEY,
BEGIN OF ty_dot_abapgit,
master_language TYPE spras,
starting_folder TYPE string,
folder_logic TYPE string,
ignore TYPE STANDARD TABLE OF string WITH DEFAULT KEY,
requirements TYPE ty_requirement_tt,
END OF ty_dot_abapgit.
CLASS-METHODS:
@ -135,6 +142,7 @@ CLASS lcl_dot_abapgit IMPLEMENTATION.
METHOD to_xml.
CALL TRANSFORMATION id
OPTIONS initial_components = 'suppress'
SOURCE data = is_data
RESULT XML rv_xml.

View File

@ -151,6 +151,11 @@ CLASS lcl_git_pack DEFINITION FINAL FRIENDS ltcl_git_pack.
EXPORTING ev_length TYPE i
CHANGING cv_data TYPE xstring.
CLASS-METHODS zlib_decompress
CHANGING cv_data TYPE xstring
cv_decompressed TYPE xstring
RAISING lcx_exception.
ENDCLASS. "lcl_pack DEFINITION
*----------------------------------------------------------------------*
@ -854,6 +859,35 @@ CLASS lcl_git_pack IMPLEMENTATION.
ENDMETHOD. "decode_tree
METHOD zlib_decompress.
DATA: ls_data TYPE lcl_zlib=>ty_decompress,
lv_compressed_len TYPE i,
lv_adler32 TYPE lcl_hash=>ty_adler32.
ls_data = lcl_zlib=>decompress( cv_data ).
lv_compressed_len = ls_data-compressed_len.
cv_decompressed = ls_data-raw.
IF lv_compressed_len IS INITIAL.
lcx_exception=>raise( 'Decompression falied :o/' ).
ENDIF.
cv_data = cv_data+lv_compressed_len.
lv_adler32 = lcl_hash=>adler32( cv_decompressed ).
IF cv_data(4) <> lv_adler32.
cv_data = cv_data+1.
ENDIF.
IF cv_data(4) <> lv_adler32.
cv_data = cv_data+1.
ENDIF.
IF cv_data(4) <> lv_adler32.
lcx_exception=>raise( 'Wrong Adler checksum' ).
ENDIF.
ENDMETHOD.
METHOD decode.
DATA: lv_x TYPE x,
@ -864,15 +898,13 @@ CLASS lcl_git_pack IMPLEMENTATION.
lv_len TYPE i,
lv_sha1 TYPE ty_sha1,
lv_ref_delta TYPE ty_sha1,
lv_adler32 TYPE lcl_hash=>ty_adler32,
lv_compressed TYPE xstring,
lv_compressed_len TYPE i,
lv_decompress_len TYPE i,
lv_compressed TYPE xstring,
lv_decompressed TYPE xstring,
lv_decompress_len TYPE i,
lv_xstring TYPE xstring,
lv_expected TYPE i,
ls_object LIKE LINE OF rt_objects,
ls_data TYPE lcl_zlib=>ty_decompress.
ls_object LIKE LINE OF rt_objects.
lv_data = iv_data.
@ -937,37 +969,21 @@ CLASS lcl_git_pack IMPLEMENTATION.
gzip_out_len = lv_compressed_len ).
IF lv_compressed(lv_compressed_len) <> lv_data(lv_compressed_len).
lcx_exception=>raise( 'Compressed data doesnt match' ).
ENDIF.
"Lets try with zlib before error in out for good
"This fixes issues with TFS 2017 and visualstudio.com Git repos
zlib_decompress( CHANGING cv_data = lv_data
cv_decompressed = lv_decompressed ).
ELSE.
lv_data = lv_data+lv_compressed_len.
ENDIF.
ELSEIF lv_zlib = c_zlib_hmm.
* cl_abap_gzip copmression works for header '789C', but does not work for
* '7801', call custom implementation of DEFLATE algorithm.
* The custom implementation could handle both, but most likely the kernel
* implementation runs faster than the custom ABAP.
ls_data = lcl_zlib=>decompress( lv_data ).
lv_compressed_len = ls_data-compressed_len.
lv_decompressed = ls_data-raw.
IF lv_compressed_len IS INITIAL.
lcx_exception=>raise( 'Decompression falied :o/' ).
ENDIF.
lv_data = lv_data+lv_compressed_len.
lv_adler32 = lcl_hash=>adler32( lv_decompressed ).
IF lv_data(4) <> lv_adler32.
lv_data = lv_data+1.
ENDIF.
IF lv_data(4) <> lv_adler32.
lv_data = lv_data+1.
ENDIF.
IF lv_data(4) <> lv_adler32.
lcx_exception=>raise( 'Wrong Adler checksum' ).
ENDIF.
zlib_decompress( CHANGING cv_data = lv_data
cv_decompressed = lv_decompressed ).
ENDIF.
lv_data = lv_data+4. " skip adler checksum

View File

@ -29,3 +29,4 @@ INCLUDE zabapgit_page_main.
INCLUDE zabapgit_page_stage.
INCLUDE zabapgit_page_debug.
INCLUDE zabapgit_page_settings.
INCLUDE zabapgit_page_repo_settings.

View File

@ -174,6 +174,11 @@ CLASS lcl_gui_router IMPLEMENTATION.
WHEN gc_action-repo_transport_to_branch.
lcl_services_repo=>transport_to_branch( iv_repository_key = lv_key ).
ev_state = gc_event_state-re_render.
WHEN gc_action-repo_settings.
CREATE OBJECT ei_page TYPE lcl_gui_page_repo_settings
EXPORTING
io_repo = lcl_app=>repo_srv( )->get( lv_key ).
ev_state = gc_event_state-new_page.
" ZIP services actions
WHEN gc_action-zip_import. " Import repo from ZIP

View File

@ -202,8 +202,6 @@ CLASS lcl_object_clas IMPLEMENTATION.
DATA: ls_vseoclass TYPE vseoclass,
lt_tpool TYPE textpool_table,
lv_object TYPE dokhl-object,
lv_state TYPE dokhl-dokstate,
lt_descriptions TYPE ty_seocompotx_tt,
ls_clskey TYPE seoclskey,
lt_sotr TYPE ty_sotr_tt,
@ -274,8 +272,7 @@ CLASS lcl_object_clas IMPLEMENTATION.
METHOD deserialize_sotr.
"OTR stands for Online Text Repository
DATA: lt_sotr TYPE ty_sotr_tt,
lt_objects TYPE sotr_objects.
DATA: lt_sotr TYPE ty_sotr_tt.
io_xml->read( EXPORTING iv_name = 'SOTR'
CHANGING cg_data = lt_sotr ).

View File

@ -92,7 +92,6 @@ CLASS lcl_object_ddls IMPLEMENTATION.
METHOD lif_object~serialize.
DATA: li_ddl TYPE REF TO object,
lv_source TYPE string,
lr_data TYPE REF TO data.
FIELD-SYMBOLS: <ls_data> TYPE any,

View File

@ -690,7 +690,6 @@ CLASS lcl_object_enho_interface IMPLEMENTATION.
METHOD lif_object_enho~deserialize.
DATA: lo_enh_intf TYPE REF TO cl_enh_tool_intf,
lt_source TYPE rswsourcet,
li_tool TYPE REF TO if_enh_tool,
lv_shorttext TYPE string,
lv_class TYPE seoclsname,

View File

@ -143,13 +143,9 @@ CLASS lcl_object_intf IMPLEMENTATION.
METHOD serialize_xml.
DATA:
lt_tpool TYPE textpool_table,
lv_object TYPE dokhl-object,
lv_state TYPE dokhl-dokstate,
lt_descriptions TYPE ty_seocompotx_tt,
ls_vseointerf TYPE vseointerf,
ls_clskey TYPE seoclskey,
lt_sotr TYPE ty_sotr_tt,
lt_lines TYPE tlinetab.

View File

@ -112,8 +112,7 @@ CLASS lcl_object_sfpf IMPLEMENTATION.
METHOD form_to_xstring.
DATA: lv_xstr TYPE xstring,
li_fp_form TYPE REF TO if_fp_form,
DATA: li_fp_form TYPE REF TO if_fp_form,
li_wb_form TYPE REF TO if_fp_wb_form.
@ -130,8 +129,6 @@ CLASS lcl_object_sfpf IMPLEMENTATION.
METHOD fix_oref.
DATA: li_iterator TYPE REF TO if_ixml_node_iterator,
lv_name TYPE string,
lv_value TYPE string,
lv_new TYPE n LENGTH 3,
lv_old TYPE string,
lt_map TYPE STANDARD TABLE OF string WITH DEFAULT KEY,

View File

@ -108,8 +108,7 @@ CLASS lcl_object_sfpi IMPLEMENTATION.
METHOD interface_to_xstring.
DATA: lv_xstr TYPE xstring,
li_fp_interface TYPE REF TO if_fp_interface,
DATA: li_fp_interface TYPE REF TO if_fp_interface,
li_wb_interface TYPE REF TO if_fp_wb_interface.

View File

@ -164,11 +164,15 @@ CLASS lcl_object_smim IMPLEMENTATION.
DATA: lv_url TYPE string,
lv_folder TYPE abap_bool,
lv_filename TYPE string,
lv_class TYPE smimloio-lo_class,
ls_file TYPE ty_file,
lv_content TYPE xstring,
li_api TYPE REF TO if_mr_api.
li_api TYPE REF TO if_mr_api,
lv_loio TYPE sdok_docid.
lv_loio = ms_item-obj_name.
TRY.
get_url_for_io(
IMPORTING
@ -201,12 +205,16 @@ CLASS lcl_object_smim IMPLEMENTATION.
ls_file-path = '/'.
ls_file-data = lv_content.
mo_files->add( ls_file ).
SELECT SINGLE lo_class FROM smimloio INTO lv_class WHERE loio_id = lv_loio.
ENDIF.
io_xml->add( iv_name = 'URL'
ig_data = lv_url ).
io_xml->add( iv_name = 'FOLDER'
ig_data = lv_folder ).
io_xml->add( iv_name = 'CLASS'
ig_data = lv_class ).
ENDMETHOD. "serialize
@ -217,6 +225,7 @@ CLASS lcl_object_smim IMPLEMENTATION.
lv_content TYPE xstring,
lv_filename TYPE skwf_filnm,
lv_io TYPE sdok_docid,
lv_class TYPE smimloio-lo_class,
ls_skwf_io TYPE skwf_io,
li_api TYPE REF TO if_mr_api.
@ -228,6 +237,8 @@ CLASS lcl_object_smim IMPLEMENTATION.
CHANGING cg_data = lv_url ).
io_xml->read( EXPORTING iv_name = 'FOLDER'
CHANGING cg_data = lv_folder ).
io_xml->read( EXPORTING iv_name = 'CLASS'
CHANGING cg_data = lv_class ).
ls_skwf_io-objid = lv_io.
@ -250,12 +261,15 @@ CLASS lcl_object_smim IMPLEMENTATION.
ENDIF.
ELSE.
lv_filename = get_filename( lv_url ).
ls_skwf_io-class = lv_class.
IF ls_skwf_io-class IS INITIAL.
cl_wb_mime_repository=>determine_io_class(
EXPORTING
filename = lv_filename
IMPORTING
io_class = ls_skwf_io-class ).
CONCATENATE ls_skwf_io-class '_L' INTO ls_skwf_io-class.
ENDIF.
lv_content = find_content( lv_url ).

View File

@ -76,8 +76,7 @@ CLASS lcl_object_splo IMPLEMENTATION.
METHOD lif_object~deserialize.
DATA: lv_obj_name TYPE e071-obj_name,
ls_tsp1t TYPE tsp1t,
DATA: ls_tsp1t TYPE tsp1t,
ls_tsp1d TYPE tsp1d,
ls_tsp0p TYPE tsp0p.
@ -93,17 +92,8 @@ CLASS lcl_object_splo IMPLEMENTATION.
MODIFY tsp1d FROM ls_tsp1d. "#EC CI_SUBRC
MODIFY tsp0p FROM ls_tsp0p. "#EC CI_SUBRC
lv_obj_name = ms_item-obj_name.
tadir_insert( iv_package ).
* CALL FUNCTION 'TR_TADIR_POPUP_ENTRY_E071'
* EXPORTING
* wi_e071_pgmid = 'R3TR'
* wi_e071_object = ms_item-obj_type
* wi_e071_obj_name = lv_obj_name
* wi_tadir_devclass = iv_package.
ENDMETHOD. "lif_object~deserialize
METHOD lif_object~delete.

View File

@ -1630,6 +1630,7 @@ CLASS lcl_objects_super IMPLEMENTATION.
wi_tadir_author = sy-uname
wi_tadir_devclass = iv_package
wi_tadir_masterlang = mv_language
iv_delflag = abap_false
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
@ -1732,8 +1733,6 @@ CLASS lcl_objects DEFINITION FINAL.
PRIVATE SECTION.
CLASS-DATA: mv_langs_installed TYPE scplangs.
CLASS-METHODS check_duplicates
IMPORTING it_files TYPE ty_files_tt
RAISING lcx_exception.

View File

@ -595,8 +595,6 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
METHOD render_line_unified.
DATA lv_line TYPE string.
FIELD-SYMBOLS <diff_line> LIKE LINE OF mt_delayed_lines.
CREATE OBJECT ro_html.

View File

@ -0,0 +1,91 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_PAGE_REPO_SETTINGS
*&---------------------------------------------------------------------*
CLASS lcl_gui_page_repo_settings DEFINITION FINAL INHERITING FROM lcl_gui_page.
PUBLIC SECTION.
METHODS:
constructor
IMPORTING io_repo TYPE REF TO lcl_repo,
lif_gui_page~on_event REDEFINITION.
PROTECTED SECTION.
CONSTANTS:
BEGIN OF c_action,
save_settings TYPE string VALUE 'save_settings',
END OF c_action.
DATA: mo_repo TYPE REF TO lcl_repo.
METHODS:
render_content REDEFINITION,
parse_post
IMPORTING
it_postdata TYPE cnht_post_data_tab
RETURNING
VALUE(rt_post_fields) TYPE tihttpnvp.
ENDCLASS. "lcl_gui_page_debuginfo
CLASS lcl_gui_page_repo_settings IMPLEMENTATION.
METHOD constructor.
super->constructor( ).
ms_control-page_title = 'REPO SETTINGS'.
mo_repo = io_repo.
ENDMETHOD. " constructor.
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 render_content.
DATA: ls_dot TYPE lcl_dot_abapgit=>ty_dot_abapgit.
ls_dot = mo_repo->get_dot_abapgit( )->get_data( ).
CREATE OBJECT ro_html.
ro_html->add( '<div class="settings_container">' ).
ro_html->add( '<form id="settings_form" method="post" action="sapevent:' &&
c_action-save_settings && '">' ).
ro_html->add( '<br>' ).
ro_html->add( 'Folder logic: <input name="folder_logic" type="text" size="10" value="' &&
ls_dot-folder_logic && '">' ).
ro_html->add( '<br>' ).
ro_html->add( '<input type="submit" value="Save" class="submit">' ).
ro_html->add( '</form>' ).
ro_html->add( '</div>' ).
ENDMETHOD. "render_content
METHOD lif_gui_page~on_event.
DATA: lt_post_fields TYPE tihttpnvp,
lo_dot TYPE REF TO lcl_dot_abapgit,
ls_post_field LIKE LINE OF lt_post_fields.
CASE iv_action.
WHEN c_action-save_settings.
lt_post_fields = parse_post( it_postdata ).
READ TABLE lt_post_fields INTO ls_post_field WITH KEY name = 'folder_logic'.
ASSERT sy-subrc = 0.
lo_dot = mo_repo->get_dot_abapgit( ).
lo_dot->set_folder_logic( ls_post_field-value ).
mo_repo->set_dot_abapgit( lo_dot ).
ev_state = gc_event_state-go_back.
ENDCASE.
ENDMETHOD.
ENDCLASS. "lcl_gui_page_debuginfo

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_PAGE_REPO_SETTINGS</NAME>
<STATE>A</STATE>
<VARCL>X</VARCL>
<SUBC>I</SUBC>
<RLOAD>E</RLOAD>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<ENTRY>Include ZABAPGIT_PAGE_REPO_SETTINGS</ENTRY>
<LENGTH>35</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -181,10 +181,9 @@ CLASS lcl_repo_content_browser IMPLEMENTATION.
<ls_tadir> LIKE LINE OF lt_tadir.
* todo, offline projects should have an dot abapgit too
lt_tadir = lcl_tadir=>read(
iv_package = mo_repo->get_package( )
io_dot = lcl_dot_abapgit=>build_default( ) ).
io_dot = mo_repo->get_dot_abapgit( ) ).
LOOP AT lt_tadir ASSIGNING <ls_tadir>.
APPEND INITIAL LINE TO rt_repo_items ASSIGNING <ls_repo_item>.

View File

@ -477,7 +477,8 @@ CLASS lcl_repo IMPLEMENTATION.
METHOD deserialize.
DATA: lt_updated_files TYPE ty_file_signatures_tt,
lo_dot_abapgit TYPE REF TO lcl_dot_abapgit.
lo_dot_abapgit TYPE REF TO lcl_dot_abapgit,
lt_requirements TYPE STANDARD TABLE OF lcl_dot_abapgit=>ty_requirement.
IF get_dot_abapgit( )->get_master_language( ) <> sy-langu.
@ -487,6 +488,12 @@ CLASS lcl_repo IMPLEMENTATION.
lo_dot_abapgit = find_remote_dot_abapgit( ).
IF lo_dot_abapgit IS BOUND.
set_dot_abapgit( lo_dot_abapgit ).
lt_requirements = lo_dot_abapgit->get_data( )-requirements.
IF lt_requirements IS NOT INITIAL.
lcl_requirement_helper=>check_requirements( it_requirements = lt_requirements
iv_show_popup = abap_true ).
ENDIF.
ENDIF.
lt_updated_files = lcl_objects=>deserialize( me ).

View File

@ -0,0 +1,223 @@
*&---------------------------------------------------------------------*
*& Include zabapgit_requirements
*&---------------------------------------------------------------------*
"! Helper class for checking requirements / dependencies
*----------------------------------------------------------------------*
* CLASS lcl_requirement_helper DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_requirement_helper DEFINITION FINAL.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_requirement_status,
met TYPE abap_bool,
component TYPE dlvunit,
description TYPE text80,
installed_release TYPE saprelease,
installed_patch TYPE sappatchlv,
required_release TYPE saprelease,
required_patch TYPE sappatchlv,
END OF ty_requirement_status,
ty_requirement_status_tt TYPE STANDARD TABLE OF ty_requirement_status WITH DEFAULT KEY.
CLASS-METHODS:
"! Check if the given requirements are met with user interaction
"! <p>
"! Shows a popup if requested and asks the user if he wants to continue if there are unmet
"! requirements. If not an exception is raised.
"! </p>
"! @parameter it_requirements | The requirements to check
"! @parameter iv_show_popup | Show popup with requirements
"! @raising lcx_exception | Cancelled by user or internal error
check_requirements IMPORTING it_requirements TYPE lcl_dot_abapgit=>ty_requirement_tt
iv_show_popup TYPE abap_bool DEFAULT abap_true
RAISING lcx_exception,
"! Get a table with information about each requirement
"! @parameter it_requirements | Requirements
"! @parameter rt_status | Result
"! @raising lcx_exception | Internal error
get_requirement_met_status IMPORTING it_requirements TYPE lcl_dot_abapgit=>ty_requirement_tt
RETURNING value(rt_status) TYPE ty_requirement_status_tt
RAISING lcx_exception.
PROTECTED SECTION.
PRIVATE SECTION.
CLASS-METHODS:
show_requirement_popup IMPORTING it_requirements TYPE ty_requirement_status_tt
RAISING lcx_exception,
version_greater_or_equal IMPORTING is_status TYPE ty_requirement_status
RETURNING value(rv_true) TYPE abap_bool.
ENDCLASS. "lcl_requirement_helper DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_requirement_helper IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_requirement_helper IMPLEMENTATION.
METHOD check_requirements.
DATA: lt_met_status TYPE ty_requirement_status_tt,
lv_answer TYPE c LENGTH 1.
lt_met_status = get_requirement_met_status( it_requirements ).
IF iv_show_popup = abap_true.
show_requirement_popup( lt_met_status ).
ENDIF.
LOOP AT lt_met_status TRANSPORTING NO FIELDS WHERE met = abap_false.
EXIT.
ENDLOOP.
IF sy-subrc = 0.
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
text_question = 'The project has unmet requirements. Do you want to continue?'
IMPORTING
answer = lv_answer.
IF lv_answer <> '1'.
lcx_exception=>raise( 'Cancelling because of unmet requirements.' ).
ENDIF.
ENDIF.
ENDMETHOD. "check_requirements
METHOD get_requirement_met_status.
DATA: lt_installed TYPE STANDARD TABLE OF cvers_sdu.
FIELD-SYMBOLS: <ls_requirement> TYPE lcl_dot_abapgit=>ty_requirement,
<ls_status> TYPE ty_requirement_status,
<ls_installed_comp> TYPE cvers_sdu.
CALL FUNCTION 'DELIVERY_GET_INSTALLED_COMPS'
TABLES
tt_comptab = lt_installed
EXCEPTIONS
no_release_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
lcx_exception=>raise( |Error from DELIVERY_GET_INSTALLED_COMPS { sy-subrc }| ) ##no_text.
ENDIF.
LOOP AT it_requirements ASSIGNING <ls_requirement>.
APPEND INITIAL LINE TO rt_status ASSIGNING <ls_status>.
<ls_status>-component = <ls_requirement>-component.
<ls_status>-required_release = <ls_requirement>-min_release.
<ls_status>-required_patch = <ls_requirement>-min_patch.
READ TABLE lt_installed WITH KEY component = <ls_requirement>-component
ASSIGNING <ls_installed_comp>.
IF sy-subrc = 0.
" Component is installed, requirement is met if the installed version is greater or equal
" to the required one.
<ls_status>-installed_release = <ls_installed_comp>-release.
<ls_status>-installed_patch = <ls_installed_comp>-extrelease.
<ls_status>-description = <ls_installed_comp>-desc_text.
<ls_status>-met = version_greater_or_equal( <ls_status> ).
ELSE.
" Component is not installed at all
<ls_status>-met = abap_false.
ENDIF.
UNASSIGN <ls_installed_comp>.
ENDLOOP.
ENDMETHOD. "get_requirement_met_status
METHOD version_greater_or_equal.
DATA: lv_number TYPE numc4.
TRY.
MOVE EXACT: is_status-installed_release TO lv_number,
is_status-installed_patch TO lv_number,
is_status-required_release TO lv_number,
is_status-required_patch TO lv_number.
CATCH cx_sy_conversion_error.
" Cannot compare by number, assume requirement not fullfilled (user can force install
" anyways if this was an error)
rv_true = abap_false.
RETURN.
ENDTRY.
" Versions are comparable by number, compare release and if necessary patch level
IF is_status-installed_release > is_status-required_release
OR ( is_status-installed_release = is_status-required_release
AND ( is_status-required_patch IS INITIAL OR
is_status-installed_patch >= is_status-required_patch ) ).
rv_true = abap_true.
ENDIF.
ENDMETHOD. "version_greater_or_equal
METHOD show_requirement_popup.
TYPES: BEGIN OF lty_color_line,
color TYPE lvc_t_scol.
INCLUDE TYPE ty_requirement_status.
TYPES: END OF lty_color_line,
lty_color_tab TYPE STANDARD TABLE OF lty_color_line WITH DEFAULT KEY.
DATA: lo_alv TYPE REF TO cl_salv_table,
lo_column TYPE REF TO cl_salv_column,
lo_columns TYPE REF TO cl_salv_columns_table,
lt_color_table TYPE lty_color_tab,
lt_color_negative TYPE lvc_t_scol,
lt_color_positive TYPE lvc_t_scol,
ls_color TYPE lvc_s_scol,
lx_ex TYPE REF TO cx_root.
FIELD-SYMBOLS: <ls_line> TYPE lty_color_line,
<ls_requirement> LIKE LINE OF it_requirements.
ls_color-color-col = col_negative.
APPEND ls_color TO lt_color_negative.
ls_color-color-col = col_positive.
APPEND ls_color TO lt_color_positive.
CLEAR ls_color.
LOOP AT it_requirements ASSIGNING <ls_requirement>.
APPEND INITIAL LINE TO lt_color_table ASSIGNING <ls_line>.
MOVE-CORRESPONDING <ls_requirement> TO <ls_line>.
ENDLOOP.
LOOP AT lt_color_table ASSIGNING <ls_line>.
IF <ls_line>-met = abap_false.
<ls_line>-color = lt_color_negative.
ELSE.
<ls_line>-color = lt_color_positive.
ENDIF.
ENDLOOP.
UNASSIGN <ls_line>.
TRY.
cl_salv_table=>factory( IMPORTING r_salv_table = lo_alv
CHANGING t_table = lt_color_table ).
lo_columns = lo_alv->get_columns( ).
lo_columns->get_column( 'MET' )->set_short_text( 'Met' ).
lo_columns->set_color_column( 'COLOR' ).
lo_columns->set_optimize( ).
lo_column = lo_columns->get_column( 'REQUIRED_RELEASE' ).
* lo_column->set_fixed_header_text( 'S' ).
lo_column->set_short_text( 'Req. Rel.' ).
lo_column = lo_columns->get_column( 'REQUIRED_PATCH' ).
* lo_column->set_fixed_header_text( 'S' ).
lo_column->set_short_text( 'Req. SP L.' ).
lo_alv->set_screen_popup( start_column = 30
end_column = 100
start_line = 10
end_line = 20 ).
lo_alv->get_display_settings( )->set_list_header( 'Requirements' ).
lo_alv->display( ).
CATCH cx_salv_msg cx_salv_not_found cx_salv_data_error INTO lx_ex.
RAISE EXCEPTION TYPE lcx_exception
EXPORTING
iv_text = lx_ex->get_text( )
ix_previous = lx_ex.
ENDTRY.
ENDMETHOD. "show_requirement_popup
ENDCLASS. "lcl_requirement_helper IMPLEMENTATION

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_REQUIREMENTS</NAME>
<STATE>A</STATE>
<VARCL>X</VARCL>
<DBAPL>S</DBAPL>
<DBNA>D$</DBNA>
<SUBC>I</SUBC>
<FIXPT>X</FIXPT>
<LDBNAME>D$S</LDBNAME>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<ENTRY>ZABAPGIT_REQUIREMENTS</ENTRY>
<LENGTH>21</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -129,8 +129,6 @@ CLASS lcl_tadir IMPLEMENTATION.
DATA: lv_index TYPE i,
lt_tadir TYPE ty_tadir_tt,
lt_tdevc TYPE STANDARD TABLE OF tdevc,
lv_len TYPE i,
lv_message TYPE string,
lv_path TYPE string.
FIELD-SYMBOLS: <ls_tdevc> LIKE LINE OF lt_tdevc,

View File

@ -29,7 +29,6 @@ ENDCLASS.
CLASS lcl_transport IMPLEMENTATION.
METHOD zip.
DATA: lt_requests TYPE trwbo_requests,
lt_tadir TYPE scts_tadir,
lv_package TYPE devclass,
@ -64,14 +63,10 @@ CLASS lcl_transport IMPLEMENTATION.
lcl_zip=>export( io_repo = lo_repo
it_filter = lt_tadir ).
ENDMETHOD.
METHOD to_tadir.
DATA: lt_requests TYPE trwbo_requests,
lt_tadir TYPE scts_tadir,
lv_package TYPE devclass,
lt_trkorr TYPE trwbo_request_headers.
DATA: lt_requests TYPE trwbo_requests.
IF lines( it_transport_headers ) = 0.
@ -112,11 +107,9 @@ CLASS lcl_transport IMPLEMENTATION.
SORT lt_super.
READ TABLE lt_super INDEX 1 INTO rv_package.
ENDMETHOD.
METHOD read_requests.
DATA lt_requests LIKE rt_requests.
FIELD-SYMBOLS <fs_trkorr> LIKE LINE OF it_trkorr.
@ -135,11 +128,9 @@ CLASS lcl_transport IMPLEMENTATION.
APPEND LINES OF lt_requests TO rt_requests.
ENDLOOP.
ENDMETHOD.
METHOD resolve.
DATA: lv_object TYPE tadir-object,
lv_obj_name TYPE tadir-obj_name,
lv_trobj_name TYPE trobj_name,
@ -185,6 +176,80 @@ CLASS lcl_transport IMPLEMENTATION.
ENDMETHOD.
ENDCLASS.
CLASS lcl_transport_objects DEFINITION.
"Under test at ltcl_transport_objects
PUBLIC SECTION.
METHODS constructor
IMPORTING
it_transport_objects TYPE scts_tadir.
METHODS to_stage
IMPORTING
io_stage TYPE REF TO lcl_stage
is_stage_objects TYPE ty_stage_files
it_object_statuses TYPE ty_results_tt
RAISING
lcx_exception.
PRIVATE SECTION.
DATA mt_transport_objects TYPE scts_tadir.
ENDCLASS.
CLASS lcl_transport_objects IMPLEMENTATION.
METHOD constructor.
mt_transport_objects = it_transport_objects.
ENDMETHOD.
METHOD to_stage.
DATA: ls_transport_object TYPE tadir,
ls_local_file TYPE ty_file_item,
ls_object_status TYPE ty_result.
LOOP AT mt_transport_objects INTO ls_transport_object.
LOOP AT it_object_statuses INTO ls_object_status
WHERE obj_name = ls_transport_object-obj_name
AND obj_type = ls_transport_object-object.
CASE ls_object_status-lstate.
WHEN gc_state-added OR gc_state-modified.
IF ls_transport_object-delflag = abap_true.
lcx_exception=>raise( |Object { ls_transport_object-obj_name
} should be added/modified, but has deletion flag in transport| ).
ENDIF.
READ TABLE is_stage_objects-local
INTO ls_local_file
WITH KEY item-obj_name = ls_transport_object-obj_name
item-obj_type = ls_transport_object-object
file-filename = ls_object_status-filename.
IF sy-subrc <> 0.
lcx_exception=>raise( |Object { ls_transport_object-obj_name
} not found in the local repository files| ).
ENDIF.
io_stage->add(
iv_path = ls_local_file-file-path
iv_filename = ls_local_file-file-filename
iv_data = ls_local_file-file-data ).
WHEN gc_state-deleted.
IF ls_transport_object-delflag = abap_false.
lcx_exception=>raise( |Object { ls_transport_object-obj_name
} should be removed, but has NO deletion flag in transport| ).
ENDIF.
io_stage->rm(
iv_path = ls_object_status-path
iv_filename = ls_object_status-filename ).
WHEN OTHERS.
ASSERT 0 = 1. "Unexpected state
ENDCASE.
ENDLOOP.
IF sy-subrc <> 0.
lcx_exception=>raise( |Object { ls_transport_object-obj_name
} not found in the local repository files| ).
ENDIF.
ENDLOOP.
ENDMETHOD.
ENDCLASS.
CLASS lcl_transport_to_branch DEFINITION.
PUBLIC SECTION.
METHODS:
@ -220,17 +285,11 @@ CLASS lcl_transport_to_branch IMPLEMENTATION.
METHOD create.
DATA:
ls_transport_object TYPE LINE OF scts_tadir,
lt_items TYPE ty_files_item_tt,
ls_local_file TYPE LINE OF ty_files_item_tt,
ls_remote_file TYPE LINE OF ty_files_tt,
ls_item TYPE string,
lv_branch_name TYPE string,
ls_comment TYPE ty_comment,
lo_stage TYPE REF TO lcl_stage,
ls_stage_objects TYPE ty_stage_files,
lt_object_statuses TYPE ty_results_tt,
ls_object_status TYPE LINE OF ty_results_tt.
lt_object_statuses TYPE ty_results_tt.
lv_branch_name = lcl_git_branch_list=>complete_heads_branch_name(
lcl_git_branch_list=>normalize_branch_name( is_transport_to_branch-branch_name ) ).
@ -280,45 +339,15 @@ CLASS lcl_transport_to_branch IMPLEMENTATION.
rs_comment-comment = is_transport_to_branch-commit_text.
ENDMETHOD.
METHOD stage_transport_objects.
DATA lo_transport_objects TYPE REF TO lcl_transport_objects.
CREATE OBJECT lo_transport_objects
EXPORTING
it_transport_objects = it_transport_objects.
DATA ls_transport_object TYPE tadir.
DATA ls_local_file TYPE ty_file_item.
DATA ls_object_status TYPE ty_result.
LOOP AT it_transport_objects INTO ls_transport_object.
READ TABLE it_object_statuses INTO ls_object_status
WITH KEY obj_name = ls_transport_object-obj_name
obj_type = ls_transport_object-object.
IF sy-subrc <> 0.
lcx_exception=>raise( |Object { ls_transport_object-obj_name } not found in the local repository files | ).
ENDIF.
CASE ls_object_status-lstate.
WHEN gc_state-added OR gc_state-modified.
ASSERT ls_transport_object-delflag = abap_false.
READ TABLE is_stage_objects-local
INTO ls_local_file
WITH KEY item-obj_name = ls_transport_object-obj_name
item-obj_type = ls_transport_object-object.
IF sy-subrc <> 0.
lcx_exception=>raise( |Object { ls_transport_object-obj_name } not found in the local repository files | ).
ENDIF.
io_stage->add(
iv_path = ls_local_file-file-path
iv_filename = ls_local_file-file-filename
iv_data = ls_local_file-file-data ).
WHEN gc_state-deleted.
ASSERT ls_transport_object-delflag = abap_true.
io_stage->rm(
iv_path = ls_object_status-path
iv_filename = ls_object_status-filename ).
WHEN OTHERS.
ASSERT 0 = 1. "Unexpected state
ENDCASE.
ENDLOOP.
lo_transport_objects->to_stage(
io_stage = io_stage
is_stage_objects = is_stage_objects
it_object_statuses = it_object_statuses ).
ENDMETHOD.
ENDCLASS.

View File

@ -1247,9 +1247,7 @@ CLASS ltcl_html DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL.
style1 FOR TESTING RAISING lcx_exception.
METHODS:
setup,
last_line
RETURNING VALUE(rv_line) TYPE string.
setup.
ENDCLASS. "ltcl_html
@ -1331,15 +1329,6 @@ CLASS ltcl_html IMPLEMENTATION.
ENDMETHOD.
METHOD last_line.
DATA: lt_strings TYPE STANDARD TABLE OF string WITH DEFAULT KEY.
SPLIT mo_html->render( ) AT gc_newline INTO TABLE lt_strings.
READ TABLE lt_strings INDEX lines( lt_strings ) INTO rv_line.
ENDMETHOD.
METHOD style1.
DATA lv_exp TYPE string.
@ -2243,3 +2232,4 @@ CLASS ltcl_persistence_settings IMPLEMENTATION.
ENDCLASS.
INCLUDE zabapgit_unit_test_clas_intf.
INCLUDE zabapgit_unit_test_transport.

View File

@ -0,0 +1,361 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_UNIT_TEST_TRANSPORT
*&---------------------------------------------------------------------*
CLASS ltcl_transport_objects DEFINITION FOR TESTING.
PRIVATE SECTION.
METHODS:
add_new_to_local_files FOR TESTING RAISING cx_static_check,
modified_to_new_local_files FOR TESTING RAISING cx_static_check,
transport_not_in_repository FOR TESTING RAISING cx_static_check,
object_not_in_local_files FOR TESTING RAISING cx_static_check,
cant_be_added_with_del_flag FOR TESTING RAISING cx_static_check,
cant_be_modified_with_del_flag FOR TESTING RAISING cx_static_check,
deleted_to_removed_files FOR TESTING RAISING cx_static_check,
shouldnt_remove_no_delflag FOR TESTING RAISING cx_static_check,
should_add_all_local_files FOR TESTING RAISING cx_static_check,
should_delete_all_related FOR TESTING RAISING cx_static_check,
setup,
given_the_transport_object
IMPORTING iv_obj_name TYPE string
iv_obj_type TYPE string
iv_delflag TYPE abap_bool OPTIONAL,
given_the_object_status
IMPORTING
iv_obj_name TYPE string OPTIONAL
iv_obj_type TYPE string OPTIONAL
iv_filename TYPE string OPTIONAL
iv_path TYPE string OPTIONAL
iv_lstate TYPE char1,
given_the_local_file
IMPORTING iv_obj_name TYPE string
iv_obj_type TYPE string
iv_filename TYPE string
iv_path TYPE string
iv_data TYPE string
RETURNING VALUE(rs_local_file) TYPE ty_file_item,
when_staging
RAISING lcx_exception,
then_file_should_be_added
IMPORTING
is_local_file TYPE ty_file_item,
then_it_should_raise_exception
IMPORTING
with_text TYPE string,
then_it_should_remove_at_stage
IMPORTING
iv_filename TYPE string
iv_path TYPE string.
DATA: mo_transport_objects TYPE REF TO lcl_transport_objects,
mt_transport_objects TYPE scts_tadir,
mt_object_statuses TYPE ty_results_tt,
ms_stage_objects TYPE ty_stage_files,
mo_stage TYPE REF TO lcl_stage.
ENDCLASS.
CLASS ltcl_transport_objects IMPLEMENTATION.
METHOD setup.
CREATE OBJECT mo_stage
EXPORTING
iv_branch_name = 'A_branch_name'
iv_branch_sha1 = 'Branch_SH1'.
ENDMETHOD.
METHOD add_new_to_local_files.
DATA ls_local_file TYPE ty_file_item.
given_the_transport_object(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS' ).
given_the_object_status(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS'
iv_filename = 'CL_FOO.abap'
iv_lstate = gc_state-added ).
ls_local_file = given_the_local_file(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS'
iv_filename = 'CL_FOO.abap'
iv_path = '/path'
iv_data = 'data' ).
when_staging( ).
then_file_should_be_added( ls_local_file ).
ENDMETHOD.
METHOD modified_to_new_local_files.
DATA ls_local_file TYPE ty_file_item.
given_the_transport_object(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS' ).
given_the_object_status(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS'
iv_filename = 'CL_FOO.abap'
iv_lstate = gc_state-modified ).
ls_local_file = given_the_local_file(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS'
iv_filename = 'CL_FOO.abap'
iv_path = '/path'
iv_data = 'data' ).
when_staging( ).
then_file_should_be_added( ls_local_file ).
ENDMETHOD.
METHOD should_add_all_local_files.
"Not only .abap, but also .xml and other includes
DATA ls_abap_local_file TYPE ty_file_item.
DATA ls_xml_local_file TYPE ty_file_item.
given_the_transport_object(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS' ).
given_the_object_status(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS'
iv_filename = 'CL_FOO.abap'
iv_lstate = gc_state-modified ).
given_the_object_status(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS'
iv_filename = 'CL_FOO.xml'
iv_lstate = gc_state-modified ).
ls_abap_local_file = given_the_local_file(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS'
iv_filename = 'CL_FOO.abap'
iv_path = '/path'
iv_data = 'data' ).
ls_xml_local_file = given_the_local_file(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS'
iv_filename = 'CL_FOO.xml'
iv_path = '/path'
iv_data = 'data' ).
when_staging( ).
then_file_should_be_added( ls_abap_local_file ).
then_file_should_be_added( ls_xml_local_file ).
ENDMETHOD.
METHOD transport_not_in_repository.
given_the_transport_object(
iv_obj_name = 'CL_A_CLASS_NOT_IN_REPO'
iv_obj_type = 'CLAS' ).
given_the_object_status(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS'
iv_lstate = gc_state-added ).
then_it_should_raise_exception(
with_text = 'Object CL_A_CLASS_NOT_IN_REPO not found in the local repository files' ).
ENDMETHOD.
METHOD object_not_in_local_files.
given_the_transport_object(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS' ).
given_the_object_status(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS'
iv_lstate = gc_state-added ).
given_the_local_file(
iv_obj_name = 'CL_ANOTHER_LOCAL_FILE'
iv_obj_type = 'CLAS'
iv_filename = 'CL_FOO.abap'
iv_path = '/path'
iv_data = 'data' ).
then_it_should_raise_exception(
with_text = 'Object CL_FOO not found in the local repository files' ).
ENDMETHOD.
METHOD cant_be_added_with_del_flag.
given_the_transport_object(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS'
iv_delflag = abap_true ).
given_the_object_status(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS'
iv_lstate = gc_state-added ).
then_it_should_raise_exception(
with_text = 'Object CL_FOO should be added/modified, but has deletion flag in transport' ).
ENDMETHOD.
METHOD cant_be_modified_with_del_flag.
given_the_transport_object(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS'
iv_delflag = abap_true ).
given_the_object_status(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS'
iv_lstate = gc_state-modified ).
then_it_should_raise_exception(
with_text = 'Object CL_FOO should be added/modified, but has deletion flag in transport' ).
ENDMETHOD.
METHOD deleted_to_removed_files.
given_the_transport_object(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS'
iv_delflag = abap_true ).
given_the_object_status(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS'
iv_filename = 'CL_FOO.abap'
iv_path = '/a_path'
iv_lstate = gc_state-deleted ).
when_staging( ).
then_it_should_remove_at_stage(
iv_filename = 'CL_FOO.abap'
iv_path = '/a_path' ).
ENDMETHOD.
METHOD should_delete_all_related.
"i.e. Should also delete the XMLs related to the transport objects
given_the_transport_object(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS'
iv_delflag = abap_true ).
given_the_object_status(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS'
iv_filename = 'CL_FOO.abap'
iv_path = '/a_path'
iv_lstate = gc_state-deleted ).
given_the_object_status(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS'
iv_filename = 'CL_FOO.xml'
iv_path = '/a_path'
iv_lstate = gc_state-deleted ).
when_staging( ).
then_it_should_remove_at_stage(
iv_filename = 'CL_FOO.abap'
iv_path = '/a_path' ).
then_it_should_remove_at_stage(
iv_filename = 'CL_FOO.xml'
iv_path = '/a_path' ).
ENDMETHOD.
METHOD shouldnt_remove_no_delflag.
given_the_transport_object(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS'
iv_delflag = abap_false ).
given_the_object_status(
iv_obj_name = 'CL_FOO'
iv_obj_type = 'CLAS'
iv_filename = 'CL_FOO.abap'
iv_path = '/a_path'
iv_lstate = gc_state-deleted ).
then_it_should_raise_exception(
with_text = 'Object CL_FOO should be removed, but has NO deletion flag in transport' ).
ENDMETHOD.
METHOD given_the_transport_object.
DATA ls_transport_object TYPE tadir.
ls_transport_object-obj_name = iv_obj_name.
ls_transport_object-object = iv_obj_type.
ls_transport_object-delflag = iv_delflag.
APPEND ls_transport_object TO mt_transport_objects.
ENDMETHOD.
METHOD given_the_object_status.
DATA ls_object_status TYPE ty_result.
ls_object_status-obj_name = iv_obj_name.
ls_object_status-obj_type = iv_obj_type.
ls_object_status-filename = iv_filename.
ls_object_status-path = iv_path.
ls_object_status-lstate = iv_lstate.
APPEND ls_object_status TO mt_object_statuses.
ENDMETHOD.
METHOD given_the_local_file.
rs_local_file-item-obj_name = iv_obj_name.
rs_local_file-item-obj_type = iv_obj_type.
rs_local_file-file-filename = iv_filename.
rs_local_file-file-path = iv_path.
rs_local_file-file-data = iv_data.
APPEND rs_local_file TO ms_stage_objects-local.
ENDMETHOD.
METHOD when_staging.
CREATE OBJECT mo_transport_objects
EXPORTING
it_transport_objects = mt_transport_objects.
mo_transport_objects->to_stage(
io_stage = mo_stage
is_stage_objects = ms_stage_objects
it_object_statuses = mt_object_statuses ).
ENDMETHOD.
METHOD then_file_should_be_added.
DATA: lt_staged_objects TYPE lcl_stage=>ty_stage_tt.
lt_staged_objects = mo_stage->get_all( ).
READ TABLE lt_staged_objects TRANSPORTING NO FIELDS
WITH KEY file-filename = is_local_file-file-filename
file-path = is_local_file-file-path
file-data = is_local_file-file-data
method = lcl_stage=>c_method-add.
IF sy-subrc <> 0.
cl_abap_unit_assert=>fail( |Object { is_local_file-file-filename } not added to stage| ).
ENDIF.
ENDMETHOD.
METHOD then_it_should_raise_exception.
DATA: lo_exception TYPE REF TO lcx_exception.
TRY.
when_staging( ).
cl_abap_unit_assert=>fail( 'Should have raised exception').
CATCH lcx_exception INTO lo_exception.
cl_abap_unit_assert=>assert_equals(
act = lo_exception->mv_text
exp = with_text ).
ENDTRY.
ENDMETHOD.
METHOD then_it_should_remove_at_stage.
DATA: lt_staged_objects TYPE lcl_stage=>ty_stage_tt.
lt_staged_objects = mo_stage->get_all( ).
READ TABLE lt_staged_objects TRANSPORTING NO FIELDS
WITH KEY file-filename = iv_filename
file-path = iv_path.
IF sy-subrc <> 0.
cl_abap_unit_assert=>fail( |Object { iv_filename } not removed in stage| ).
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_UNIT_TEST_TRANSPORT</NAME>
<STATE>A</STATE>
<VARCL>X</VARCL>
<SUBC>I</SUBC>
<RLOAD>E</RLOAD>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<ENTRY>Include ZABAPGIT_UNIT_TEST_TRANSPORT</ENTRY>
<LENGTH>36</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -264,17 +264,13 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION.
lo_tb_branch TYPE REF TO lcl_html_toolbar,
lv_key TYPE lcl_persistence_db=>ty_value,
lv_wp_opt LIKE gc_html_opt-crossout,
lv_pull_opt LIKE gc_html_opt-crossout,
lo_repo_online TYPE REF TO lcl_repo_online.
lv_pull_opt LIKE gc_html_opt-crossout.
CREATE OBJECT ro_toolbar.
CREATE OBJECT lo_tb_branch.
CREATE OBJECT lo_tb_advanced.
lv_key = mo_repo->get_key( ).
IF mo_repo->is_offline( ) = abap_false.
lo_repo_online ?= mo_repo.
ENDIF.
IF mo_repo->is_write_protected( ) = abap_true.
lv_wp_opt = gc_html_opt-crossout.
@ -315,6 +311,8 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION.
lo_tb_advanced->add( iv_txt = 'Make on-line'
iv_act = |{ gc_action-repo_remote_attach }?{ lv_key }| ).
ENDIF.
lo_tb_advanced->add( iv_txt = 'Repo settings'
iv_act = |{ gc_action-repo_settings }?{ lv_key }| ).
lo_tb_advanced->add( iv_txt = 'Update local checksums'
iv_act = |{ gc_action-repo_refresh_checksums }?{ lv_key }| ).
lo_tb_advanced->add( iv_txt = 'Remove'

View File

@ -69,40 +69,42 @@ ENDCLASS. "lcl_zip DEFINITION
CLASS lcl_zip IMPLEMENTATION.
METHOD get_message.
* method not in use?
ASSERT 0 = 1.
DATA: lv_returncode TYPE c,
lt_fields TYPE TABLE OF sval.
FIELD-SYMBOLS: <ls_field> LIKE LINE OF lt_fields.
APPEND INITIAL LINE TO lt_fields ASSIGNING <ls_field>.
<ls_field>-tabname = 'ABAPTXT255'.
<ls_field>-fieldname = 'LINE'.
<ls_field>-fieldtext = 'Commit message'. "#EC NOTEXT
<ls_field>-field_obl = abap_true.
CALL FUNCTION 'POPUP_GET_VALUES'
EXPORTING
no_value_check = abap_true
popup_title = 'Enter commit message' "#EC NOTEXT
IMPORTING
returncode = lv_returncode
TABLES
fields = lt_fields
EXCEPTIONS
error_in_fields = 1
OTHERS = 2.
IF sy-subrc <> 0.
lcx_exception=>raise( 'Error from POPUP_GET_VALUES' ).
ENDIF.
IF lv_returncode = 'A'.
lcx_exception=>raise( 'cancelled' ).
ENDIF.
READ TABLE lt_fields INDEX 1 ASSIGNING <ls_field>.
ASSERT sy-subrc = 0.
rv_message = <ls_field>-value.
* DATA: lv_returncode TYPE c,
* lt_fields TYPE TABLE OF sval.
*
* FIELD-SYMBOLS: <ls_field> LIKE LINE OF lt_fields.
*
*
* APPEND INITIAL LINE TO lt_fields ASSIGNING <ls_field>.
* <ls_field>-tabname = 'ABAPTXT255'.
* <ls_field>-fieldname = 'LINE'.
* <ls_field>-fieldtext = 'Commit message'. "#EC NOTEXT
* <ls_field>-field_obl = abap_true.
*
* CALL FUNCTION 'POPUP_GET_VALUES'
* EXPORTING
* no_value_check = abap_true
* popup_title = 'Enter commit message' "#EC NOTEXT
* IMPORTING
* returncode = lv_returncode
* TABLES
* fields = lt_fields
* EXCEPTIONS
* error_in_fields = 1
* OTHERS = 2.
* IF sy-subrc <> 0.
* lcx_exception=>raise( 'Error from POPUP_GET_VALUES' ).
* ENDIF.
* IF lv_returncode = 'A'.
* lcx_exception=>raise( 'cancelled' ).
* ENDIF.
*
* READ TABLE lt_fields INDEX 1 ASSIGNING <ls_field>.
* ASSERT sy-subrc = 0.
* rv_message = <ls_field>-value.
ENDMETHOD. "get_message
@ -396,7 +398,6 @@ CLASS lcl_zip IMPLEMENTATION.
METHOD export.
DATA: lo_log TYPE REF TO lcl_log,
lv_index TYPE i,
lt_zip TYPE ty_files_item_tt.
FIELD-SYMBOLS: <ls_zip> LIKE LINE OF lt_zip.