From 9e3025d8dcb2c6aaa0eed2bcbd89d7eb117cf90d Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sat, 13 Jan 2018 11:43:10 +0100 Subject: [PATCH] lcl_stage to global (#1133) * lcl_stage to global * lcl_syntax to global * move login manager unit tests * html action utils to global * fix indentation --- src/syntax/package.devc.xml | 10 + src/syntax/zcl_abapgit_syntax_abap.clas.abap | 288 ++++ src/syntax/zcl_abapgit_syntax_abap.clas.xml | 18 + .../zcl_abapgit_syntax_highlighter.clas.abap | 236 ++++ ...t_syntax_highlighter.clas.testclasses.abap | 609 ++++++++ .../zcl_abapgit_syntax_highlighter.clas.xml | 20 + src/syntax/zcl_abapgit_syntax_xml.clas.abap | 117 ++ src/syntax/zcl_abapgit_syntax_xml.clas.xml | 18 + .../zcl_abapgit_html_action_utils.clas.abap | 434 ++++++ ...it_html_action_utils.clas.testclasses.abap | 253 ++++ src/ui/zcl_abapgit_html_action_utils.clas.xml | 19 + src/utils/zcl_abapgit_login_manager.clas.abap | 57 +- ...bapgit_login_manager.clas.testclasses.abap | 65 + src/utils/zcl_abapgit_login_manager.clas.xml | 1 + src/zabapgit_background.prog.abap | 4 +- src/zabapgit_git.prog.abap | 10 +- src/zabapgit_gui_router.prog.abap | 21 +- src/zabapgit_html_action_utils.prog.abap | 397 +----- src/zabapgit_page_background.prog.abap | 2 +- src/zabapgit_page_branch_overview.prog.abap | 2 +- src/zabapgit_page_commit.prog.abap | 13 +- src/zabapgit_page_db.prog.abap | 8 +- src/zabapgit_page_diff.prog.abap | 4 +- src/zabapgit_page_merge.prog.abap | 2 +- src/zabapgit_page_repo_settings.prog.abap | 2 +- src/zabapgit_page_settings.prog.abap | 2 +- src/zabapgit_page_stage.prog.abap | 20 +- src/zabapgit_repo.prog.abap | 4 +- src/zabapgit_repo_impl.prog.abap | 4 +- src/zabapgit_services_git.prog.abap | 2 +- src/zabapgit_stage.prog.abap | 193 +-- src/zabapgit_syntax_highlighter.prog.abap | 1252 +---------------- src/zabapgit_transport.prog.abap | 6 +- src/zabapgit_unit_test.prog.abap | 320 ----- src/zabapgit_unit_test_transport.prog.abap | 11 +- src/zabapgit_view_repo.prog.abap | 10 +- src/zcl_abapgit_stage.clas.abap | 208 +++ src/zcl_abapgit_stage.clas.xml | 18 + 38 files changed, 2411 insertions(+), 2249 deletions(-) create mode 100644 src/syntax/package.devc.xml create mode 100644 src/syntax/zcl_abapgit_syntax_abap.clas.abap create mode 100644 src/syntax/zcl_abapgit_syntax_abap.clas.xml create mode 100644 src/syntax/zcl_abapgit_syntax_highlighter.clas.abap create mode 100644 src/syntax/zcl_abapgit_syntax_highlighter.clas.testclasses.abap create mode 100644 src/syntax/zcl_abapgit_syntax_highlighter.clas.xml create mode 100644 src/syntax/zcl_abapgit_syntax_xml.clas.abap create mode 100644 src/syntax/zcl_abapgit_syntax_xml.clas.xml create mode 100644 src/ui/zcl_abapgit_html_action_utils.clas.abap create mode 100644 src/ui/zcl_abapgit_html_action_utils.clas.testclasses.abap create mode 100644 src/ui/zcl_abapgit_html_action_utils.clas.xml create mode 100644 src/utils/zcl_abapgit_login_manager.clas.testclasses.abap create mode 100644 src/zcl_abapgit_stage.clas.abap create mode 100644 src/zcl_abapgit_stage.clas.xml diff --git a/src/syntax/package.devc.xml b/src/syntax/package.devc.xml new file mode 100644 index 000000000..fb67153d2 --- /dev/null +++ b/src/syntax/package.devc.xml @@ -0,0 +1,10 @@ + + + + + + Syntax highlighting + + + + diff --git a/src/syntax/zcl_abapgit_syntax_abap.clas.abap b/src/syntax/zcl_abapgit_syntax_abap.clas.abap new file mode 100644 index 000000000..8013a0eb2 --- /dev/null +++ b/src/syntax/zcl_abapgit_syntax_abap.clas.abap @@ -0,0 +1,288 @@ +CLASS zcl_abapgit_syntax_abap DEFINITION + PUBLIC + INHERITING FROM zcl_abapgit_syntax_highlighter + CREATE PUBLIC . + + PUBLIC SECTION. + + CLASS-METHODS class_constructor. + METHODS constructor. + + CONSTANTS: + BEGIN OF c_css, + keyword TYPE string VALUE 'keyword', "#EC NOTEXT + text TYPE string VALUE 'text', "#EC NOTEXT + comment TYPE string VALUE 'comment', "#EC NOTEXT + END OF c_css, + + BEGIN OF c_token, + keyword TYPE c VALUE 'K', "#EC NOTEXT + text TYPE c VALUE 'T', "#EC NOTEXT + comment TYPE c VALUE 'C', "#EC NOTEXT + END OF c_token, + + BEGIN OF c_regex, + comment TYPE string VALUE '##|"|^\*', + text TYPE string VALUE '`|''|\||\{|\}', + keyword TYPE string VALUE '&&|\b[-_a-z0-9]+\b', + END OF c_regex. + + PROTECTED SECTION. + + CLASS-DATA gt_keywords TYPE HASHED TABLE OF string WITH UNIQUE KEY table_line. + + CLASS-METHODS init_keywords. + CLASS-METHODS is_keyword + IMPORTING iv_chunk TYPE string + RETURNING VALUE(rv_yes) TYPE abap_bool. + + METHODS order_matches REDEFINITION. + METHODS parse_line REDEFINITION. + +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_SYNTAX_ABAP IMPLEMENTATION. + + + METHOD class_constructor. + + init_keywords( ). + + ENDMETHOD. " class_constructor + + + METHOD constructor. + + super->constructor( ). + + " Initialize instances of regular expression + + add_rule( iv_regex = c_regex-keyword + iv_token = c_token-keyword + iv_style = c_css-keyword ). + + add_rule( iv_regex = c_regex-comment + iv_token = c_token-comment + iv_style = c_css-comment ). + + add_rule( iv_regex = c_regex-text + iv_token = c_token-text + iv_style = c_css-text ). + + ENDMETHOD. " constructor + + + METHOD init_keywords. + + DATA: lv_keywords TYPE string, + lt_keywords TYPE STANDARD TABLE OF string. + + lv_keywords = + '&&|?TO|ABAP-SOURCE|ABBREVIATED|ABS|ABSTRACT|ACCEPT|ACCEPTING|ACCESSPOLICY' && + '|ACCORDING|ACOS|ACTIVATION|ACTUAL|ADD|ADD-CORRESPONDING|ADJACENT|AFTER|ALIAS' && + '|ALIASES|ALIGN|ALL|ALLOCATE|ALPHA|ANALYSIS|ANALYZER|AND|ANY|APPEND|APPENDAGE' && + '|APPENDING|APPLICATION|ARCHIVE|AREA|ARITHMETIC|AS|ASCENDING|ASIN|ASPECT|ASSERT' && + '|ASSIGN|ASSIGNED|ASSIGNING|ASSOCIATION|ASYNCHRONOUS|AT|ATAN|ATTRIBUTES|AUTHORITY' && + '|AUTHORITY-CHECK|AVG|BACK|BACKGROUND|BACKUP|BACKWARD|BADI|BASE|BEFORE|BEGIN' && + '|BETWEEN|BIG|BINARY|BINDING|BIT|BIT-AND|BIT-NOT|BIT-OR|BIT-XOR|BLACK|BLANK' && + '|BLANKS|BLOB|BLOCK|BLOCKS|BLUE|BOUND|BOUNDARIES|BOUNDS|BOXED|BREAK-POINT|BT' && + '|BUFFER|BY|BYPASSING|BYTE|BYTE-CA|BYTE-CN|BYTE-CO|BYTE-CS|BYTE-NA|BYTE-NS' && + '|BYTE-ORDER|C|CA|CALL|CALLING|CASE|CAST|CASTING|CATCH|CEIL|CENTER|CENTERED' && + '|CHAIN|CHAIN-INPUT|CHAIN-REQUEST|CHANGE|CHANGING|CHANNELS|CHARACTER|CHARLEN' && + '|CHAR-TO-HEX|CHECK|CHECKBOX|CI_|CIRCULAR|CLASS|CLASS-CODING|CLASS-DATA' && + '|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|CLEANUP|CLEAR|CLIENT|CLOB|CLOCK|CLOSE' && + '|CN|CNT|CO|COALESCE|CODE|CODING|COL_BACKGROUND|COL_GROUP|COL_HEADING|COL_KEY' && + '|COL_NEGATIVE|COL_NORMAL|COL_POSITIVE|COL_TOTAL|COLLECT|COLOR|COLUMN|COLUMNS' && + '|COMMENT|COMMENTS|COMMIT|COMMON|COMMUNICATION|COMPARING|COMPONENT|COMPONENTS' && + '|COMPRESSION|COMPUTE|CONCAT|CONCATENATE|COND|CONDENSE|CONDITION|CONNECT' && + '|CONNECTION|CONSTANTS|CONTEXT|CONTEXTS|CONTINUE|CONTROL|CONTROLS|CONV|CONVERSION' && + '|CONVERT|COPIES|COPY|CORRESPONDING|COS|COSH|COUNT|COUNTRY|COVER|CP|CPI|CREATE' && + '|CREATING|CRITICAL|CS|CURRENCY|CURRENCY_CONVERSION|CURRENT|CURSOR|CURSOR-SELECTION' && + '|CUSTOMER|CUSTOMER-FUNCTION|DANGEROUS|DATA|DATABASE|DATAINFO|DATASET|DATE' && + '|DAYLIGHT|DBMAXLEN|DD/MM/YY|DD/MM/YYYY|DDMMYY|DEALLOCATE|DECIMAL_SHIFT|DECIMALS' && + '|DECLARATIONS|DEEP|DEFAULT|DEFERRED|DEFINE|DEFINING|DEFINITION|DELETE|DELETING' && + '|DEMAND|DEPARTMENT|DESCENDING|DESCRIBE|DESTINATION|DETAIL|DIALOG|DIRECTORY' && + '|DISCONNECT|DISPLAY|DISPLAY-MODE|DISTANCE|DISTINCT|DIV|DIVIDE|DIVIDE-CORRESPONDING' && + '|DIVISION|DO|DUMMY|DUPLICATE|DUPLICATES|DURATION|DURING|DYNAMIC|DYNPRO|E|EACH' && + '|EDIT|EDITOR-CALL|ELSE|ELSEIF|EMPTY|ENABLED|ENABLING|ENCODING|END|ENDAT|ENDCASE' && + '|ENDCATCH|ENDCHAIN|ENDCLASS|ENDDO|ENDENHANCEMENT|END-ENHANCEMENT-SECTION' && + '|ENDEXEC|ENDFOR|ENDFORM|ENDFUNCTION|ENDIAN|ENDIF|ENDING|ENDINTERFACE' && + '|END-LINES|ENDLOOP|ENDMETHOD|ENDMODULE|END-OF-DEFINITION|END-OF-FILE' && + '|END-OF-PAGE|END-OF-SELECTION|ENDON|ENDPROVIDE|ENDSELECT|ENDTRY|ENDWHILE' && + '|ENGINEERING|ENHANCEMENT|ENHANCEMENT-POINT|ENHANCEMENTS|ENHANCEMENT-SECTION' && + '|ENTRIES|ENTRY|ENVIRONMENT|EQ|EQUAL|EQUIV|ERRORMESSAGE|ERRORS|ESCAPE|ESCAPING' && + '|EVENT|EVENTS|EXACT|EXCEPT|EXCEPTION|EXCEPTIONS|EXCEPTION-TABLE|EXCLUDE|EXCLUDING' && + '|EXEC|EXECUTE|EXISTS|EXIT|EXIT-COMMAND|EXP|EXPAND|EXPANDING|EXPIRATION|EXPLICIT' && + '|EXPONENT|EXPORT|EXPORTING|EXTEND|EXTENDED|EXTENSION|EXTRACT|FAIL|FETCH|FIELD' && + '|FIELD-GROUPS|FIELDS|FIELD-SYMBOL|FIELD-SYMBOLS|FILE|FILTER|FILTERS|FILTER-TABLE' && + '|FINAL|FIND|FIRST|FIRST-LINE|FIXED-POINT|FKEQ|FKGE|FLOOR|FLUSH|FONT|FOR|FORM' && + '|FORMAT|FORWARD|FOUND|FRAC|FRAME|FRAMES|FREE|FRIENDS|FROM|FUNCTION|FUNCTIONALITY' && + '|FUNCTION-POOL|FURTHER|GAPS|GE|GENERATE|GET|GIVING|GKEQ|GKGE|GLOBAL|GRANT|GREATER' && + '|GREEN|GROUP|GROUPS|GT|HANDLE|HANDLER|HARMLESS|HASHED|HAVING|HDB|HEADER|HEADERS' && + '|HEADING|HEAD-LINES|HELP-ID|HELP-REQUEST|HIDE|HIGH|HINT|HOLD|HOTSPOT|I|ICON|ID' && + '|IDENTIFICATION|IDENTIFIER|IDS|IF|IGNORE|IGNORING|IMMEDIATELY|IMPLEMENTATION' && + '|IMPLEMENTATIONS|IMPLEMENTED|IMPLICIT|IMPORT|IMPORTING|IN|INACTIVE|INCL|INCLUDE' && + '|INCLUDES|INCLUDING|INCREMENT|INDEX|INDEX-LINE|INFOTYPES|INHERITING|INIT|INITIAL' && + '|INITIALIZATION|INNER|INOUT|INPUT|INSERT|INSTANCES|INTENSIFIED|INTERFACE' && + '|INTERFACE-POOL|INTERFACES|INTERNAL|INTERVALS|INTO|INVERSE|INVERTED-DATE|IS' && + '|ISO|ITERATOR|ITNO|JOB|JOIN|KEEP|KEEPING|KERNEL|KEY|KEYS|KEYWORDS|KIND' && + '|LANGUAGE|LAST|LATE|LAYOUT|LE|LEADING|LEAVE|LEFT|LEFT-JUSTIFIED|LEFTPLUS' && + '|LEFTSPACE|LEGACY|LENGTH|LESS|LET|LEVEL|LEVELS|LIKE|LINE|LINE-COUNT|LINEFEED' && + '|LINES|LINE-SELECTION|LINE-SIZE|LIST|LISTBOX|LIST-PROCESSING|LITTLE|LLANG' && + '|LOAD|LOAD-OF-PROGRAM|LOB|LOCAL|LOCALE|LOCATOR|LOG|LOG10|LOGFILE|LOGICAL' && + '|LOG-POINT|LONG|LOOP|LOW|LOWER|LPAD|LPI|LT|M|MAIL|MAIN|MAJOR-ID|MAPPING|MARGIN' && + '|MARK|MASK|MATCH|MATCHCODE|MAX|MAXIMUM|MEDIUM|MEMBERS|MEMORY|MESH|MESSAGE' && + '|MESSAGE-ID|MESSAGES|MESSAGING|METHOD|METHODS|MIN|MINIMUM|MINOR-ID|MM/DD/YY' && + '|MM/DD/YYYY|MMDDYY|MOD|MODE|MODIF|MODIFIER|MODIFY|MODULE|MOVE|MOVE-CORRESPONDING' && + '|MULTIPLY|MULTIPLY-CORRESPONDING|NA|NAME|NAMETAB|NATIVE|NB|NE|NESTED|NESTING' && + '|NEW|NEW-LINE|NEW-PAGE|NEW-SECTION|NEXT|NO|NODE|NODES|NO-DISPLAY' && + '|NO-EXTENSION|NO-GAP|NO-GAPS|NO-GROUPING|NO-HEADING|NON-UNICODE|NON-UNIQUE' && + '|NO-SCROLLING|NO-SIGN|NOT|NO-TITLE|NO-TOPOFPAGE|NO-ZERO|NP|NS|NULL|NUMBER' && + '|NUMOFCHAR|O|OBJECT|OBJECTS|OBLIGATORY|OCCURRENCE|OCCURRENCES|OCCURS|OF|OFF' && + '|OFFSET|OLE|ON|ONLY|OPEN|OPTION|OPTIONAL|OPTIONS|OR|ORDER|OTHER|OTHERS|OUT' && + '|OUTER|OUTPUT|OUTPUT-LENGTH|OVERFLOW|OVERLAY|PACK|PACKAGE|PAD|PADDING|PAGE' && + '|PAGES|PARAMETER|PARAMETERS|PARAMETER-TABLE|PART|PARTIALLY|PATTERN|PERCENTAGE' && + '|PERFORM|PERFORMING|PERSON|PF|PF-STATUS|PINK|PLACES|POOL|POS_HIGH|POS_LOW' && + '|POSITION|PRAGMAS|PRECOMPILED|PREFERRED|PRESERVING|PRIMARY|PRINT|PRINT-CONTROL' && + '|PRIORITY|PRIVATE|PROCEDURE|PROCESS|PROGRAM|PROPERTY|PROTECTED|PROVIDE|PUBLIC' && + '|PUSHBUTTON|PUT|QUEUE-ONLY|QUICKINFO|RADIOBUTTON|RAISE|RAISING|RANGE|RANGES' && + '|RAW|READ|READER|READ-ONLY|RECEIVE|RECEIVED|RECEIVER|RECEIVING|RED|REDEFINITION' && + '|REDUCE|REDUCED|REF|REFERENCE|REFRESH|REGEX|REJECT|REMOTE|RENAMING|REPLACE' && + '|REPLACEMENT|REPLACING|REPORT|REQUEST|REQUESTED|RESERVE|RESET|RESOLUTION' && + '|RESPECTING|RESPONSIBLE|RESULT|RESULTS|RESUMABLE|RESUME|RETRY|RETURN|RETURNCODE' && + '|RETURNING|RIGHT|RIGHT-JUSTIFIED|RIGHTPLUS|RIGHTSPACE|RISK|RMC_COMMUNICATION_FAILURE' && + '|RMC_INVALID_STATUS|RMC_SYSTEM_FAILURE|ROLE|ROLLBACK|ROUND|ROWS|RTTI|RUN|SAP' && + '|SAP-SPOOL|SAVING|SCALE_PRESERVING|SCALE_PRESERVING_SCIENTIFIC|SCAN|SCIENTIFIC' && + '|SCIENTIFIC_WITH_LEADING_ZERO|SCREEN|SCROLL|SCROLL-BOUNDARY|SCROLLING|SEARCH' && + '|SECONDARY|SECONDS|SECTION|SELECT|SELECTION|SELECTIONS|SELECTION-SCREEN|SELECTION-SET' && + '|SELECTION-SETS|SELECTION-TABLE|SELECT-OPTIONS|SELECTOR|SEND|SEPARATE|SEPARATED|SET' && + '|SHARED|SHIFT|SHORT|SHORTDUMP-ID|SIGN|SIGN_AS_POSTFIX|SIMPLE|SIN|SINGLE|SINH|SIZE' && + '|SKIP|SKIPPING|SMART|SOME|SORT|SORTABLE|SORTED|SOURCE|SPACE|SPECIFIED|SPLIT|SPOOL' && + '|SPOTS|SQL|SQLSCRIPT|SQRT|STABLE|STAMP|STANDARD|STARTING|START-OF-SELECTION|STATE' && + '|STATEMENT|STATEMENTS|STATIC|STATICS|STATUSINFO|STEP-LOOP|STOP|STRLEN|STRUCTURE' && + '|STRUCTURES|STYLE|SUBKEY|SUBMATCHES|SUBMIT|SUBROUTINE|SUBSCREEN|SUBSTRING|SUBTRACT' && + '|SUBTRACT-CORRESPONDING|SUFFIX|SUM|SUMMARY|SUMMING|SUPPLIED|SUPPLY|SUPPRESS|SWITCH' && + '|SWITCHSTATES|SYMBOL|SYNCPOINTS|SYNTAX|SYNTAX-CHECK|SYNTAX-TRACE' && + '|SYSTEM-CALL|SYSTEM-EXCEPTIONS|SYSTEM-EXIT|TAB|TABBED|TABLE|TABLES|TABLEVIEW|TABSTRIP' && + '|TAN|TANH|TARGET|TASK|TASKS|TEST|TESTING|TEXT|TEXTPOOL|THEN|THROW|TIME|TIMES|TIMESTAMP' && + '|TIMEZONE|TITLE|TITLEBAR|TITLE-LINES|TO|TOKENIZATION|TOKENS|TOP-LINES|TOP-OF-PAGE' && + '|TRACE-FILE|TRACE-TABLE|TRAILING|TRANSACTION|TRANSFER|TRANSFORMATION|TRANSLATE' && + '|TRANSPORTING|TRMAC|TRUNC|TRUNCATE|TRUNCATION|TRY|TYPE|TYPE-POOL|TYPE-POOLS|TYPES' && + '|ULINE|UNASSIGN|UNDER|UNICODE|UNION|UNIQUE|UNIT|UNIT_CONVERSION|UNIX|UNPACK|UNTIL' && + '|UNWIND|UP|UPDATE|UPPER|USER|USER-COMMAND|USING|UTF-8|VALID|VALUE|VALUE-REQUEST|VALUES' && + '|VARY|VARYING|VERIFICATION-MESSAGE|VERSION|VIA|VIEW|VISIBLE|WAIT|WARNING|WHEN|WHENEVER' && + '|WHERE|WHILE|WIDTH|WINDOW|WINDOWS|WITH|WITH-HEADING|WITHOUT|WITH-TITLE|WORD|WORK' && + '|WRITE|WRITER|X|XML|XOR|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE'. + + SPLIT lv_keywords AT '|' INTO TABLE lt_keywords. + gt_keywords = lt_keywords. " Hash table + + ENDMETHOD. " init_keywords + + + METHOD is_keyword. + + DATA lv_str TYPE string. + + lv_str = to_upper( iv_chunk ). + READ TABLE gt_keywords WITH KEY table_line = lv_str TRANSPORTING NO FIELDS. + rv_yes = boolc( sy-subrc = 0 ). + + ENDMETHOD. " is_keyword. + + + METHOD order_matches. + + DATA: + lv_index TYPE sy-tabix, + lv_line_len TYPE i, + lv_prev_token TYPE c. + + FIELD-SYMBOLS: + TYPE ty_match, + TYPE ty_match. + + SORT ct_matches BY offset. + + lv_line_len = strlen( iv_line ). + + LOOP AT ct_matches ASSIGNING . + lv_index = sy-tabix. + + " Delete matches after open text match + IF lv_prev_token = c_token-text AND -token <> c_token-text. + DELETE ct_matches INDEX lv_index. + CONTINUE. + ENDIF. + + CASE -token. + WHEN c_token-keyword. + IF -offset > 0. + " Delete match if keyword is part of structure or field symbol + IF substring( val = iv_line off = ( -offset - 1 ) len = 1 ) CA '-<'. + DELETE ct_matches INDEX lv_index. + CONTINUE. + ENDIF. + ENDIF. + + WHEN c_token-comment. + -length = lv_line_len - -offset. + DELETE ct_matches FROM lv_index + 1. + CONTINUE. + + WHEN c_token-text. + -text_tag = substring( val = iv_line + off = -offset + len = -length ). + IF lv_prev_token = c_token-text. + IF -text_tag = -text_tag. + -length = -offset + -length - -offset. + CLEAR lv_prev_token. + ELSEIF -text_tag = '}' AND -text_tag = '{'. + -length = -offset - -offset - 1. " Shift } out of scope + -offset = -offset + 1. " Shift { out of scope + CLEAR lv_prev_token. + ELSEIF -text_tag = '{'. + -length = -offset - -offset. + CLEAR lv_prev_token. + ELSEIF -text_tag = '}'. + -length = -offset - -offset. + -offset = -offset + 1. " Shift } out of scope + CLEAR lv_prev_token. + ENDIF. + DELETE ct_matches INDEX lv_index. + CONTINUE. + ENDIF. + + ENDCASE. + + lv_prev_token = -token. + ASSIGN TO . + ENDLOOP. + + ENDMETHOD. " order_matches. + + + METHOD parse_line. "REDEFINITION + + DATA lv_index TYPE i. + + FIELD-SYMBOLS LIKE LINE OF et_matches. + + super->parse_line( EXPORTING iv_line = iv_line + IMPORTING et_matches = et_matches ). + + " Remove non-keywords + LOOP AT et_matches ASSIGNING WHERE token = c_token-keyword. + lv_index = sy-tabix. + IF abap_false = is_keyword( substring( val = iv_line + off = -offset + len = -length ) ). + DELETE et_matches INDEX lv_index. + ENDIF. + ENDLOOP. + + ENDMETHOD. " parse_line. +ENDCLASS. diff --git a/src/syntax/zcl_abapgit_syntax_abap.clas.xml b/src/syntax/zcl_abapgit_syntax_abap.clas.xml new file mode 100644 index 000000000..98977a702 --- /dev/null +++ b/src/syntax/zcl_abapgit_syntax_abap.clas.xml @@ -0,0 +1,18 @@ + + + + + + ZCL_ABAPGIT_SYNTAX_ABAP + 1 + E + ABAP Syntax Highlighting + 2 + 1 + X + X + X + + + + diff --git a/src/syntax/zcl_abapgit_syntax_highlighter.clas.abap b/src/syntax/zcl_abapgit_syntax_highlighter.clas.abap new file mode 100644 index 000000000..7e0145944 --- /dev/null +++ b/src/syntax/zcl_abapgit_syntax_highlighter.clas.abap @@ -0,0 +1,236 @@ +CLASS zcl_abapgit_syntax_highlighter DEFINITION + PUBLIC + ABSTRACT + CREATE PUBLIC . + + PUBLIC SECTION. + + CLASS-METHODS create + IMPORTING + !iv_filename TYPE string + RETURNING + VALUE(ro_instance) TYPE REF TO zcl_abapgit_syntax_highlighter . + METHODS process_line + IMPORTING + !iv_line TYPE string + RETURNING + VALUE(rv_line) TYPE string . + PROTECTED SECTION. + + TYPES: + BEGIN OF ty_match, + token TYPE char1, " Type of matches + offset TYPE i, " Beginning position of the string that should be formatted + length TYPE i, " Length of the string that should be formatted + text_tag TYPE string, " Type of text tag + END OF ty_match. + + TYPES: + ty_match_tt TYPE STANDARD TABLE OF ty_match WITH DEFAULT KEY. + + TYPES: + BEGIN OF ty_rule, + regex TYPE REF TO cl_abap_regex, + token TYPE char1, + style TYPE string, + END OF ty_rule. + + CONSTANTS c_token_none TYPE c VALUE '.'. + + DATA mt_rules TYPE STANDARD TABLE OF ty_rule. + + METHODS add_rule + IMPORTING + iv_regex TYPE string + iv_token TYPE c + iv_style TYPE string. + + METHODS parse_line + IMPORTING iv_line TYPE string + EXPORTING et_matches TYPE ty_match_tt. + + METHODS order_matches ABSTRACT + IMPORTING iv_line TYPE string + CHANGING ct_matches TYPE ty_match_tt. + + METHODS extend_matches + IMPORTING iv_line TYPE string + CHANGING ct_matches TYPE ty_match_tt. + + METHODS format_line + IMPORTING iv_line TYPE string + it_matches TYPE ty_match_tt + RETURNING VALUE(rv_line) TYPE string. + + METHODS apply_style + IMPORTING iv_line TYPE string + iv_class TYPE string + RETURNING VALUE(rv_line) TYPE string. + +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_SYNTAX_HIGHLIGHTER IMPLEMENTATION. + + + METHOD add_rule. + + DATA ls_rule LIKE LINE OF mt_rules. + + CREATE OBJECT ls_rule-regex + EXPORTING + pattern = iv_regex + ignore_case = abap_true. + + ls_rule-token = iv_token. + ls_rule-style = iv_style. + APPEND ls_rule TO mt_rules. + + ENDMETHOD. + + + METHOD apply_style. + + DATA lv_escaped TYPE string. + + lv_escaped = escape( val = iv_line format = cl_abap_format=>e_html_attr ). + IF iv_class IS NOT INITIAL. + rv_line = |{ lv_escaped }|. + ELSE. + rv_line = lv_escaped. + ENDIF. + + ENDMETHOD. " apply_style + + + METHOD create. + + " Create instance of highighter dynamically dependent on syntax type + IF iv_filename CP '*.abap'. + CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_abap. + ELSEIF iv_filename CP '*.xml'. + CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_xml. + ELSE. + CLEAR ro_instance. + ENDIF. + + ENDMETHOD. " create. + + + METHOD extend_matches. + + DATA: + lv_line_len TYPE i, + lv_last_pos TYPE i VALUE 0, + lv_length TYPE i, + ls_match TYPE ty_match. + + FIELD-SYMBOLS TYPE ty_match. + + lv_line_len = strlen( iv_line ). + + SORT ct_matches BY offset. + + " Add entries refering to parts of text that should not be formatted + LOOP AT ct_matches ASSIGNING . + IF -offset > lv_last_pos. + lv_length = -offset - lv_last_pos. + ls_match-token = c_token_none. + ls_match-offset = lv_last_pos. + ls_match-length = lv_length. + INSERT ls_match INTO ct_matches INDEX sy-tabix. + ENDIF. + lv_last_pos = -offset + -length. + ENDLOOP. + + " Add remainder of the string + IF lv_line_len > lv_last_pos. + lv_length = lv_line_len - lv_last_pos. + ls_match-token = c_token_none. + ls_match-offset = lv_last_pos. + ls_match-length = lv_length. + APPEND ls_match TO ct_matches. + ENDIF. + + ENDMETHOD. " extend_matches + + + METHOD format_line. + + DATA: + lv_chunk TYPE string, + ls_rule LIKE LINE OF mt_rules. + + FIELD-SYMBOLS TYPE ty_match. + + LOOP AT it_matches ASSIGNING . + lv_chunk = substring( val = iv_line off = -offset len = -length ). + + CLEAR ls_rule. " Failed read equals no style + READ TABLE mt_rules INTO ls_rule WITH KEY token = -token. + + lv_chunk = me->apply_style( iv_line = lv_chunk + iv_class = ls_rule-style ). + + rv_line = rv_line && lv_chunk. + ENDLOOP. + + ENDMETHOD. " format_line + + + METHOD parse_line. + + DATA: + lo_regex TYPE REF TO cl_abap_regex, + lo_matcher TYPE REF TO cl_abap_matcher, + lt_result TYPE match_result_tab, + ls_match TYPE ty_match. + + FIELD-SYMBOLS: + LIKE LINE OF mt_rules, + TYPE match_result. + + CLEAR et_matches. + + " Process syntax-dependent regex table and find all matches + LOOP AT mt_rules ASSIGNING . + lo_regex = -regex. + lo_matcher = lo_regex->create_matcher( text = iv_line ). + lt_result = lo_matcher->find_all( ). + + " Save matches into custom table with predefined tokens + LOOP AT lt_result ASSIGNING . + CLEAR: ls_match. + ls_match-token = -token. + ls_match-offset = -offset. + ls_match-length = -length. + APPEND ls_match TO et_matches. + ENDLOOP. + ENDLOOP. + + ENDMETHOD. " parse_line + + + METHOD process_line. + + DATA: lt_matches TYPE ty_match_tt. + + IF strlen( iv_line ) = 0. + RETURN. + ENDIF. + + me->parse_line( EXPORTING iv_line = iv_line + IMPORTING et_matches = lt_matches ). + + me->order_matches( EXPORTING iv_line = iv_line + CHANGING ct_matches = lt_matches ). + + me->extend_matches( EXPORTING iv_line = iv_line + CHANGING ct_matches = lt_matches ). + + rv_line = me->format_line( iv_line = iv_line + it_matches = lt_matches ). + + ENDMETHOD. " process_line +ENDCLASS. diff --git a/src/syntax/zcl_abapgit_syntax_highlighter.clas.testclasses.abap b/src/syntax/zcl_abapgit_syntax_highlighter.clas.testclasses.abap new file mode 100644 index 000000000..90fa9b793 --- /dev/null +++ b/src/syntax/zcl_abapgit_syntax_highlighter.clas.testclasses.abap @@ -0,0 +1,609 @@ +CLASS ltcl_syntax_cases DEFINITION DEFERRED. +CLASS zcl_abapgit_syntax_highlighter DEFINITION LOCAL FRIENDS ltcl_syntax_cases. + +*----------------------------------------------------------------------* +* CLASS ltcl_syntax_cases definition +*----------------------------------------------------------------------* +CLASS ltcl_syntax_cases DEFINITION FINAL FOR TESTING RISK LEVEL HARMLESS + DURATION SHORT. + + PRIVATE SECTION. + + DATA: + mt_after_parse TYPE zcl_abapgit_syntax_highlighter=>ty_match_tt, + mt_after_order TYPE zcl_abapgit_syntax_highlighter=>ty_match_tt, + mt_after_extend TYPE zcl_abapgit_syntax_highlighter=>ty_match_tt, + ms_match TYPE zcl_abapgit_syntax_highlighter=>ty_match. + + METHODS: + do_test IMPORTING iv_line TYPE string + iv_filename TYPE string, + test_abap_01 FOR TESTING, + test_abap_02 FOR TESTING, + test_abap_03 FOR TESTING, + test_abap_04 FOR TESTING, + test_abap_05 FOR TESTING, + test_abap_06 FOR TESTING, + test_abap_07 FOR TESTING, + test_abap_08 FOR TESTING, + test_xml_01 FOR TESTING, + test_xml_02 FOR TESTING, + test_xml_03 FOR TESTING, + test_xml_04 FOR TESTING, + test_xml_05 FOR TESTING. + +ENDCLASS. " ltcl_syntax_cases +*----------------------------------------------------------------------* +* CLASS ltcl_syntax_cases IMPLEMENTATION +*----------------------------------------------------------------------* +CLASS ltcl_syntax_cases IMPLEMENTATION. + + DEFINE _generate_parse. + ms_match-token = &1. + ms_match-offset = &2. + ms_match-length = &3. + APPEND ms_match TO mt_after_parse. + END-OF-DEFINITION. " _generate_parse + + DEFINE _generate_order. + ms_match-token = &1. + ms_match-offset = &2. + ms_match-length = &3. + ms_match-text_tag = &4. + APPEND ms_match TO mt_after_order. + END-OF-DEFINITION. " _generate_order + + DEFINE _generate_extend. + ms_match-token = &1. + ms_match-offset = &2. + ms_match-length = &3. + ms_match-text_tag = &4. + APPEND ms_match TO mt_after_extend. + END-OF-DEFINITION. " _generate_extend + + METHOD do_test. + + DATA: lt_matches_act TYPE zcl_abapgit_syntax_highlighter=>ty_match_tt, + lo TYPE REF TO zcl_abapgit_syntax_highlighter. + + + lo = zcl_abapgit_syntax_highlighter=>create( iv_filename ). + lo->parse_line( EXPORTING iv_line = iv_line + IMPORTING et_matches = lt_matches_act ). + + SORT lt_matches_act BY offset. + + cl_abap_unit_assert=>assert_equals( exp = mt_after_parse + act = lt_matches_act + msg = | Error during parsing: { iv_line }| ). + + lo->order_matches( EXPORTING iv_line = iv_line + CHANGING ct_matches = lt_matches_act ). + + cl_abap_unit_assert=>assert_equals( exp = mt_after_order + act = lt_matches_act + msg = | Error during ordering: { iv_line }| ). + + lo->extend_matches( EXPORTING iv_line = iv_line + CHANGING ct_matches = lt_matches_act ). + + cl_abap_unit_assert=>assert_equals( exp = mt_after_extend + act = lt_matches_act + msg = | Error during extending: { iv_line }| ). + + ENDMETHOD. "test + +****************************************************** +* Test parsing and ordering of comments * +****************************************************** + METHOD test_abap_01. + + DATA lv_line TYPE string. + + lv_line = '* commented out line with key word data'. "#EC NOTEXT + + " Generate table with expected values after parsing + _generate_parse 'C' 0 1. + _generate_parse 'K' 12 3. + _generate_parse 'K' 16 4. + _generate_parse 'K' 21 4. + _generate_parse 'K' 26 3. + _generate_parse 'K' 30 4. + _generate_parse 'K' 35 4. + + " Generate table with expected values after ordering + _generate_order 'C' 0 39 ''. + + " Generate table with expected values after ordering + _generate_extend 'C' 0 39 ''. + + do_test( iv_line = lv_line iv_filename = '*.abap' ). + + ENDMETHOD. " test_abap_01 + +****************************************************** +* Test parsing and ordering of remainder of string * +****************************************************** + METHOD test_abap_02. + + DATA lv_line TYPE string. + + lv_line = 'data: lv_var_name type string.'. "#EC NOTEXT + + " Generate table with expected values after parsing + _generate_parse 'K' 0 4. + _generate_parse 'K' 18 4. + + " Generate table with expected values after ordering + _generate_order 'K' 0 4 ''. + _generate_order 'K' 18 4 ''. + + " Generate table with expected values after extending + _generate_extend 'K' 0 4 ''. + _generate_extend '.' 4 14 ''. + _generate_extend 'K' 18 4 ''. + _generate_extend '.' 22 8 ''. + + do_test( iv_line = lv_line iv_filename = '*.abap' ). + + ENDMETHOD. " test_abap_02 + +****************************************************** +* Test parsing and ordering of key words & texts * +****************************************************** + METHOD test_abap_03. + + DATA lv_line TYPE string. + + + lv_line = 'call function ''FM_NAME''. " Commented'. "#EC NOTEXT + + " Generate table with expected values after parsing + _generate_parse 'K' 0 4. + _generate_parse 'K' 5 8. + _generate_parse 'T' 14 1. + _generate_parse 'T' 22 1. + _generate_parse 'C' 25 1. + + " Generate table with expected values after ordering + _generate_order 'K' 0 4 ''. + _generate_order 'K' 5 8 ''. + _generate_order 'T' 14 9 ''''. + _generate_order 'C' 25 11 ''. + + " Generate table with expected values after extending + _generate_extend 'K' 0 4 ''. + _generate_extend '.' 4 1 ''. + _generate_extend 'K' 5 8 ''. + _generate_extend '.' 13 1 ''. + _generate_extend 'T' 14 9 ''''. + _generate_extend '.' 23 2 ''. + _generate_extend 'C' 25 11 ''. + + do_test( iv_line = lv_line iv_filename = '*.abap' ). + + ENDMETHOD. " test_abap_03 + +****************************************************** +* Test parsing and ordering of key words in texts * +****************************************************** + METHOD test_abap_04. + + DATA lv_line TYPE string. + + lv_line = 'constants: lc_var type string value ''simpletext data simpletext''.'. "#EC NOTEXT + + " Generate table with expected values after parsing + _generate_parse 'K' 0 9. + _generate_parse 'K' 18 4. + _generate_parse 'K' 30 5. + _generate_parse 'T' 36 1. + _generate_parse 'K' 48 4. + _generate_parse 'T' 63 1. + + " Generate table with expected values after ordering + _generate_order 'K' 0 9 ''. + _generate_order 'K' 18 4 ''. + _generate_order 'K' 30 5 ''. + _generate_order 'T' 36 28 ''''. + + " Generate table with expected values after ordering + _generate_extend 'K' 0 9 ''. + _generate_extend '.' 9 9 ''. + _generate_extend 'K' 18 4 ''. + _generate_extend '.' 22 8 ''. + _generate_extend 'K' 30 5 ''. + _generate_extend '.' 35 1 ''. + _generate_extend 'T' 36 28 ''''. + _generate_extend '.' 64 1 ''. + + do_test( iv_line = lv_line iv_filename = '*.abap' ). + + ENDMETHOD. " test_abap_04 + +****************************************************** +* Test parsing and ordering texts in curly brackets * +****************************************************** + METHOD test_abap_05. + + DATA lv_line TYPE string. + + lv_line = 'a = |{ b }={ c }|.'. "#EC NOTEXT + + " Generate table with expected values after parsing + _generate_parse 'T' 4 1. + _generate_parse 'T' 5 1. + _generate_parse 'T' 9 1. + _generate_parse 'T' 11 1. + _generate_parse 'K' 13 1. + _generate_parse 'T' 15 1. + _generate_parse 'T' 16 1. + + " Generate table with expected values after ordering + _generate_order 'T' 4 1 '|'. + _generate_order 'T' 10 1 '}'. + _generate_order 'K' 13 1 ''. + _generate_order 'T' 16 1 '}'. + + " Generate table with expected values after extending + _generate_extend '.' 0 4 ''. + _generate_extend 'T' 4 1 '|'. + _generate_extend '.' 5 5 ''. + _generate_extend 'T' 10 1 '}'. + _generate_extend '.' 11 2 ''. + _generate_extend 'K' 13 1 ''. + _generate_extend '.' 14 2 ''. + _generate_extend 'T' 16 1 '}'. + _generate_extend '.' 17 1 ''. + + do_test( iv_line = lv_line iv_filename = '*.abap' ). + + ENDMETHOD. " test_abap_05 + +****************************************************** +* Test parsing and ordering of texts * +****************************************************** + METHOD test_abap_06. + + DATA lv_line TYPE string. + + lv_line = 'lv_line = lc_constant && |XYZ { ''ab'' && |ac{ ''UU'' }| }|'. "#EC NOTEXT + + " Generate table with expected values after parsing + _generate_parse 'K' 22 2. + _generate_parse 'T' 25 1. + _generate_parse 'T' 30 1. + _generate_parse 'T' 32 1. + _generate_parse 'T' 35 1. + _generate_parse 'K' 37 2. + _generate_parse 'T' 40 1. + _generate_parse 'T' 43 1. + _generate_parse 'T' 45 1. + _generate_parse 'T' 48 1. + _generate_parse 'T' 50 1. + _generate_parse 'T' 51 1. + _generate_parse 'T' 53 1. + _generate_parse 'T' 54 1. + + " Generate table with expected values after ordering + _generate_order 'K' 22 2 ''. + _generate_order 'T' 25 5 '|'. + _generate_order 'T' 32 4 ''''. + _generate_order 'K' 37 2 ''. + _generate_order 'T' 40 3 '|'. + _generate_order 'T' 45 4 ''''. + _generate_order 'T' 51 1 '}'. + _generate_order 'T' 54 1 '}'. + + " Generate table with expected values after extending + _generate_extend '.' 00 22 ''. + _generate_extend 'K' 22 2 ''. + _generate_extend '.' 24 1 ''. + _generate_extend 'T' 25 5 '|'. + _generate_extend '.' 30 2 ''. + _generate_extend 'T' 32 4 ''''. + _generate_extend '.' 36 1 ''. + _generate_extend 'K' 37 2 ''. + _generate_extend '.' 39 1 ''. + _generate_extend 'T' 40 3 '|'. + _generate_extend '.' 43 2 ''. + _generate_extend 'T' 45 4 ''''. + _generate_extend '.' 49 2 ''. + _generate_extend 'T' 51 1 '}'. + _generate_extend '.' 52 2 ''. + _generate_extend 'T' 54 1 '}'. + + do_test( iv_line = lv_line iv_filename = '*.abap' ). + + ENDMETHOD. " test_abap_06 + +******************************************************** +* Check that '*' in select statement is not a match * +******************************************************** + METHOD test_abap_07. + + DATA lv_line TYPE string. + + lv_line = 'SELECT * FROM foo'. "#EC NOTEXT + + " Generate table with expected values after parsing + _generate_parse 'K' 0 6. + _generate_parse 'K' 9 4. + + " Generate table with expected values after ordering + _generate_order 'K' 0 6 ''. + _generate_order 'K' 9 4 ''. + + " Generate table with expected values after extending + _generate_extend 'K' 0 6 ''. + _generate_extend '.' 6 3 ''. + _generate_extend 'K' 9 4 ''. + _generate_extend '.' 13 4 ''. + + do_test( iv_line = lv_line iv_filename = '*.abap' ). + + ENDMETHOD. " test_abap_07 + +******************************************************** +* Test parsing and ordering of key words in structures * +******************************************************** + METHOD test_abap_08. + + DATA lv_line TYPE string. + + lv_line = 'lv_length = -length.'. "#EC NOTEXT + + " Generate table with expected values after parsing + _generate_parse 'K' 13 5. + _generate_parse 'K' 20 6. + + " Generate table with expected values after extending + _generate_extend '.' 0 27 ''. + + do_test( iv_line = lv_line iv_filename = '*.abap' ). + + ENDMETHOD. " test_abap_08 + +******************************************************** +* Test parsing and ordering of tags in xml * +******************************************************** + METHOD test_xml_01. + + DATA lv_line TYPE string. + + lv_line = 'Text'. "#EC NOTEXT + + " Generate table with expected values after parsing + _generate_parse 'X' 0 1. + _generate_parse 'X' 4 1. + _generate_parse 'X' 9 1. + _generate_parse 'X' 14 1. + + " Generate table with expected values after ordering + _generate_order 'X' 0 5 '<'. + _generate_order 'X' 9 6 '<'. + + " Generate table with expected values after extending + _generate_extend 'X' 0 5 '<'. + _generate_extend '.' 5 4 ''. + _generate_extend 'X' 9 6 '<'. + + do_test( iv_line = lv_line iv_filename = '*.xml' ). + + ENDMETHOD. " test_xml_01 + + METHOD test_xml_02. + + DATA lv_line TYPE string. + + lv_line = ''. "#EC NOTEXT + + " Generate table with expected values after parsing + _generate_parse 'X' 0 1. + _generate_parse 'X' 5 1. + + " Generate table with expected values after ordering + _generate_order 'X' 0 6 '<'. + + " Generate table with expected values after extending + _generate_extend 'X' 0 6 '<'. + + do_test( iv_line = lv_line iv_filename = '*.xml' ). + + ENDMETHOD. " test_xml_02 + + METHOD test_xml_03. + + DATA lv_line TYPE string. + + lv_line = ''. "#EC NOTEXT + + " Generate table with expected values after parsing + _generate_parse 'X' 0 1. + _generate_parse 'A' 4 10. + _generate_parse 'V' 15 7. + _generate_parse 'X' 23 1. + + " Generate table with expected values after ordering + _generate_order 'X' 0 4 '<'. + _generate_order 'A' 4 10 ''. + _generate_order 'V' 15 7 ''. + _generate_order 'X' 22 2 '>'. + + " Generate table with expected values after extending + _generate_extend 'X' 0 4 '<'. + _generate_extend 'A' 4 10 ''. + _generate_extend '.' 14 1 ''. + _generate_extend 'V' 15 7 ''. + _generate_extend 'X' 22 2 '>'. + + do_test( iv_line = lv_line iv_filename = '*.xml' ). + + ENDMETHOD. " test_xml_03 + + METHOD test_xml_04. + + DATA lv_line TYPE string. + + lv_line = ''. "#EC NOTEXT + + " Generate table with expected values after parsing + _generate_parse 'X' 0 1. + _generate_parse 'A' 5 8. + _generate_parse 'V' 14 5. + _generate_parse 'X' 20 1. + + " Generate table with expected values after ordering + _generate_order 'X' 0 5 '<'. + _generate_order 'A' 5 8 ''. + _generate_order 'V' 14 5 ''. + _generate_order 'X' 19 2 '>'. + + " Generate table with expected values after extending + _generate_extend 'X' 0 5 '<'. + _generate_extend 'A' 5 8 ''. + _generate_extend '.' 13 1 ''. + _generate_extend 'V' 14 5 ''. + _generate_extend 'X' 19 2 '>'. + + do_test( iv_line = lv_line iv_filename = '*.xml' ). + + ENDMETHOD. " test_xml_04 + + METHOD test_xml_05. + + DATA lv_line TYPE string. + + lv_line = '"text"'. "#EC NOTEXT + + " Generate table with expected values after parsing + _generate_parse 'X' 0 1. + _generate_parse 'A' 7 6. + _generate_parse 'V' 14 4. + _generate_parse 'A' 18 6. + _generate_parse 'V' 25 4. + _generate_parse 'X' 29 1. + _generate_parse 'V' 30 6. + _generate_parse 'X' 36 1. + _generate_parse 'X' 44 1. + + " Generate table with expected values after ordering + _generate_order 'X' 0 7 '<'. + _generate_order 'A' 7 6 ''. + _generate_order 'V' 14 4 ''. + _generate_order 'A' 18 6 ''. + _generate_order 'V' 25 4 ''. + _generate_order 'X' 29 1 '>'. + _generate_order 'X' 36 9 '<'. + + " Generate table with expected values after extending + _generate_extend 'X' 0 7 '<'. + _generate_extend 'A' 7 6 ''. + _generate_extend '.' 13 1 ''. + _generate_extend 'V' 14 4 ''. + _generate_extend 'A' 18 6 ''. + _generate_extend '.' 24 1 ''. + _generate_extend 'V' 25 4 ''. + _generate_extend 'X' 29 1 '>'. + _generate_extend '.' 30 6 ''. + _generate_extend 'X' 36 9 '<'. + + do_test( iv_line = lv_line iv_filename = '*.xml' ). + + ENDMETHOD. " test_xml_05 + +ENDCLASS. " ltcl_syntax_cases IMPLEMENTATION + +CLASS ltcl_syntax_basic_logic DEFINITION DEFERRED. +CLASS zcl_abapgit_syntax_highlighter DEFINITION LOCAL FRIENDS ltcl_syntax_basic_logic. + +*----------------------------------------------------------------------* +* CLASS ltcl_syntax_basic_logic DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS ltcl_syntax_basic_logic DEFINITION FINAL FOR TESTING RISK LEVEL HARMLESS + DURATION SHORT. + + PRIVATE SECTION. + + DATA mo TYPE REF TO zcl_abapgit_syntax_highlighter. + + METHODS: + setup, + process_line FOR TESTING, + format_line FOR TESTING, + apply_style FOR TESTING. + +ENDCLASS. " ltcl_syntax_basic_logic + +*----------------------------------------------------------------------* +* CLASS ltcl_syntax_highlighter IMPLEMENTATION +*----------------------------------------------------------------------* +CLASS ltcl_syntax_basic_logic IMPLEMENTATION. + + METHOD setup. + mo = zcl_abapgit_syntax_highlighter=>create( '*.abap' ). + ENDMETHOD. " setup + + METHOD format_line. + + DATA: + lv_line TYPE string, + lv_line_act TYPE string, + lv_line_exp TYPE string. + + lv_line = 'call function ''FM_NAME''. " Commented'. "#EC NOTEXT + + lv_line_exp = + 'call' && "#EC NOTEXT + ' function' && "#EC NOTEXT + ' 'FM_NAME'.' && "#EC NOTEXT + ' " Commented'. "#EC NOTEXT + + lv_line_act = mo->process_line( iv_line = lv_line ). + + cl_abap_unit_assert=>assert_equals( exp = lv_line_exp + act = lv_line_act + msg = | Error during formating: { lv_line }| ). + + ENDMETHOD. " format_line + + METHOD apply_style. + + DATA lv_line_act TYPE string. + + " Call the method and compare results + lv_line_act = mo->apply_style( iv_line = 'CALL FUNCTION' "#EC NOTEXT + iv_class = zcl_abapgit_syntax_abap=>c_css-keyword ). + + cl_abap_unit_assert=>assert_equals( + act = lv_line_act + exp = 'CALL FUNCTION' "#EC NOTEXT + msg = 'Failure during applying of style.' ). "#EC NOTEXT + + ENDMETHOD. " apply_style + + METHOD process_line. + + DATA lv_line_act TYPE string. + + " Call the method with empty parameter and compare results + lv_line_act = mo->process_line( iv_line = '' ). + + cl_abap_unit_assert=>assert_equals( + act = lv_line_act + exp = '' + msg = 'Failure in method process_line.' ). "#EC NOTEXT + + " Call the method with non-empty line and compare results + lv_line_act = mo->process_line( iv_line = '* CALL FUNCTION' ). "#EC NOTEXT + + cl_abap_unit_assert=>assert_equals( + act = lv_line_act + exp = '* CALL FUNCTION' "#EC NOTEXT + msg = 'Failure in method process_line.' ). "#EC NOTEXT + + ENDMETHOD. " process_line + +ENDCLASS. " ltcl_syntax_highlighter diff --git a/src/syntax/zcl_abapgit_syntax_highlighter.clas.xml b/src/syntax/zcl_abapgit_syntax_highlighter.clas.xml new file mode 100644 index 000000000..223c3c52a --- /dev/null +++ b/src/syntax/zcl_abapgit_syntax_highlighter.clas.xml @@ -0,0 +1,20 @@ + + + + + + ZCL_ABAPGIT_SYNTAX_HIGHLIGHTER + 1 + E + Syntax highlighter + 2 + 1 + X + X + X + X + X + + + + diff --git a/src/syntax/zcl_abapgit_syntax_xml.clas.abap b/src/syntax/zcl_abapgit_syntax_xml.clas.abap new file mode 100644 index 000000000..d21b189cd --- /dev/null +++ b/src/syntax/zcl_abapgit_syntax_xml.clas.abap @@ -0,0 +1,117 @@ +CLASS zcl_abapgit_syntax_xml DEFINITION + PUBLIC + INHERITING FROM zcl_abapgit_syntax_highlighter + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS constructor. + + CONSTANTS: + BEGIN OF c_css, + xml_tag TYPE string VALUE 'xml_tag', "#EC NOTEXT + attr TYPE string VALUE 'attr', "#EC NOTEXT + attr_val TYPE string VALUE 'attr_val', "#EC NOTEXT + END OF c_css, + + BEGIN OF c_token, + xml_tag TYPE c VALUE 'X', "#EC NOTEXT + attr TYPE c VALUE 'A', "#EC NOTEXT + attr_val TYPE c VALUE 'V', "#EC NOTEXT + END OF c_token, + + BEGIN OF c_regex, + xml_tag TYPE string VALUE '[<>]', "#EC NOTEXT + attr TYPE string VALUE '\s[-a-z:_0-9]+\s*(?==)', "#EC NOTEXT + attr_val TYPE string VALUE '["''][^''"]+[''"]', "#EC NOTEXT + END OF c_regex. + + PROTECTED SECTION. + + METHODS order_matches REDEFINITION. + +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_SYNTAX_XML IMPLEMENTATION. + + + METHOD constructor. + + super->constructor( ). + + " Initialize instances of regular expressions + + add_rule( iv_regex = c_regex-xml_tag + iv_token = c_token-xml_tag + iv_style = c_css-xml_tag ). + + add_rule( iv_regex = c_regex-attr + iv_token = c_token-attr + iv_style = c_css-attr ). + + add_rule( iv_regex = c_regex-attr_val + iv_token = c_token-attr_val + iv_style = c_css-attr_val ). + + ENDMETHOD. + + + METHOD order_matches. + + DATA: + lv_index TYPE sy-tabix, + lv_prev_token TYPE c, + lv_state TYPE c VALUE 'O'. " O - for open tag; C - for closed tag; + + FIELD-SYMBOLS: + TYPE ty_match, + TYPE ty_match. + + + SORT ct_matches BY offset. + + LOOP AT ct_matches ASSIGNING . + lv_index = sy-tabix. + + CASE -token. + WHEN c_token-xml_tag. + -text_tag = substring( val = iv_line + off = -offset + len = -length ). + + " No other matches between two tags + IF -text_tag = '>' AND lv_prev_token = c_token-xml_tag. + lv_state = 'C'. + -length = -offset - -offset + -length. + DELETE ct_matches INDEX lv_index. + CONTINUE. + + " Adjust length and offset of closing tag + ELSEIF -text_tag = '>' AND lv_prev_token <> c_token-xml_tag. + lv_state = 'C'. + -length = -offset - -offset - -length + -length. + -offset = -offset + -length. + ELSE. + lv_state = 'O'. + ENDIF. + + WHEN OTHERS. + IF lv_prev_token = c_token-xml_tag. + -length = -offset - -offset. " Extend length of the opening tag + ENDIF. + + IF lv_state = 'C'. " Delete all matches between tags + DELETE ct_matches INDEX lv_index. + CONTINUE. + ENDIF. + + ENDCASE. + + lv_prev_token = -token. + ASSIGN TO . + ENDLOOP. + + ENDMETHOD. " order_matches +ENDCLASS. diff --git a/src/syntax/zcl_abapgit_syntax_xml.clas.xml b/src/syntax/zcl_abapgit_syntax_xml.clas.xml new file mode 100644 index 000000000..52e9764b1 --- /dev/null +++ b/src/syntax/zcl_abapgit_syntax_xml.clas.xml @@ -0,0 +1,18 @@ + + + + + + ZCL_ABAPGIT_SYNTAX_XML + 1 + E + XML Syntax Highlighter + 2 + 1 + X + X + X + + + + diff --git a/src/ui/zcl_abapgit_html_action_utils.clas.abap b/src/ui/zcl_abapgit_html_action_utils.clas.abap new file mode 100644 index 000000000..bd3063fab --- /dev/null +++ b/src/ui/zcl_abapgit_html_action_utils.clas.abap @@ -0,0 +1,434 @@ +CLASS zcl_abapgit_html_action_utils DEFINITION + PUBLIC + CREATE PUBLIC . + + PUBLIC SECTION. + + CLASS-METHODS field_keys_to_upper + CHANGING + !ct_fields TYPE tihttpnvp . + CLASS-METHODS parse_fields + IMPORTING + !iv_string TYPE clike + RETURNING + VALUE(rt_fields) TYPE tihttpnvp . + CLASS-METHODS parse_fields_upper_case_name + IMPORTING + !iv_string TYPE clike + RETURNING + VALUE(rt_fields) TYPE tihttpnvp . + CLASS-METHODS add_field + IMPORTING + !name TYPE string + !iv TYPE any + CHANGING + !ct TYPE tihttpnvp . + CLASS-METHODS get_field + IMPORTING + !name TYPE string + !it TYPE tihttpnvp + CHANGING + !cv TYPE any . + CLASS-METHODS jump_encode + IMPORTING + !iv_obj_type TYPE tadir-object + !iv_obj_name TYPE tadir-obj_name + RETURNING + VALUE(rv_string) TYPE string . + CLASS-METHODS jump_decode + IMPORTING + !iv_string TYPE clike + EXPORTING + !ev_obj_type TYPE tadir-object + !ev_obj_name TYPE tadir-obj_name + RAISING + zcx_abapgit_exception . + CLASS-METHODS dir_encode + IMPORTING + !iv_path TYPE string + RETURNING + VALUE(rv_string) TYPE string . + CLASS-METHODS dir_decode + IMPORTING + !iv_string TYPE clike + RETURNING + VALUE(rv_path) TYPE string + RAISING + zcx_abapgit_exception . + CLASS-METHODS file_encode + IMPORTING + !iv_key TYPE zcl_abapgit_persistence_repo=>ty_repo-key + !ig_file TYPE any "assuming ty_file + RETURNING + VALUE(rv_string) TYPE string . + CLASS-METHODS obj_encode + IMPORTING + !iv_key TYPE zcl_abapgit_persistence_repo=>ty_repo-key + !ig_object TYPE any "assuming ty_item + RETURNING + VALUE(rv_string) TYPE string . + CLASS-METHODS file_obj_decode + IMPORTING + !iv_string TYPE clike + EXPORTING + !ev_key TYPE zcl_abapgit_persistence_repo=>ty_repo-key + !eg_file TYPE any "assuming ty_file + !eg_object TYPE any "assuming ty_item + RAISING + zcx_abapgit_exception . + CLASS-METHODS dbkey_encode + IMPORTING + !is_key TYPE zcl_abapgit_persistence_db=>ty_content + RETURNING + VALUE(rv_string) TYPE string . + CLASS-METHODS dbkey_decode + IMPORTING + !iv_string TYPE clike + RETURNING + VALUE(rs_key) TYPE zcl_abapgit_persistence_db=>ty_content . + CLASS-METHODS dbcontent_decode + IMPORTING + !it_postdata TYPE cnht_post_data_tab + RETURNING + VALUE(rs_content) TYPE zcl_abapgit_persistence_db=>ty_content . + CLASS-METHODS parse_commit_request + IMPORTING + !it_postdata TYPE cnht_post_data_tab + EXPORTING + !es_fields TYPE any . + CLASS-METHODS decode_bg_update + IMPORTING + !iv_getdata TYPE clike + RETURNING + VALUE(rs_fields) TYPE zcl_abapgit_persist_background=>ty_background . + CLASS-METHODS stage_decode + IMPORTING + !iv_getdata TYPE clike + EXPORTING + !ev_key TYPE zcl_abapgit_persistence_repo=>ty_repo-key + !ev_seed TYPE string + RAISING + zcx_abapgit_exception . + PRIVATE SECTION. + CLASS-METHODS unescape + IMPORTING iv_string TYPE string + RETURNING VALUE(rv_string) TYPE string. + +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_HTML_ACTION_UTILS IMPLEMENTATION. + + + METHOD add_field. + + DATA ls_field LIKE LINE OF ct. + + FIELD-SYMBOLS TYPE any. + + ls_field-name = name. + + CASE cl_abap_typedescr=>describe_by_data( iv )->kind. + WHEN cl_abap_typedescr=>kind_elem. + ls_field-value = iv. + WHEN cl_abap_typedescr=>kind_struct. + ASSIGN COMPONENT name OF STRUCTURE iv TO . + ASSERT IS ASSIGNED. + ls_field-value = . + WHEN OTHERS. + ASSERT 0 = 1. + ENDCASE. + + APPEND ls_field TO ct. + + ENDMETHOD. "add_field + + + METHOD dbcontent_decode. + + DATA: lt_fields TYPE tihttpnvp, + lv_string TYPE string. + + + CONCATENATE LINES OF it_postdata INTO lv_string. + + lv_string = cl_http_utility=>unescape_url( lv_string ). + + rs_content = dbkey_decode( lv_string ). + + lt_fields = parse_fields_upper_case_name( lv_string ). + + get_field( EXPORTING name = 'XMLDATA' it = lt_fields CHANGING cv = rs_content-data_str ). + IF rs_content-data_str(1) <> '<' AND rs_content-data_str+1(1) = '<'. " Hmmm ??? + rs_content-data_str = rs_content-data_str+1. +* ELSE. +* CLEAR rs_content-data_str. + ENDIF. + + ENDMETHOD. "dbcontent_decode + + + METHOD dbkey_decode. + + DATA: lt_fields TYPE tihttpnvp. + + lt_fields = parse_fields_upper_case_name( cl_http_utility=>unescape_url( |{ iv_string }| ) ). + + get_field( EXPORTING name = 'TYPE' it = lt_fields CHANGING cv = rs_key-type ). + get_field( EXPORTING name = 'VALUE' it = lt_fields CHANGING cv = rs_key-value ). + + ENDMETHOD. "dbkey_decode + + + METHOD dbkey_encode. + + DATA: lt_fields TYPE tihttpnvp. + + add_field( EXPORTING name = 'TYPE' iv = is_key-type CHANGING ct = lt_fields ). + add_field( EXPORTING name = 'VALUE' iv = is_key-value CHANGING ct = lt_fields ). + + rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). + + ENDMETHOD. "dbkey_encode + + + METHOD decode_bg_update. + + DATA: lt_fields TYPE tihttpnvp. + + lt_fields = parse_fields_upper_case_name( iv_getdata ). + + get_field( EXPORTING name = 'METHOD' it = lt_fields CHANGING cv = rs_fields ). + get_field( EXPORTING name = 'USERNAME' it = lt_fields CHANGING cv = rs_fields ). + get_field( EXPORTING name = 'PASSWORD' it = lt_fields CHANGING cv = rs_fields ). + get_field( EXPORTING name = 'AMETHOD' it = lt_fields CHANGING cv = rs_fields ). + get_field( EXPORTING name = 'ANAME' it = lt_fields CHANGING cv = rs_fields ). + get_field( EXPORTING name = 'AMAIL' it = lt_fields CHANGING cv = rs_fields ). + + ASSERT NOT rs_fields IS INITIAL. + + ENDMETHOD. "decode_bg_update + + + METHOD dir_decode. + + DATA: lt_fields TYPE tihttpnvp. + + lt_fields = parse_fields( iv_string ). + get_field( EXPORTING name = 'PATH' it = lt_fields CHANGING cv = rv_path ). + + ENDMETHOD. "dir_decode + + + METHOD dir_encode. + + DATA: lt_fields TYPE tihttpnvp. + add_field( EXPORTING name = 'PATH' iv = iv_path CHANGING ct = lt_fields ). + rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). + + ENDMETHOD. "dir_encode + + + METHOD field_keys_to_upper. + + FIELD-SYMBOLS LIKE LINE OF ct_fields. + + LOOP AT ct_fields ASSIGNING . + -name = to_upper( -name ). + ENDLOOP. + + ENDMETHOD. "field_keys_to_upper + + + METHOD file_encode. + + DATA: lt_fields TYPE tihttpnvp. + + + add_field( EXPORTING name = 'KEY' iv = iv_key CHANGING ct = lt_fields ). + add_field( EXPORTING name = 'PATH' iv = ig_file CHANGING ct = lt_fields ). + add_field( EXPORTING name = 'FILENAME' iv = ig_file CHANGING ct = lt_fields ). + + rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). + + ENDMETHOD. "file_encode + + + METHOD file_obj_decode. + + DATA: lt_fields TYPE tihttpnvp. + + ASSERT eg_file IS SUPPLIED OR eg_object IS SUPPLIED. + + CLEAR: ev_key, eg_file, eg_object. + lt_fields = parse_fields_upper_case_name( iv_string ). + + get_field( EXPORTING name = 'KEY' it = lt_fields CHANGING cv = ev_key ). + + IF eg_file IS SUPPLIED. + get_field( EXPORTING name = 'PATH' it = lt_fields CHANGING cv = eg_file ). + get_field( EXPORTING name = 'FILENAME' it = lt_fields CHANGING cv = eg_file ). + ENDIF. + + IF eg_object IS SUPPLIED. + get_field( EXPORTING name = 'OBJ_TYPE' it = lt_fields CHANGING cv = eg_object ). + get_field( EXPORTING name = 'OBJ_NAME' it = lt_fields CHANGING cv = eg_object ). + ENDIF. + + ENDMETHOD. "file_decode + + + METHOD get_field. + + FIELD-SYMBOLS: LIKE LINE OF it, + TYPE any. + + + READ TABLE it ASSIGNING WITH KEY name = name. + IF sy-subrc IS NOT INITIAL. + RETURN. + ENDIF. + + CASE cl_abap_typedescr=>describe_by_data( cv )->kind. + WHEN cl_abap_typedescr=>kind_elem. + cv = -value. + WHEN cl_abap_typedescr=>kind_struct. + ASSIGN COMPONENT name OF STRUCTURE cv TO . + ASSERT IS ASSIGNED. + = -value. + WHEN OTHERS. + ASSERT 0 = 1. + ENDCASE. + + ENDMETHOD. "get_field + + + METHOD jump_decode. + + DATA: lt_fields TYPE tihttpnvp. + + lt_fields = parse_fields( iv_string ). + + get_field( EXPORTING name = 'TYPE' it = lt_fields CHANGING cv = ev_obj_type ). + get_field( EXPORTING name = 'NAME' it = lt_fields CHANGING cv = ev_obj_name ). + + ENDMETHOD. "jump_decode + + + METHOD jump_encode. + + DATA: lt_fields TYPE tihttpnvp. + + + add_field( EXPORTING name = 'TYPE' iv = iv_obj_type CHANGING ct = lt_fields ). + add_field( EXPORTING name = 'NAME' iv = iv_obj_name CHANGING ct = lt_fields ). + + rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). + + ENDMETHOD. "jump_encode + + + METHOD obj_encode. + + DATA: lt_fields TYPE tihttpnvp. + + + add_field( EXPORTING name = 'KEY' iv = iv_key CHANGING ct = lt_fields ). + add_field( EXPORTING name = 'OBJ_TYPE' iv = ig_object CHANGING ct = lt_fields ). + add_field( EXPORTING name = 'OBJ_NAME' iv = ig_object CHANGING ct = lt_fields ). + + rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). + + ENDMETHOD. "obj_encode + + + METHOD parse_commit_request. + + CONSTANTS: lc_replace TYPE string VALUE '<>'. + + DATA: lv_string TYPE string, + lt_fields TYPE tihttpnvp. + + FIELD-SYMBOLS TYPE string. + + CLEAR es_fields. + + CONCATENATE LINES OF it_postdata INTO lv_string. + REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>gc_crlf IN lv_string WITH lc_replace. + REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>gc_newline IN lv_string WITH lc_replace. + lt_fields = parse_fields_upper_case_name( lv_string ). + + get_field( EXPORTING name = 'COMMITTER_NAME' it = lt_fields CHANGING cv = es_fields ). + get_field( EXPORTING name = 'COMMITTER_EMAIL' it = lt_fields CHANGING cv = es_fields ). + get_field( EXPORTING name = 'AUTHOR_NAME' it = lt_fields CHANGING cv = es_fields ). + get_field( EXPORTING name = 'AUTHOR_EMAIL' it = lt_fields CHANGING cv = es_fields ). + get_field( EXPORTING name = 'COMMENT' it = lt_fields CHANGING cv = es_fields ). + get_field( EXPORTING name = 'BODY' it = lt_fields CHANGING cv = es_fields ). + + ASSIGN COMPONENT 'BODY' OF STRUCTURE es_fields TO . + ASSERT IS ASSIGNED. + REPLACE ALL OCCURRENCES OF lc_replace IN WITH zif_abapgit_definitions=>gc_newline. + + ENDMETHOD. "parse_commit_request + + + METHOD parse_fields. + + DATA: substrings TYPE stringtab, + field LIKE LINE OF rt_fields. + + FIELD-SYMBOLS: LIKE LINE OF substrings. + + SPLIT iv_string AT '&' INTO TABLE substrings. + + LOOP AT substrings ASSIGNING . + + CLEAR: field. + + field-name = substring_before( val = + sub = '=' ). + field-name = unescape( field-name ). + + field-value = substring_after( val = + sub = '=' ). + field-value = unescape( field-value ). + + INSERT field INTO TABLE rt_fields. + + ENDLOOP. + + ENDMETHOD. + + + METHOD parse_fields_upper_case_name. + + rt_fields = parse_fields( iv_string ). + field_keys_to_upper( CHANGING ct_fields = rt_fields ). + + ENDMETHOD. " parse_fields. + + + METHOD stage_decode. + + DATA: lt_fields TYPE tihttpnvp. + + lt_fields = parse_fields_upper_case_name( iv_getdata ). + + get_field( EXPORTING name = 'KEY' it = lt_fields CHANGING cv = ev_key ). + get_field( EXPORTING name = 'SEED' it = lt_fields CHANGING cv = ev_seed ). + + ASSERT NOT ev_key IS INITIAL. + + ENDMETHOD. " stage_decode. + + + METHOD unescape. +* do not use cl_http_utility as it does strange things with the encoding + rv_string = iv_string. + +* todo, more to be added here + REPLACE ALL OCCURRENCES OF '%3F' IN rv_string WITH '?'. + + ENDMETHOD. +ENDCLASS. diff --git a/src/ui/zcl_abapgit_html_action_utils.clas.testclasses.abap b/src/ui/zcl_abapgit_html_action_utils.clas.testclasses.abap new file mode 100644 index 000000000..3f9feaf88 --- /dev/null +++ b/src/ui/zcl_abapgit_html_action_utils.clas.testclasses.abap @@ -0,0 +1,253 @@ +CLASS ltcl_html_action_utils DEFINITION FOR TESTING RISK LEVEL HARMLESS + DURATION SHORT FINAL + INHERITING FROM cl_aunit_assert. + + PUBLIC SECTION. + + CLASS-METHODS class_constructor. + METHODS add_field FOR TESTING. + METHODS get_field FOR TESTING. + METHODS parse_fields_simple_case FOR TESTING. + METHODS parse_fields_advanced_case FOR TESTING. + METHODS parse_fields_unescape FOR TESTING. + METHODS parse_fields_german_umlauts FOR TESTING. + + PRIVATE SECTION. + + CONSTANTS: BEGIN OF co_german_umlaut_as_hex, + lower_case_ae TYPE xstring VALUE 'C3A4', + lower_case_oe TYPE xstring VALUE 'C3B6', + lower_case_ue TYPE xstring VALUE 'C3BC', + END OF co_german_umlaut_as_hex. + + CLASS-DATA: BEGIN OF ms_german_umlaut_as_char, + lower_case_ae TYPE string, + lower_case_oe TYPE string, + lower_case_ue TYPE string, + END OF ms_german_umlaut_as_char. + + DATA m_given_parse_string TYPE string. + DATA mt_parsed_fields TYPE tihttpnvp. + + METHODS _given_string_is + IMPORTING + i_string TYPE string. + METHODS _when_fields_are_parsed. + METHODS _then_fields_should_be + IMPORTING + index TYPE i + name TYPE string + value TYPE string. + + CLASS-METHODS _hex_to_char + IMPORTING + i_x TYPE xstring + RETURNING + VALUE(r_s) TYPE string. + +ENDCLASS. "ltcl_html_action_utils + +CLASS ltcl_html_action_utils IMPLEMENTATION. + + METHOD class_constructor. + + ms_german_umlaut_as_char-lower_case_ae = _hex_to_char( co_german_umlaut_as_hex-lower_case_ae ). + ms_german_umlaut_as_char-lower_case_oe = _hex_to_char( co_german_umlaut_as_hex-lower_case_oe ). + ms_german_umlaut_as_char-lower_case_ue = _hex_to_char( co_german_umlaut_as_hex-lower_case_ue ). + + ENDMETHOD. + + METHOD add_field. + + DATA: lt_fields TYPE tihttpnvp, + lt_answer TYPE tihttpnvp, + ls_field LIKE LINE OF lt_fields. + + ls_field-name = 'NAME'. + ls_field-value = 'TEST'. + APPEND ls_field TO lt_answer. + + ls_field-name = 'VALUE'. + ls_field-value = 'TEST'. + APPEND ls_field TO lt_answer. + + zcl_abapgit_html_action_utils=>add_field( EXPORTING name = 'NAME' iv = 'TEST' + CHANGING ct = lt_fields ). + zcl_abapgit_html_action_utils=>add_field( EXPORTING name = 'VALUE' iv = ls_field + CHANGING ct = lt_fields ). + + assert_equals( act = lt_fields exp = lt_answer ). + + ENDMETHOD. "add_field + + METHOD get_field. + + DATA: lt_fields TYPE tihttpnvp, + ls_answer LIKE LINE OF lt_fields, + ls_field LIKE LINE OF lt_fields. + + ls_answer-name = 'NAME'. + ls_answer-value = 'TEST'. + APPEND ls_answer TO lt_fields. + + zcl_abapgit_html_action_utils=>get_field( EXPORTING name = 'NAME' it = lt_fields + CHANGING cv = ls_field-value ). + zcl_abapgit_html_action_utils=>get_field( EXPORTING name = 'NAME' it = lt_fields + CHANGING cv = ls_field ). + + ls_answer-name = 'TEST'. + ls_answer-value = 'TEST'. + assert_equals( act = ls_field exp = ls_answer ). " Both field are filled! + + ENDMETHOD. "get_field + + METHOD parse_fields_simple_case. + + _given_string_is( `committer_name=Gustav Gans` ). + + _when_fields_are_parsed( ). + + _then_fields_should_be( index = 1 name = `COMMITTER_NAME` value = `Gustav Gans` ). + + ENDMETHOD. + + METHOD parse_fields_advanced_case. + + _given_string_is( `committer_name=Albert Schweitzer&` + && `committer_email=albert.schweitzer@googlemail.com&` + && `comment=dummy comment&` + && `body=Message body<><>with line break<>&` + && `author_name=Karl Klammer&` + && `author_email=karl@klammer.com` ). + + _when_fields_are_parsed( ). + + _then_fields_should_be( index = 1 + name = `COMMITTER_NAME` + value = `Albert Schweitzer` ). + + _then_fields_should_be( index = 2 + name = `COMMITTER_EMAIL` + value = `albert.schweitzer@googlemail.com` ). + + _then_fields_should_be( index = 3 + name = `COMMENT` + value = `dummy comment` ). + + _then_fields_should_be( index = 4 + name = `BODY` + value = `Message body<><>with line break<>` ). + + _then_fields_should_be( index = 5 + name = `AUTHOR_NAME` + value = `Karl Klammer` ). + + _then_fields_should_be( index = 6 + name = `AUTHOR_EMAIL` + value = `karl@klammer.com` ). + + ENDMETHOD. + + METHOD parse_fields_unescape. +* file status = '?', used in staging page + + _given_string_is( '/SRC/ZFOOBAR.PROG.ABAP=%3F' ). + + _when_fields_are_parsed( ). + + _then_fields_should_be( index = 1 + name = '/SRC/ZFOOBAR.PROG.ABAP' + value = '?' ). + + ENDMETHOD. + + METHOD parse_fields_german_umlauts. + + DATA: ae TYPE string, + oe TYPE string, + ue TYPE string, + ae_oe_ue TYPE string. + + ae = ms_german_umlaut_as_char-lower_case_ae. + oe = ms_german_umlaut_as_char-lower_case_oe. + ue = ms_german_umlaut_as_char-lower_case_ue. + + ae_oe_ue = ae && oe && ue. + + _given_string_is( |committer_name=Christian G{ ue }nter&| + && |committer_email=guenne@googlemail.com&| + && |comment={ ae_oe_ue }&| + && |body=Message body<><>with line break<>and umlauts. { ae_oe_ue }&| + && |author_name=Gerd Schr{ oe }der&| + && |author_email=gerd@schroeder.com| ). + + _when_fields_are_parsed( ). + + _then_fields_should_be( index = 1 + name = `COMMITTER_NAME` + value = |Christian G{ ue }nter| ). + + _then_fields_should_be( index = 2 + name = `COMMITTER_EMAIL` + value = `guenne@googlemail.com` ). + + _then_fields_should_be( index = 3 + name = `COMMENT` + value = ae_oe_ue ). + + _then_fields_should_be( index = 4 + name = `BODY` + value = |Message body<><>with line break<>and umlauts. { ae_oe_ue }| ). + + _then_fields_should_be( index = 5 + name = `AUTHOR_NAME` + value = |Gerd Schr{ oe }der| ). + + _then_fields_should_be( index = 6 + name = `AUTHOR_EMAIL` + value = `gerd@schroeder.com` ). + + ENDMETHOD. + + METHOD _given_string_is. + + m_given_parse_string = i_string. + + ENDMETHOD. + + METHOD _when_fields_are_parsed. + + mt_parsed_fields = zcl_abapgit_html_action_utils=>parse_fields_upper_case_name( m_given_parse_string ). + + ENDMETHOD. + + METHOD _then_fields_should_be. + + FIELD-SYMBOLS: LIKE LINE OF mt_parsed_fields. + + READ TABLE mt_parsed_fields ASSIGNING + INDEX index. + + cl_abap_unit_assert=>assert_subrc( exp = 0 + msg = |No parsed field found at index { index }| ). + + cl_abap_unit_assert=>assert_equals( act = -name + exp = name + msg = |Name at index { index } should be { name }| ). + + cl_abap_unit_assert=>assert_equals( act = -value + exp = value + msg = |Value at index { index } should be { value }| ). + + ENDMETHOD. + + METHOD _hex_to_char. + + DATA lr_conv TYPE REF TO cl_abap_conv_in_ce. + + lr_conv = cl_abap_conv_in_ce=>create( ). + lr_conv->convert( EXPORTING input = i_x IMPORTING data = r_s ). + + ENDMETHOD. + +ENDCLASS. "ltcl_html_action_utils diff --git a/src/ui/zcl_abapgit_html_action_utils.clas.xml b/src/ui/zcl_abapgit_html_action_utils.clas.xml new file mode 100644 index 000000000..35a4e96b6 --- /dev/null +++ b/src/ui/zcl_abapgit_html_action_utils.clas.xml @@ -0,0 +1,19 @@ + + + + + + ZCL_ABAPGIT_HTML_ACTION_UTILS + 1 + E + HTML action utilities + 2 + 1 + X + X + X + X + + + + diff --git a/src/utils/zcl_abapgit_login_manager.clas.abap b/src/utils/zcl_abapgit_login_manager.clas.abap index 5c8af4e9d..9999b60df 100644 --- a/src/utils/zcl_abapgit_login_manager.clas.abap +++ b/src/utils/zcl_abapgit_login_manager.clas.abap @@ -5,35 +5,30 @@ CLASS zcl_abapgit_login_manager DEFINITION PUBLIC SECTION. - CLASS-METHODS: - load - IMPORTING - !iv_uri TYPE string - !ii_client TYPE REF TO if_http_client OPTIONAL - RETURNING - VALUE(rv_authorization) TYPE string - RAISING - zcx_abapgit_exception, - - save - IMPORTING - !iv_uri TYPE string - !ii_client TYPE REF TO if_http_client - RAISING - zcx_abapgit_exception, - - clear, - - set - IMPORTING - !iv_uri TYPE string - !iv_username TYPE string - !iv_password TYPE string - RETURNING - VALUE(rv_auth) TYPE string - RAISING - zcx_abapgit_exception . - + CLASS-METHODS load + IMPORTING + !iv_uri TYPE string + !ii_client TYPE REF TO if_http_client OPTIONAL + RETURNING + VALUE(rv_authorization) TYPE string + RAISING + zcx_abapgit_exception . + CLASS-METHODS save + IMPORTING + !iv_uri TYPE string + !ii_client TYPE REF TO if_http_client + RAISING + zcx_abapgit_exception . + CLASS-METHODS clear . + CLASS-METHODS set + IMPORTING + !iv_uri TYPE string + !iv_username TYPE string + !iv_password TYPE string + RETURNING + VALUE(rv_auth) TYPE string + RAISING + zcx_abapgit_exception . PRIVATE SECTION. TYPES: @@ -57,7 +52,8 @@ ENDCLASS. -CLASS zcl_abapgit_login_manager IMPLEMENTATION. +CLASS ZCL_ABAPGIT_LOGIN_MANAGER IMPLEMENTATION. + METHOD append. @@ -135,5 +131,4 @@ CLASS zcl_abapgit_login_manager IMPLEMENTATION. iv_auth = rv_auth ). ENDMETHOD. - ENDCLASS. diff --git a/src/utils/zcl_abapgit_login_manager.clas.testclasses.abap b/src/utils/zcl_abapgit_login_manager.clas.testclasses.abap new file mode 100644 index 000000000..5e6326345 --- /dev/null +++ b/src/utils/zcl_abapgit_login_manager.clas.testclasses.abap @@ -0,0 +1,65 @@ +CLASS ltcl_login_manager DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. + + PRIVATE SECTION. + CONSTANTS: c_username TYPE string VALUE 'Aladdin' ##NO_TEXT, + c_password TYPE string VALUE 'OpenSesame' ##NO_TEXT. + + METHODS: + setup, + teardown, + encoding FOR TESTING + RAISING zcx_abapgit_exception, + same_server FOR TESTING + RAISING zcx_abapgit_exception. + +ENDCLASS. + +CLASS ltcl_login_manager IMPLEMENTATION. + + METHOD setup. + zcl_abapgit_login_manager=>clear( ). + ENDMETHOD. + + METHOD teardown. + zcl_abapgit_login_manager=>clear( ). + ENDMETHOD. + + METHOD encoding. + + DATA: lv_auth TYPE string. + + lv_auth = zcl_abapgit_login_manager=>set( + iv_uri = 'https://github.com/larshp/abapGit.git' + iv_username = c_username + iv_password = c_password ). + + cl_abap_unit_assert=>assert_equals( + act = lv_auth + exp = 'Basic QWxhZGRpbjpPcGVuU2VzYW1l' ). + + ENDMETHOD. + + METHOD same_server. + + CONSTANTS: lc_github1 TYPE string VALUE 'https://github.com/larshp/abapGit.git', + lc_github2 TYPE string VALUE 'https://github.com/larshp/Foobar.git'. + + DATA: lv_auth1 TYPE string, + lv_auth2 TYPE string. + + + zcl_abapgit_login_manager=>set( + iv_uri = lc_github1 + iv_username = c_username + iv_password = c_password ). + + lv_auth1 = zcl_abapgit_login_manager=>load( lc_github1 ). + lv_auth2 = zcl_abapgit_login_manager=>load( lc_github2 ). + + cl_abap_unit_assert=>assert_equals( + act = lv_auth1 + exp = lv_auth2 ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/utils/zcl_abapgit_login_manager.clas.xml b/src/utils/zcl_abapgit_login_manager.clas.xml index 33d9a7cf0..36ce3e60e 100644 --- a/src/utils/zcl_abapgit_login_manager.clas.xml +++ b/src/utils/zcl_abapgit_login_manager.clas.xml @@ -13,6 +13,7 @@ X X X + X diff --git a/src/zabapgit_background.prog.abap b/src/zabapgit_background.prog.abap index ab304fd82..f50c6ebb0 100644 --- a/src/zabapgit_background.prog.abap +++ b/src/zabapgit_background.prog.abap @@ -53,7 +53,7 @@ CLASS lcl_background IMPLEMENTATION. DATA: ls_comment TYPE zif_abapgit_definitions=>ty_comment, ls_files TYPE zif_abapgit_definitions=>ty_stage_files, - lo_stage TYPE REF TO lcl_stage. + lo_stage TYPE REF TO zcl_abapgit_stage. FIELD-SYMBOLS: LIKE LINE OF ls_files-local. @@ -125,7 +125,7 @@ CLASS lcl_background IMPLEMENTATION. lt_users TYPE STANDARD TABLE OF xubname WITH DEFAULT KEY, ls_user_files LIKE ls_files, lv_changed_by TYPE xubname, - lo_stage TYPE REF TO lcl_stage. + lo_stage TYPE REF TO zcl_abapgit_stage. FIELD-SYMBOLS: LIKE LINE OF lt_changed, LIKE LINE OF ls_files-local. diff --git a/src/zabapgit_git.prog.abap b/src/zabapgit_git.prog.abap index 854e547a5..ab31ec686 100644 --- a/src/zabapgit_git.prog.abap +++ b/src/zabapgit_git.prog.abap @@ -314,7 +314,7 @@ CLASS lcl_git_porcelain DEFINITION FINAL FRIENDS ltcl_git_porcelain. CLASS-METHODS push IMPORTING io_repo TYPE REF TO lcl_repo_online is_comment TYPE zif_abapgit_definitions=>ty_comment - io_stage TYPE REF TO lcl_stage + io_stage TYPE REF TO zcl_abapgit_stage EXPORTING ev_branch TYPE zif_abapgit_definitions=>ty_sha1 et_updated_files TYPE zif_abapgit_definitions=>ty_file_signatures_tt RAISING zcx_abapgit_exception. @@ -395,7 +395,7 @@ CLASS lcl_git_porcelain DEFINITION FINAL FRIENDS ltcl_git_porcelain. io_repo TYPE REF TO lcl_repo_online it_trees TYPE ty_trees_tt it_blobs TYPE zif_abapgit_definitions=>ty_files_tt - io_stage TYPE REF TO lcl_stage + io_stage TYPE REF TO zcl_abapgit_stage RETURNING VALUE(rv_branch) TYPE zif_abapgit_definitions=>ty_sha1 RAISING zcx_abapgit_exception. @@ -598,7 +598,7 @@ CLASS lcl_git_porcelain IMPLEMENTATION. lt_trees TYPE ty_trees_tt, lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, lt_branches TYPE zcl_abapgit_git_branch_list=>ty_git_branch_list_tt, - lt_stage TYPE lcl_stage=>ty_stage_tt. + lt_stage TYPE zcl_abapgit_stage=>ty_stage_tt. FIELD-SYMBOLS: LIKE LINE OF lt_stage, LIKE LINE OF et_updated_files, @@ -632,7 +632,7 @@ CLASS lcl_git_porcelain IMPLEMENTATION. MOVE-CORRESPONDING -file TO . CASE -method. - WHEN lcl_stage=>c_method-add. + WHEN zcl_abapgit_stage=>c_method-add. APPEND -file TO lt_blobs. @@ -654,7 +654,7 @@ CLASS lcl_git_porcelain IMPLEMENTATION. -sha1 = lv_sha1. "New sha1 - WHEN lcl_stage=>c_method-rm. + WHEN zcl_abapgit_stage=>c_method-rm. DELETE lt_expanded WHERE name = -file-filename AND path = -file-path. diff --git a/src/zabapgit_gui_router.prog.abap b/src/zabapgit_gui_router.prog.abap index 27588e593..1f2d1d5b8 100644 --- a/src/zabapgit_gui_router.prog.abap +++ b/src/zabapgit_gui_router.prog.abap @@ -111,7 +111,7 @@ CLASS lcl_gui_router IMPLEMENTATION. " SAP GUI actions WHEN zif_abapgit_definitions=>gc_action-jump. " Open object editor - lcl_html_action_utils=>jump_decode( + zcl_abapgit_html_action_utils=>jump_decode( EXPORTING iv_string = iv_getdata IMPORTING ev_obj_type = ls_item-obj_type ev_obj_name = ls_item-obj_name ). @@ -134,11 +134,11 @@ CLASS lcl_gui_router IMPLEMENTATION. iv_getdata = iv_getdata ). ev_state = zif_abapgit_definitions=>gc_event_state-new_page. WHEN zif_abapgit_definitions=>gc_action-db_delete. " DB Delete - ls_db = lcl_html_action_utils=>dbkey_decode( iv_getdata ). + ls_db = zcl_abapgit_html_action_utils=>dbkey_decode( iv_getdata ). lcl_services_db=>delete( ls_db ). ev_state = zif_abapgit_definitions=>gc_event_state-re_render. WHEN zif_abapgit_definitions=>gc_action-db_update. " DB Update - ls_db = lcl_html_action_utils=>dbcontent_decode( it_postdata ). + ls_db = zcl_abapgit_html_action_utils=>dbcontent_decode( it_postdata ). lcl_services_db=>update( ls_db ). ev_state = zif_abapgit_definitions=>gc_event_state-go_back. @@ -279,7 +279,7 @@ CLASS lcl_gui_router IMPLEMENTATION. ls_key TYPE zcl_abapgit_persistence_db=>ty_content. lv_page_class = |LCL_GUI_PAGE_{ to_upper( iv_name ) }|. - ls_key = lcl_html_action_utils=>dbkey_decode( iv_getdata ). + ls_key = zcl_abapgit_html_action_utils=>dbkey_decode( iv_getdata ). TRY. CREATE OBJECT ri_page TYPE (lv_page_class) @@ -320,10 +320,13 @@ CLASS lcl_gui_router IMPLEMENTATION. lv_key TYPE zcl_abapgit_persistence_repo=>ty_repo-key. - lcl_html_action_utils=>file_obj_decode( EXPORTING iv_string = iv_getdata - IMPORTING ev_key = lv_key - eg_file = ls_file - eg_object = ls_object ). + zcl_abapgit_html_action_utils=>file_obj_decode( + EXPORTING + iv_string = iv_getdata + IMPORTING + ev_key = lv_key + eg_file = ls_file + eg_object = ls_object ). CREATE OBJECT lo_page EXPORTING @@ -347,7 +350,7 @@ CLASS lcl_gui_router IMPLEMENTATION. IF sy-subrc <> 0. " Not found ? -> just repo key in params lv_key = iv_getdata. ELSE. - lcl_html_action_utils=>stage_decode( + zcl_abapgit_html_action_utils=>stage_decode( EXPORTING iv_getdata = iv_getdata IMPORTING ev_key = lv_key ev_seed = lv_seed ). diff --git a/src/zabapgit_html_action_utils.prog.abap b/src/zabapgit_html_action_utils.prog.abap index 3bb356759..e7c757335 100644 --- a/src/zabapgit_html_action_utils.prog.abap +++ b/src/zabapgit_html_action_utils.prog.abap @@ -2,399 +2,4 @@ *& Include ZABAPGIT_HTML_ACTION_UTILS *&---------------------------------------------------------------------* -*----------------------------------------------------------------------* -* CLASS lcl_html_action_utils DEFINITION -*----------------------------------------------------------------------* -CLASS lcl_html_action_utils DEFINITION FINAL. - PUBLIC SECTION. - - CLASS-METHODS field_keys_to_upper - CHANGING ct_fields TYPE tihttpnvp. - - CLASS-METHODS parse_fields - IMPORTING iv_string TYPE clike - RETURNING VALUE(rt_fields) TYPE tihttpnvp. - - CLASS-METHODS parse_fields_upper_case_name - IMPORTING iv_string TYPE clike - RETURNING VALUE(rt_fields) TYPE tihttpnvp. - - CLASS-METHODS add_field - IMPORTING name TYPE string - iv TYPE any - CHANGING ct TYPE tihttpnvp. - - CLASS-METHODS get_field - IMPORTING name TYPE string - it TYPE tihttpnvp - CHANGING cv TYPE any. - - CLASS-METHODS jump_encode - IMPORTING iv_obj_type TYPE tadir-object - iv_obj_name TYPE tadir-obj_name - RETURNING VALUE(rv_string) TYPE string. - - CLASS-METHODS jump_decode - IMPORTING iv_string TYPE clike - EXPORTING ev_obj_type TYPE tadir-object - ev_obj_name TYPE tadir-obj_name - RAISING zcx_abapgit_exception. - - CLASS-METHODS dir_encode - IMPORTING iv_path TYPE string - RETURNING VALUE(rv_string) TYPE string. - - CLASS-METHODS dir_decode - IMPORTING iv_string TYPE clike - RETURNING VALUE(rv_path) TYPE string - RAISING zcx_abapgit_exception. - - CLASS-METHODS file_encode - IMPORTING iv_key TYPE zcl_abapgit_persistence_repo=>ty_repo-key - ig_file TYPE any "assuming ty_file - RETURNING VALUE(rv_string) TYPE string. - - CLASS-METHODS obj_encode - IMPORTING iv_key TYPE zcl_abapgit_persistence_repo=>ty_repo-key - ig_object TYPE any "assuming ty_item - RETURNING VALUE(rv_string) TYPE string. - - CLASS-METHODS file_obj_decode - IMPORTING iv_string TYPE clike - EXPORTING ev_key TYPE zcl_abapgit_persistence_repo=>ty_repo-key - eg_file TYPE any "assuming ty_file - eg_object TYPE any "assuming ty_item - RAISING zcx_abapgit_exception. - - CLASS-METHODS dbkey_encode - IMPORTING is_key TYPE zcl_abapgit_persistence_db=>ty_content - RETURNING VALUE(rv_string) TYPE string. - - CLASS-METHODS dbkey_decode - IMPORTING iv_string TYPE clike - RETURNING VALUE(rs_key) TYPE zcl_abapgit_persistence_db=>ty_content. - - CLASS-METHODS dbcontent_decode - IMPORTING it_postdata TYPE cnht_post_data_tab - RETURNING VALUE(rs_content) TYPE zcl_abapgit_persistence_db=>ty_content. - - CLASS-METHODS parse_commit_request - IMPORTING it_postdata TYPE cnht_post_data_tab - EXPORTING es_fields TYPE any. - - CLASS-METHODS decode_bg_update - IMPORTING iv_getdata TYPE clike - RETURNING VALUE(rs_fields) TYPE zcl_abapgit_persist_background=>ty_background. - - CLASS-METHODS stage_decode - IMPORTING iv_getdata TYPE clike - EXPORTING ev_key TYPE zcl_abapgit_persistence_repo=>ty_repo-key - ev_seed TYPE string - RAISING zcx_abapgit_exception. - - PRIVATE SECTION. - CLASS-METHODS unescape - IMPORTING iv_string TYPE string - RETURNING VALUE(rv_string) TYPE string. - -ENDCLASS. "lcl_html_action_utils DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_html_action_utils IMPLEMENTATION -*----------------------------------------------------------------------* -CLASS lcl_html_action_utils IMPLEMENTATION. - - METHOD field_keys_to_upper. - - FIELD-SYMBOLS LIKE LINE OF ct_fields. - - LOOP AT ct_fields ASSIGNING . - -name = to_upper( -name ). - ENDLOOP. - - ENDMETHOD. "field_keys_to_upper - - METHOD parse_fields. - - DATA: substrings TYPE stringtab, - field LIKE LINE OF rt_fields. - - FIELD-SYMBOLS: LIKE LINE OF substrings. - - SPLIT iv_string AT '&' INTO TABLE substrings. - - LOOP AT substrings ASSIGNING . - - CLEAR: field. - - field-name = substring_before( val = - sub = '=' ). - field-name = unescape( field-name ). - - field-value = substring_after( val = - sub = '=' ). - field-value = unescape( field-value ). - - INSERT field INTO TABLE rt_fields. - - ENDLOOP. - - ENDMETHOD. - - METHOD unescape. -* do not use cl_http_utility as it does strange things with the encoding - rv_string = iv_string. - -* todo, more to be added here - REPLACE ALL OCCURRENCES OF '%3F' IN rv_string WITH '?'. - - ENDMETHOD. - - METHOD parse_fields_upper_case_name. - - rt_fields = parse_fields( iv_string ). - field_keys_to_upper( CHANGING ct_fields = rt_fields ). - - ENDMETHOD. " parse_fields. - - METHOD add_field. - - DATA ls_field LIKE LINE OF ct. - - FIELD-SYMBOLS TYPE any. - - ls_field-name = name. - - CASE cl_abap_typedescr=>describe_by_data( iv )->kind. - WHEN cl_abap_typedescr=>kind_elem. - ls_field-value = iv. - WHEN cl_abap_typedescr=>kind_struct. - ASSIGN COMPONENT name OF STRUCTURE iv TO . - ASSERT IS ASSIGNED. - ls_field-value = . - WHEN OTHERS. - ASSERT 0 = 1. - ENDCASE. - - APPEND ls_field TO ct. - - ENDMETHOD. "add_field - - METHOD get_field. - - FIELD-SYMBOLS: LIKE LINE OF it, - TYPE any. - - - READ TABLE it ASSIGNING WITH KEY name = name. - IF sy-subrc IS NOT INITIAL. - RETURN. - ENDIF. - - CASE cl_abap_typedescr=>describe_by_data( cv )->kind. - WHEN cl_abap_typedescr=>kind_elem. - cv = -value. - WHEN cl_abap_typedescr=>kind_struct. - ASSIGN COMPONENT name OF STRUCTURE cv TO . - ASSERT IS ASSIGNED. - = -value. - WHEN OTHERS. - ASSERT 0 = 1. - ENDCASE. - - ENDMETHOD. "get_field - - METHOD jump_encode. - - DATA: lt_fields TYPE tihttpnvp. - - - add_field( EXPORTING name = 'TYPE' iv = iv_obj_type CHANGING ct = lt_fields ). - add_field( EXPORTING name = 'NAME' iv = iv_obj_name CHANGING ct = lt_fields ). - - rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). - - ENDMETHOD. "jump_encode - - METHOD jump_decode. - - DATA: lt_fields TYPE tihttpnvp. - - lt_fields = lcl_html_action_utils=>parse_fields( iv_string ). - - get_field( EXPORTING name = 'TYPE' it = lt_fields CHANGING cv = ev_obj_type ). - get_field( EXPORTING name = 'NAME' it = lt_fields CHANGING cv = ev_obj_name ). - - ENDMETHOD. "jump_decode - - METHOD dir_encode. - - DATA: lt_fields TYPE tihttpnvp. - add_field( EXPORTING name = 'PATH' iv = iv_path CHANGING ct = lt_fields ). - rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). - - ENDMETHOD. "dir_encode - - METHOD dir_decode. - - DATA: lt_fields TYPE tihttpnvp. - - lt_fields = lcl_html_action_utils=>parse_fields( iv_string ). - get_field( EXPORTING name = 'PATH' it = lt_fields CHANGING cv = rv_path ). - - ENDMETHOD. "dir_decode - - METHOD file_encode. - - DATA: lt_fields TYPE tihttpnvp. - - - add_field( EXPORTING name = 'KEY' iv = iv_key CHANGING ct = lt_fields ). - add_field( EXPORTING name = 'PATH' iv = ig_file CHANGING ct = lt_fields ). - add_field( EXPORTING name = 'FILENAME' iv = ig_file CHANGING ct = lt_fields ). - - rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). - - ENDMETHOD. "file_encode - - METHOD obj_encode. - - DATA: lt_fields TYPE tihttpnvp. - - - add_field( EXPORTING name = 'KEY' iv = iv_key CHANGING ct = lt_fields ). - add_field( EXPORTING name = 'OBJ_TYPE' iv = ig_object CHANGING ct = lt_fields ). - add_field( EXPORTING name = 'OBJ_NAME' iv = ig_object CHANGING ct = lt_fields ). - - rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). - - ENDMETHOD. "obj_encode - - METHOD file_obj_decode. - - DATA: lt_fields TYPE tihttpnvp. - - ASSERT eg_file IS SUPPLIED OR eg_object IS SUPPLIED. - - CLEAR: ev_key, eg_file, eg_object. - lt_fields = parse_fields_upper_case_name( iv_string ). - - get_field( EXPORTING name = 'KEY' it = lt_fields CHANGING cv = ev_key ). - - IF eg_file IS SUPPLIED. - get_field( EXPORTING name = 'PATH' it = lt_fields CHANGING cv = eg_file ). - get_field( EXPORTING name = 'FILENAME' it = lt_fields CHANGING cv = eg_file ). - ENDIF. - - IF eg_object IS SUPPLIED. - get_field( EXPORTING name = 'OBJ_TYPE' it = lt_fields CHANGING cv = eg_object ). - get_field( EXPORTING name = 'OBJ_NAME' it = lt_fields CHANGING cv = eg_object ). - ENDIF. - - ENDMETHOD. "file_decode - - METHOD dbkey_encode. - - DATA: lt_fields TYPE tihttpnvp. - - add_field( EXPORTING name = 'TYPE' iv = is_key-type CHANGING ct = lt_fields ). - add_field( EXPORTING name = 'VALUE' iv = is_key-value CHANGING ct = lt_fields ). - - rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). - - ENDMETHOD. "dbkey_encode - - METHOD dbkey_decode. - - DATA: lt_fields TYPE tihttpnvp. - - lt_fields = parse_fields_upper_case_name( cl_http_utility=>unescape_url( |{ iv_string }| ) ). - - get_field( EXPORTING name = 'TYPE' it = lt_fields CHANGING cv = rs_key-type ). - get_field( EXPORTING name = 'VALUE' it = lt_fields CHANGING cv = rs_key-value ). - - ENDMETHOD. "dbkey_decode - - METHOD dbcontent_decode. - - DATA: lt_fields TYPE tihttpnvp, - lv_string TYPE string. - - - CONCATENATE LINES OF it_postdata INTO lv_string. - - lv_string = cl_http_utility=>unescape_url( lv_string ). - - rs_content = dbkey_decode( lv_string ). - - lt_fields = parse_fields_upper_case_name( lv_string ). - - get_field( EXPORTING name = 'XMLDATA' it = lt_fields CHANGING cv = rs_content-data_str ). - IF rs_content-data_str(1) <> '<' AND rs_content-data_str+1(1) = '<'. " Hmmm ??? - rs_content-data_str = rs_content-data_str+1. -* ELSE. -* CLEAR rs_content-data_str. - ENDIF. - - ENDMETHOD. "dbcontent_decode - - METHOD parse_commit_request. - - CONSTANTS: lc_replace TYPE string VALUE '<>'. - - DATA: lv_string TYPE string, - lt_fields TYPE tihttpnvp. - - FIELD-SYMBOLS TYPE string. - - CLEAR es_fields. - - CONCATENATE LINES OF it_postdata INTO lv_string. - REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>gc_crlf IN lv_string WITH lc_replace. - REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>gc_newline IN lv_string WITH lc_replace. - lt_fields = parse_fields_upper_case_name( lv_string ). - - get_field( EXPORTING name = 'COMMITTER_NAME' it = lt_fields CHANGING cv = es_fields ). - get_field( EXPORTING name = 'COMMITTER_EMAIL' it = lt_fields CHANGING cv = es_fields ). - get_field( EXPORTING name = 'AUTHOR_NAME' it = lt_fields CHANGING cv = es_fields ). - get_field( EXPORTING name = 'AUTHOR_EMAIL' it = lt_fields CHANGING cv = es_fields ). - get_field( EXPORTING name = 'COMMENT' it = lt_fields CHANGING cv = es_fields ). - get_field( EXPORTING name = 'BODY' it = lt_fields CHANGING cv = es_fields ). - - ASSIGN COMPONENT 'BODY' OF STRUCTURE es_fields TO . - ASSERT IS ASSIGNED. - REPLACE ALL OCCURRENCES OF lc_replace IN WITH zif_abapgit_definitions=>gc_newline. - - ENDMETHOD. "parse_commit_request - - METHOD decode_bg_update. - - DATA: lt_fields TYPE tihttpnvp. - - lt_fields = parse_fields_upper_case_name( iv_getdata ). - - get_field( EXPORTING name = 'METHOD' it = lt_fields CHANGING cv = rs_fields ). - get_field( EXPORTING name = 'USERNAME' it = lt_fields CHANGING cv = rs_fields ). - get_field( EXPORTING name = 'PASSWORD' it = lt_fields CHANGING cv = rs_fields ). - get_field( EXPORTING name = 'AMETHOD' it = lt_fields CHANGING cv = rs_fields ). - get_field( EXPORTING name = 'ANAME' it = lt_fields CHANGING cv = rs_fields ). - get_field( EXPORTING name = 'AMAIL' it = lt_fields CHANGING cv = rs_fields ). - - ASSERT NOT rs_fields IS INITIAL. - - ENDMETHOD. "decode_bg_update - - METHOD stage_decode. - - DATA: lt_fields TYPE tihttpnvp. - - lt_fields = parse_fields_upper_case_name( iv_getdata ). - - get_field( EXPORTING name = 'KEY' it = lt_fields CHANGING cv = ev_key ). - get_field( EXPORTING name = 'SEED' it = lt_fields CHANGING cv = ev_seed ). - - ASSERT NOT ev_key IS INITIAL. - - ENDMETHOD. " stage_decode. - -ENDCLASS. "lcl_html_action_utils IMPLEMENTATION +* todo, include to be deleted diff --git a/src/zabapgit_page_background.prog.abap b/src/zabapgit_page_background.prog.abap index 33d2d0eb8..98d54854c 100644 --- a/src/zabapgit_page_background.prog.abap +++ b/src/zabapgit_page_background.prog.abap @@ -120,7 +120,7 @@ CLASS lcl_gui_page_bkg IMPLEMENTATION. CASE iv_action. WHEN zif_abapgit_definitions=>gc_action-bg_update. - ls_bg_task = lcl_html_action_utils=>decode_bg_update( iv_getdata ). + ls_bg_task = zcl_abapgit_html_action_utils=>decode_bg_update( iv_getdata ). ls_bg_task-key = mv_key. lcl_services_bkg=>update_task( ls_bg_task ). ev_state = zif_abapgit_definitions=>gc_event_state-re_render. diff --git a/src/zabapgit_page_branch_overview.prog.abap b/src/zabapgit_page_branch_overview.prog.abap index 3c68a34fb..da0d83ca9 100644 --- a/src/zabapgit_page_branch_overview.prog.abap +++ b/src/zabapgit_page_branch_overview.prog.abap @@ -581,7 +581,7 @@ CLASS lcl_gui_page_boverview IMPLEMENTATION. CONCATENATE LINES OF it_postdata INTO lv_string. - lt_fields = lcl_html_action_utils=>parse_fields( lv_string ). + lt_fields = zcl_abapgit_html_action_utils=>parse_fields( lv_string ). READ TABLE lt_fields ASSIGNING WITH KEY name = 'source' ##NO_TEXT. ASSERT sy-subrc = 0. diff --git a/src/zabapgit_page_commit.prog.abap b/src/zabapgit_page_commit.prog.abap index a6b4c951c..ab7704012 100644 --- a/src/zabapgit_page_commit.prog.abap +++ b/src/zabapgit_page_commit.prog.abap @@ -14,7 +14,7 @@ CLASS lcl_gui_page_commit DEFINITION FINAL INHERITING FROM lcl_gui_page. METHODS: constructor IMPORTING io_repo TYPE REF TO lcl_repo_online - io_stage TYPE REF TO lcl_stage + io_stage TYPE REF TO zcl_abapgit_stage RAISING zcx_abapgit_exception, zif_abapgit_gui_page~on_event REDEFINITION. @@ -25,7 +25,7 @@ CLASS lcl_gui_page_commit DEFINITION FINAL INHERITING FROM lcl_gui_page. PRIVATE SECTION. DATA: mo_repo TYPE REF TO lcl_repo_online, - mo_stage TYPE REF TO lcl_stage. + mo_stage TYPE REF TO zcl_abapgit_stage. METHODS: render_menu @@ -63,8 +63,9 @@ CLASS lcl_gui_page_commit IMPLEMENTATION. CASE iv_action. WHEN c_action-commit_post. - lcl_html_action_utils=>parse_commit_request( EXPORTING it_postdata = it_postdata - IMPORTING es_fields = ls_commit ). + zcl_abapgit_html_action_utils=>parse_commit_request( + EXPORTING it_postdata = it_postdata + IMPORTING es_fields = ls_commit ). ls_commit-repo_key = mo_repo->get_key( ). @@ -99,7 +100,7 @@ CLASS lcl_gui_page_commit IMPLEMENTATION. METHOD render_stage. - DATA: lt_stage TYPE lcl_stage=>ty_stage_tt. + DATA: lt_stage TYPE zcl_abapgit_stage=>ty_stage_tt. FIELD-SYMBOLS: LIKE LINE OF lt_stage. @@ -119,7 +120,7 @@ CLASS lcl_gui_page_commit IMPLEMENTATION. LOOP AT lt_stage ASSIGNING . ro_html->add( '' ). ro_html->add( '' ). - ro_html->add( lcl_stage=>method_description( -method ) ). + ro_html->add( zcl_abapgit_stage=>method_description( -method ) ). ro_html->add( '' ). ro_html->add( '' ). ro_html->add( -file-path && -file-filename ). diff --git a/src/zabapgit_page_db.prog.abap b/src/zabapgit_page_db.prog.abap index 4ba0aa6e2..31745eba7 100644 --- a/src/zabapgit_page_db.prog.abap +++ b/src/zabapgit_page_db.prog.abap @@ -39,7 +39,7 @@ CLASS lcl_gui_page_db_dis IMPLEMENTATION. METHOD render_content. DATA: - lo_highlighter TYPE REF TO lcl_syntax_highlighter, + lo_highlighter TYPE REF TO zcl_abapgit_syntax_highlighter, lo_toolbar TYPE REF TO zcl_abapgit_html_toolbar, lv_data TYPE zcl_abapgit_persistence_db=>ty_content-data_str, ls_action TYPE zcl_abapgit_persistence_db=>ty_content, @@ -53,11 +53,11 @@ CLASS lcl_gui_page_db_dis IMPLEMENTATION. ENDTRY. " Create syntax highlighter - lo_highlighter = lcl_syntax_highlighter=>create( '*.xml' ). + lo_highlighter = zcl_abapgit_syntax_highlighter=>create( '*.xml' ). ls_action-type = ms_key-type. ls_action-value = ms_key-value. - lv_action = lcl_html_action_utils=>dbkey_encode( ls_action ). + lv_action = zcl_abapgit_html_action_utils=>dbkey_encode( ls_action ). lv_data = lo_highlighter->process_line( zcl_abapgit_xml_pretty=>print( lv_data ) ). CREATE OBJECT ro_html. @@ -208,7 +208,7 @@ CLASS lcl_gui_page_db IMPLEMENTATION. lv_trclass = ' class="firstrow"' ##NO_TEXT. ENDIF. - lv_action = lcl_html_action_utils=>dbkey_encode( ). + lv_action = zcl_abapgit_html_action_utils=>dbkey_encode( ). CREATE OBJECT lo_toolbar. lo_toolbar->add( iv_txt = 'Display' iv_act = |{ zif_abapgit_definitions=>gc_action-db_display }?{ lv_action }| ). diff --git a/src/zabapgit_page_diff.prog.abap b/src/zabapgit_page_diff.prog.abap index 2cb4477de..c966ab0d5 100644 --- a/src/zabapgit_page_diff.prog.abap +++ b/src/zabapgit_page_diff.prog.abap @@ -486,13 +486,13 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. METHOD render_lines. - DATA: lo_highlighter TYPE REF TO lcl_syntax_highlighter, + DATA: lo_highlighter TYPE REF TO zcl_abapgit_syntax_highlighter, lt_diffs TYPE zcl_abapgit_diff=>ty_diffs_tt, lv_insert_nav TYPE abap_bool. FIELD-SYMBOLS LIKE LINE OF lt_diffs. - lo_highlighter = lcl_syntax_highlighter=>create( is_diff-filename ). + lo_highlighter = zcl_abapgit_syntax_highlighter=>create( is_diff-filename ). CREATE OBJECT ro_html. lt_diffs = is_diff-o_diff->get( ). diff --git a/src/zabapgit_page_merge.prog.abap b/src/zabapgit_page_merge.prog.abap index 82a7bbfc3..625b8c228 100644 --- a/src/zabapgit_page_merge.prog.abap +++ b/src/zabapgit_page_merge.prog.abap @@ -21,7 +21,7 @@ CLASS lcl_merge DEFINITION FINAL. ttree TYPE lcl_git_porcelain=>ty_expanded_tt, ctree TYPE lcl_git_porcelain=>ty_expanded_tt, result TYPE lcl_git_porcelain=>ty_expanded_tt, - stage TYPE REF TO lcl_stage, + stage TYPE REF TO zcl_abapgit_stage, conflict TYPE string, END OF ty_merge. diff --git a/src/zabapgit_page_repo_settings.prog.abap b/src/zabapgit_page_repo_settings.prog.abap index 8b2c89396..fb0e16833 100644 --- a/src/zabapgit_page_repo_settings.prog.abap +++ b/src/zabapgit_page_repo_settings.prog.abap @@ -40,7 +40,7 @@ CLASS lcl_gui_page_repo_sett IMPLEMENTATION. DATA lv_serialized_post_data TYPE string. CONCATENATE LINES OF it_postdata INTO lv_serialized_post_data. - rt_post_fields = lcl_html_action_utils=>parse_fields( lv_serialized_post_data ). + rt_post_fields = zcl_abapgit_html_action_utils=>parse_fields( lv_serialized_post_data ). ENDMETHOD. diff --git a/src/zabapgit_page_settings.prog.abap b/src/zabapgit_page_settings.prog.abap index 5e8000b30..7487513e8 100644 --- a/src/zabapgit_page_settings.prog.abap +++ b/src/zabapgit_page_settings.prog.abap @@ -224,7 +224,7 @@ CLASS lcl_gui_page_settings IMPLEMENTATION. DATA lv_serialized_post_data TYPE string. CONCATENATE LINES OF it_postdata INTO lv_serialized_post_data. - rt_post_fields = lcl_html_action_utils=>parse_fields( lv_serialized_post_data ). + rt_post_fields = zcl_abapgit_html_action_utils=>parse_fields( lv_serialized_post_data ). ENDMETHOD. diff --git a/src/zabapgit_page_stage.prog.abap b/src/zabapgit_page_stage.prog.abap index 79a0de5c5..7338b58fd 100644 --- a/src/zabapgit_page_stage.prog.abap +++ b/src/zabapgit_page_stage.prog.abap @@ -47,7 +47,7 @@ CLASS lcl_gui_page_stage DEFINITION FINAL INHERITING FROM lcl_gui_page. process_stage_list IMPORTING it_postdata TYPE cnht_post_data_tab - io_stage TYPE REF TO lcl_stage + io_stage TYPE REF TO zcl_abapgit_stage RAISING zcx_abapgit_exception, build_menu @@ -90,7 +90,7 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. METHOD zif_abapgit_gui_page~on_event. - DATA lo_stage TYPE REF TO lcl_stage. + DATA lo_stage TYPE REF TO zcl_abapgit_stage. FIELD-SYMBOLS: LIKE LINE OF ms_files-local. @@ -131,7 +131,7 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. LIKE LINE OF lt_fields. CONCATENATE LINES OF it_postdata INTO lv_string. - lt_fields = lcl_html_action_utils=>parse_fields( lv_string ). + lt_fields = zcl_abapgit_html_action_utils=>parse_fields( lv_string ). IF lines( lt_fields ) = 0. zcx_abapgit_exception=>raise( 'process_stage_list: empty list' ). @@ -147,7 +147,7 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. ev_filename = ls_file-filename ). CASE -value. - WHEN lcl_stage=>c_method-add. + WHEN zcl_abapgit_stage=>c_method-add. READ TABLE ms_files-local ASSIGNING WITH KEY file-path = ls_file-path file-filename = ls_file-filename. @@ -155,13 +155,13 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. io_stage->add( iv_path = -file-path iv_filename = -file-filename iv_data = -file-data ). - WHEN lcl_stage=>c_method-ignore. + WHEN zcl_abapgit_stage=>c_method-ignore. io_stage->ignore( iv_path = ls_file-path iv_filename = ls_file-filename ). - WHEN lcl_stage=>c_method-rm. + WHEN zcl_abapgit_stage=>c_method-rm. io_stage->rm( iv_path = ls_file-path iv_filename = ls_file-filename ). - WHEN lcl_stage=>c_method-skip. + WHEN zcl_abapgit_stage=>c_method-skip. " Do nothing WHEN OTHERS. zcx_abapgit_exception=>raise( |process_stage_list: unknown method { -value }| ). @@ -246,8 +246,10 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. CASE iv_context. WHEN 'local'. - lv_param = lcl_html_action_utils=>file_encode( iv_key = mo_repo->get_key( ) - ig_file = is_file ). + lv_param = zcl_abapgit_html_action_utils=>file_encode( + iv_key = mo_repo->get_key( ) + ig_file = is_file ). + lv_filename = zcl_abapgit_html=>a( iv_txt = lv_filename iv_act = |{ zif_abapgit_definitions=>gc_action-go_diff }?{ lv_param }| ). diff --git a/src/zabapgit_repo.prog.abap b/src/zabapgit_repo.prog.abap index 8ba23f1a7..69291ad17 100644 --- a/src/zabapgit_repo.prog.abap +++ b/src/zabapgit_repo.prog.abap @@ -137,7 +137,7 @@ CLASS lcl_repo_online DEFINITION INHERITING FROM lcl_repo FINAL. rebuild_local_checksums REDEFINITION, push IMPORTING is_comment TYPE zif_abapgit_definitions=>ty_comment - io_stage TYPE REF TO lcl_stage + io_stage TYPE REF TO zcl_abapgit_stage RAISING zcx_abapgit_exception, get_unnecessary_local_objs RETURNING VALUE(rt_unnecessary_local_objects) TYPE zif_abapgit_definitions=>ty_tadir_tt @@ -153,7 +153,7 @@ CLASS lcl_repo_online DEFINITION INHERITING FROM lcl_repo FINAL. METHODS: handle_stage_ignore - IMPORTING io_stage TYPE REF TO lcl_stage + IMPORTING io_stage TYPE REF TO zcl_abapgit_stage RAISING zcx_abapgit_exception, actualize_head_branch RAISING zcx_abapgit_exception, diff --git a/src/zabapgit_repo_impl.prog.abap b/src/zabapgit_repo_impl.prog.abap index 73ce6dea7..bcf7b8248 100644 --- a/src/zabapgit_repo_impl.prog.abap +++ b/src/zabapgit_repo_impl.prog.abap @@ -223,14 +223,14 @@ CLASS lcl_repo_online IMPLEMENTATION. DATA: lv_add TYPE abap_bool, lo_dot_abapgit TYPE REF TO zcl_abapgit_dot_abapgit, - lt_stage TYPE lcl_stage=>ty_stage_tt. + lt_stage TYPE zcl_abapgit_stage=>ty_stage_tt. FIELD-SYMBOLS: LIKE LINE OF lt_stage. lo_dot_abapgit = get_dot_abapgit( ). lt_stage = io_stage->get_all( ). - LOOP AT lt_stage ASSIGNING WHERE method = lcl_stage=>c_method-ignore. + LOOP AT lt_stage ASSIGNING WHERE method = zcl_abapgit_stage=>c_method-ignore. lo_dot_abapgit->add_ignore( iv_path = -file-path diff --git a/src/zabapgit_services_git.prog.abap b/src/zabapgit_services_git.prog.abap index 042c51098..ed4e3be90 100644 --- a/src/zabapgit_services_git.prog.abap +++ b/src/zabapgit_services_git.prog.abap @@ -50,7 +50,7 @@ CLASS lcl_services_git DEFINITION FINAL. CLASS-METHODS commit IMPORTING io_repo TYPE REF TO lcl_repo_online is_commit TYPE ty_commit_fields - io_stage TYPE REF TO lcl_stage + io_stage TYPE REF TO zcl_abapgit_stage RAISING zcx_abapgit_exception zcx_abapgit_cancel. ENDCLASS. " lcl_services_git diff --git a/src/zabapgit_stage.prog.abap b/src/zabapgit_stage.prog.abap index da487e32f..41c8521be 100644 --- a/src/zabapgit_stage.prog.abap +++ b/src/zabapgit_stage.prog.abap @@ -2,195 +2,4 @@ *& Include ZABAPGIT_STAGE *&---------------------------------------------------------------------* -"! keep the list of staged files, independent of repository and branch -CLASS lcl_stage DEFINITION FINAL. - - PUBLIC SECTION. - TYPES: ty_method TYPE c LENGTH 1. - - CONSTANTS: BEGIN OF c_method, - add TYPE ty_method VALUE 'A', - rm TYPE ty_method VALUE 'R', - ignore TYPE ty_method VALUE 'I', - skip TYPE ty_method VALUE '?', - END OF c_method. - - TYPES: BEGIN OF ty_stage, - file TYPE zif_abapgit_definitions=>ty_file, - method TYPE ty_method, - END OF ty_stage. - - TYPES: ty_stage_tt TYPE SORTED TABLE OF ty_stage - WITH UNIQUE KEY file-path file-filename. - - CLASS-METHODS method_description - IMPORTING iv_method TYPE ty_method - RETURNING VALUE(rv_description) TYPE string - RAISING zcx_abapgit_exception. - - METHODS: - constructor - IMPORTING iv_branch_name TYPE string - iv_branch_sha1 TYPE zif_abapgit_definitions=>ty_sha1 - iv_merge_source TYPE zif_abapgit_definitions=>ty_sha1 OPTIONAL, - get_branch_name - RETURNING VALUE(rv_branch) TYPE string, - get_branch_sha1 - RETURNING VALUE(rv_branch) TYPE zif_abapgit_definitions=>ty_sha1, - add - IMPORTING iv_path TYPE zif_abapgit_definitions=>ty_file-path - iv_filename TYPE zif_abapgit_definitions=>ty_file-filename - iv_data TYPE xstring - RAISING zcx_abapgit_exception, - reset - IMPORTING iv_path TYPE zif_abapgit_definitions=>ty_file-path - iv_filename TYPE zif_abapgit_definitions=>ty_file-filename - RAISING zcx_abapgit_exception, - reset_all - RAISING zcx_abapgit_exception, - rm - IMPORTING iv_path TYPE zif_abapgit_definitions=>ty_file-path - iv_filename TYPE zif_abapgit_definitions=>ty_file-filename - RAISING zcx_abapgit_exception, - ignore - IMPORTING iv_path TYPE zif_abapgit_definitions=>ty_file-path - iv_filename TYPE zif_abapgit_definitions=>ty_file-filename - RAISING zcx_abapgit_exception, - lookup - IMPORTING iv_path TYPE zif_abapgit_definitions=>ty_file-path - iv_filename TYPE zif_abapgit_definitions=>ty_file-filename - RETURNING VALUE(rv_method) TYPE ty_method, - get_merge_source - RETURNING VALUE(rv_source) TYPE zif_abapgit_definitions=>ty_sha1, - count - RETURNING VALUE(rv_count) TYPE i, - get_all - RETURNING VALUE(rt_stage) TYPE ty_stage_tt. - - PRIVATE SECTION. - DATA: mt_stage TYPE ty_stage_tt, - mv_branch_name TYPE string, - mv_branch_sha1 TYPE zif_abapgit_definitions=>ty_sha1, - mv_merge_source TYPE zif_abapgit_definitions=>ty_sha1. - - METHODS: - append - IMPORTING iv_path TYPE zif_abapgit_definitions=>ty_file-path - iv_filename TYPE zif_abapgit_definitions=>ty_file-filename - iv_method TYPE ty_method - iv_data TYPE xstring OPTIONAL - RAISING zcx_abapgit_exception. - -ENDCLASS. "lcl_stage DEFINITION - -CLASS lcl_stage IMPLEMENTATION. - - METHOD constructor. - mv_branch_name = iv_branch_name. - mv_branch_sha1 = iv_branch_sha1. - mv_merge_source = iv_merge_source. - ENDMETHOD. - - METHOD get_branch_name. - rv_branch = mv_branch_name. - ENDMETHOD. - - METHOD get_merge_source. - rv_source = mv_merge_source. - ENDMETHOD. - - METHOD get_branch_sha1. - rv_branch = mv_branch_sha1. - ENDMETHOD. - - METHOD lookup. - - DATA ls_stage LIKE LINE OF mt_stage. - - - READ TABLE mt_stage INTO ls_stage - WITH KEY file-path = iv_path - file-filename = iv_filename. - IF sy-subrc = 0. - rv_method = ls_stage-method. - ENDIF. - - ENDMETHOD. "lookup - - METHOD get_all. - rt_stage = mt_stage. - ENDMETHOD. "get_all - - METHOD append. - - DATA: ls_stage LIKE LINE OF mt_stage. - - FIELD-SYMBOLS: LIKE LINE OF mt_stage. - - - READ TABLE mt_stage WITH KEY - file-path = iv_path - file-filename = iv_filename - ASSIGNING . - IF sy-subrc = 0. - -file-data = iv_data. - -method = iv_method. - ELSE. - ls_stage-file-path = iv_path. - ls_stage-file-filename = iv_filename. - ls_stage-file-data = iv_data. - ls_stage-method = iv_method. - INSERT ls_stage INTO TABLE mt_stage. - ENDIF. - - ENDMETHOD. "append - - METHOD method_description. - - CASE iv_method. - WHEN c_method-add. - rv_description = 'add'. - WHEN c_method-rm. - rv_description = 'rm'. - WHEN c_method-ignore. - rv_description = 'ignore' ##NO_TEXT. - WHEN OTHERS. - zcx_abapgit_exception=>raise( 'unknown staging method type' ). - ENDCASE. - - ENDMETHOD. "method_description - - METHOD add. - append( iv_path = iv_path - iv_filename = iv_filename - iv_method = c_method-add - iv_data = iv_data ). - ENDMETHOD. "add - - METHOD reset. - DELETE mt_stage WHERE file-path = iv_path - AND file-filename = iv_filename. - ASSERT sy-subrc = 0. - ENDMETHOD. "reset - - METHOD reset_all. - CLEAR mt_stage. - ENDMETHOD. "reset_all - - METHOD rm. - append( iv_path = iv_path - iv_filename = iv_filename - iv_method = c_method-rm ). - ENDMETHOD. "rm - - METHOD ignore. - append( iv_path = iv_path - iv_filename = iv_filename - iv_method = c_method-ignore ). - ENDMETHOD. "ignore - - METHOD count. - rv_count = lines( mt_stage ). - ENDMETHOD. "count - -ENDCLASS. +* todo, include to be deleted diff --git a/src/zabapgit_syntax_highlighter.prog.abap b/src/zabapgit_syntax_highlighter.prog.abap index 27c883e37..5e6f8f6e2 100644 --- a/src/zabapgit_syntax_highlighter.prog.abap +++ b/src/zabapgit_syntax_highlighter.prog.abap @@ -2,1254 +2,4 @@ *& Include ZABAPGIT_SYNTAX_HIGHLIGHTER *&---------------------------------------------------------------------* -CLASS ltcl_syntax_cases DEFINITION DEFERRED. -CLASS ltcl_syntax_basic_logic DEFINITION DEFERRED. - -CLASS lcl_syntax_abap DEFINITION DEFERRED. -CLASS lcl_syntax_xml DEFINITION DEFERRED. - -*----------------------------------------------------------------------* -* CLASS lcl_syntax_highlighter DEFINITION -*----------------------------------------------------------------------* -CLASS lcl_syntax_highlighter DEFINITION ABSTRACT - FRIENDS ltcl_syntax_cases ltcl_syntax_basic_logic. - - PUBLIC SECTION. - - CLASS-METHODS create - IMPORTING iv_filename TYPE string - RETURNING VALUE(ro_instance) TYPE REF TO lcl_syntax_highlighter. - - METHODS process_line - IMPORTING iv_line TYPE string - RETURNING VALUE(rv_line) TYPE string. - - PROTECTED SECTION. - - TYPES: - BEGIN OF ty_match, - token TYPE char1, " Type of matches - offset TYPE i, " Beginning position of the string that should be formatted - length TYPE i, " Length of the string that should be formatted - text_tag TYPE string, " Type of text tag - END OF ty_match. - - TYPES: - ty_match_tt TYPE STANDARD TABLE OF ty_match WITH DEFAULT KEY. - - TYPES: - BEGIN OF ty_rule, - regex TYPE REF TO cl_abap_regex, - token TYPE char1, - style TYPE string, - END OF ty_rule. - - CONSTANTS c_token_none TYPE c VALUE '.'. - - DATA mt_rules TYPE STANDARD TABLE OF ty_rule. - - METHODS add_rule - IMPORTING - iv_regex TYPE string - iv_token TYPE c - iv_style TYPE string. - - METHODS parse_line - IMPORTING iv_line TYPE string - EXPORTING et_matches TYPE ty_match_tt. - - METHODS order_matches ABSTRACT - IMPORTING iv_line TYPE string - CHANGING ct_matches TYPE ty_match_tt. - - METHODS extend_matches - IMPORTING iv_line TYPE string - CHANGING ct_matches TYPE ty_match_tt. - - METHODS format_line - IMPORTING iv_line TYPE string - it_matches TYPE ty_match_tt - RETURNING VALUE(rv_line) TYPE string. - - METHODS apply_style - IMPORTING iv_line TYPE string - iv_class TYPE string - RETURNING VALUE(rv_line) TYPE string. - -ENDCLASS. " lcl_syntax_highlighter DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_syntax_abap DEFINITION -*----------------------------------------------------------------------* -CLASS lcl_syntax_abap DEFINITION INHERITING FROM lcl_syntax_highlighter FINAL. - - PUBLIC SECTION. - - CLASS-METHODS class_constructor. - METHODS constructor. - - CONSTANTS: - BEGIN OF c_css, - keyword TYPE string VALUE 'keyword', "#EC NOTEXT - text TYPE string VALUE 'text', "#EC NOTEXT - comment TYPE string VALUE 'comment', "#EC NOTEXT - END OF c_css, - - BEGIN OF c_token, - keyword TYPE c VALUE 'K', "#EC NOTEXT - text TYPE c VALUE 'T', "#EC NOTEXT - comment TYPE c VALUE 'C', "#EC NOTEXT - END OF c_token, - - BEGIN OF c_regex, - comment TYPE string VALUE '##|"|^\*', - text TYPE string VALUE '`|''|\||\{|\}', - keyword TYPE string VALUE '&&|\b[-_a-z0-9]+\b', - END OF c_regex. - - PROTECTED SECTION. - - CLASS-DATA gt_keywords TYPE HASHED TABLE OF string WITH UNIQUE KEY table_line. - - CLASS-METHODS init_keywords. - CLASS-METHODS is_keyword - IMPORTING iv_chunk TYPE string - RETURNING VALUE(rv_yes) TYPE abap_bool. - - METHODS order_matches REDEFINITION. - METHODS parse_line REDEFINITION. - -ENDCLASS. " lcl_syntax_abap DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_syntax_xml DEFINITION -*----------------------------------------------------------------------* -CLASS lcl_syntax_xml DEFINITION INHERITING FROM lcl_syntax_highlighter FINAL. - - PUBLIC SECTION. - - METHODS constructor. - - CONSTANTS: - BEGIN OF c_css, - xml_tag TYPE string VALUE 'xml_tag', "#EC NOTEXT - attr TYPE string VALUE 'attr', "#EC NOTEXT - attr_val TYPE string VALUE 'attr_val', "#EC NOTEXT - END OF c_css, - - BEGIN OF c_token, - xml_tag TYPE c VALUE 'X', "#EC NOTEXT - attr TYPE c VALUE 'A', "#EC NOTEXT - attr_val TYPE c VALUE 'V', "#EC NOTEXT - END OF c_token, - - BEGIN OF c_regex, - xml_tag TYPE string VALUE '[<>]', "#EC NOTEXT - attr TYPE string VALUE '\s[-a-z:_0-9]+\s*(?==)', "#EC NOTEXT - attr_val TYPE string VALUE '["''][^''"]+[''"]', "#EC NOTEXT - END OF c_regex. - - PROTECTED SECTION. - - METHODS order_matches REDEFINITION. - -ENDCLASS. " lcl_syntax_xml DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_syntax_highlighter IMPLEMENTATION -*----------------------------------------------------------------------* -* Implementation of syntax highligther for ABAP source code -*----------------------------------------------------------------------* - -CLASS lcl_syntax_highlighter IMPLEMENTATION. - - METHOD create. - - " Create instance of highighter dynamically dependent on syntax type - IF iv_filename CP '*.abap'. - CREATE OBJECT ro_instance TYPE lcl_syntax_abap. - ELSEIF iv_filename CP '*.xml'. - CREATE OBJECT ro_instance TYPE lcl_syntax_xml. - ELSE. - CLEAR ro_instance. - ENDIF. - - ENDMETHOD. " create. - - METHOD add_rule. - - DATA ls_rule LIKE LINE OF mt_rules. - - CREATE OBJECT ls_rule-regex - EXPORTING - pattern = iv_regex - ignore_case = abap_true. - - ls_rule-token = iv_token. - ls_rule-style = iv_style. - APPEND ls_rule TO mt_rules. - - ENDMETHOD. - - METHOD parse_line. - - DATA: - lo_regex TYPE REF TO cl_abap_regex, - lo_matcher TYPE REF TO cl_abap_matcher, - lt_result TYPE match_result_tab, - ls_match TYPE ty_match. - - FIELD-SYMBOLS: - LIKE LINE OF mt_rules, - TYPE match_result. - - CLEAR et_matches. - - " Process syntax-dependent regex table and find all matches - LOOP AT mt_rules ASSIGNING . - lo_regex = -regex. - lo_matcher = lo_regex->create_matcher( text = iv_line ). - lt_result = lo_matcher->find_all( ). - - " Save matches into custom table with predefined tokens - LOOP AT lt_result ASSIGNING . - CLEAR: ls_match. - ls_match-token = -token. - ls_match-offset = -offset. - ls_match-length = -length. - APPEND ls_match TO et_matches. - ENDLOOP. - ENDLOOP. - - ENDMETHOD. " parse_line - - METHOD extend_matches. - - DATA: - lv_line_len TYPE i, - lv_last_pos TYPE i VALUE 0, - lv_length TYPE i, - ls_match TYPE ty_match. - - FIELD-SYMBOLS TYPE ty_match. - - lv_line_len = strlen( iv_line ). - - SORT ct_matches BY offset. - - " Add entries refering to parts of text that should not be formatted - LOOP AT ct_matches ASSIGNING . - IF -offset > lv_last_pos. - lv_length = -offset - lv_last_pos. - ls_match-token = c_token_none. - ls_match-offset = lv_last_pos. - ls_match-length = lv_length. - INSERT ls_match INTO ct_matches INDEX sy-tabix. - ENDIF. - lv_last_pos = -offset + -length. - ENDLOOP. - - " Add remainder of the string - IF lv_line_len > lv_last_pos. - lv_length = lv_line_len - lv_last_pos. - ls_match-token = c_token_none. - ls_match-offset = lv_last_pos. - ls_match-length = lv_length. - APPEND ls_match TO ct_matches. - ENDIF. - - ENDMETHOD. " extend_matches - - METHOD format_line. - - DATA: - lv_chunk TYPE string, - ls_rule LIKE LINE OF mt_rules. - - FIELD-SYMBOLS TYPE ty_match. - - LOOP AT it_matches ASSIGNING . - lv_chunk = substring( val = iv_line off = -offset len = -length ). - - CLEAR ls_rule. " Failed read equals no style - READ TABLE mt_rules INTO ls_rule WITH KEY token = -token. - - lv_chunk = me->apply_style( iv_line = lv_chunk - iv_class = ls_rule-style ). - - rv_line = rv_line && lv_chunk. - ENDLOOP. - - ENDMETHOD. " format_line - - METHOD apply_style. - - DATA lv_escaped TYPE string. - - lv_escaped = escape( val = iv_line format = cl_abap_format=>e_html_attr ). - IF iv_class IS NOT INITIAL. - rv_line = |{ lv_escaped }|. - ELSE. - rv_line = lv_escaped. - ENDIF. - - ENDMETHOD. " apply_style - - METHOD process_line. - - DATA: lt_matches TYPE ty_match_tt. - - IF strlen( iv_line ) = 0. - RETURN. - ENDIF. - - me->parse_line( EXPORTING iv_line = iv_line - IMPORTING et_matches = lt_matches ). - - me->order_matches( EXPORTING iv_line = iv_line - CHANGING ct_matches = lt_matches ). - - me->extend_matches( EXPORTING iv_line = iv_line - CHANGING ct_matches = lt_matches ). - - rv_line = me->format_line( iv_line = iv_line - it_matches = lt_matches ). - - ENDMETHOD. " process_line - -ENDCLASS. " lcl_syntax_highlighter IMPLEMENTATION - -*----------------------------------------------------------------------* -* CLASS lcl_syntax_abap IMPLEMENTATION -*----------------------------------------------------------------------* -* Implementation of syntax highligther for XML source code -*----------------------------------------------------------------------* - -CLASS lcl_syntax_abap IMPLEMENTATION. - - METHOD class_constructor. - - init_keywords( ). - - ENDMETHOD. " class_constructor - - METHOD is_keyword. - - DATA lv_str TYPE string. - - lv_str = to_upper( iv_chunk ). - READ TABLE gt_keywords WITH KEY table_line = lv_str TRANSPORTING NO FIELDS. - rv_yes = boolc( sy-subrc = 0 ). - - ENDMETHOD. " is_keyword. - - METHOD constructor. - - super->constructor( ). - - " Initialize instances of regular expression - - add_rule( iv_regex = c_regex-keyword - iv_token = c_token-keyword - iv_style = c_css-keyword ). - - add_rule( iv_regex = c_regex-comment - iv_token = c_token-comment - iv_style = c_css-comment ). - - add_rule( iv_regex = c_regex-text - iv_token = c_token-text - iv_style = c_css-text ). - - ENDMETHOD. " constructor - - METHOD init_keywords. - - DATA: lv_keywords TYPE string, - lt_keywords TYPE STANDARD TABLE OF string. - - lv_keywords = - '&&|?TO|ABAP-SOURCE|ABBREVIATED|ABS|ABSTRACT|ACCEPT|ACCEPTING|ACCESSPOLICY' && - '|ACCORDING|ACOS|ACTIVATION|ACTUAL|ADD|ADD-CORRESPONDING|ADJACENT|AFTER|ALIAS' && - '|ALIASES|ALIGN|ALL|ALLOCATE|ALPHA|ANALYSIS|ANALYZER|AND|ANY|APPEND|APPENDAGE' && - '|APPENDING|APPLICATION|ARCHIVE|AREA|ARITHMETIC|AS|ASCENDING|ASIN|ASPECT|ASSERT' && - '|ASSIGN|ASSIGNED|ASSIGNING|ASSOCIATION|ASYNCHRONOUS|AT|ATAN|ATTRIBUTES|AUTHORITY' && - '|AUTHORITY-CHECK|AVG|BACK|BACKGROUND|BACKUP|BACKWARD|BADI|BASE|BEFORE|BEGIN' && - '|BETWEEN|BIG|BINARY|BINDING|BIT|BIT-AND|BIT-NOT|BIT-OR|BIT-XOR|BLACK|BLANK' && - '|BLANKS|BLOB|BLOCK|BLOCKS|BLUE|BOUND|BOUNDARIES|BOUNDS|BOXED|BREAK-POINT|BT' && - '|BUFFER|BY|BYPASSING|BYTE|BYTE-CA|BYTE-CN|BYTE-CO|BYTE-CS|BYTE-NA|BYTE-NS' && - '|BYTE-ORDER|C|CA|CALL|CALLING|CASE|CAST|CASTING|CATCH|CEIL|CENTER|CENTERED' && - '|CHAIN|CHAIN-INPUT|CHAIN-REQUEST|CHANGE|CHANGING|CHANNELS|CHARACTER|CHARLEN' && - '|CHAR-TO-HEX|CHECK|CHECKBOX|CI_|CIRCULAR|CLASS|CLASS-CODING|CLASS-DATA' && - '|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|CLEANUP|CLEAR|CLIENT|CLOB|CLOCK|CLOSE' && - '|CN|CNT|CO|COALESCE|CODE|CODING|COL_BACKGROUND|COL_GROUP|COL_HEADING|COL_KEY' && - '|COL_NEGATIVE|COL_NORMAL|COL_POSITIVE|COL_TOTAL|COLLECT|COLOR|COLUMN|COLUMNS' && - '|COMMENT|COMMENTS|COMMIT|COMMON|COMMUNICATION|COMPARING|COMPONENT|COMPONENTS' && - '|COMPRESSION|COMPUTE|CONCAT|CONCATENATE|COND|CONDENSE|CONDITION|CONNECT' && - '|CONNECTION|CONSTANTS|CONTEXT|CONTEXTS|CONTINUE|CONTROL|CONTROLS|CONV|CONVERSION' && - '|CONVERT|COPIES|COPY|CORRESPONDING|COS|COSH|COUNT|COUNTRY|COVER|CP|CPI|CREATE' && - '|CREATING|CRITICAL|CS|CURRENCY|CURRENCY_CONVERSION|CURRENT|CURSOR|CURSOR-SELECTION' && - '|CUSTOMER|CUSTOMER-FUNCTION|DANGEROUS|DATA|DATABASE|DATAINFO|DATASET|DATE' && - '|DAYLIGHT|DBMAXLEN|DD/MM/YY|DD/MM/YYYY|DDMMYY|DEALLOCATE|DECIMAL_SHIFT|DECIMALS' && - '|DECLARATIONS|DEEP|DEFAULT|DEFERRED|DEFINE|DEFINING|DEFINITION|DELETE|DELETING' && - '|DEMAND|DEPARTMENT|DESCENDING|DESCRIBE|DESTINATION|DETAIL|DIALOG|DIRECTORY' && - '|DISCONNECT|DISPLAY|DISPLAY-MODE|DISTANCE|DISTINCT|DIV|DIVIDE|DIVIDE-CORRESPONDING' && - '|DIVISION|DO|DUMMY|DUPLICATE|DUPLICATES|DURATION|DURING|DYNAMIC|DYNPRO|E|EACH' && - '|EDIT|EDITOR-CALL|ELSE|ELSEIF|EMPTY|ENABLED|ENABLING|ENCODING|END|ENDAT|ENDCASE' && - '|ENDCATCH|ENDCHAIN|ENDCLASS|ENDDO|ENDENHANCEMENT|END-ENHANCEMENT-SECTION' && - '|ENDEXEC|ENDFOR|ENDFORM|ENDFUNCTION|ENDIAN|ENDIF|ENDING|ENDINTERFACE' && - '|END-LINES|ENDLOOP|ENDMETHOD|ENDMODULE|END-OF-DEFINITION|END-OF-FILE' && - '|END-OF-PAGE|END-OF-SELECTION|ENDON|ENDPROVIDE|ENDSELECT|ENDTRY|ENDWHILE' && - '|ENGINEERING|ENHANCEMENT|ENHANCEMENT-POINT|ENHANCEMENTS|ENHANCEMENT-SECTION' && - '|ENTRIES|ENTRY|ENVIRONMENT|EQ|EQUAL|EQUIV|ERRORMESSAGE|ERRORS|ESCAPE|ESCAPING' && - '|EVENT|EVENTS|EXACT|EXCEPT|EXCEPTION|EXCEPTIONS|EXCEPTION-TABLE|EXCLUDE|EXCLUDING' && - '|EXEC|EXECUTE|EXISTS|EXIT|EXIT-COMMAND|EXP|EXPAND|EXPANDING|EXPIRATION|EXPLICIT' && - '|EXPONENT|EXPORT|EXPORTING|EXTEND|EXTENDED|EXTENSION|EXTRACT|FAIL|FETCH|FIELD' && - '|FIELD-GROUPS|FIELDS|FIELD-SYMBOL|FIELD-SYMBOLS|FILE|FILTER|FILTERS|FILTER-TABLE' && - '|FINAL|FIND|FIRST|FIRST-LINE|FIXED-POINT|FKEQ|FKGE|FLOOR|FLUSH|FONT|FOR|FORM' && - '|FORMAT|FORWARD|FOUND|FRAC|FRAME|FRAMES|FREE|FRIENDS|FROM|FUNCTION|FUNCTIONALITY' && - '|FUNCTION-POOL|FURTHER|GAPS|GE|GENERATE|GET|GIVING|GKEQ|GKGE|GLOBAL|GRANT|GREATER' && - '|GREEN|GROUP|GROUPS|GT|HANDLE|HANDLER|HARMLESS|HASHED|HAVING|HDB|HEADER|HEADERS' && - '|HEADING|HEAD-LINES|HELP-ID|HELP-REQUEST|HIDE|HIGH|HINT|HOLD|HOTSPOT|I|ICON|ID' && - '|IDENTIFICATION|IDENTIFIER|IDS|IF|IGNORE|IGNORING|IMMEDIATELY|IMPLEMENTATION' && - '|IMPLEMENTATIONS|IMPLEMENTED|IMPLICIT|IMPORT|IMPORTING|IN|INACTIVE|INCL|INCLUDE' && - '|INCLUDES|INCLUDING|INCREMENT|INDEX|INDEX-LINE|INFOTYPES|INHERITING|INIT|INITIAL' && - '|INITIALIZATION|INNER|INOUT|INPUT|INSERT|INSTANCES|INTENSIFIED|INTERFACE' && - '|INTERFACE-POOL|INTERFACES|INTERNAL|INTERVALS|INTO|INVERSE|INVERTED-DATE|IS' && - '|ISO|ITERATOR|ITNO|JOB|JOIN|KEEP|KEEPING|KERNEL|KEY|KEYS|KEYWORDS|KIND' && - '|LANGUAGE|LAST|LATE|LAYOUT|LE|LEADING|LEAVE|LEFT|LEFT-JUSTIFIED|LEFTPLUS' && - '|LEFTSPACE|LEGACY|LENGTH|LESS|LET|LEVEL|LEVELS|LIKE|LINE|LINE-COUNT|LINEFEED' && - '|LINES|LINE-SELECTION|LINE-SIZE|LIST|LISTBOX|LIST-PROCESSING|LITTLE|LLANG' && - '|LOAD|LOAD-OF-PROGRAM|LOB|LOCAL|LOCALE|LOCATOR|LOG|LOG10|LOGFILE|LOGICAL' && - '|LOG-POINT|LONG|LOOP|LOW|LOWER|LPAD|LPI|LT|M|MAIL|MAIN|MAJOR-ID|MAPPING|MARGIN' && - '|MARK|MASK|MATCH|MATCHCODE|MAX|MAXIMUM|MEDIUM|MEMBERS|MEMORY|MESH|MESSAGE' && - '|MESSAGE-ID|MESSAGES|MESSAGING|METHOD|METHODS|MIN|MINIMUM|MINOR-ID|MM/DD/YY' && - '|MM/DD/YYYY|MMDDYY|MOD|MODE|MODIF|MODIFIER|MODIFY|MODULE|MOVE|MOVE-CORRESPONDING' && - '|MULTIPLY|MULTIPLY-CORRESPONDING|NA|NAME|NAMETAB|NATIVE|NB|NE|NESTED|NESTING' && - '|NEW|NEW-LINE|NEW-PAGE|NEW-SECTION|NEXT|NO|NODE|NODES|NO-DISPLAY' && - '|NO-EXTENSION|NO-GAP|NO-GAPS|NO-GROUPING|NO-HEADING|NON-UNICODE|NON-UNIQUE' && - '|NO-SCROLLING|NO-SIGN|NOT|NO-TITLE|NO-TOPOFPAGE|NO-ZERO|NP|NS|NULL|NUMBER' && - '|NUMOFCHAR|O|OBJECT|OBJECTS|OBLIGATORY|OCCURRENCE|OCCURRENCES|OCCURS|OF|OFF' && - '|OFFSET|OLE|ON|ONLY|OPEN|OPTION|OPTIONAL|OPTIONS|OR|ORDER|OTHER|OTHERS|OUT' && - '|OUTER|OUTPUT|OUTPUT-LENGTH|OVERFLOW|OVERLAY|PACK|PACKAGE|PAD|PADDING|PAGE' && - '|PAGES|PARAMETER|PARAMETERS|PARAMETER-TABLE|PART|PARTIALLY|PATTERN|PERCENTAGE' && - '|PERFORM|PERFORMING|PERSON|PF|PF-STATUS|PINK|PLACES|POOL|POS_HIGH|POS_LOW' && - '|POSITION|PRAGMAS|PRECOMPILED|PREFERRED|PRESERVING|PRIMARY|PRINT|PRINT-CONTROL' && - '|PRIORITY|PRIVATE|PROCEDURE|PROCESS|PROGRAM|PROPERTY|PROTECTED|PROVIDE|PUBLIC' && - '|PUSHBUTTON|PUT|QUEUE-ONLY|QUICKINFO|RADIOBUTTON|RAISE|RAISING|RANGE|RANGES' && - '|RAW|READ|READER|READ-ONLY|RECEIVE|RECEIVED|RECEIVER|RECEIVING|RED|REDEFINITION' && - '|REDUCE|REDUCED|REF|REFERENCE|REFRESH|REGEX|REJECT|REMOTE|RENAMING|REPLACE' && - '|REPLACEMENT|REPLACING|REPORT|REQUEST|REQUESTED|RESERVE|RESET|RESOLUTION' && - '|RESPECTING|RESPONSIBLE|RESULT|RESULTS|RESUMABLE|RESUME|RETRY|RETURN|RETURNCODE' && - '|RETURNING|RIGHT|RIGHT-JUSTIFIED|RIGHTPLUS|RIGHTSPACE|RISK|RMC_COMMUNICATION_FAILURE' && - '|RMC_INVALID_STATUS|RMC_SYSTEM_FAILURE|ROLE|ROLLBACK|ROUND|ROWS|RTTI|RUN|SAP' && - '|SAP-SPOOL|SAVING|SCALE_PRESERVING|SCALE_PRESERVING_SCIENTIFIC|SCAN|SCIENTIFIC' && - '|SCIENTIFIC_WITH_LEADING_ZERO|SCREEN|SCROLL|SCROLL-BOUNDARY|SCROLLING|SEARCH' && - '|SECONDARY|SECONDS|SECTION|SELECT|SELECTION|SELECTIONS|SELECTION-SCREEN|SELECTION-SET' && - '|SELECTION-SETS|SELECTION-TABLE|SELECT-OPTIONS|SELECTOR|SEND|SEPARATE|SEPARATED|SET' && - '|SHARED|SHIFT|SHORT|SHORTDUMP-ID|SIGN|SIGN_AS_POSTFIX|SIMPLE|SIN|SINGLE|SINH|SIZE' && - '|SKIP|SKIPPING|SMART|SOME|SORT|SORTABLE|SORTED|SOURCE|SPACE|SPECIFIED|SPLIT|SPOOL' && - '|SPOTS|SQL|SQLSCRIPT|SQRT|STABLE|STAMP|STANDARD|STARTING|START-OF-SELECTION|STATE' && - '|STATEMENT|STATEMENTS|STATIC|STATICS|STATUSINFO|STEP-LOOP|STOP|STRLEN|STRUCTURE' && - '|STRUCTURES|STYLE|SUBKEY|SUBMATCHES|SUBMIT|SUBROUTINE|SUBSCREEN|SUBSTRING|SUBTRACT' && - '|SUBTRACT-CORRESPONDING|SUFFIX|SUM|SUMMARY|SUMMING|SUPPLIED|SUPPLY|SUPPRESS|SWITCH' && - '|SWITCHSTATES|SYMBOL|SYNCPOINTS|SYNTAX|SYNTAX-CHECK|SYNTAX-TRACE' && - '|SYSTEM-CALL|SYSTEM-EXCEPTIONS|SYSTEM-EXIT|TAB|TABBED|TABLE|TABLES|TABLEVIEW|TABSTRIP' && - '|TAN|TANH|TARGET|TASK|TASKS|TEST|TESTING|TEXT|TEXTPOOL|THEN|THROW|TIME|TIMES|TIMESTAMP' && - '|TIMEZONE|TITLE|TITLEBAR|TITLE-LINES|TO|TOKENIZATION|TOKENS|TOP-LINES|TOP-OF-PAGE' && - '|TRACE-FILE|TRACE-TABLE|TRAILING|TRANSACTION|TRANSFER|TRANSFORMATION|TRANSLATE' && - '|TRANSPORTING|TRMAC|TRUNC|TRUNCATE|TRUNCATION|TRY|TYPE|TYPE-POOL|TYPE-POOLS|TYPES' && - '|ULINE|UNASSIGN|UNDER|UNICODE|UNION|UNIQUE|UNIT|UNIT_CONVERSION|UNIX|UNPACK|UNTIL' && - '|UNWIND|UP|UPDATE|UPPER|USER|USER-COMMAND|USING|UTF-8|VALID|VALUE|VALUE-REQUEST|VALUES' && - '|VARY|VARYING|VERIFICATION-MESSAGE|VERSION|VIA|VIEW|VISIBLE|WAIT|WARNING|WHEN|WHENEVER' && - '|WHERE|WHILE|WIDTH|WINDOW|WINDOWS|WITH|WITH-HEADING|WITHOUT|WITH-TITLE|WORD|WORK' && - '|WRITE|WRITER|X|XML|XOR|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE'. - - SPLIT lv_keywords AT '|' INTO TABLE lt_keywords. - gt_keywords = lt_keywords. " Hash table - - ENDMETHOD. " init_keywords - - METHOD parse_line. "REDEFINITION - - DATA lv_index TYPE i. - - FIELD-SYMBOLS LIKE LINE OF et_matches. - - super->parse_line( EXPORTING iv_line = iv_line - IMPORTING et_matches = et_matches ). - - " Remove non-keywords - LOOP AT et_matches ASSIGNING WHERE token = c_token-keyword. - lv_index = sy-tabix. - IF abap_false = is_keyword( substring( val = iv_line - off = -offset - len = -length ) ). - DELETE et_matches INDEX lv_index. - ENDIF. - ENDLOOP. - - ENDMETHOD. " parse_line. - - METHOD order_matches. - - DATA: - lv_index TYPE sy-tabix, - lv_line_len TYPE i, - lv_prev_token TYPE c. - - FIELD-SYMBOLS: - TYPE ty_match, - TYPE ty_match. - - SORT ct_matches BY offset. - - lv_line_len = strlen( iv_line ). - - LOOP AT ct_matches ASSIGNING . - lv_index = sy-tabix. - - " Delete matches after open text match - IF lv_prev_token = c_token-text AND -token <> c_token-text. - DELETE ct_matches INDEX lv_index. - CONTINUE. - ENDIF. - - CASE -token. - WHEN c_token-keyword. - IF -offset > 0. - " Delete match if keyword is part of structure or field symbol - IF substring( val = iv_line off = ( -offset - 1 ) len = 1 ) CA '-<'. - DELETE ct_matches INDEX lv_index. - CONTINUE. - ENDIF. - ENDIF. - - WHEN c_token-comment. - -length = lv_line_len - -offset. - DELETE ct_matches FROM lv_index + 1. - CONTINUE. - - WHEN c_token-text. - -text_tag = substring( val = iv_line - off = -offset - len = -length ). - IF lv_prev_token = c_token-text. - IF -text_tag = -text_tag. - -length = -offset + -length - -offset. - CLEAR lv_prev_token. - ELSEIF -text_tag = '}' AND -text_tag = '{'. - -length = -offset - -offset - 1. " Shift } out of scope - -offset = -offset + 1. " Shift { out of scope - CLEAR lv_prev_token. - ELSEIF -text_tag = '{'. - -length = -offset - -offset. - CLEAR lv_prev_token. - ELSEIF -text_tag = '}'. - -length = -offset - -offset. - -offset = -offset + 1. " Shift } out of scope - CLEAR lv_prev_token. - ENDIF. - DELETE ct_matches INDEX lv_index. - CONTINUE. - ENDIF. - - ENDCASE. - - lv_prev_token = -token. - ASSIGN TO . - ENDLOOP. - - ENDMETHOD. " order_matches. - -ENDCLASS. " lcl_syntax_abap IMPLEMENTATION - -*----------------------------------------------------------------------* -* CLASS lcl_syntax_xml IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_syntax_xml IMPLEMENTATION. - - METHOD constructor. - - super->constructor( ). - - " Initialize instances of regular expressions - - add_rule( iv_regex = c_regex-xml_tag - iv_token = c_token-xml_tag - iv_style = c_css-xml_tag ). - - add_rule( iv_regex = c_regex-attr - iv_token = c_token-attr - iv_style = c_css-attr ). - - add_rule( iv_regex = c_regex-attr_val - iv_token = c_token-attr_val - iv_style = c_css-attr_val ). - - ENDMETHOD. - - METHOD order_matches. - - DATA: - lv_index TYPE sy-tabix, - lv_prev_token TYPE c, - lv_state TYPE c VALUE 'O'. " O - for open tag; C - for closed tag; - - FIELD-SYMBOLS: - TYPE ty_match, - TYPE ty_match. - - - SORT ct_matches BY offset. - - LOOP AT ct_matches ASSIGNING . - lv_index = sy-tabix. - - CASE -token. - WHEN c_token-xml_tag. - -text_tag = substring( val = iv_line - off = -offset - len = -length ). - - " No other matches between two tags - IF -text_tag = '>' AND lv_prev_token = c_token-xml_tag. - lv_state = 'C'. - -length = -offset - -offset + -length. - DELETE ct_matches INDEX lv_index. - CONTINUE. - - " Adjust length and offset of closing tag - ELSEIF -text_tag = '>' AND lv_prev_token <> c_token-xml_tag. - lv_state = 'C'. - -length = -offset - -offset - -length + -length. - -offset = -offset + -length. - ELSE. - lv_state = 'O'. - ENDIF. - - WHEN OTHERS. - IF lv_prev_token = c_token-xml_tag. - -length = -offset - -offset. " Extend length of the opening tag - ENDIF. - - IF lv_state = 'C'. " Delete all matches between tags - DELETE ct_matches INDEX lv_index. - CONTINUE. - ENDIF. - - ENDCASE. - - lv_prev_token = -token. - ASSIGN TO . - ENDLOOP. - - ENDMETHOD. " order_matches - -ENDCLASS. " lcl_syntax_xml IMPLEMENTATION - -*----------------------------------------------------------------------* -* CLASS ltcl_syntax_cases definition -*----------------------------------------------------------------------* -CLASS ltcl_syntax_cases DEFINITION FINAL FOR TESTING RISK LEVEL HARMLESS - DURATION SHORT. - - PRIVATE SECTION. - - DATA: - mt_after_parse TYPE lcl_syntax_highlighter=>ty_match_tt, - mt_after_order TYPE lcl_syntax_highlighter=>ty_match_tt, - mt_after_extend TYPE lcl_syntax_highlighter=>ty_match_tt, - ms_match TYPE lcl_syntax_highlighter=>ty_match. - - METHODS: - do_test IMPORTING iv_line TYPE string - iv_filename TYPE string, - test_abap_01 FOR TESTING, - test_abap_02 FOR TESTING, - test_abap_03 FOR TESTING, - test_abap_04 FOR TESTING, - test_abap_05 FOR TESTING, - test_abap_06 FOR TESTING, - test_abap_07 FOR TESTING, - test_abap_08 FOR TESTING, - test_xml_01 FOR TESTING, - test_xml_02 FOR TESTING, - test_xml_03 FOR TESTING, - test_xml_04 FOR TESTING, - test_xml_05 FOR TESTING. - -ENDCLASS. " ltcl_syntax_cases -*----------------------------------------------------------------------* -* CLASS ltcl_syntax_cases IMPLEMENTATION -*----------------------------------------------------------------------* -CLASS ltcl_syntax_cases IMPLEMENTATION. - - DEFINE _generate_parse. - ms_match-token = &1. - ms_match-offset = &2. - ms_match-length = &3. - APPEND ms_match TO mt_after_parse. - END-OF-DEFINITION. " _generate_parse - - DEFINE _generate_order. - ms_match-token = &1. - ms_match-offset = &2. - ms_match-length = &3. - ms_match-text_tag = &4. - APPEND ms_match TO mt_after_order. - END-OF-DEFINITION. " _generate_order - - DEFINE _generate_extend. - ms_match-token = &1. - ms_match-offset = &2. - ms_match-length = &3. - ms_match-text_tag = &4. - APPEND ms_match TO mt_after_extend. - END-OF-DEFINITION. " _generate_extend - - METHOD do_test. - - DATA: lt_matches_act TYPE lcl_syntax_highlighter=>ty_match_tt, - lo TYPE REF TO lcl_syntax_highlighter. - - - lo = lcl_syntax_highlighter=>create( iv_filename ). - lo->parse_line( EXPORTING iv_line = iv_line - IMPORTING et_matches = lt_matches_act ). - - SORT lt_matches_act BY offset. - - cl_abap_unit_assert=>assert_equals( exp = mt_after_parse - act = lt_matches_act - msg = | Error during parsing: { iv_line }| ). - - lo->order_matches( EXPORTING iv_line = iv_line - CHANGING ct_matches = lt_matches_act ). - - cl_abap_unit_assert=>assert_equals( exp = mt_after_order - act = lt_matches_act - msg = | Error during ordering: { iv_line }| ). - - lo->extend_matches( EXPORTING iv_line = iv_line - CHANGING ct_matches = lt_matches_act ). - - cl_abap_unit_assert=>assert_equals( exp = mt_after_extend - act = lt_matches_act - msg = | Error during extending: { iv_line }| ). - - ENDMETHOD. "test - -****************************************************** -* Test parsing and ordering of comments * -****************************************************** - METHOD test_abap_01. - - DATA lv_line TYPE string. - - lv_line = '* commented out line with key word data'. "#EC NOTEXT - - " Generate table with expected values after parsing - _generate_parse 'C' 0 1. - _generate_parse 'K' 12 3. - _generate_parse 'K' 16 4. - _generate_parse 'K' 21 4. - _generate_parse 'K' 26 3. - _generate_parse 'K' 30 4. - _generate_parse 'K' 35 4. - - " Generate table with expected values after ordering - _generate_order 'C' 0 39 ''. - - " Generate table with expected values after ordering - _generate_extend 'C' 0 39 ''. - - do_test( iv_line = lv_line iv_filename = '*.abap' ). - - ENDMETHOD. " test_abap_01 - -****************************************************** -* Test parsing and ordering of remainder of string * -****************************************************** - METHOD test_abap_02. - - DATA lv_line TYPE string. - - lv_line = 'data: lv_var_name type string.'. "#EC NOTEXT - - " Generate table with expected values after parsing - _generate_parse 'K' 0 4. - _generate_parse 'K' 18 4. - - " Generate table with expected values after ordering - _generate_order 'K' 0 4 ''. - _generate_order 'K' 18 4 ''. - - " Generate table with expected values after extending - _generate_extend 'K' 0 4 ''. - _generate_extend '.' 4 14 ''. - _generate_extend 'K' 18 4 ''. - _generate_extend '.' 22 8 ''. - - do_test( iv_line = lv_line iv_filename = '*.abap' ). - - ENDMETHOD. " test_abap_02 - -****************************************************** -* Test parsing and ordering of key words & texts * -****************************************************** - METHOD test_abap_03. - - DATA lv_line TYPE string. - - - lv_line = 'call function ''FM_NAME''. " Commented'. "#EC NOTEXT - - " Generate table with expected values after parsing - _generate_parse 'K' 0 4. - _generate_parse 'K' 5 8. - _generate_parse 'T' 14 1. - _generate_parse 'T' 22 1. - _generate_parse 'C' 25 1. - - " Generate table with expected values after ordering - _generate_order 'K' 0 4 ''. - _generate_order 'K' 5 8 ''. - _generate_order 'T' 14 9 ''''. - _generate_order 'C' 25 11 ''. - - " Generate table with expected values after extending - _generate_extend 'K' 0 4 ''. - _generate_extend '.' 4 1 ''. - _generate_extend 'K' 5 8 ''. - _generate_extend '.' 13 1 ''. - _generate_extend 'T' 14 9 ''''. - _generate_extend '.' 23 2 ''. - _generate_extend 'C' 25 11 ''. - - do_test( iv_line = lv_line iv_filename = '*.abap' ). - - ENDMETHOD. " test_abap_03 - -****************************************************** -* Test parsing and ordering of key words in texts * -****************************************************** - METHOD test_abap_04. - - DATA lv_line TYPE string. - - lv_line = 'constants: lc_var type string value ''simpletext data simpletext''.'. "#EC NOTEXT - - " Generate table with expected values after parsing - _generate_parse 'K' 0 9. - _generate_parse 'K' 18 4. - _generate_parse 'K' 30 5. - _generate_parse 'T' 36 1. - _generate_parse 'K' 48 4. - _generate_parse 'T' 63 1. - - " Generate table with expected values after ordering - _generate_order 'K' 0 9 ''. - _generate_order 'K' 18 4 ''. - _generate_order 'K' 30 5 ''. - _generate_order 'T' 36 28 ''''. - - " Generate table with expected values after ordering - _generate_extend 'K' 0 9 ''. - _generate_extend '.' 9 9 ''. - _generate_extend 'K' 18 4 ''. - _generate_extend '.' 22 8 ''. - _generate_extend 'K' 30 5 ''. - _generate_extend '.' 35 1 ''. - _generate_extend 'T' 36 28 ''''. - _generate_extend '.' 64 1 ''. - - do_test( iv_line = lv_line iv_filename = '*.abap' ). - - ENDMETHOD. " test_abap_04 - -****************************************************** -* Test parsing and ordering texts in curly brackets * -****************************************************** - METHOD test_abap_05. - - DATA lv_line TYPE string. - - lv_line = 'a = |{ b }={ c }|.'. "#EC NOTEXT - - " Generate table with expected values after parsing - _generate_parse 'T' 4 1. - _generate_parse 'T' 5 1. - _generate_parse 'T' 9 1. - _generate_parse 'T' 11 1. - _generate_parse 'K' 13 1. - _generate_parse 'T' 15 1. - _generate_parse 'T' 16 1. - - " Generate table with expected values after ordering - _generate_order 'T' 4 1 '|'. - _generate_order 'T' 10 1 '}'. - _generate_order 'K' 13 1 ''. - _generate_order 'T' 16 1 '}'. - - " Generate table with expected values after extending - _generate_extend '.' 0 4 ''. - _generate_extend 'T' 4 1 '|'. - _generate_extend '.' 5 5 ''. - _generate_extend 'T' 10 1 '}'. - _generate_extend '.' 11 2 ''. - _generate_extend 'K' 13 1 ''. - _generate_extend '.' 14 2 ''. - _generate_extend 'T' 16 1 '}'. - _generate_extend '.' 17 1 ''. - - do_test( iv_line = lv_line iv_filename = '*.abap' ). - - ENDMETHOD. " test_abap_05 - -****************************************************** -* Test parsing and ordering of texts * -****************************************************** - METHOD test_abap_06. - - DATA lv_line TYPE string. - - lv_line = 'lv_line = lc_constant && |XYZ { ''ab'' && |ac{ ''UU'' }| }|'. "#EC NOTEXT - - " Generate table with expected values after parsing - _generate_parse 'K' 22 2. - _generate_parse 'T' 25 1. - _generate_parse 'T' 30 1. - _generate_parse 'T' 32 1. - _generate_parse 'T' 35 1. - _generate_parse 'K' 37 2. - _generate_parse 'T' 40 1. - _generate_parse 'T' 43 1. - _generate_parse 'T' 45 1. - _generate_parse 'T' 48 1. - _generate_parse 'T' 50 1. - _generate_parse 'T' 51 1. - _generate_parse 'T' 53 1. - _generate_parse 'T' 54 1. - - " Generate table with expected values after ordering - _generate_order 'K' 22 2 ''. - _generate_order 'T' 25 5 '|'. - _generate_order 'T' 32 4 ''''. - _generate_order 'K' 37 2 ''. - _generate_order 'T' 40 3 '|'. - _generate_order 'T' 45 4 ''''. - _generate_order 'T' 51 1 '}'. - _generate_order 'T' 54 1 '}'. - - " Generate table with expected values after extending - _generate_extend '.' 00 22 ''. - _generate_extend 'K' 22 2 ''. - _generate_extend '.' 24 1 ''. - _generate_extend 'T' 25 5 '|'. - _generate_extend '.' 30 2 ''. - _generate_extend 'T' 32 4 ''''. - _generate_extend '.' 36 1 ''. - _generate_extend 'K' 37 2 ''. - _generate_extend '.' 39 1 ''. - _generate_extend 'T' 40 3 '|'. - _generate_extend '.' 43 2 ''. - _generate_extend 'T' 45 4 ''''. - _generate_extend '.' 49 2 ''. - _generate_extend 'T' 51 1 '}'. - _generate_extend '.' 52 2 ''. - _generate_extend 'T' 54 1 '}'. - - do_test( iv_line = lv_line iv_filename = '*.abap' ). - - ENDMETHOD. " test_abap_06 - -******************************************************** -* Check that '*' in select statement is not a match * -******************************************************** - METHOD test_abap_07. - - DATA lv_line TYPE string. - - lv_line = 'SELECT * FROM foo'. "#EC NOTEXT - - " Generate table with expected values after parsing - _generate_parse 'K' 0 6. - _generate_parse 'K' 9 4. - - " Generate table with expected values after ordering - _generate_order 'K' 0 6 ''. - _generate_order 'K' 9 4 ''. - - " Generate table with expected values after extending - _generate_extend 'K' 0 6 ''. - _generate_extend '.' 6 3 ''. - _generate_extend 'K' 9 4 ''. - _generate_extend '.' 13 4 ''. - - do_test( iv_line = lv_line iv_filename = '*.abap' ). - - ENDMETHOD. " test_abap_07 - -******************************************************** -* Test parsing and ordering of key words in structures * -******************************************************** - METHOD test_abap_08. - - DATA lv_line TYPE string. - - lv_line = 'lv_length = -length.'. "#EC NOTEXT - - " Generate table with expected values after parsing - _generate_parse 'K' 13 5. - _generate_parse 'K' 20 6. - - " Generate table with expected values after extending - _generate_extend '.' 0 27 ''. - - do_test( iv_line = lv_line iv_filename = '*.abap' ). - - ENDMETHOD. " test_abap_08 - -******************************************************** -* Test parsing and ordering of tags in xml * -******************************************************** - METHOD test_xml_01. - - DATA lv_line TYPE string. - - lv_line = 'Text'. "#EC NOTEXT - - " Generate table with expected values after parsing - _generate_parse 'X' 0 1. - _generate_parse 'X' 4 1. - _generate_parse 'X' 9 1. - _generate_parse 'X' 14 1. - - " Generate table with expected values after ordering - _generate_order 'X' 0 5 '<'. - _generate_order 'X' 9 6 '<'. - - " Generate table with expected values after extending - _generate_extend 'X' 0 5 '<'. - _generate_extend '.' 5 4 ''. - _generate_extend 'X' 9 6 '<'. - - do_test( iv_line = lv_line iv_filename = '*.xml' ). - - ENDMETHOD. " test_xml_01 - - METHOD test_xml_02. - - DATA lv_line TYPE string. - - lv_line = ''. "#EC NOTEXT - - " Generate table with expected values after parsing - _generate_parse 'X' 0 1. - _generate_parse 'X' 5 1. - - " Generate table with expected values after ordering - _generate_order 'X' 0 6 '<'. - - " Generate table with expected values after extending - _generate_extend 'X' 0 6 '<'. - - do_test( iv_line = lv_line iv_filename = '*.xml' ). - - ENDMETHOD. " test_xml_02 - - METHOD test_xml_03. - - DATA lv_line TYPE string. - - lv_line = ''. "#EC NOTEXT - - " Generate table with expected values after parsing - _generate_parse 'X' 0 1. - _generate_parse 'A' 4 10. - _generate_parse 'V' 15 7. - _generate_parse 'X' 23 1. - - " Generate table with expected values after ordering - _generate_order 'X' 0 4 '<'. - _generate_order 'A' 4 10 ''. - _generate_order 'V' 15 7 ''. - _generate_order 'X' 22 2 '>'. - - " Generate table with expected values after extending - _generate_extend 'X' 0 4 '<'. - _generate_extend 'A' 4 10 ''. - _generate_extend '.' 14 1 ''. - _generate_extend 'V' 15 7 ''. - _generate_extend 'X' 22 2 '>'. - - do_test( iv_line = lv_line iv_filename = '*.xml' ). - - ENDMETHOD. " test_xml_03 - - METHOD test_xml_04. - - DATA lv_line TYPE string. - - lv_line = ''. "#EC NOTEXT - - " Generate table with expected values after parsing - _generate_parse 'X' 0 1. - _generate_parse 'A' 5 8. - _generate_parse 'V' 14 5. - _generate_parse 'X' 20 1. - - " Generate table with expected values after ordering - _generate_order 'X' 0 5 '<'. - _generate_order 'A' 5 8 ''. - _generate_order 'V' 14 5 ''. - _generate_order 'X' 19 2 '>'. - - " Generate table with expected values after extending - _generate_extend 'X' 0 5 '<'. - _generate_extend 'A' 5 8 ''. - _generate_extend '.' 13 1 ''. - _generate_extend 'V' 14 5 ''. - _generate_extend 'X' 19 2 '>'. - - do_test( iv_line = lv_line iv_filename = '*.xml' ). - - ENDMETHOD. " test_xml_04 - - METHOD test_xml_05. - - DATA lv_line TYPE string. - - lv_line = '"text"'. "#EC NOTEXT - - " Generate table with expected values after parsing - _generate_parse 'X' 0 1. - _generate_parse 'A' 7 6. - _generate_parse 'V' 14 4. - _generate_parse 'A' 18 6. - _generate_parse 'V' 25 4. - _generate_parse 'X' 29 1. - _generate_parse 'V' 30 6. - _generate_parse 'X' 36 1. - _generate_parse 'X' 44 1. - - " Generate table with expected values after ordering - _generate_order 'X' 0 7 '<'. - _generate_order 'A' 7 6 ''. - _generate_order 'V' 14 4 ''. - _generate_order 'A' 18 6 ''. - _generate_order 'V' 25 4 ''. - _generate_order 'X' 29 1 '>'. - _generate_order 'X' 36 9 '<'. - - " Generate table with expected values after extending - _generate_extend 'X' 0 7 '<'. - _generate_extend 'A' 7 6 ''. - _generate_extend '.' 13 1 ''. - _generate_extend 'V' 14 4 ''. - _generate_extend 'A' 18 6 ''. - _generate_extend '.' 24 1 ''. - _generate_extend 'V' 25 4 ''. - _generate_extend 'X' 29 1 '>'. - _generate_extend '.' 30 6 ''. - _generate_extend 'X' 36 9 '<'. - - do_test( iv_line = lv_line iv_filename = '*.xml' ). - - ENDMETHOD. " test_xml_05 - -ENDCLASS. " ltcl_syntax_cases IMPLEMENTATION - -*----------------------------------------------------------------------* -* CLASS ltcl_syntax_basic_logic DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS ltcl_syntax_basic_logic DEFINITION FINAL FOR TESTING RISK LEVEL HARMLESS - DURATION SHORT. - - PRIVATE SECTION. - - DATA mo TYPE REF TO lcl_syntax_highlighter. - - METHODS: - setup, - process_line FOR TESTING, - format_line FOR TESTING, - apply_style FOR TESTING. - -ENDCLASS. " ltcl_syntax_basic_logic - -*----------------------------------------------------------------------* -* CLASS ltcl_syntax_highlighter IMPLEMENTATION -*----------------------------------------------------------------------* -CLASS ltcl_syntax_basic_logic IMPLEMENTATION. - - METHOD setup. - mo = lcl_syntax_highlighter=>create( '*.abap' ). - ENDMETHOD. " setup - - METHOD format_line. - - DATA: - lv_line TYPE string, - lv_line_act TYPE string, - lv_line_exp TYPE string. - - lv_line = 'call function ''FM_NAME''. " Commented'. "#EC NOTEXT - - lv_line_exp = - 'call' && "#EC NOTEXT - ' function' && "#EC NOTEXT - ' 'FM_NAME'.' && "#EC NOTEXT - ' " Commented'. "#EC NOTEXT - - lv_line_act = mo->process_line( iv_line = lv_line ). - - cl_abap_unit_assert=>assert_equals( exp = lv_line_exp - act = lv_line_act - msg = | Error during formating: { lv_line }| ). - - ENDMETHOD. " format_line - - METHOD apply_style. - - DATA lv_line_act TYPE string. - - " Call the method and compare results - lv_line_act = mo->apply_style( iv_line = 'CALL FUNCTION' "#EC NOTEXT - iv_class = lcl_syntax_abap=>c_css-keyword ). - - cl_abap_unit_assert=>assert_equals( - act = lv_line_act - exp = 'CALL FUNCTION' "#EC NOTEXT - msg = 'Failure during applying of style.' ). "#EC NOTEXT - - ENDMETHOD. " apply_style - - METHOD process_line. - - DATA lv_line_act TYPE string. - - " Call the method with empty parameter and compare results - lv_line_act = mo->process_line( iv_line = '' ). - - cl_abap_unit_assert=>assert_equals( - act = lv_line_act - exp = '' - msg = 'Failure in method process_line.' ). "#EC NOTEXT - - " Call the method with non-empty line and compare results - lv_line_act = mo->process_line( iv_line = '* CALL FUNCTION' ). "#EC NOTEXT - - cl_abap_unit_assert=>assert_equals( - act = lv_line_act - exp = '* CALL FUNCTION' "#EC NOTEXT - msg = 'Failure in method process_line.' ). "#EC NOTEXT - - ENDMETHOD. " process_line - -ENDCLASS. " ltcl_syntax_highlighter +* todo, include to be deleted diff --git a/src/zabapgit_transport.prog.abap b/src/zabapgit_transport.prog.abap index a806b7120..6d992ade3 100644 --- a/src/zabapgit_transport.prog.abap +++ b/src/zabapgit_transport.prog.abap @@ -184,7 +184,7 @@ CLASS lcl_transport_objects DEFINITION. it_transport_objects TYPE scts_tadir. METHODS to_stage IMPORTING - io_stage TYPE REF TO lcl_stage + io_stage TYPE REF TO zcl_abapgit_stage is_stage_objects TYPE zif_abapgit_definitions=>ty_stage_files it_object_statuses TYPE zif_abapgit_definitions=>ty_results_tt RAISING @@ -275,7 +275,7 @@ CLASS lcl_transport_2_branch DEFINITION. METHODS stage_transport_objects IMPORTING it_transport_objects TYPE scts_tadir - io_stage TYPE REF TO lcl_stage + io_stage TYPE REF TO zcl_abapgit_stage is_stage_objects TYPE zif_abapgit_definitions=>ty_stage_files it_object_statuses TYPE zif_abapgit_definitions=>ty_results_tt RAISING @@ -288,7 +288,7 @@ CLASS lcl_transport_2_branch IMPLEMENTATION. DATA: lv_branch_name TYPE string, ls_comment TYPE zif_abapgit_definitions=>ty_comment, - lo_stage TYPE REF TO lcl_stage, + lo_stage TYPE REF TO zcl_abapgit_stage, ls_stage_objects TYPE zif_abapgit_definitions=>ty_stage_files, lt_object_statuses TYPE zif_abapgit_definitions=>ty_results_tt. diff --git a/src/zabapgit_unit_test.prog.abap b/src/zabapgit_unit_test.prog.abap index 56f8e9ae8..813b221c6 100644 --- a/src/zabapgit_unit_test.prog.abap +++ b/src/zabapgit_unit_test.prog.abap @@ -808,326 +808,6 @@ CLASS ltcl_serialize IMPLEMENTATION. ENDCLASS. "ltcl_serialize IMPLEMENTATION -CLASS ltcl_login_manager DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. - - PRIVATE SECTION. - CONSTANTS: c_username TYPE string VALUE 'Aladdin' ##NO_TEXT, - c_password TYPE string VALUE 'OpenSesame' ##NO_TEXT. - - METHODS: - setup, - teardown, - encoding FOR TESTING - RAISING zcx_abapgit_exception, - same_server FOR TESTING - RAISING zcx_abapgit_exception. - -ENDCLASS. - -CLASS ltcl_login_manager IMPLEMENTATION. - - METHOD setup. - zcl_abapgit_login_manager=>clear( ). - ENDMETHOD. - - METHOD teardown. - zcl_abapgit_login_manager=>clear( ). - ENDMETHOD. - - METHOD encoding. - - DATA: lv_auth TYPE string. - - lv_auth = zcl_abapgit_login_manager=>set( - iv_uri = 'https://github.com/larshp/abapGit.git' - iv_username = c_username - iv_password = c_password ). - - cl_abap_unit_assert=>assert_equals( - act = lv_auth - exp = 'Basic QWxhZGRpbjpPcGVuU2VzYW1l' ). - - ENDMETHOD. - - METHOD same_server. - - CONSTANTS: lc_github1 TYPE string VALUE 'https://github.com/larshp/abapGit.git', - lc_github2 TYPE string VALUE 'https://github.com/larshp/Foobar.git'. - - DATA: lv_auth1 TYPE string, - lv_auth2 TYPE string. - - - zcl_abapgit_login_manager=>set( - iv_uri = lc_github1 - iv_username = c_username - iv_password = c_password ). - - lv_auth1 = zcl_abapgit_login_manager=>load( lc_github1 ). - lv_auth2 = zcl_abapgit_login_manager=>load( lc_github2 ). - - cl_abap_unit_assert=>assert_equals( - act = lv_auth1 - exp = lv_auth2 ). - - ENDMETHOD. - -ENDCLASS. - -CLASS ltcl_html_action_utils DEFINITION FOR TESTING RISK LEVEL HARMLESS - DURATION SHORT FINAL - INHERITING FROM cl_aunit_assert. - - PUBLIC SECTION. - - CLASS-METHODS class_constructor. - METHODS add_field FOR TESTING. - METHODS get_field FOR TESTING. - METHODS parse_fields_simple_case FOR TESTING. - METHODS parse_fields_advanced_case FOR TESTING. - METHODS parse_fields_unescape FOR TESTING. - METHODS parse_fields_german_umlauts FOR TESTING. - - PRIVATE SECTION. - - CONSTANTS: BEGIN OF co_german_umlaut_as_hex, - lower_case_ae TYPE xstring VALUE 'C3A4', - lower_case_oe TYPE xstring VALUE 'C3B6', - lower_case_ue TYPE xstring VALUE 'C3BC', - END OF co_german_umlaut_as_hex. - - CLASS-DATA: BEGIN OF ms_german_umlaut_as_char, - lower_case_ae TYPE string, - lower_case_oe TYPE string, - lower_case_ue TYPE string, - END OF ms_german_umlaut_as_char. - - DATA m_given_parse_string TYPE string. - DATA mt_parsed_fields TYPE tihttpnvp. - - METHODS _given_string_is - IMPORTING - i_string TYPE string. - METHODS _when_fields_are_parsed. - METHODS _then_fields_should_be - IMPORTING - index TYPE i - name TYPE string - value TYPE string. - - CLASS-METHODS _hex_to_char - IMPORTING - i_x TYPE xstring - RETURNING - VALUE(r_s) TYPE string. - -ENDCLASS. "ltcl_html_action_utils - -CLASS ltcl_html_action_utils IMPLEMENTATION. - - METHOD class_constructor. - - ms_german_umlaut_as_char-lower_case_ae = _hex_to_char( co_german_umlaut_as_hex-lower_case_ae ). - ms_german_umlaut_as_char-lower_case_oe = _hex_to_char( co_german_umlaut_as_hex-lower_case_oe ). - ms_german_umlaut_as_char-lower_case_ue = _hex_to_char( co_german_umlaut_as_hex-lower_case_ue ). - - ENDMETHOD. - - METHOD add_field. - - DATA: lt_fields TYPE tihttpnvp, - lt_answer TYPE tihttpnvp, - ls_field LIKE LINE OF lt_fields. - - ls_field-name = 'NAME'. - ls_field-value = 'TEST'. - APPEND ls_field TO lt_answer. - - ls_field-name = 'VALUE'. - ls_field-value = 'TEST'. - APPEND ls_field TO lt_answer. - - lcl_html_action_utils=>add_field( EXPORTING name = 'NAME' iv = 'TEST' - CHANGING ct = lt_fields ). - lcl_html_action_utils=>add_field( EXPORTING name = 'VALUE' iv = ls_field - CHANGING ct = lt_fields ). - - assert_equals( act = lt_fields exp = lt_answer ). - - ENDMETHOD. "add_field - - METHOD get_field. - - DATA: lt_fields TYPE tihttpnvp, - ls_answer LIKE LINE OF lt_fields, - ls_field LIKE LINE OF lt_fields. - - ls_answer-name = 'NAME'. - ls_answer-value = 'TEST'. - APPEND ls_answer TO lt_fields. - - lcl_html_action_utils=>get_field( EXPORTING name = 'NAME' it = lt_fields - CHANGING cv = ls_field-value ). - lcl_html_action_utils=>get_field( EXPORTING name = 'NAME' it = lt_fields - CHANGING cv = ls_field ). - - ls_answer-name = 'TEST'. - ls_answer-value = 'TEST'. - assert_equals( act = ls_field exp = ls_answer ). " Both field are filled! - - ENDMETHOD. "get_field - - METHOD parse_fields_simple_case. - - _given_string_is( `committer_name=Gustav Gans` ). - - _when_fields_are_parsed( ). - - _then_fields_should_be( index = 1 name = `COMMITTER_NAME` value = `Gustav Gans` ). - - ENDMETHOD. - - METHOD parse_fields_advanced_case. - - _given_string_is( `committer_name=Albert Schweitzer&` - && `committer_email=albert.schweitzer@googlemail.com&` - && `comment=dummy comment&` - && `body=Message body<><>with line break<>&` - && `author_name=Karl Klammer&` - && `author_email=karl@klammer.com` ). - - _when_fields_are_parsed( ). - - _then_fields_should_be( index = 1 - name = `COMMITTER_NAME` - value = `Albert Schweitzer` ). - - _then_fields_should_be( index = 2 - name = `COMMITTER_EMAIL` - value = `albert.schweitzer@googlemail.com` ). - - _then_fields_should_be( index = 3 - name = `COMMENT` - value = `dummy comment` ). - - _then_fields_should_be( index = 4 - name = `BODY` - value = `Message body<><>with line break<>` ). - - _then_fields_should_be( index = 5 - name = `AUTHOR_NAME` - value = `Karl Klammer` ). - - _then_fields_should_be( index = 6 - name = `AUTHOR_EMAIL` - value = `karl@klammer.com` ). - - ENDMETHOD. - - METHOD parse_fields_unescape. -* file status = '?', used in staging page - - _given_string_is( '/SRC/ZFOOBAR.PROG.ABAP=%3F' ). - - _when_fields_are_parsed( ). - - _then_fields_should_be( index = 1 - name = '/SRC/ZFOOBAR.PROG.ABAP' - value = '?' ). - - ENDMETHOD. - - METHOD parse_fields_german_umlauts. - - DATA: ae TYPE string, - oe TYPE string, - ue TYPE string, - ae_oe_ue TYPE string. - - ae = ms_german_umlaut_as_char-lower_case_ae. - oe = ms_german_umlaut_as_char-lower_case_oe. - ue = ms_german_umlaut_as_char-lower_case_ue. - - ae_oe_ue = ae && oe && ue. - - _given_string_is( |committer_name=Christian G{ ue }nter&| - && |committer_email=guenne@googlemail.com&| - && |comment={ ae_oe_ue }&| - && |body=Message body<><>with line break<>and umlauts. { ae_oe_ue }&| - && |author_name=Gerd Schr{ oe }der&| - && |author_email=gerd@schroeder.com| ). - - _when_fields_are_parsed( ). - - _then_fields_should_be( index = 1 - name = `COMMITTER_NAME` - value = |Christian G{ ue }nter| ). - - _then_fields_should_be( index = 2 - name = `COMMITTER_EMAIL` - value = `guenne@googlemail.com` ). - - _then_fields_should_be( index = 3 - name = `COMMENT` - value = ae_oe_ue ). - - _then_fields_should_be( index = 4 - name = `BODY` - value = |Message body<><>with line break<>and umlauts. { ae_oe_ue }| ). - - _then_fields_should_be( index = 5 - name = `AUTHOR_NAME` - value = |Gerd Schr{ oe }der| ). - - _then_fields_should_be( index = 6 - name = `AUTHOR_EMAIL` - value = `gerd@schroeder.com` ). - - ENDMETHOD. - - METHOD _given_string_is. - - m_given_parse_string = i_string. - - ENDMETHOD. - - METHOD _when_fields_are_parsed. - - mt_parsed_fields = lcl_html_action_utils=>parse_fields_upper_case_name( m_given_parse_string ). - - ENDMETHOD. - - METHOD _then_fields_should_be. - - FIELD-SYMBOLS: LIKE LINE OF mt_parsed_fields. - - READ TABLE mt_parsed_fields ASSIGNING - INDEX index. - - cl_abap_unit_assert=>assert_subrc( exp = 0 - msg = |No parsed field found at index { index }| ). - - cl_abap_unit_assert=>assert_equals( act = -name - exp = name - msg = |Name at index { index } should be { name }| ). - - cl_abap_unit_assert=>assert_equals( act = -value - exp = value - msg = |Value at index { index } should be { value }| ). - - ENDMETHOD. - - METHOD _hex_to_char. - - DATA lr_conv TYPE REF TO cl_abap_conv_in_ce. - - lr_conv = cl_abap_conv_in_ce=>create( ). - lr_conv->convert( EXPORTING input = i_x IMPORTING data = r_s ). - - ENDMETHOD. - -ENDCLASS. "ltcl_html_action_utils - CLASS ltcl_file_status DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL INHERITING FROM cl_aunit_assert. diff --git a/src/zabapgit_unit_test_transport.prog.abap b/src/zabapgit_unit_test_transport.prog.abap index 1202c27f5..f2c8e85a0 100644 --- a/src/zabapgit_unit_test_transport.prog.abap +++ b/src/zabapgit_unit_test_transport.prog.abap @@ -52,7 +52,8 @@ CLASS ltcl_transport_objects DEFINITION FOR TESTING. mt_transport_objects TYPE scts_tadir, mt_object_statuses TYPE zif_abapgit_definitions=>ty_results_tt, ms_stage_objects TYPE zif_abapgit_definitions=>ty_stage_files, - mo_stage TYPE REF TO lcl_stage. + mo_stage TYPE REF TO zcl_abapgit_stage. + ENDCLASS. CLASS ltcl_transport_objects IMPLEMENTATION. @@ -321,14 +322,14 @@ CLASS ltcl_transport_objects IMPLEMENTATION. ENDMETHOD. METHOD then_file_should_be_added. - DATA: lt_staged_objects TYPE lcl_stage=>ty_stage_tt. + DATA: lt_staged_objects TYPE zcl_abapgit_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. + method = zcl_abapgit_stage=>c_method-add. IF sy-subrc <> 0. cl_abap_unit_assert=>fail( |Object { is_local_file-file-filename } not added to stage| ). ENDIF. @@ -347,7 +348,9 @@ CLASS ltcl_transport_objects IMPLEMENTATION. ENDMETHOD. METHOD then_it_should_remove_at_stage. - DATA: lt_staged_objects TYPE lcl_stage=>ty_stage_tt. + + DATA: lt_staged_objects TYPE zcl_abapgit_stage=>ty_stage_tt. + lt_staged_objects = mo_stage->get_all( ). READ TABLE lt_staged_objects TRANSPORTING NO FIELDS diff --git a/src/zabapgit_view_repo.prog.abap b/src/zabapgit_view_repo.prog.abap index 03cb7e781..00dd643f1 100644 --- a/src/zabapgit_view_repo.prog.abap +++ b/src/zabapgit_view_repo.prog.abap @@ -106,7 +106,7 @@ CLASS lcl_gui_view_repo IMPLEMENTATION. mv_hide_files = zcl_abapgit_persistence_user=>get_instance( )->toggle_hide_files( ). ev_state = zif_abapgit_definitions=>gc_event_state-re_render. WHEN c_actions-change_dir. " Change dir - lv_path = lcl_html_action_utils=>dir_decode( iv_getdata ). + lv_path = zcl_abapgit_html_action_utils=>dir_decode( iv_getdata ). mv_cur_dir = zcl_abapgit_path=>change_dir( iv_cur_dir = mv_cur_dir iv_cd = lv_path ). ev_state = zif_abapgit_definitions=>gc_event_state-re_render. WHEN c_actions-toggle_folders. " Toggle folder view @@ -505,7 +505,7 @@ CLASS lcl_gui_view_repo IMPLEMENTATION. IF mv_hide_files = abap_true AND is_item-obj_name IS NOT INITIAL. - lv_difflink = lcl_html_action_utils=>obj_encode( + lv_difflink = zcl_abapgit_html_action_utils=>obj_encode( iv_key = mo_repo->get_key( ) ig_object = is_item ). @@ -521,7 +521,7 @@ CLASS lcl_gui_view_repo IMPLEMENTATION. ro_html->add( '
' ). IF ls_file-is_changed = abap_true. - lv_difflink = lcl_html_action_utils=>file_encode( + lv_difflink = zcl_abapgit_html_action_utils=>file_encode( iv_key = mo_repo->get_key( ) ig_file = ls_file ). ro_html->add_a( iv_txt = 'view diff' @@ -569,7 +569,7 @@ CLASS lcl_gui_view_repo IMPLEMENTATION. lv_path = iv_path. REPLACE FIRST OCCURRENCE OF mv_cur_dir IN lv_path WITH ''. - lv_encode = lcl_html_action_utils=>dir_encode( lv_path ). + lv_encode = zcl_abapgit_html_action_utils=>dir_encode( lv_path ). rv_html = zcl_abapgit_html=>a( iv_txt = lv_path iv_act = |{ c_actions-change_dir }?{ lv_encode }| ). @@ -580,7 +580,7 @@ CLASS lcl_gui_view_repo IMPLEMENTATION. DATA: lv_encode TYPE string. - lv_encode = lcl_html_action_utils=>jump_encode( iv_obj_type = is_item-obj_type + lv_encode = zcl_abapgit_html_action_utils=>jump_encode( iv_obj_type = is_item-obj_type iv_obj_name = is_item-obj_name ). rv_html = zcl_abapgit_html=>a( iv_txt = |{ is_item-obj_name }| diff --git a/src/zcl_abapgit_stage.clas.abap b/src/zcl_abapgit_stage.clas.abap new file mode 100644 index 000000000..88f980a7d --- /dev/null +++ b/src/zcl_abapgit_stage.clas.abap @@ -0,0 +1,208 @@ +CLASS zcl_abapgit_stage DEFINITION + PUBLIC + CREATE PUBLIC . + + PUBLIC SECTION. + TYPES: ty_method TYPE c LENGTH 1. + + CONSTANTS: BEGIN OF c_method, + add TYPE ty_method VALUE 'A', + rm TYPE ty_method VALUE 'R', + ignore TYPE ty_method VALUE 'I', + skip TYPE ty_method VALUE '?', + END OF c_method. + + TYPES: BEGIN OF ty_stage, + file TYPE zif_abapgit_definitions=>ty_file, + method TYPE ty_method, + END OF ty_stage. + + TYPES: ty_stage_tt TYPE SORTED TABLE OF ty_stage + WITH UNIQUE KEY file-path file-filename. + + CLASS-METHODS method_description + IMPORTING iv_method TYPE ty_method + RETURNING VALUE(rv_description) TYPE string + RAISING zcx_abapgit_exception. + + METHODS: + constructor + IMPORTING iv_branch_name TYPE string + iv_branch_sha1 TYPE zif_abapgit_definitions=>ty_sha1 + iv_merge_source TYPE zif_abapgit_definitions=>ty_sha1 OPTIONAL, + get_branch_name + RETURNING VALUE(rv_branch) TYPE string, + get_branch_sha1 + RETURNING VALUE(rv_branch) TYPE zif_abapgit_definitions=>ty_sha1, + add + IMPORTING iv_path TYPE zif_abapgit_definitions=>ty_file-path + iv_filename TYPE zif_abapgit_definitions=>ty_file-filename + iv_data TYPE xstring + RAISING zcx_abapgit_exception, + reset + IMPORTING iv_path TYPE zif_abapgit_definitions=>ty_file-path + iv_filename TYPE zif_abapgit_definitions=>ty_file-filename + RAISING zcx_abapgit_exception, + reset_all + RAISING zcx_abapgit_exception, + rm + IMPORTING iv_path TYPE zif_abapgit_definitions=>ty_file-path + iv_filename TYPE zif_abapgit_definitions=>ty_file-filename + RAISING zcx_abapgit_exception, + ignore + IMPORTING iv_path TYPE zif_abapgit_definitions=>ty_file-path + iv_filename TYPE zif_abapgit_definitions=>ty_file-filename + RAISING zcx_abapgit_exception, + lookup + IMPORTING iv_path TYPE zif_abapgit_definitions=>ty_file-path + iv_filename TYPE zif_abapgit_definitions=>ty_file-filename + RETURNING VALUE(rv_method) TYPE ty_method, + get_merge_source + RETURNING VALUE(rv_source) TYPE zif_abapgit_definitions=>ty_sha1, + count + RETURNING VALUE(rv_count) TYPE i, + get_all + RETURNING VALUE(rt_stage) TYPE ty_stage_tt. + + PRIVATE SECTION. + DATA: mt_stage TYPE ty_stage_tt, + mv_branch_name TYPE string, + mv_branch_sha1 TYPE zif_abapgit_definitions=>ty_sha1, + mv_merge_source TYPE zif_abapgit_definitions=>ty_sha1. + + METHODS: + append + IMPORTING iv_path TYPE zif_abapgit_definitions=>ty_file-path + iv_filename TYPE zif_abapgit_definitions=>ty_file-filename + iv_method TYPE ty_method + iv_data TYPE xstring OPTIONAL + RAISING zcx_abapgit_exception. + +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_STAGE IMPLEMENTATION. + + + METHOD add. + append( iv_path = iv_path + iv_filename = iv_filename + iv_method = c_method-add + iv_data = iv_data ). + ENDMETHOD. "add + + + METHOD append. + + DATA: ls_stage LIKE LINE OF mt_stage. + + FIELD-SYMBOLS: LIKE LINE OF mt_stage. + + + READ TABLE mt_stage WITH KEY + file-path = iv_path + file-filename = iv_filename + ASSIGNING . + IF sy-subrc = 0. + -file-data = iv_data. + -method = iv_method. + ELSE. + ls_stage-file-path = iv_path. + ls_stage-file-filename = iv_filename. + ls_stage-file-data = iv_data. + ls_stage-method = iv_method. + INSERT ls_stage INTO TABLE mt_stage. + ENDIF. + + ENDMETHOD. "append + + + METHOD constructor. + mv_branch_name = iv_branch_name. + mv_branch_sha1 = iv_branch_sha1. + mv_merge_source = iv_merge_source. + ENDMETHOD. + + + METHOD count. + rv_count = lines( mt_stage ). + ENDMETHOD. "count + + + METHOD get_all. + rt_stage = mt_stage. + ENDMETHOD. "get_all + + + METHOD get_branch_name. + rv_branch = mv_branch_name. + ENDMETHOD. + + + METHOD get_branch_sha1. + rv_branch = mv_branch_sha1. + ENDMETHOD. + + + METHOD get_merge_source. + rv_source = mv_merge_source. + ENDMETHOD. + + + METHOD ignore. + append( iv_path = iv_path + iv_filename = iv_filename + iv_method = c_method-ignore ). + ENDMETHOD. "ignore + + + METHOD lookup. + + DATA ls_stage LIKE LINE OF mt_stage. + + + READ TABLE mt_stage INTO ls_stage + WITH KEY file-path = iv_path + file-filename = iv_filename. + IF sy-subrc = 0. + rv_method = ls_stage-method. + ENDIF. + + ENDMETHOD. "lookup + + + METHOD method_description. + + CASE iv_method. + WHEN c_method-add. + rv_description = 'add'. + WHEN c_method-rm. + rv_description = 'rm'. + WHEN c_method-ignore. + rv_description = 'ignore' ##NO_TEXT. + WHEN OTHERS. + zcx_abapgit_exception=>raise( 'unknown staging method type' ). + ENDCASE. + + ENDMETHOD. "method_description + + + METHOD reset. + DELETE mt_stage WHERE file-path = iv_path + AND file-filename = iv_filename. + ASSERT sy-subrc = 0. + ENDMETHOD. "reset + + + METHOD reset_all. + CLEAR mt_stage. + ENDMETHOD. "reset_all + + + METHOD rm. + append( iv_path = iv_path + iv_filename = iv_filename + iv_method = c_method-rm ). + ENDMETHOD. "rm +ENDCLASS. diff --git a/src/zcl_abapgit_stage.clas.xml b/src/zcl_abapgit_stage.clas.xml new file mode 100644 index 000000000..d2a38154e --- /dev/null +++ b/src/zcl_abapgit_stage.clas.xml @@ -0,0 +1,18 @@ + + + + + + ZCL_ABAPGIT_STAGE + 1 + E + Staging logic + 2 + 1 + X + X + X + + + +