Skip to content

Releases

v0.6.42

Choose a tag to compare

@github-actions github-actions released this 17 Oct 08:45
ebc4bce

Fixed

  • Queued calls no longer time out behind a long abap_ui press, and a remaining timeout is retryable (#242). The pool's wait budget was a fixed ABAP_SESSION_WAIT_MS (10 s), so a call queued behind a ~60 s press failed with Timed out waiting for the ABAP session. It is now ABAP_SESSION_WAIT_MS plus the longest request timeout, as the connection-level lock already was. A refusal that still happens is classified SESSION_BUSY with retryable: true and details holder, heldForMs, expectedRemainingMs and retryAfterMs, instead of a generic ADT_ERROR. Press already runs on the write lane, so reads are not blocked behind it. README documents the variable.
  • abap_ui mode=press runs CALL TRANSACTION ... OPTIONS FROM CTU_PARAMS with DEFSIZE = 'X' by default (#240), so table controls expose their standard row count to batch input instead of only rows (01)/(02). New optional inputs defsize (default true), racommit, nobinpt, nobiend (default false); DISMODE stays N, UPDMODE S. The effective options are echoed in the response header as options.
  • abap_ui mode=fcode no longer claims a function code has no handler when it is just not a literal WHEN in the screen's PAI (#239). The unresolved reason now reads "not found statically" and says the code may be handled via a variable/constant, table-driven sequence control or by the caller after the screen returns; a note suggests a short press probe. The bridge also emits mention frames for every line in the program that holds the code as a quoted literal (capped at 40), and each row lists them as "OTHER MENTIONS" (constants, other CASE blocks, caller includes). The bridge source changes, so the first call after upgrading rewrites its class once. Not verified live against A4H: the program SAPLV45C is not present there and the installed MCP build predates mode=fcode.
  • core.call_fm fills structured IMPORTING/CHANGING parameters from a JSON object keyed by component name, and core.describe_fm lists the components (#238). Previously the raw input string was assigned to the structure, so a JSON object landed as shifted garbage in the first fields and a structure with packed, integer or raw components could not be filled at all. A parameter value that is a JSON object (an object in params, or a string holding one) is now parsed with the bridge's own scan() and each component is converted by its RTTI type: char, numc, dats (YYYYMMDD or YYYY-MM-DD), tims (HHMMSS or HH:MM:SS), packed and decimal floats from a JSON number or numeric string, integers, and raw/xstring from hex. Unknown component names, values that would be truncated or rounded, tables, references and nesting deeper than one sub-structure are refused with the component named. A plain string for a flat character structure keeps working as before. params_schema now carries components (name, type, length, decimals) for each structured parameter; output is unchanged. TABLES rows are not covered: call_fm does not bind TABLES parameters from input yet.
  • core.call_fm binds TABLES parameters from a JSON array of row objects, and core.describe_fm lists them in params_schema (#237). Previously describe_fm showed TABLES parameters only under parameters and call_fm refused them (RFC_READ_TABLE has no input parameter OPTIONS), so RFC_READ_TABLE and every other TABLES-based function module could not be given input. A TABLES value that is an array (or a string holding one) is now split into rows and each row filled like a structure parameter (component names, RTTI conversion, errors prefixed row N:); [] or an empty value passes an empty table. Tables with an elementary line type are refused with a message. params_schema carries type: [array, string] and items.components for each TABLES parameter, mandatory ones in required.
  • abap_ui mode=press no longer refuses dialog transactions whose TSTC-CINFO carries the authorization flag (#236). XD01, MM01 and similar (CINFO=04) were refused although the tool itself classified them as dialog transactions, because batch-input applicability was tested against the literal '00'. It is now derived from the decoded kind in one shared helper (describeTstc), used by both the press pre-check and the screen-mode transcript parser: dialog kinds with only non-type bits press; report (80, 84, 90), OO, parameter and area-menu transactions stay refused, and abap_run is suggested only for reports. A locked transaction (0x20) is refused with its own SM01 message, and an unrecognised CINFO is still refused conservatively, with text that no longer contradicts itself.
  • abap_ui mode=press no longer leaves enqueue locks held by the bridge session (#241). The driven transaction's enqueues lived on as long as the pooled ADT session did, which blocked the same user in SAP GUI. The generated bridge now ends with ROLLBACK WORK. and CALL FUNCTION 'DEQUEUE_ALL' after every result line is written (the update is synchronous under UPDATE 'S', so the rollback only discards leftovers), and the press run drops its ADT session afterwards through the new opt-in RunClassOptions.dropSessionAfter, so a dump, timeout or stall cannot keep the locks alive either. The bridge source changes, so the first press after upgrading rewrites its bridge class once.

v0.6.41

Choose a tag to compare

@github-actions github-actions released this 24 Sep 12:52
c0b2003

Changed

  • Internal refactor: src/tools/write.ts (6,828 lines) is split into cohesive src/tools/write-*.ts modules (schema, response notes, source resolution, classrun-bridge create/delete/update/index/search-help handlers, package create, batch delete). No behaviour change: the abap_write schema, description and every response string are unchanged, and tools/list output is byte-identical.

v0.6.40

Choose a tag to compare

@github-actions github-actions released this 24 Sep 09:36
075a37d

Fixed

  • abap_read view="footprint" now reports dynamic UPDATE (tab) and DELETE FROM (tab) writes (#232). Both patterns put a word boundary right after the closing ) of the dynamic table token, so a statement such as UPDATE (gv_tab) SET ... or DELETE FROM (gv_tab) WHERE ... never matched and the write was silently dropped. They now match and are reported as unresolved writes, like dynamic INSERT and MODIFY already were. The dynamic token also now accepts a structure component, field symbol or attribute ((ls_cfg-tabname), (<lv_tab>), (me->mv_tab)) in every Open SQL write form; static table names resolve as before.

v0.6.39

Choose a tag to compare

@github-actions github-actions released this 24 Sep 00:12
f5005a7

Tests

  • Raise unit-test coverage of footprint, CDS lineage and enhancement-write to about 99% of lines; two skipped tests document bug #232 (#231)

v0.6.38

Choose a tag to compare

@github-actions github-actions released this 24 Sep 00:04
69df204

Removed

  • The dead abap-contract CLI and the @abaplint/core dependency (#229). src/bin/contract.ts was the subprocess behind abap_read view:"contract", which #76 removed; nothing has spawned it since. It is deleted together with its test, the unregistered bin/abap-contract shim and the second bundle output bundle/bin/contract.js, so src/index.ts is now the only bundle entry point. @abaplint/core was imported only by that file and is no longer a runtime dependency; THIRD-PARTY-NOTICES drops it and the two packages it alone pulled in (json5, vscode-languageserver-types). The server bundle and the abap-journal-reconcile CLI are unchanged.

v0.6.37

Choose a tag to compare

@github-actions github-actions released this 23 Sep 23:51
37d17c6

Added

  • Journal entries carry undoable (bool) and undoBlocker (reason) fields, computed at write time (#200).
  • Text pool writes (abap_write text_pool) record a before-image, and abap_journal mode=undo restores the complete previous pool (#200).
  • BOPF abap_bopf_edit model updates record the previous model XML, and abap_journal mode=undo PUTs it back and re-activates, with node IDs mapped to the live model's first (BOPF re-mints them on every PUT) (#200).
  • abap_enh create_spot/create_impl/create_hook entries are undoable (delete the object) when the before-state was confirmed-absent, guarded by a where-used check (#200).
  • abap_enh set_impl_active entries record the implementation's previous active state, and abap_journal mode=undo sets it back (#200).
  • abap_journal mode=undo on an activate entry now undoes the latest earlier succeeded write entry for the same object instead of refusing outright (#200).

Changed

  • A create whose POST answers HTTP 201 with a Location header is now recorded as beforeCapture: "confirmed-absent" when no earlier absence evidence exists (#200).
  • abap_enh create_spot/create_impl now read the object before creating and refuse the create when it already exists (#200).

v0.6.36

Choose a tag to compare

@github-actions github-actions released this 23 Sep 17:27
90b2610

Added

  • abap_bopf_edit/abap_bopf_delete work on transportable packages (#216). abap_bopf_edit operation=create_bo no longer refuses UNSUPPORTED "package X is transportable", and every mutating abap_bopf_edit operation plus abap_bopf_delete no longer refuse "pinned to transport X" after already taking the lock. Both tools take a new optional corr_nr input, resolved before the lock the same way abap_write resolves one: the caller's corr_nr if given, otherwise under ABAP_ALLOW_TRANSPORTS — auto reuses or creates a session request, a pinned allowlist must already contain the request, and deny-all refuses SAFETY_DENIED before any wire request is made. The resolved request is judged by the safety gate, sent as corrNr on the create POST / model PUT / DELETE, and cross-checked against the lock's CORRNR: a lock naming a different request refuses TRANSPORT_ERROR with nothing written. When a request was used, the response header carries a transport: <request> line. create_bo's POST into a transportable package is not atomic — a failed POST can still create the object — so on failure abapsmith now re-reads: object present and complete → success, with a warnings: header line saying the POST failed but the object was found complete and kept (naming the transport request); object present but unusable (root node unnamed or absent) → the partial object and the constants interface BOPF generated with it are deleted again under the same request (one stateful session, like the delete cascade), and BOPF_CREATE_UNUSABLE states whether that delete worked or what is left; object absent → the original error, unchanged. The same cleanup runs when the POST succeeds but the root node comes back unusable on a transportable package (live-observed on A4H: rootNodeName with a space). The journal entry of a BOPF create, edit or delete on a transportable package now records the request as corrNr, as abap_write's entries do. $TMP/local packages behave exactly as before — no cleanup, no transport: line. abap_bopf_delete's cascade_ddic sends the same request for any DDIC candidate whose lock reports a transport; a candidate pinned to a different transport while the BO delete itself was local is reported as not deleted, with the reason.

Fixed

  • abap_bopf_test no longer generates bridge source lines over 255 characters (#207). A scenario with many fields or a long string value could produce a DATA line, a transcript line, or a cleanup APPEND VALUE #( ... ) past ABAP's 255-character line limit, and the generated bridge class failed to compile. The generator now wraps at 120 columns: a long string literal is split into pieces of at most 100 chars and rejoined with &&, each node's transcript DATA line is assembled from several template pieces, and the cleanup APPEND VALUE #( ... ) is written one component per line. Before any wire request, abapsmith asserts that no emitted line exceeds 255 chars; if one still would, the call is refused BAD_INPUT naming the scenario node and field instead of shipping source that won't compile. The runtime transcript itself is unchanged.

v0.6.35

Choose a tag to compare

@github-actions github-actions released this 23 Sep 17:04
3078b96

Added

  • abap_debug set_value changes a simple variable, structure component or table cell at a stop in edit/admin mode, validates the value against the type first, refuses constants and references, and lists every change in the session's final output (#198).

v0.6.34

Choose a tag to compare

@github-actions github-actions released this 23 Sep 16:30
13b3d62

Added

  • abap_enh create-family operations take package, corr_nr and activate (#215). create_spot, add_badi_def, add_filter_def, create_impl and set_filter_values now take an optional package (default $TMP) and, against a transportable package, corr_nr, following the same transport rules as abap_write — the safety gate's verdict is taken before the session resolver gets a chance to create a request. activate (default true) set to false leaves the object saved but inactive, ready for abap_read enhancements:true and a later abap_activate (with affects, as the response's NOTE spells out); add_badi_def's marker interface is still always activated, since the BAdI definition needs it active. exercise and create_hook are unchanged.

Changed

  • abap_enh affects is optional where the journal needs no foreign object (#212). create_spot, add_badi_def and add_filter_def now default affects to the spot being created or extended, and create_hook derives it from the host named in spec with one read of the host object, instead of requiring the caller to repeat what the call already states. create_impl, set_filter_values, exercise, write_description, delete and set_impl_active still require it, and BAD_INPUT names all six when it's missing. Every one of these checks runs before any network request.

v0.6.33

Choose a tag to compare

@github-actions github-actions released this 23 Sep 16:05
691bfa4

Added

  • abap_write's text_pool now applies to CLAS/OC and FUGR/F, not just PROG/P, and gains a headings group (#199). Each type writes its own textelements resource (PROG/PX/CLAS/OCX/FUGR/PX); a CLAS/OC text pool has text symbols only — naming selection_texts or headings for a class is refused BAD_INPUT before any request ("applies to PROG/P and FUGR/F only"). headings (PROG/P and FUGR/F only) is {list_header?, column_headers?} — the report's list header (max 70 chars) and up to four column heading lines (max 132 chars each, SE38 "List Headings"); each group given still replaces that whole group, as before. Naming text_pool against any other type is refused BAD_INPUT before any request, now naming the supported types ("text_pool applies to PROG/P, CLAS/OC and FUGR/F only, not INTF/OI."). A whole-object source read of a CLAS/OC or FUGR/F now appends the same TEXT POOL section a PROG/P read has, including the new headings: group, when the object has any text symbols, selection texts or headings; that read costs one extra request for a class (three for a function group), as it already did for a program. The textelements resource has no per-call language selector — probed on A4H, a sap-language/language query parameter, an Accept-Language/sap-language header, and ABAP_LANGUAGE=EN vs DE at logon all returned the same master-language texts — so text_pool reads and writes the object's own master language and takes no language parameter. Verified on A4H: $TMP class ZCL_AS_TEXT199 (static method returning text-001), function group ZAS_FG199 with a module returning text-002, and report ZAS_R199 calling both — after text_pool writes, abap_read showed the TEXT POOL section for all three and abap_run of the report printed class: Hello, fm: Hello from FM, the list header Issue 199 headings and both column heading lines; text_pool on INTF/OI and selection_texts on the class were refused as described.

Changed

  • The text_pool response's <language> is now the object's master language, not the configured logon language (#199). The textelements resource has no per-call language selector and always writes the master language, so the response header now reads <language> off the textelements descriptor instead of reporting the configured logon language.