CLASS zcl_abapgit_services_abapgit DEFINITION PUBLIC FINAL CREATE PUBLIC . PUBLIC SECTION. CONSTANTS c_abapgit_homepage TYPE string VALUE 'http://www.abapgit.org' ##NO_TEXT. CONSTANTS c_abapgit_wikipage TYPE string VALUE 'http://docs.abapgit.org' ##NO_TEXT. CONSTANTS c_package_abapgit TYPE devclass VALUE '$ABAPGIT' ##NO_TEXT. CONSTANTS c_abapgit_url TYPE string VALUE 'https://github.com/larshp/abapGit.git' ##NO_TEXT. CONSTANTS c_abapgit_tcode TYPE tcode VALUE `ZABAPGIT` ##NO_TEXT. CLASS-METHODS open_abapgit_homepage RAISING zcx_abapgit_exception . CLASS-METHODS open_abapgit_wikipage RAISING zcx_abapgit_exception . CLASS-METHODS install_abapgit RAISING zcx_abapgit_exception. CLASS-METHODS is_installed RETURNING VALUE(rv_devclass) TYPE tadir-devclass . CLASS-METHODS prepare_gui_startup RAISING zcx_abapgit_exception . PROTECTED SECTION. PRIVATE SECTION. CLASS-METHODS do_install IMPORTING iv_title TYPE c iv_text TYPE c iv_url TYPE string iv_package TYPE devclass RAISING zcx_abapgit_exception. CLASS-METHODS set_start_repo_from_package IMPORTING iv_package TYPE devclass RAISING zcx_abapgit_exception. CLASS-METHODS get_package_from_adt RETURNING VALUE(rv_package) TYPE devclass. ENDCLASS. CLASS ZCL_ABAPGIT_SERVICES_ABAPGIT IMPLEMENTATION. METHOD do_install. DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, lv_answer TYPE c LENGTH 1. lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm( iv_titlebar = iv_title iv_text_question = iv_text iv_text_button_1 = 'Continue' iv_text_button_2 = 'Cancel' iv_default_button = '2' iv_display_cancel_button = abap_false ). "#EC NOTEXT IF lv_answer <> '1'. RETURN. ENDIF. IF abap_false = zcl_abapgit_repo_srv=>get_instance( )->is_repo_installed( iv_url = iv_url iv_target_package = iv_package ). zcl_abapgit_factory=>get_sap_package( iv_package )->create_local( ). lo_repo = zcl_abapgit_repo_srv=>get_instance( )->new_online( iv_url = iv_url iv_branch_name = 'refs/heads/master' iv_package = iv_package ) ##NO_TEXT. zcl_abapgit_services_repo=>gui_deserialize( lo_repo ). zcl_abapgit_services_repo=>toggle_favorite( lo_repo->get_key( ) ). ENDIF. COMMIT WORK. ENDMETHOD. METHOD get_package_from_adt. DATA: ls_item TYPE zif_abapgit_definitions=>ty_item, lr_context TYPE REF TO data, lt_fields TYPE tihttpnvp. FIELD-SYMBOLS: TYPE any, TYPE string, LIKE LINE OF lt_fields. ls_item-obj_type = 'CLAS'. ls_item-obj_name = 'CL_ADT_GUI_INTEGRATION_CONTEXT'. IF zcl_abapgit_objects=>exists( ls_item ) = abap_false. " ADT is not supported in this NW release RETURN. ENDIF. TRY. CREATE DATA lr_context TYPE ('CL_ADT_GUI_INTEGRATION_CONTEXT=>TY_CONTEXT_INFO'). ASSIGN lr_context->* TO . ASSERT sy-subrc = 0. CALL METHOD ('CL_ADT_GUI_INTEGRATION_CONTEXT')=>read_context RECEIVING result = . ASSIGN COMPONENT 'PARAMETERS' OF STRUCTURE TO . ASSERT sy-subrc = 0. lt_fields = cl_http_utility=>string_to_fields( cl_http_utility=>unescape_url( ) ). READ TABLE lt_fields ASSIGNING WITH KEY name = 'p_package_name'. IF sy-subrc = 0. rv_package = -value. " We want to open the repo just once. Therefore we delete the parameters " and initialize the ADT context. CLEAR . CALL METHOD ('CL_ADT_GUI_INTEGRATION_CONTEXT')=>initialize_instance EXPORTING context_info = . ENDIF. CATCH cx_root. " Some problems with dynamic ADT access. " Let's ignore it for now and fail silently ENDTRY. ENDMETHOD. METHOD install_abapgit. CONSTANTS lc_title TYPE c LENGTH 40 VALUE 'Install abapGit'. DATA lv_text TYPE c LENGTH 100. IF NOT is_installed( ) IS INITIAL. lv_text = 'Seems like abapGit package is already installed. No changes to be done'. zcl_abapgit_ui_factory=>get_popups( )->popup_to_inform( iv_titlebar = lc_title iv_text_message = lv_text ). RETURN. ENDIF. lv_text = |Confirm to install current version of abapGit to package { c_package_abapgit }|. do_install( iv_title = lc_title iv_text = lv_text iv_url = c_abapgit_url iv_package = c_package_abapgit ). ENDMETHOD. METHOD is_installed. SELECT SINGLE devclass FROM tadir INTO rv_devclass WHERE object = 'TRAN' AND obj_name = c_abapgit_tcode. ENDMETHOD. METHOD open_abapgit_homepage. cl_gui_frontend_services=>execute( EXPORTING document = c_abapgit_homepage EXCEPTIONS OTHERS = 1 ). IF sy-subrc <> 0. zcx_abapgit_exception=>raise( 'Opening page in external browser failed.' ). ENDIF. ENDMETHOD. METHOD open_abapgit_wikipage. cl_gui_frontend_services=>execute( EXPORTING document = c_abapgit_wikipage EXCEPTIONS OTHERS = 1 ). IF sy-subrc <> 0. zcx_abapgit_exception=>raise( 'Opening page in external browser failed.' ). ENDIF. ENDMETHOD. METHOD prepare_gui_startup. DATA: lv_repo_key TYPE zif_abapgit_persistence=>ty_value, lv_package TYPE devclass, lv_package_adt TYPE devclass. IF zcl_abapgit_persist_settings=>get_instance( )->read( )->get_show_default_repo( ) = abap_false. " Don't show the last seen repo at startup zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( || ). ENDIF. " We have three special cases for gui startup " - open a specific repo by repo key " - open a specific repo by package name " - open a specific repo by package name provided by ADT " These overrule the last shown repo GET PARAMETER ID zif_abapgit_definitions=>c_spagpa_param_repo_key FIELD lv_repo_key. GET PARAMETER ID zif_abapgit_definitions=>c_spagpa_param_package FIELD lv_package. lv_package_adt = get_package_from_adt( ). IF lv_repo_key IS NOT INITIAL. SET PARAMETER ID zif_abapgit_definitions=>c_spagpa_param_repo_key FIELD ''. zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( lv_repo_key ). ELSEIF lv_package IS NOT INITIAL. SET PARAMETER ID zif_abapgit_definitions=>c_spagpa_param_package FIELD ''. set_start_repo_from_package( lv_package ). ELSEIF lv_package_adt IS NOT INITIAL. set_start_repo_from_package( lv_package_adt ). ENDIF. ENDMETHOD. METHOD set_start_repo_from_package. DATA: lo_repo TYPE REF TO zcl_abapgit_repo, lt_r_package TYPE RANGE OF devclass, ls_r_package LIKE LINE OF lt_r_package, lt_superpackages TYPE zif_abapgit_sap_package=>ty_devclass_tt, lo_package TYPE REF TO zif_abapgit_sap_package, lt_repo_list TYPE zif_abapgit_definitions=>ty_repo_ref_tt. FIELD-SYMBOLS: TYPE LINE OF zif_abapgit_definitions=>ty_repo_ref_tt, LIKE LINE OF lt_superpackages. lo_package = zcl_abapgit_factory=>get_sap_package( iv_package ). IF lo_package->exists( ) = abap_false. RETURN. ENDIF. ls_r_package-sign = 'I'. ls_r_package-option = 'EQ'. ls_r_package-low = iv_package. INSERT ls_r_package INTO TABLE lt_r_package. " Also consider superpackages. E.g. when some open $abapgit_ui, abapGit repo " should be found via package $abapgit lt_superpackages = lo_package->list_superpackages( ). LOOP AT lt_superpackages ASSIGNING . ls_r_package-low = . INSERT ls_r_package INTO TABLE lt_r_package. ENDLOOP. lt_repo_list = zcl_abapgit_repo_srv=>get_instance( )->list( ). LOOP AT lt_repo_list ASSIGNING . IF ->get_package( ) IN lt_r_package. lo_repo = . EXIT. ENDIF. ENDLOOP. IF lo_repo IS BOUND. zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( lo_repo->get_key( ) ). ENDIF. ENDMETHOD. ENDCLASS.