From 978a8aa65c153b722d657e941551354344d94237 Mon Sep 17 00:00:00 2001 From: Marc Bernard <59966492+mbtools@users.noreply.github.com> Date: Tue, 9 Jan 2024 12:31:46 +0100 Subject: [PATCH] Fix APACK issues (#6743) Co-authored-by: Lars Hvam --- src/apack/zcl_abapgit_apack_helper.clas.abap | 59 +++++++++---- src/apack/zcl_abapgit_apack_reader.clas.abap | 83 +++++++++---------- .../zif_abapgit_apack_definitions.intf.abap | 7 ++ src/repo/zcl_abapgit_repo.clas.abap | 6 +- 4 files changed, 91 insertions(+), 64 deletions(-) diff --git a/src/apack/zcl_abapgit_apack_helper.clas.abap b/src/apack/zcl_abapgit_apack_helper.clas.abap index 3d34f202b..5d838de8b 100644 --- a/src/apack/zcl_abapgit_apack_helper.clas.abap +++ b/src/apack/zcl_abapgit_apack_helper.clas.abap @@ -24,16 +24,14 @@ CLASS zcl_abapgit_apack_helper DEFINITION VALUE(rs_file) TYPE zif_abapgit_git_definitions=>ty_file RAISING zcx_abapgit_exception . + + CLASS-METHODS get_manifest_implementations + RETURNING + VALUE(rt_manifest_implementations) TYPE zif_abapgit_apack_definitions=>ty_manifest_declarations. + PROTECTED SECTION. PRIVATE SECTION. - TYPES: - BEGIN OF ty_manifest_declaration, - clsname TYPE seometarel-clsname, - devclass TYPE devclass, - END OF ty_manifest_declaration . - TYPES: - ty_manifest_declarations TYPE STANDARD TABLE OF ty_manifest_declaration WITH NON-UNIQUE DEFAULT KEY . TYPES: BEGIN OF ty_dependency_status, met TYPE zif_abapgit_definitions=>ty_yes_no_partial. @@ -235,20 +233,12 @@ CLASS zcl_abapgit_apack_helper IMPLEMENTATION. METHOD get_installed_packages. DATA: lo_apack_reader TYPE REF TO zcl_abapgit_apack_reader, - lt_manifest_implementation TYPE ty_manifest_declarations, - ls_manifest_implementation TYPE ty_manifest_declaration, + lt_manifest_implementation TYPE zif_abapgit_apack_definitions=>ty_manifest_declarations, + ls_manifest_implementation TYPE zif_abapgit_apack_definitions=>ty_manifest_declaration, lo_manifest_provider TYPE REF TO object, ls_descriptor TYPE zif_abapgit_apack_definitions=>ty_descriptor. - SELECT seometarel~clsname tadir~devclass FROM seometarel "#EC CI_NOORDER - INNER JOIN tadir ON seometarel~clsname = tadir~obj_name "#EC CI_BUFFJOIN - INTO TABLE lt_manifest_implementation - WHERE tadir~pgmid = 'R3TR' - AND tadir~object = 'CLAS' - AND seometarel~version = '1' - AND ( seometarel~refclsname = zif_abapgit_apack_definitions=>c_apack_interface_cust - OR seometarel~refclsname = zif_abapgit_apack_definitions=>c_apack_interface_sap ) - ORDER BY clsname devclass. + lt_manifest_implementation = get_manifest_implementations( ). LOOP AT lt_manifest_implementation INTO ls_manifest_implementation. CLEAR: lo_manifest_provider, lo_apack_reader. @@ -276,6 +266,39 @@ CLASS zcl_abapgit_apack_helper IMPLEMENTATION. ENDMETHOD. + METHOD get_manifest_implementations. + + DATA lt_refclsname TYPE RANGE OF abap_classname. + DATA ls_refclsname LIKE LINE OF lt_refclsname. + + ls_refclsname-sign = 'I'. + ls_refclsname-option = 'EQ'. + ls_refclsname-low = zif_abapgit_apack_definitions=>c_apack_interface_cust. + INSERT ls_refclsname INTO TABLE lt_refclsname. + + ls_refclsname-sign = 'I'. + ls_refclsname-option = 'EQ'. + ls_refclsname-low = zif_abapgit_apack_definitions=>c_apack_interface_sap. + INSERT ls_refclsname INTO TABLE lt_refclsname. + + ls_refclsname-sign = 'I'. + ls_refclsname-option = 'CP'. + ls_refclsname-low = zif_abapgit_apack_definitions=>c_apack_interface_nspc. + INSERT ls_refclsname INTO TABLE lt_refclsname. + + " Find all classes that implement customer or SAP version of APACK interface + SELECT seometarel~clsname tadir~devclass FROM seometarel "#EC CI_NOORDER + INNER JOIN tadir ON seometarel~clsname = tadir~obj_name "#EC CI_BUFFJOIN + INTO TABLE rt_manifest_implementations + WHERE tadir~pgmid = 'R3TR' + AND tadir~object = 'CLAS' + AND seometarel~version = '1' + AND seometarel~refclsname IN lt_refclsname + ORDER BY clsname devclass ##SUBRC_OK. + + ENDMETHOD. + + METHOD show_dependencies_popup. DATA: lo_alv TYPE REF TO cl_salv_table, diff --git a/src/apack/zcl_abapgit_apack_reader.clas.abap b/src/apack/zcl_abapgit_apack_reader.clas.abap index a28f11267..ffd82e100 100644 --- a/src/apack/zcl_abapgit_apack_reader.clas.abap +++ b/src/apack/zcl_abapgit_apack_reader.clas.abap @@ -43,14 +43,18 @@ CLASS zcl_abapgit_apack_reader DEFINITION METHODS constructor IMPORTING !iv_package_name TYPE ty_package_name . + METHODS refresh. PROTECTED SECTION. PRIVATE SECTION. TYPES: - BEGIN OF ty_s_manifest_declaration, - clsname TYPE seoclsname, - devclass TYPE devclass, - END OF ty_s_manifest_declaration . + BEGIN OF ty_instance, + package TYPE ty_package_name, + instance TYPE REF TO zcl_abapgit_apack_reader, + END OF ty_instance, + ty_instances TYPE HASHED TABLE OF ty_instance WITH UNIQUE KEY package. + + CLASS-DATA gt_instances TYPE ty_instances. DATA mv_package_name TYPE ty_package_name . DATA ms_cached_descriptor TYPE zif_abapgit_apack_definitions=>ty_descriptor . @@ -70,10 +74,11 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_APACK_READER IMPLEMENTATION. +CLASS zcl_abapgit_apack_reader IMPLEMENTATION. METHOD constructor. + ASSERT iv_package_name IS NOT INITIAL. mv_package_name = iv_package_name. ENDMETHOD. @@ -117,9 +122,23 @@ CLASS ZCL_ABAPGIT_APACK_READER IMPLEMENTATION. METHOD create_instance. - CREATE OBJECT ro_manifest_reader - EXPORTING - iv_package_name = iv_package_name. + + DATA ls_instance TYPE ty_instance. + + " One instance per package + READ TABLE gt_instances INTO ls_instance WITH TABLE KEY package = iv_package_name. + IF sy-subrc <> 0. + ls_instance-package = iv_package_name. + + CREATE OBJECT ls_instance-instance + EXPORTING + iv_package_name = iv_package_name. + + INSERT ls_instance INTO TABLE gt_instances. + ENDIF. + + ro_manifest_reader = ls_instance-instance. + ENDMETHOD. @@ -146,6 +165,7 @@ CLASS ZCL_ABAPGIT_APACK_READER IMPLEMENTATION. ms_cached_descriptor-sem_version = zcl_abapgit_version=>conv_str_to_version( ms_cached_descriptor-version ). LOOP AT ms_cached_descriptor-dependencies ASSIGNING . + TRANSLATE -version TO LOWER CASE. -sem_version = zcl_abapgit_version=>conv_str_to_version( -version ). ENDLOOP. @@ -171,44 +191,15 @@ CLASS ZCL_ABAPGIT_APACK_READER IMPLEMENTATION. DATA: lo_manifest_provider TYPE REF TO object, lv_package TYPE devclass, lt_packages TYPE zif_abapgit_sap_package=>ty_devclass_tt, - ls_manifest_implementation TYPE ty_s_manifest_declaration, - lt_manifest_implementation TYPE STANDARD TABLE OF ty_s_manifest_declaration WITH DEFAULT KEY. - DATA lt_refclsname TYPE RANGE OF abap_classname. - DATA ls_refclsname LIKE LINE OF lt_refclsname. + ls_manifest_implementation TYPE zif_abapgit_apack_definitions=>ty_manifest_declaration, + lt_manifest_implementation TYPE zif_abapgit_apack_definitions=>ty_manifest_declarations. + IF mv_is_cached IS INITIAL. - IF mv_package_name IS NOT INITIAL. lt_packages = zcl_abapgit_factory=>get_sap_package( mv_package_name )->list_subpackages( ). INSERT mv_package_name INTO TABLE lt_packages. - ENDIF. - IF mv_is_cached IS INITIAL AND lt_packages IS NOT INITIAL. - ls_refclsname-sign = 'I'. - ls_refclsname-option = 'EQ'. - ls_refclsname-low = zif_abapgit_apack_definitions=>c_apack_interface_cust. - INSERT ls_refclsname INTO TABLE lt_refclsname. - - ls_refclsname-sign = 'I'. - ls_refclsname-option = 'EQ'. - ls_refclsname-low = zif_abapgit_apack_definitions=>c_apack_interface_sap. - INSERT ls_refclsname INTO TABLE lt_refclsname. - - IF mv_package_name CA '/'. - ls_refclsname-sign = 'I'. - ls_refclsname-option = 'CP'. - ls_refclsname-low = zif_abapgit_apack_definitions=>c_apack_interface_nspc. - INSERT ls_refclsname INTO TABLE lt_refclsname. - ENDIF. - - " Find all classes that implement customer or SAP version of APACK interface - SELECT seometarel~clsname tadir~devclass FROM seometarel "#EC CI_NOORDER - INNER JOIN tadir ON seometarel~clsname = tadir~obj_name "#EC CI_BUFFJOIN - INTO TABLE lt_manifest_implementation - WHERE tadir~pgmid = 'R3TR' AND - tadir~object = 'CLAS' AND - seometarel~version = '1' AND - seometarel~refclsname IN lt_refclsname - ORDER BY clsname devclass. + lt_manifest_implementation = zcl_abapgit_apack_helper=>get_manifest_implementations( ). LOOP AT lt_packages INTO lv_package. READ TABLE lt_manifest_implementation INTO ls_manifest_implementation WITH KEY devclass = lv_package. @@ -241,14 +232,16 @@ CLASS ZCL_ABAPGIT_APACK_READER IMPLEMENTATION. ls_returned_manifest = get_manifest_descriptor( ). - rv_has_manifest = abap_false. - IF ls_returned_manifest IS NOT INITIAL. - rv_has_manifest = abap_true. - ENDIF. + rv_has_manifest = boolc( ls_returned_manifest IS NOT INITIAL ). ENDMETHOD. + METHOD refresh. + CLEAR: mv_is_cached, ms_cached_descriptor. + ENDMETHOD. + + METHOD set_manifest_descriptor. mv_is_cached = abap_true. ms_cached_descriptor = is_manifest_descriptor. diff --git a/src/apack/zif_abapgit_apack_definitions.intf.abap b/src/apack/zif_abapgit_apack_definitions.intf.abap index 5c4f71777..576d85c82 100644 --- a/src/apack/zif_abapgit_apack_definitions.intf.abap +++ b/src/apack/zif_abapgit_apack_definitions.intf.abap @@ -32,6 +32,13 @@ INTERFACE zif_abapgit_apack_definitions PUBLIC . ty_descriptors TYPE STANDARD TABLE OF ty_descriptor WITH NON-UNIQUE DEFAULT KEY. + TYPES: + BEGIN OF ty_manifest_declaration, + clsname TYPE seoclsname, + devclass TYPE devclass, + END OF ty_manifest_declaration, + ty_manifest_declarations TYPE STANDARD TABLE OF ty_manifest_declaration WITH DEFAULT KEY. + CONSTANTS c_dot_apack_manifest TYPE string VALUE '.apack-manifest.xml' ##NO_TEXT. CONSTANTS c_repository_type_abapgit TYPE ty_repository_type VALUE 'abapGit' ##NO_TEXT. CONSTANTS c_apack_interface_sap TYPE seoclsname VALUE 'IF_APACK_MANIFEST' ##NO_TEXT. diff --git a/src/repo/zcl_abapgit_repo.clas.abap b/src/repo/zcl_abapgit_repo.clas.abap index 59aa0ad57..aa3330933 100644 --- a/src/repo/zcl_abapgit_repo.clas.abap +++ b/src/repo/zcl_abapgit_repo.clas.abap @@ -65,7 +65,9 @@ CLASS zcl_abapgit_repo DEFINITION zcx_abapgit_exception . METHODS get_dot_apack RETURNING - VALUE(ro_dot_apack) TYPE REF TO zcl_abapgit_apack_reader . + VALUE(ro_dot_apack) TYPE REF TO zcl_abapgit_apack_reader + RAISING + zcx_abapgit_exception. METHODS get_log RETURNING VALUE(ri_log) TYPE REF TO zif_abapgit_log . @@ -878,6 +880,8 @@ CLASS zcl_abapgit_repo IMPLEMENTATION. CLEAR mt_local. ENDIF. + get_dot_apack( )->refresh( ). + ENDMETHOD.