[ 
https://issues.apache.org/jira/browse/GROOVY-12711?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18139888#comment-18139888
 ] 

ASF GitHub Bot commented on GROOVY-12711:
-----------------------------------------

codecov-commenter commented on PR #3242:
URL: https://github.com/apache/groovy/pull/3242#issuecomment-6694730249

   ## 
[Codecov](https://app.codecov.io/gh/apache/groovy/pull/3242?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
 Report
   :x: Patch coverage is `59.41558%` with `125 lines` in your changes missing 
coverage. Please review.
   :white_check_mark: Project coverage is 74.3095%. Comparing base 
([`22bb46c`](https://app.codecov.io/gh/apache/groovy/commit/22bb46c363e83198bb4328326e599a3610cf4417?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache))
 to head 
([`7ece7be`](https://app.codecov.io/gh/apache/groovy/commit/7ece7bea413b06ed89150d1feadeeca17372c535?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)).
   :warning: Report is 2 commits behind head on master.
   
   | [Files with missing 
lines](https://app.codecov.io/gh/apache/groovy/pull/3242?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
 | Patch % | Lines |
   |---|---|---|
   | 
[...us/groovy/tools/javac/InMemoryJavaFileManager.java](https://app.codecov.io/gh/apache/groovy/pull/3242?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fcodehaus%2Fgroovy%2Ftools%2Fjavac%2FInMemoryJavaFileManager.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2phdmFjL0luTWVtb3J5SmF2YUZpbGVNYW5hZ2VyLmphdmE=)
 | 34.0909% | [46 Missing and 12 partials :warning: 
](https://app.codecov.io/gh/apache/groovy/pull/3242?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
 |
   | 
[...ehaus/groovy/tools/javac/MemClassNodeResolver.java](https://app.codecov.io/gh/apache/groovy/pull/3242?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fcodehaus%2Fgroovy%2Ftools%2Fjavac%2FMemClassNodeResolver.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2phdmFjL01lbUNsYXNzTm9kZVJlc29sdmVyLmphdmE=)
 | 57.5342% | [21 Missing and 10 partials :warning: 
](https://app.codecov.io/gh/apache/groovy/pull/3242?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
 |
   | 
[...odehaus/groovy/tools/javac/MemClassFileObject.java](https://app.codecov.io/gh/apache/groovy/pull/3242?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fcodehaus%2Fgroovy%2Ftools%2Fjavac%2FMemClassFileObject.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2phdmFjL01lbUNsYXNzRmlsZU9iamVjdC5qYXZh)
 | 55.5556% | [15 Missing and 1 partial :warning: 
](https://app.codecov.io/gh/apache/groovy/pull/3242?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
 |
   | 
[...us/groovy/tools/javac/MemClassOutputClasspath.java](https://app.codecov.io/gh/apache/groovy/pull/3242?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fcodehaus%2Fgroovy%2Ftools%2Fjavac%2FMemClassOutputClasspath.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2phdmFjL01lbUNsYXNzT3V0cHV0Q2xhc3NwYXRoLmphdmE=)
 | 73.3333% | [8 Missing and 4 partials :warning: 
](https://app.codecov.io/gh/apache/groovy/pull/3242?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
 |
   | 
[...codehaus/groovy/tools/javac/JavacJavaCompiler.java](https://app.codecov.io/gh/apache/groovy/pull/3242?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fcodehaus%2Fgroovy%2Ftools%2Fjavac%2FJavacJavaCompiler.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2phdmFjL0phdmFjSmF2YUNvbXBpbGVyLmphdmE=)
 | 83.3333% | [1 Missing and 3 partials :warning: 
](https://app.codecov.io/gh/apache/groovy/pull/3242?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
 |
   | 
[...s/groovy/tools/javac/JavaAwareCompilationUnit.java](https://app.codecov.io/gh/apache/groovy/pull/3242?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fcodehaus%2Fgroovy%2Ftools%2Fjavac%2FJavaAwareCompilationUnit.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2phdmFjL0phdmFBd2FyZUNvbXBpbGF0aW9uVW5pdC5qYXZh)
 | 89.6552% | [0 Missing and 3 partials :warning: 
](https://app.codecov.io/gh/apache/groovy/pull/3242?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
 |
   | 
[...codehaus/groovy/control/CompilerConfiguration.java](https://app.codecov.io/gh/apache/groovy/pull/3242?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fcodehaus%2Fgroovy%2Fcontrol%2FCompilerConfiguration.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvQ29tcGlsZXJDb25maWd1cmF0aW9uLmphdmE=)
 | 75.0000% | [0 Missing and 1 partial :warning: 
](https://app.codecov.io/gh/apache/groovy/pull/3242?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
 |
   
   <details><summary>Additional details and impacted files</summary>
   
   
   
   [![Impacted file tree 
graph](https://app.codecov.io/gh/apache/groovy/pull/3242/graphs/tree.svg?width=650&height=150&src=pr&token=1r45138NfQ&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)](https://app.codecov.io/gh/apache/groovy/pull/3242?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
   
   ```diff
   @@                Coverage Diff                 @@
   ##               master      #3242        +/-   ##
   ==================================================
   - Coverage     74.3343%   74.3095%   -0.0248%     
   - Complexity      44299      44365        +66     
   ==================================================
     Files            1699       1703         +4     
     Lines          150855     151153       +298     
     Branches        28754      28810        +56     
   ==================================================
   + Hits           112137     112321       +184     
   - Misses          28441      28525        +84     
   - Partials        10277      10307        +30     
   ```
   
   | [Files with missing 
lines](https://app.codecov.io/gh/apache/groovy/pull/3242?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
 | Coverage Δ | |
   |---|---|---|
   | 
[...a/org/codehaus/groovy/control/CompilationUnit.java](https://app.codecov.io/gh/apache/groovy/pull/3242?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fcodehaus%2Fgroovy%2Fcontrol%2FCompilationUnit.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvQ29tcGlsYXRpb25Vbml0LmphdmE=)
 | `81.5939% <100.0000%> (+0.0701%)` | :arrow_up: |
   | 
[...codehaus/groovy/control/CompilerConfiguration.java](https://app.codecov.io/gh/apache/groovy/pull/3242?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fcodehaus%2Fgroovy%2Fcontrol%2FCompilerConfiguration.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvQ29tcGlsZXJDb25maWd1cmF0aW9uLmphdmE=)
 | `75.4144% <75.0000%> (-0.0046%)` | :arrow_down: |
   | 
[...s/groovy/tools/javac/JavaAwareCompilationUnit.java](https://app.codecov.io/gh/apache/groovy/pull/3242?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fcodehaus%2Fgroovy%2Ftools%2Fjavac%2FJavaAwareCompilationUnit.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2phdmFjL0phdmFBd2FyZUNvbXBpbGF0aW9uVW5pdC5qYXZh)
 | `91.3462% <89.6552%> (-0.7591%)` | :arrow_down: |
   | 
[...codehaus/groovy/tools/javac/JavacJavaCompiler.java](https://app.codecov.io/gh/apache/groovy/pull/3242?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fcodehaus%2Fgroovy%2Ftools%2Fjavac%2FJavacJavaCompiler.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2phdmFjL0phdmFjSmF2YUNvbXBpbGVyLmphdmE=)
 | `75.0000% <83.3333%> (+4.4737%)` | :arrow_up: |
   | 
[...us/groovy/tools/javac/MemClassOutputClasspath.java](https://app.codecov.io/gh/apache/groovy/pull/3242?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fcodehaus%2Fgroovy%2Ftools%2Fjavac%2FMemClassOutputClasspath.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2phdmFjL01lbUNsYXNzT3V0cHV0Q2xhc3NwYXRoLmphdmE=)
 | `73.3333% <73.3333%> (ø)` | |
   | 
[...odehaus/groovy/tools/javac/MemClassFileObject.java](https://app.codecov.io/gh/apache/groovy/pull/3242?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fcodehaus%2Fgroovy%2Ftools%2Fjavac%2FMemClassFileObject.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2phdmFjL01lbUNsYXNzRmlsZU9iamVjdC5qYXZh)
 | `55.5556% <55.5556%> (ø)` | |
   | 
[...ehaus/groovy/tools/javac/MemClassNodeResolver.java](https://app.codecov.io/gh/apache/groovy/pull/3242?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fcodehaus%2Fgroovy%2Ftools%2Fjavac%2FMemClassNodeResolver.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2phdmFjL01lbUNsYXNzTm9kZVJlc29sdmVyLmphdmE=)
 | `57.5342% <57.5342%> (ø)` | |
   | 
[...us/groovy/tools/javac/InMemoryJavaFileManager.java](https://app.codecov.io/gh/apache/groovy/pull/3242?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fcodehaus%2Fgroovy%2Ftools%2Fjavac%2FInMemoryJavaFileManager.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2phdmFjL0luTWVtb3J5SmF2YUZpbGVNYW5hZ2VyLmphdmE=)
 | `34.0909% <34.0909%> (ø)` | |
   
   ... and [10 files with indirect coverage 
changes](https://app.codecov.io/gh/apache/groovy/pull/3242/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
   </details>
   <details><summary> :rocket: New features to boost your workflow: </summary>
   
   - :snowflake: [Test 
Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, 
report on failures, and find test suite problems.
   - :package: [JS Bundle 
Analysis](https://docs.codecov.com/docs/javascript-bundle-analysis): Save 
yourself from yourself by tracking and limiting bundle sizes in JS merges.
   </details>




> Joint compilation: keep javac CLASS_OUTPUT in memory when memStub is enabled
> ----------------------------------------------------------------------------
>
>                 Key: GROOVY-12711
>                 URL: https://issues.apache.org/jira/browse/GROOVY-12711
>             Project: Groovy
>          Issue Type: Improvement
>          Components: Compiler
>            Reporter: Daniel Sun
>            Assignee: Daniel Sun
>            Priority: Major
>
> h2. Background
> Apache Groovy's joint compilation pipeline already supports generating Java 
> stubs in memory via {{CompilerConfiguration.MEM_STUB}} ({{"memStub"}}) and 
> {{MemJavaFileObject}} (since 3.0.0). {{JavaAwareCompilationUnit}} emits those 
> stubs at {{Phases.CONVERSION}} (including GEP-21 CONVERSION-phase 
> transform/stubber contributions) and invokes javac at the 
> {{SEMANTIC_ANALYSIS}} boundary.
> What remains disk-bound is javac *class output*: {{JavacJavaCompiler}} / 
> consumers such as {{groovy-lsp}} still rely on a filesystem target directory 
> (or an owner-only temporary directory) for {{CLASS_OUTPUT}}. Embeddings that 
> need a clean, low-latency, no-workspace-pollution joint compile—language 
> services, tests, and future agent tooling—therefore cannot yet run a fully 
> heap-resident Groovy↔Java cycle through the public core APIs alone.
> This ticket is intentionally *not* a request to add an MCP server or LSP host 
> to groovy-core. Optional modules {{groovy-lsp}} and {{groovy-mcp}} already 
> provide protocol adapters over {{GroovyLanguageEngine}}. Core should supply 
> reusable joint-compilation primitives those modules (and third parties) can 
> adopt later.
> h2. Motivation
>  * Agents and IDEs that patch Groovy and Java together need joint validation 
> without writing stubs or {{.class}} files into the project tree or into temp 
> directories that must be permission-hardened and cleaned up.
>  * Disk stub/class I/O adds latency, races with file watchers, and 
> false-positive failures when overlays disagree with on-disk sources.
>  * Completing in-memory *class* output—on top of existing in-memory *stub* 
> sources—closes the remaining gap in the joint pipeline and unblocks follow-on 
> introspection work without widening the core attack surface.
> h2. Goals
>  * Provide a reusable in-memory {{javax.tools.JavaFileManager}} (wrapping 
> {{StandardJavaFileManager}} as needed) that stores javac {{CLASS_OUTPUT}} 
> bytes in heap.
>  * Integrate it into the joint-compilation path behind an *explicit opt-in* 
> when {{memStub}} is enabled (recommended joint option constant alongside 
> {{MEM_STUB}}, e.g. {{MEM_CLASS_OUTPUT}} / {{"memClassOutput"}}—final name 
> bikeshed OK if documented).
>  * Allow {{JavaAwareCompilationUnit}} + {{JavacJavaCompiler}} to complete a 
> mixed Groovy/Java compile *without* requiring {{stubDir}} or a filesystem 
> {{targetDirectory}} for class output when that opt-in is active.
>  * Preserve today's disk-based {{stubDir}} / target-directory behavior as the 
> default for Ant/Gradle-style joint builds.
>  * Document the option next to {{MEM_STUB}}; mark new APIs {{@since 6.0.0}} 
> (or the assigned 6.0.x).
>  * Add focused unit tests proving a bidirectional Groovy↔Java reference 
> compiles successfully with no stub or class files on disk, plus a regression 
> that the classic disk path still works.
> h2. Non-Goals
>  * No MCP JSON-RPC tools, daemon, or dependency on an MCP SDK in core.
>  * No LSP protocol changes and no requirement to modify {{groovy-lsp}} / 
> {{groovy-mcp}} in the same change set (follow-up tickets may consume the API).
>  * No Overlay VFS process, no multi-tenant sandbox service.
>  * No silent forced {{StaticTypeCheckingVisitor}} on dynamic Groovy.
>  * No change to default joint-compilation outputs for existing builds that do 
> not opt in.
>  * No attempt to run all AST transforms before stub emission (GEP-21 stubbers 
> remain the mechanism for pre-javac signature contributions).
>  * No "zero hallucination" product claims; success is measured by tests, 
> compatibility, and API clarity.
> h2. Proposed Approach
>  # Add {{InMemoryJavaFileManager}} under {{org.codehaus.groovy.tools.javac}} 
> that forwards to the standard manager for inputs/classpath but redirects 
> {{getJavaFileForOutput(..., CLASS_OUTPUT, ...)}} to an in-memory 
> {{JavaFileObject}} (e.g. {{MemClassFileObject}}), exposing produced bytecode 
> by binary name.
>  # Teach {{JavacJavaCompiler}} to install that manager when {{memStub}} is 
> true *and* the new mem-class-output option is enabled (and/or when no target 
> directory is configured—behavior must be documented and tested).
>  # Adjust {{JavaAwareCompilationUnit}} configuration so the Groovy class 
> loader can resolve types from the in-memory class bytes after javac without 
> requiring {{targetDirectory}} on disk in that mode. Prefer the smallest 
> robust hook; if a dedicated {{ClassNodeResolver}} helper is too large for one 
> review, land bytecode retrieval + tested {{defineClass}}/loader integration 
> first and file a follow-up for resolver sugar.
>  # Keep {{MemJavaFileObject}} stub generation as-is; this ticket does not 
> replace GEP-21.
>  # Update package documentation for joint compilation accordingly.
> h2. Acceptance Criteria
>  * Standards: Uses public {{javax.tools}} APIs only (no illegal reflective 
> access / {{--add-exports}} requirements beyond what Groovy already needs for 
> joint compile).
>  * Compatibility: Existing {{stubDir}} joint compiles without the new option 
> behave as today (regression test).
>  * Functional: With {{memStub}} + mem class output, a fixture where Java 
> calls a Groovy stubbed API and Groovy references a Java type compiles 
> successfully with no stub directory and no class-output directory.
>  * Maintainability: New types live in {{org.codehaus.groovy.tools.javac}}, 
> are documented, and do not entangle protocol modules.
>  * Reusability: File manager API is usable by embeddings outside Ant (tests 
> demonstrate construction without {{FileSystemCompiler}}).
>  * Robustness: Compiler errors surface through existing 
> collectors/diagnostics; failures do not leave orphan temp dirs (because none 
> are required in the mem path).
>  * Performance: Small fixture completes reliably under CI; mem path must not 
> be pathologically slower than disk path for that fixture (guard with a 
> generous timeout rather than a flaky microbenchmark).
>  * Security: Output path does not write class bytes to the filesystem; does 
> not introduce network I/O, script evaluation, or Grab; does not expand 
> classpath resolution beyond existing joint-compile behavior. Vuln/scanner 
> surface must not increase.
> h2. Risks / Compatibility
>  * Binary compatibility: additive APIs only; run the project's 
> binary-compatibility checks.
>  * Class loader / resolution ordering: in-memory classes must become visible 
> to Groovy resolution the same way disk {{targetDirectory}} classes are today; 
> mishandling could break joint cycles—tests must cover the bidirectional case.
>  * Opt-in flag vs implied behavior when {{targetDirectory == null}}: choose 
> one documented rule to avoid surprising Ant users.
>  * Follow-on modules (LSP) currently create owner-only temp dirs; migrating 
> them is *out of scope* here but should become easier once this lands.
> h2. Test Plan
>  * New unit/integration tests under the existing joint-compilation / 
> tools.javac test areas:
>  ** memStub + mem class output: Groovy↔Java cycle, assert success, assert no 
> stubDir/class output dir required.
>  ** intentional type error: failure reported cleanly.
>  ** disk stubDir path unchanged when option off.
>  * Run standard core test task(s) and binary-compatibility checks required 
> for the touched modules.
> h2. Notes for implementers / reviewers
>  * Related in-tree pieces: {{MemJavaFileObject}}, 
> {{JavaStubGenerator#generateMemStub}}, {{CompilerConfiguration.MEM_STUB}}, 
> {{JavaAwareCompilationUnit}}, GEP-21 {{StubberSupport}}, 
> {{subprojects/groovy-lsp}} ({{LspJavaCompiler}}, temp CLASS_OUTPUT), 
> {{subprojects/groovy-mcp}} (protocol only—do not expand in this ticket).
>  * Long-term "Semantic Oracle" agent tools (FQN contract inspect, multi-file 
> dry-run, diagnostic enrichment) depend on *this* foundation plus later 
> library introspection APIs; track those as separate issues after this 
> Improvement merges.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to