mirror of
https://github.com/abapGit/abapGit.git
synced 2025-04-30 11:46:38 +08:00
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
This commit is contained in:
parent
97b5a3d143
commit
9e3025d8dc
10
src/syntax/package.devc.xml
Normal file
10
src/syntax/package.devc.xml
Normal file
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<abapGit version="v1.0.0" serializer="LCL_OBJECT_DEVC" serializer_version="v1.0.0">
|
||||
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
||||
<asx:values>
|
||||
<DEVC>
|
||||
<CTEXT>Syntax highlighting</CTEXT>
|
||||
</DEVC>
|
||||
</asx:values>
|
||||
</asx:abap>
|
||||
</abapGit>
|
288
src/syntax/zcl_abapgit_syntax_abap.clas.abap
Normal file
288
src/syntax/zcl_abapgit_syntax_abap.clas.abap
Normal file
|
@ -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:
|
||||
<prev> TYPE ty_match,
|
||||
<match> TYPE ty_match.
|
||||
|
||||
SORT ct_matches BY offset.
|
||||
|
||||
lv_line_len = strlen( iv_line ).
|
||||
|
||||
LOOP AT ct_matches ASSIGNING <match>.
|
||||
lv_index = sy-tabix.
|
||||
|
||||
" Delete matches after open text match
|
||||
IF lv_prev_token = c_token-text AND <match>-token <> c_token-text.
|
||||
DELETE ct_matches INDEX lv_index.
|
||||
CONTINUE.
|
||||
ENDIF.
|
||||
|
||||
CASE <match>-token.
|
||||
WHEN c_token-keyword.
|
||||
IF <match>-offset > 0.
|
||||
" Delete match if keyword is part of structure or field symbol
|
||||
IF substring( val = iv_line off = ( <match>-offset - 1 ) len = 1 ) CA '-<'.
|
||||
DELETE ct_matches INDEX lv_index.
|
||||
CONTINUE.
|
||||
ENDIF.
|
||||
ENDIF.
|
||||
|
||||
WHEN c_token-comment.
|
||||
<match>-length = lv_line_len - <match>-offset.
|
||||
DELETE ct_matches FROM lv_index + 1.
|
||||
CONTINUE.
|
||||
|
||||
WHEN c_token-text.
|
||||
<match>-text_tag = substring( val = iv_line
|
||||
off = <match>-offset
|
||||
len = <match>-length ).
|
||||
IF lv_prev_token = c_token-text.
|
||||
IF <match>-text_tag = <prev>-text_tag.
|
||||
<prev>-length = <match>-offset + <match>-length - <prev>-offset.
|
||||
CLEAR lv_prev_token.
|
||||
ELSEIF <prev>-text_tag = '}' AND <match>-text_tag = '{'.
|
||||
<prev>-length = <match>-offset - <prev>-offset - 1. " Shift } out of scope
|
||||
<prev>-offset = <prev>-offset + 1. " Shift { out of scope
|
||||
CLEAR lv_prev_token.
|
||||
ELSEIF <match>-text_tag = '{'.
|
||||
<prev>-length = <match>-offset - <prev>-offset.
|
||||
CLEAR lv_prev_token.
|
||||
ELSEIF <prev>-text_tag = '}'.
|
||||
<prev>-length = <match>-offset - <prev>-offset.
|
||||
<prev>-offset = <prev>-offset + 1. " Shift } out of scope
|
||||
CLEAR lv_prev_token.
|
||||
ENDIF.
|
||||
DELETE ct_matches INDEX lv_index.
|
||||
CONTINUE.
|
||||
ENDIF.
|
||||
|
||||
ENDCASE.
|
||||
|
||||
lv_prev_token = <match>-token.
|
||||
ASSIGN <match> TO <prev>.
|
||||
ENDLOOP.
|
||||
|
||||
ENDMETHOD. " order_matches.
|
||||
|
||||
|
||||
METHOD parse_line. "REDEFINITION
|
||||
|
||||
DATA lv_index TYPE i.
|
||||
|
||||
FIELD-SYMBOLS <match> 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 <match> WHERE token = c_token-keyword.
|
||||
lv_index = sy-tabix.
|
||||
IF abap_false = is_keyword( substring( val = iv_line
|
||||
off = <match>-offset
|
||||
len = <match>-length ) ).
|
||||
DELETE et_matches INDEX lv_index.
|
||||
ENDIF.
|
||||
ENDLOOP.
|
||||
|
||||
ENDMETHOD. " parse_line.
|
||||
ENDCLASS.
|
18
src/syntax/zcl_abapgit_syntax_abap.clas.xml
Normal file
18
src/syntax/zcl_abapgit_syntax_abap.clas.xml
Normal file
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
|
||||
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
||||
<asx:values>
|
||||
<VSEOCLASS>
|
||||
<CLSNAME>ZCL_ABAPGIT_SYNTAX_ABAP</CLSNAME>
|
||||
<VERSION>1</VERSION>
|
||||
<LANGU>E</LANGU>
|
||||
<DESCRIPT>ABAP Syntax Highlighting</DESCRIPT>
|
||||
<EXPOSURE>2</EXPOSURE>
|
||||
<STATE>1</STATE>
|
||||
<CLSCCINCL>X</CLSCCINCL>
|
||||
<FIXPT>X</FIXPT>
|
||||
<UNICODE>X</UNICODE>
|
||||
</VSEOCLASS>
|
||||
</asx:values>
|
||||
</asx:abap>
|
||||
</abapGit>
|
236
src/syntax/zcl_abapgit_syntax_highlighter.clas.abap
Normal file
236
src/syntax/zcl_abapgit_syntax_highlighter.clas.abap
Normal file
|
@ -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 = |<span class="{ iv_class }">{ lv_escaped }</span>|.
|
||||
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 <match> 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 <match>.
|
||||
IF <match>-offset > lv_last_pos.
|
||||
lv_length = <match>-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 = <match>-offset + <match>-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 <match> TYPE ty_match.
|
||||
|
||||
LOOP AT it_matches ASSIGNING <match>.
|
||||
lv_chunk = substring( val = iv_line off = <match>-offset len = <match>-length ).
|
||||
|
||||
CLEAR ls_rule. " Failed read equals no style
|
||||
READ TABLE mt_rules INTO ls_rule WITH KEY token = <match>-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:
|
||||
<regex> LIKE LINE OF mt_rules,
|
||||
<result> TYPE match_result.
|
||||
|
||||
CLEAR et_matches.
|
||||
|
||||
" Process syntax-dependent regex table and find all matches
|
||||
LOOP AT mt_rules ASSIGNING <regex>.
|
||||
lo_regex = <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 <result>.
|
||||
CLEAR: ls_match.
|
||||
ls_match-token = <regex>-token.
|
||||
ls_match-offset = <result>-offset.
|
||||
ls_match-length = <result>-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.
|
609
src/syntax/zcl_abapgit_syntax_highlighter.clas.testclasses.abap
Normal file
609
src/syntax/zcl_abapgit_syntax_highlighter.clas.testclasses.abap
Normal file
|
@ -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 = <match>-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 = '<tag>Text</tag>'. "#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 = '<tag/>'. "#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 = '<tag attribute="value"/>'. "#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 = '<?xml version="1.0"?>'. "#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 = '<ns:tag ns:a1="v1" ns:a2=''v2''>"text"</ns:tag>'. "#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 =
|
||||
'<span class="keyword">call</span>' && "#EC NOTEXT
|
||||
' <span class="keyword">function</span>' && "#EC NOTEXT
|
||||
' <span class="text">'FM_NAME'</span>.' && "#EC NOTEXT
|
||||
' <span class="comment">" Commented</span>'. "#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 = '<span class="keyword">CALL FUNCTION</span>' "#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 = '<span class="comment">* CALL FUNCTION</span>' "#EC NOTEXT
|
||||
msg = 'Failure in method process_line.' ). "#EC NOTEXT
|
||||
|
||||
ENDMETHOD. " process_line
|
||||
|
||||
ENDCLASS. " ltcl_syntax_highlighter
|
20
src/syntax/zcl_abapgit_syntax_highlighter.clas.xml
Normal file
20
src/syntax/zcl_abapgit_syntax_highlighter.clas.xml
Normal file
|
@ -0,0 +1,20 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
|
||||
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
||||
<asx:values>
|
||||
<VSEOCLASS>
|
||||
<CLSNAME>ZCL_ABAPGIT_SYNTAX_HIGHLIGHTER</CLSNAME>
|
||||
<VERSION>1</VERSION>
|
||||
<LANGU>E</LANGU>
|
||||
<DESCRIPT>Syntax highlighter</DESCRIPT>
|
||||
<EXPOSURE>2</EXPOSURE>
|
||||
<STATE>1</STATE>
|
||||
<CLSABSTRCT>X</CLSABSTRCT>
|
||||
<CLSCCINCL>X</CLSCCINCL>
|
||||
<FIXPT>X</FIXPT>
|
||||
<UNICODE>X</UNICODE>
|
||||
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
|
||||
</VSEOCLASS>
|
||||
</asx:values>
|
||||
</asx:abap>
|
||||
</abapGit>
|
117
src/syntax/zcl_abapgit_syntax_xml.clas.abap
Normal file
117
src/syntax/zcl_abapgit_syntax_xml.clas.abap
Normal file
|
@ -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:
|
||||
<prev> TYPE ty_match,
|
||||
<match> TYPE ty_match.
|
||||
|
||||
|
||||
SORT ct_matches BY offset.
|
||||
|
||||
LOOP AT ct_matches ASSIGNING <match>.
|
||||
lv_index = sy-tabix.
|
||||
|
||||
CASE <match>-token.
|
||||
WHEN c_token-xml_tag.
|
||||
<match>-text_tag = substring( val = iv_line
|
||||
off = <match>-offset
|
||||
len = <match>-length ).
|
||||
|
||||
" No other matches between two tags
|
||||
IF <match>-text_tag = '>' AND lv_prev_token = c_token-xml_tag.
|
||||
lv_state = 'C'.
|
||||
<prev>-length = <match>-offset - <prev>-offset + <match>-length.
|
||||
DELETE ct_matches INDEX lv_index.
|
||||
CONTINUE.
|
||||
|
||||
" Adjust length and offset of closing tag
|
||||
ELSEIF <match>-text_tag = '>' AND lv_prev_token <> c_token-xml_tag.
|
||||
lv_state = 'C'.
|
||||
<match>-length = <match>-offset - <prev>-offset - <prev>-length + <match>-length.
|
||||
<match>-offset = <prev>-offset + <prev>-length.
|
||||
ELSE.
|
||||
lv_state = 'O'.
|
||||
ENDIF.
|
||||
|
||||
WHEN OTHERS.
|
||||
IF lv_prev_token = c_token-xml_tag.
|
||||
<prev>-length = <match>-offset - <prev>-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 = <match>-token.
|
||||
ASSIGN <match> TO <prev>.
|
||||
ENDLOOP.
|
||||
|
||||
ENDMETHOD. " order_matches
|
||||
ENDCLASS.
|
18
src/syntax/zcl_abapgit_syntax_xml.clas.xml
Normal file
18
src/syntax/zcl_abapgit_syntax_xml.clas.xml
Normal file
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
|
||||
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
||||
<asx:values>
|
||||
<VSEOCLASS>
|
||||
<CLSNAME>ZCL_ABAPGIT_SYNTAX_XML</CLSNAME>
|
||||
<VERSION>1</VERSION>
|
||||
<LANGU>E</LANGU>
|
||||
<DESCRIPT>XML Syntax Highlighter</DESCRIPT>
|
||||
<EXPOSURE>2</EXPOSURE>
|
||||
<STATE>1</STATE>
|
||||
<CLSCCINCL>X</CLSCCINCL>
|
||||
<FIXPT>X</FIXPT>
|
||||
<UNICODE>X</UNICODE>
|
||||
</VSEOCLASS>
|
||||
</asx:values>
|
||||
</asx:abap>
|
||||
</abapGit>
|
434
src/ui/zcl_abapgit_html_action_utils.clas.abap
Normal file
434
src/ui/zcl_abapgit_html_action_utils.clas.abap
Normal file
|
@ -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 <src> 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 <src>.
|
||||
ASSERT <src> IS ASSIGNED.
|
||||
ls_field-value = <src>.
|
||||
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 <field> LIKE LINE OF ct_fields.
|
||||
|
||||
LOOP AT ct_fields ASSIGNING <field>.
|
||||
<field>-name = to_upper( <field>-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: <ls_field> LIKE LINE OF it,
|
||||
<dest> TYPE any.
|
||||
|
||||
|
||||
READ TABLE it ASSIGNING <ls_field> 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 = <ls_field>-value.
|
||||
WHEN cl_abap_typedescr=>kind_struct.
|
||||
ASSIGN COMPONENT name OF STRUCTURE cv TO <dest>.
|
||||
ASSERT <dest> IS ASSIGNED.
|
||||
<dest> = <ls_field>-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 '<<new>>'.
|
||||
|
||||
DATA: lv_string TYPE string,
|
||||
lt_fields TYPE tihttpnvp.
|
||||
|
||||
FIELD-SYMBOLS <body> 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 <body>.
|
||||
ASSERT <body> IS ASSIGNED.
|
||||
REPLACE ALL OCCURRENCES OF lc_replace IN <body> 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: <substring> LIKE LINE OF substrings.
|
||||
|
||||
SPLIT iv_string AT '&' INTO TABLE substrings.
|
||||
|
||||
LOOP AT substrings ASSIGNING <substring>.
|
||||
|
||||
CLEAR: field.
|
||||
|
||||
field-name = substring_before( val = <substring>
|
||||
sub = '=' ).
|
||||
field-name = unescape( field-name ).
|
||||
|
||||
field-value = substring_after( val = <substring>
|
||||
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.
|
253
src/ui/zcl_abapgit_html_action_utils.clas.testclasses.abap
Normal file
253
src/ui/zcl_abapgit_html_action_utils.clas.testclasses.abap
Normal file
|
@ -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<<new>><<new>>with line break<<new>>&`
|
||||
&& `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<<new>><<new>>with line break<<new>>` ).
|
||||
|
||||
_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<<new>><<new>>with line break<<new>>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<<new>><<new>>with line break<<new>>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: <parsed_field> LIKE LINE OF mt_parsed_fields.
|
||||
|
||||
READ TABLE mt_parsed_fields ASSIGNING <parsed_field>
|
||||
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 = <parsed_field>-name
|
||||
exp = name
|
||||
msg = |Name at index { index } should be { name }| ).
|
||||
|
||||
cl_abap_unit_assert=>assert_equals( act = <parsed_field>-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
|
19
src/ui/zcl_abapgit_html_action_utils.clas.xml
Normal file
19
src/ui/zcl_abapgit_html_action_utils.clas.xml
Normal file
|
@ -0,0 +1,19 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
|
||||
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
||||
<asx:values>
|
||||
<VSEOCLASS>
|
||||
<CLSNAME>ZCL_ABAPGIT_HTML_ACTION_UTILS</CLSNAME>
|
||||
<VERSION>1</VERSION>
|
||||
<LANGU>E</LANGU>
|
||||
<DESCRIPT>HTML action utilities</DESCRIPT>
|
||||
<EXPOSURE>2</EXPOSURE>
|
||||
<STATE>1</STATE>
|
||||
<CLSCCINCL>X</CLSCCINCL>
|
||||
<FIXPT>X</FIXPT>
|
||||
<UNICODE>X</UNICODE>
|
||||
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
|
||||
</VSEOCLASS>
|
||||
</asx:values>
|
||||
</asx:abap>
|
||||
</abapGit>
|
|
@ -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.
|
||||
|
|
65
src/utils/zcl_abapgit_login_manager.clas.testclasses.abap
Normal file
65
src/utils/zcl_abapgit_login_manager.clas.testclasses.abap
Normal file
|
@ -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.
|
|
@ -13,6 +13,7 @@
|
|||
<CLSCCINCL>X</CLSCCINCL>
|
||||
<FIXPT>X</FIXPT>
|
||||
<UNICODE>X</UNICODE>
|
||||
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
|
||||
</VSEOCLASS>
|
||||
<DESCRIPTIONS>
|
||||
<SEOCOMPOTX>
|
||||
|
|
|
@ -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: <ls_local> 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: <ls_changed> LIKE LINE OF lt_changed,
|
||||
<ls_local> LIKE LINE OF ls_files-local.
|
||||
|
|
|
@ -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: <ls_stage> LIKE LINE OF lt_stage,
|
||||
<ls_updated> LIKE LINE OF et_updated_files,
|
||||
|
@ -632,7 +632,7 @@ CLASS lcl_git_porcelain IMPLEMENTATION.
|
|||
MOVE-CORRESPONDING <ls_stage>-file TO <ls_updated>.
|
||||
|
||||
CASE <ls_stage>-method.
|
||||
WHEN lcl_stage=>c_method-add.
|
||||
WHEN zcl_abapgit_stage=>c_method-add.
|
||||
|
||||
APPEND <ls_stage>-file TO lt_blobs.
|
||||
|
||||
|
@ -654,7 +654,7 @@ CLASS lcl_git_porcelain IMPLEMENTATION.
|
|||
|
||||
<ls_updated>-sha1 = lv_sha1. "New sha1
|
||||
|
||||
WHEN lcl_stage=>c_method-rm.
|
||||
WHEN zcl_abapgit_stage=>c_method-rm.
|
||||
DELETE lt_expanded
|
||||
WHERE name = <ls_stage>-file-filename
|
||||
AND path = <ls_stage>-file-path.
|
||||
|
|
|
@ -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 ).
|
||||
|
|
|
@ -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 <field> LIKE LINE OF ct_fields.
|
||||
|
||||
LOOP AT ct_fields ASSIGNING <field>.
|
||||
<field>-name = to_upper( <field>-name ).
|
||||
ENDLOOP.
|
||||
|
||||
ENDMETHOD. "field_keys_to_upper
|
||||
|
||||
METHOD parse_fields.
|
||||
|
||||
DATA: substrings TYPE stringtab,
|
||||
field LIKE LINE OF rt_fields.
|
||||
|
||||
FIELD-SYMBOLS: <substring> LIKE LINE OF substrings.
|
||||
|
||||
SPLIT iv_string AT '&' INTO TABLE substrings.
|
||||
|
||||
LOOP AT substrings ASSIGNING <substring>.
|
||||
|
||||
CLEAR: field.
|
||||
|
||||
field-name = substring_before( val = <substring>
|
||||
sub = '=' ).
|
||||
field-name = unescape( field-name ).
|
||||
|
||||
field-value = substring_after( val = <substring>
|
||||
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 <src> 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 <src>.
|
||||
ASSERT <src> IS ASSIGNED.
|
||||
ls_field-value = <src>.
|
||||
WHEN OTHERS.
|
||||
ASSERT 0 = 1.
|
||||
ENDCASE.
|
||||
|
||||
APPEND ls_field TO ct.
|
||||
|
||||
ENDMETHOD. "add_field
|
||||
|
||||
METHOD get_field.
|
||||
|
||||
FIELD-SYMBOLS: <ls_field> LIKE LINE OF it,
|
||||
<dest> TYPE any.
|
||||
|
||||
|
||||
READ TABLE it ASSIGNING <ls_field> 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 = <ls_field>-value.
|
||||
WHEN cl_abap_typedescr=>kind_struct.
|
||||
ASSIGN COMPONENT name OF STRUCTURE cv TO <dest>.
|
||||
ASSERT <dest> IS ASSIGNED.
|
||||
<dest> = <ls_field>-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 '<<new>>'.
|
||||
|
||||
DATA: lv_string TYPE string,
|
||||
lt_fields TYPE tihttpnvp.
|
||||
|
||||
FIELD-SYMBOLS <body> 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 <body>.
|
||||
ASSERT <body> IS ASSIGNED.
|
||||
REPLACE ALL OCCURRENCES OF lc_replace IN <body> 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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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 <ls_field> WITH KEY name = 'source' ##NO_TEXT.
|
||||
ASSERT sy-subrc = 0.
|
||||
|
|
|
@ -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: <ls_stage> LIKE LINE OF lt_stage.
|
||||
|
||||
|
@ -119,7 +120,7 @@ CLASS lcl_gui_page_commit IMPLEMENTATION.
|
|||
LOOP AT lt_stage ASSIGNING <ls_stage>.
|
||||
ro_html->add( '<tr>' ).
|
||||
ro_html->add( '<td class="method">' ).
|
||||
ro_html->add( lcl_stage=>method_description( <ls_stage>-method ) ).
|
||||
ro_html->add( zcl_abapgit_stage=>method_description( <ls_stage>-method ) ).
|
||||
ro_html->add( '</td>' ).
|
||||
ro_html->add( '<td>' ).
|
||||
ro_html->add( <ls_stage>-file-path && <ls_stage>-file-filename ).
|
||||
|
|
|
@ -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( <ls_data> ).
|
||||
lv_action = zcl_abapgit_html_action_utils=>dbkey_encode( <ls_data> ).
|
||||
|
||||
CREATE OBJECT lo_toolbar.
|
||||
lo_toolbar->add( iv_txt = 'Display' iv_act = |{ zif_abapgit_definitions=>gc_action-db_display }?{ lv_action }| ).
|
||||
|
|
|
@ -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 <ls_diff> 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( ).
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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: <ls_file> LIKE LINE OF ms_files-local.
|
||||
|
||||
|
@ -131,7 +131,7 @@ CLASS lcl_gui_page_stage IMPLEMENTATION.
|
|||
<ls_item> 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 <ls_item>-value.
|
||||
WHEN lcl_stage=>c_method-add.
|
||||
WHEN zcl_abapgit_stage=>c_method-add.
|
||||
READ TABLE ms_files-local ASSIGNING <ls_file>
|
||||
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 = <ls_file>-file-path
|
||||
iv_filename = <ls_file>-file-filename
|
||||
iv_data = <ls_file>-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 { <ls_item>-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 }| ).
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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: <ls_stage> LIKE LINE OF lt_stage.
|
||||
|
||||
|
||||
lo_dot_abapgit = get_dot_abapgit( ).
|
||||
lt_stage = io_stage->get_all( ).
|
||||
LOOP AT lt_stage ASSIGNING <ls_stage> WHERE method = lcl_stage=>c_method-ignore.
|
||||
LOOP AT lt_stage ASSIGNING <ls_stage> WHERE method = zcl_abapgit_stage=>c_method-ignore.
|
||||
|
||||
lo_dot_abapgit->add_ignore(
|
||||
iv_path = <ls_stage>-file-path
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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: <ls_stage> LIKE LINE OF mt_stage.
|
||||
|
||||
|
||||
READ TABLE mt_stage WITH KEY
|
||||
file-path = iv_path
|
||||
file-filename = iv_filename
|
||||
ASSIGNING <ls_stage>.
|
||||
IF sy-subrc = 0.
|
||||
<ls_stage>-file-data = iv_data.
|
||||
<ls_stage>-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
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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.
|
||||
|
||||
|
|
|
@ -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<<new>><<new>>with line break<<new>>&`
|
||||
&& `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<<new>><<new>>with line break<<new>>` ).
|
||||
|
||||
_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<<new>><<new>>with line break<<new>>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<<new>><<new>>with line break<<new>>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: <parsed_field> LIKE LINE OF mt_parsed_fields.
|
||||
|
||||
READ TABLE mt_parsed_fields ASSIGNING <parsed_field>
|
||||
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 = <parsed_field>-name
|
||||
exp = name
|
||||
msg = |Name at index { index } should be { name }| ).
|
||||
|
||||
cl_abap_unit_assert=>assert_equals( act = <parsed_field>-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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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( '<div>' ).
|
||||
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 }|
|
||||
|
|
208
src/zcl_abapgit_stage.clas.abap
Normal file
208
src/zcl_abapgit_stage.clas.abap
Normal file
|
@ -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: <ls_stage> LIKE LINE OF mt_stage.
|
||||
|
||||
|
||||
READ TABLE mt_stage WITH KEY
|
||||
file-path = iv_path
|
||||
file-filename = iv_filename
|
||||
ASSIGNING <ls_stage>.
|
||||
IF sy-subrc = 0.
|
||||
<ls_stage>-file-data = iv_data.
|
||||
<ls_stage>-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.
|
18
src/zcl_abapgit_stage.clas.xml
Normal file
18
src/zcl_abapgit_stage.clas.xml
Normal file
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
|
||||
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
||||
<asx:values>
|
||||
<VSEOCLASS>
|
||||
<CLSNAME>ZCL_ABAPGIT_STAGE</CLSNAME>
|
||||
<VERSION>1</VERSION>
|
||||
<LANGU>E</LANGU>
|
||||
<DESCRIPT>Staging logic</DESCRIPT>
|
||||
<EXPOSURE>2</EXPOSURE>
|
||||
<STATE>1</STATE>
|
||||
<CLSCCINCL>X</CLSCCINCL>
|
||||
<FIXPT>X</FIXPT>
|
||||
<UNICODE>X</UNICODE>
|
||||
</VSEOCLASS>
|
||||
</asx:values>
|
||||
</asx:abap>
|
||||
</abapGit>
|
Loading…
Reference in New Issue
Block a user