Skip to content

fix(reports): GitHub Actions annotations never reached the pull request - #1042

Merged
Chemaclass merged 2 commits into
mainfrom
fix/1014-gha-annotations
Aug 10, 2026
Merged

fix(reports): GitHub Actions annotations never reached the pull request#1042
Chemaclass merged 2 commits into
mainfrom
fix/1014-gha-annotations

Conversation

@Chemaclass

Copy link
Copy Markdown
Member

🤔 Background

Related #1014

bashunit could produce GitHub Actions annotations, but they never reached a pull request. GitHub parses workflow commands from the job log, and the only caller wrote them to a file instead of stdout. The flag was undocumented, and the official action never wired it, so users of TypedDevs/bashunit@v0 got nothing.

💡 Changes

  • Annotations now print to stdout automatically inside GitHub Actions, with the failing test's file and line so they land on the right line of the diff. No flag needed.
  • --gha-annotations <auto|always|never> overrides the detection; auto also stays quiet under --output tap.
  • --log-gha keeps writing its file, is now listed in --help, and the two sinks never duplicate each other in the job log.
  • action.yml gains an annotations input, and row collection is enabled when annotations will print, which also keeps them working under --parallel.

GitHub parses workflow commands from the job log, and bashunit only ever
wrote them to a file. print_gha_annotations already emitted correct
`::error file=...,line=...` lines, but the sole caller redirected them
into $BASHUNIT_LOG_GHA, so a file nobody cat'd produced zero annotations.
The flag was also missing from `bashunit test --help`, and the official
action never wired any of it, so users of TypedDevs/bashunit@v0 got
nothing at all.
Annotations now go to stdout, automatically, whenever GITHUB_ACTIONS is
true. --gha-annotations auto|always|never overrides the detection. `auto`
also stays quiet under --output tap, whose stdout is a machine format an
annotation line would corrupt.
reports::is_enabled had to learn about this too: it gates row collection,
so without it the arrays stayed empty and there was nothing to annotate
when no other report flag was set. Printing happens after load_spooled so
a --parallel run annotates the rows its workers spooled, which the parent
would otherwise never have seen (#1004).
--log-gha keeps writing the file and is now documented. The two sinks are
independent, so using both does not duplicate anything in the job log.
Closes#1014
@ChemaclassChemaclass added the bug Something isn't working label Aug 10, 2026
@ChemaclassChemaclass self-assigned this Aug 10, 2026
GITHUB_ACTIONS is inherited by every child process, so auto-detection
alone made every nested bashunit run annotate its parent's job log with
its own fixtures' failures. bashunit's own acceptance suite spawns ~258
nested runs, which is how CI caught it; a user's script under test that
calls bashunit would have polluted their log the same way.
A run claims the log by exporting a marker and reading it first, so the
outermost process wins and every descendant stays quiet. The marker is
deliberately exported, unlike the run-mode flags: the nested run is
exactly the consumer that has to see it.
The reports unit tests ask whether a *file* report was configured.
Annotations are a second reason to collect rows and switch themselves on
inside GitHub Actions, so they are pinned off there to keep the answer
independent of the ambient environment.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugSomething isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Chemaclass
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
fix(reports): GitHub Actions annotations never reached the pull request by Chemaclass · Pull Request #1042 · TypedDevs/bashunit · GitHub
Skip to content

fix(reports): GitHub Actions annotations never reached the pull request - #1042

Merged
Chemaclass merged 2 commits into
mainfrom
fix/1014-gha-annotations
Aug 10, 2026
Merged

fix(reports): GitHub Actions annotations never reached the pull request#1042
Chemaclass merged 2 commits into
mainfrom
fix/1014-gha-annotations

Conversation

@Chemaclass

Copy link
Copy Markdown
Member

🤔 Background

Related #1014

bashunit could produce GitHub Actions annotations, but they never reached a pull request. GitHub parses workflow commands from the job log, and the only caller wrote them to a file instead of stdout. The flag was undocumented, and the official action never wired it, so users of TypedDevs/bashunit@v0 got nothing.

💡 Changes

  • Annotations now print to stdout automatically inside GitHub Actions, with the failing test's file and line so they land on the right line of the diff. No flag needed.
  • --gha-annotations <auto|always|never> overrides the detection; auto also stays quiet under --output tap.
  • --log-gha keeps writing its file, is now listed in --help, and the two sinks never duplicate each other in the job log.
  • action.yml gains an annotations input, and row collection is enabled when annotations will print, which also keeps them working under --parallel.

GitHub parses workflow commands from the job log, and bashunit only ever
wrote them to a file. print_gha_annotations already emitted correct
`::error file=...,line=...` lines, but the sole caller redirected them
into $BASHUNIT_LOG_GHA, so a file nobody cat'd produced zero annotations.
The flag was also missing from `bashunit test --help`, and the official
action never wired any of it, so users of TypedDevs/bashunit@v0 got
nothing at all.
Annotations now go to stdout, automatically, whenever GITHUB_ACTIONS is
true. --gha-annotations auto|always|never overrides the detection. `auto`
also stays quiet under --output tap, whose stdout is a machine format an
annotation line would corrupt.
reports::is_enabled had to learn about this too: it gates row collection,
so without it the arrays stayed empty and there was nothing to annotate
when no other report flag was set. Printing happens after load_spooled so
a --parallel run annotates the rows its workers spooled, which the parent
would otherwise never have seen (#1004).
--log-gha keeps writing the file and is now documented. The two sinks are
independent, so using both does not duplicate anything in the job log.
Closes#1014
@ChemaclassChemaclass added the bug Something isn't working label Aug 10, 2026
@ChemaclassChemaclass self-assigned this Aug 10, 2026
GITHUB_ACTIONS is inherited by every child process, so auto-detection
alone made every nested bashunit run annotate its parent's job log with
its own fixtures' failures. bashunit's own acceptance suite spawns ~258
nested runs, which is how CI caught it; a user's script under test that
calls bashunit would have polluted their log the same way.
A run claims the log by exporting a marker and reading it first, so the
outermost process wins and every descendant stays quiet. The marker is
deliberately exported, unlike the run-mode flags: the nested run is
exactly the consumer that has to see it.
The reports unit tests ask whether a *file* report was configured.
Annotations are a second reason to collect rows and switch themselves on
inside GitHub Actions, so they are pinned off there to keep the answer
independent of the ambient environment.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugSomething isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Chemaclass
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(reports): GitHub Actions annotations never reached the pull request by Chemaclass · Pull Request #1042 · TypedDevs/bashunit · GitHub
Skip to content

fix(reports): GitHub Actions annotations never reached the pull request - #1042

Merged
Chemaclass merged 2 commits into
mainfrom
fix/1014-gha-annotations
Aug 10, 2026
Merged

fix(reports): GitHub Actions annotations never reached the pull request#1042
Chemaclass merged 2 commits into
mainfrom
fix/1014-gha-annotations

Conversation

@Chemaclass

Copy link
Copy Markdown
Member

🤔 Background

Related #1014

bashunit could produce GitHub Actions annotations, but they never reached a pull request. GitHub parses workflow commands from the job log, and the only caller wrote them to a file instead of stdout. The flag was undocumented, and the official action never wired it, so users of TypedDevs/bashunit@v0 got nothing.

💡 Changes

  • Annotations now print to stdout automatically inside GitHub Actions, with the failing test's file and line so they land on the right line of the diff. No flag needed.
  • --gha-annotations <auto|always|never> overrides the detection; auto also stays quiet under --output tap.
  • --log-gha keeps writing its file, is now listed in --help, and the two sinks never duplicate each other in the job log.
  • action.yml gains an annotations input, and row collection is enabled when annotations will print, which also keeps them working under --parallel.

GitHub parses workflow commands from the job log, and bashunit only ever
wrote them to a file. print_gha_annotations already emitted correct
`::error file=...,line=...` lines, but the sole caller redirected them
into $BASHUNIT_LOG_GHA, so a file nobody cat'd produced zero annotations.
The flag was also missing from `bashunit test --help`, and the official
action never wired any of it, so users of TypedDevs/bashunit@v0 got
nothing at all.
Annotations now go to stdout, automatically, whenever GITHUB_ACTIONS is
true. --gha-annotations auto|always|never overrides the detection. `auto`
also stays quiet under --output tap, whose stdout is a machine format an
annotation line would corrupt.
reports::is_enabled had to learn about this too: it gates row collection,
so without it the arrays stayed empty and there was nothing to annotate
when no other report flag was set. Printing happens after load_spooled so
a --parallel run annotates the rows its workers spooled, which the parent
would otherwise never have seen (#1004).
--log-gha keeps writing the file and is now documented. The two sinks are
independent, so using both does not duplicate anything in the job log.
Closes#1014
@ChemaclassChemaclass added the bug Something isn't working label Aug 10, 2026
@ChemaclassChemaclass self-assigned this Aug 10, 2026
GITHUB_ACTIONS is inherited by every child process, so auto-detection
alone made every nested bashunit run annotate its parent's job log with
its own fixtures' failures. bashunit's own acceptance suite spawns ~258
nested runs, which is how CI caught it; a user's script under test that
calls bashunit would have polluted their log the same way.
A run claims the log by exporting a marker and reading it first, so the
outermost process wins and every descendant stays quiet. The marker is
deliberately exported, unlike the run-mode flags: the nested run is
exactly the consumer that has to see it.
The reports unit tests ask whether a *file* report was configured.
Annotations are a second reason to collect rows and switch themselves on
inside GitHub Actions, so they are pinned off there to keep the answer
independent of the ambient environment.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugSomething isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Chemaclass
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(reports): GitHub Actions annotations never reached the pull request by Chemaclass · Pull Request #1042 · TypedDevs/bashunit · GitHub
Skip to content

fix(reports): GitHub Actions annotations never reached the pull request - #1042

Merged
Chemaclass merged 2 commits into
mainfrom
fix/1014-gha-annotations
Aug 10, 2026
Merged

fix(reports): GitHub Actions annotations never reached the pull request#1042
Chemaclass merged 2 commits into
mainfrom
fix/1014-gha-annotations

Conversation

@Chemaclass

Copy link
Copy Markdown
Member

🤔 Background

Related #1014

bashunit could produce GitHub Actions annotations, but they never reached a pull request. GitHub parses workflow commands from the job log, and the only caller wrote them to a file instead of stdout. The flag was undocumented, and the official action never wired it, so users of TypedDevs/bashunit@v0 got nothing.

💡 Changes

  • Annotations now print to stdout automatically inside GitHub Actions, with the failing test's file and line so they land on the right line of the diff. No flag needed.
  • --gha-annotations <auto|always|never> overrides the detection; auto also stays quiet under --output tap.
  • --log-gha keeps writing its file, is now listed in --help, and the two sinks never duplicate each other in the job log.
  • action.yml gains an annotations input, and row collection is enabled when annotations will print, which also keeps them working under --parallel.

GitHub parses workflow commands from the job log, and bashunit only ever
wrote them to a file. print_gha_annotations already emitted correct
`::error file=...,line=...` lines, but the sole caller redirected them
into $BASHUNIT_LOG_GHA, so a file nobody cat'd produced zero annotations.
The flag was also missing from `bashunit test --help`, and the official
action never wired any of it, so users of TypedDevs/bashunit@v0 got
nothing at all.
Annotations now go to stdout, automatically, whenever GITHUB_ACTIONS is
true. --gha-annotations auto|always|never overrides the detection. `auto`
also stays quiet under --output tap, whose stdout is a machine format an
annotation line would corrupt.
reports::is_enabled had to learn about this too: it gates row collection,
so without it the arrays stayed empty and there was nothing to annotate
when no other report flag was set. Printing happens after load_spooled so
a --parallel run annotates the rows its workers spooled, which the parent
would otherwise never have seen (#1004).
--log-gha keeps writing the file and is now documented. The two sinks are
independent, so using both does not duplicate anything in the job log.
Closes#1014
@ChemaclassChemaclass added the bug Something isn't working label Aug 10, 2026
@ChemaclassChemaclass self-assigned this Aug 10, 2026
GITHUB_ACTIONS is inherited by every child process, so auto-detection
alone made every nested bashunit run annotate its parent's job log with
its own fixtures' failures. bashunit's own acceptance suite spawns ~258
nested runs, which is how CI caught it; a user's script under test that
calls bashunit would have polluted their log the same way.
A run claims the log by exporting a marker and reading it first, so the
outermost process wins and every descendant stays quiet. The marker is
deliberately exported, unlike the run-mode flags: the nested run is
exactly the consumer that has to see it.
The reports unit tests ask whether a *file* report was configured.
Annotations are a second reason to collect rows and switch themselves on
inside GitHub Actions, so they are pinned off there to keep the answer
independent of the ambient environment.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugSomething isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Chemaclass
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' fix(reports): GitHub Actions annotations never reached the pull request by Chemaclass · Pull Request #1042 · TypedDevs/bashunit · GitHub
Skip to content

fix(reports): GitHub Actions annotations never reached the pull request - #1042

Merged
Chemaclass merged 2 commits into
mainfrom
fix/1014-gha-annotations
Aug 10, 2026
Merged

fix(reports): GitHub Actions annotations never reached the pull request#1042
Chemaclass merged 2 commits into
mainfrom
fix/1014-gha-annotations

Conversation

@Chemaclass

Copy link
Copy Markdown
Member

🤔 Background

Related #1014

bashunit could produce GitHub Actions annotations, but they never reached a pull request. GitHub parses workflow commands from the job log, and the only caller wrote them to a file instead of stdout. The flag was undocumented, and the official action never wired it, so users of TypedDevs/bashunit@v0 got nothing.

💡 Changes

  • Annotations now print to stdout automatically inside GitHub Actions, with the failing test's file and line so they land on the right line of the diff. No flag needed.
  • --gha-annotations <auto|always|never> overrides the detection; auto also stays quiet under --output tap.
  • --log-gha keeps writing its file, is now listed in --help, and the two sinks never duplicate each other in the job log.
  • action.yml gains an annotations input, and row collection is enabled when annotations will print, which also keeps them working under --parallel.

GitHub parses workflow commands from the job log, and bashunit only ever
wrote them to a file. print_gha_annotations already emitted correct
`::error file=...,line=...` lines, but the sole caller redirected them
into $BASHUNIT_LOG_GHA, so a file nobody cat'd produced zero annotations.
The flag was also missing from `bashunit test --help`, and the official
action never wired any of it, so users of TypedDevs/bashunit@v0 got
nothing at all.
Annotations now go to stdout, automatically, whenever GITHUB_ACTIONS is
true. --gha-annotations auto|always|never overrides the detection. `auto`
also stays quiet under --output tap, whose stdout is a machine format an
annotation line would corrupt.
reports::is_enabled had to learn about this too: it gates row collection,
so without it the arrays stayed empty and there was nothing to annotate
when no other report flag was set. Printing happens after load_spooled so
a --parallel run annotates the rows its workers spooled, which the parent
would otherwise never have seen (#1004).
--log-gha keeps writing the file and is now documented. The two sinks are
independent, so using both does not duplicate anything in the job log.
Closes#1014
@ChemaclassChemaclass added the bug Something isn't working label Aug 10, 2026
@ChemaclassChemaclass self-assigned this Aug 10, 2026
GITHUB_ACTIONS is inherited by every child process, so auto-detection
alone made every nested bashunit run annotate its parent's job log with
its own fixtures' failures. bashunit's own acceptance suite spawns ~258
nested runs, which is how CI caught it; a user's script under test that
calls bashunit would have polluted their log the same way.
A run claims the log by exporting a marker and reading it first, so the
outermost process wins and every descendant stays quiet. The marker is
deliberately exported, unlike the run-mode flags: the nested run is
exactly the consumer that has to see it.
The reports unit tests ask whether a *file* report was configured.
Annotations are a second reason to collect rows and switch themselves on
inside GitHub Actions, so they are pinned off there to keep the answer
independent of the ambient environment.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugSomething isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Chemaclass
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(reports): GitHub Actions annotations never reached the pull request by Chemaclass · Pull Request #1042 · TypedDevs/bashunit · GitHub
Skip to content

fix(reports): GitHub Actions annotations never reached the pull request - #1042

Merged
Chemaclass merged 2 commits into
mainfrom
fix/1014-gha-annotations
Aug 10, 2026
Merged

fix(reports): GitHub Actions annotations never reached the pull request#1042
Chemaclass merged 2 commits into
mainfrom
fix/1014-gha-annotations

Conversation

@Chemaclass

Copy link
Copy Markdown
Member

🤔 Background

Related #1014

bashunit could produce GitHub Actions annotations, but they never reached a pull request. GitHub parses workflow commands from the job log, and the only caller wrote them to a file instead of stdout. The flag was undocumented, and the official action never wired it, so users of TypedDevs/bashunit@v0 got nothing.

💡 Changes

  • Annotations now print to stdout automatically inside GitHub Actions, with the failing test's file and line so they land on the right line of the diff. No flag needed.
  • --gha-annotations <auto|always|never> overrides the detection; auto also stays quiet under --output tap.
  • --log-gha keeps writing its file, is now listed in --help, and the two sinks never duplicate each other in the job log.
  • action.yml gains an annotations input, and row collection is enabled when annotations will print, which also keeps them working under --parallel.

GitHub parses workflow commands from the job log, and bashunit only ever
wrote them to a file. print_gha_annotations already emitted correct
`::error file=...,line=...` lines, but the sole caller redirected them
into $BASHUNIT_LOG_GHA, so a file nobody cat'd produced zero annotations.
The flag was also missing from `bashunit test --help`, and the official
action never wired any of it, so users of TypedDevs/bashunit@v0 got
nothing at all.
Annotations now go to stdout, automatically, whenever GITHUB_ACTIONS is
true. --gha-annotations auto|always|never overrides the detection. `auto`
also stays quiet under --output tap, whose stdout is a machine format an
annotation line would corrupt.
reports::is_enabled had to learn about this too: it gates row collection,
so without it the arrays stayed empty and there was nothing to annotate
when no other report flag was set. Printing happens after load_spooled so
a --parallel run annotates the rows its workers spooled, which the parent
would otherwise never have seen (#1004).
--log-gha keeps writing the file and is now documented. The two sinks are
independent, so using both does not duplicate anything in the job log.
Closes#1014
@ChemaclassChemaclass added the bug Something isn't working label Aug 10, 2026
@ChemaclassChemaclass self-assigned this Aug 10, 2026
GITHUB_ACTIONS is inherited by every child process, so auto-detection
alone made every nested bashunit run annotate its parent's job log with
its own fixtures' failures. bashunit's own acceptance suite spawns ~258
nested runs, which is how CI caught it; a user's script under test that
calls bashunit would have polluted their log the same way.
A run claims the log by exporting a marker and reading it first, so the
outermost process wins and every descendant stays quiet. The marker is
deliberately exported, unlike the run-mode flags: the nested run is
exactly the consumer that has to see it.
The reports unit tests ask whether a *file* report was configured.
Annotations are a second reason to collect rows and switch themselves on
inside GitHub Actions, so they are pinned off there to keep the answer
independent of the ambient environment.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugSomething isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Chemaclass
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(reports): GitHub Actions annotations never reached the pull request by Chemaclass · Pull Request #1042 · TypedDevs/bashunit · GitHub
Skip to content

fix(reports): GitHub Actions annotations never reached the pull request - #1042

Merged
Chemaclass merged 2 commits into
mainfrom
fix/1014-gha-annotations
Aug 10, 2026
Merged

fix(reports): GitHub Actions annotations never reached the pull request#1042
Chemaclass merged 2 commits into
mainfrom
fix/1014-gha-annotations

Conversation

@Chemaclass

Copy link
Copy Markdown
Member

🤔 Background

Related #1014

bashunit could produce GitHub Actions annotations, but they never reached a pull request. GitHub parses workflow commands from the job log, and the only caller wrote them to a file instead of stdout. The flag was undocumented, and the official action never wired it, so users of TypedDevs/bashunit@v0 got nothing.

💡 Changes

  • Annotations now print to stdout automatically inside GitHub Actions, with the failing test's file and line so they land on the right line of the diff. No flag needed.
  • --gha-annotations <auto|always|never> overrides the detection; auto also stays quiet under --output tap.
  • --log-gha keeps writing its file, is now listed in --help, and the two sinks never duplicate each other in the job log.
  • action.yml gains an annotations input, and row collection is enabled when annotations will print, which also keeps them working under --parallel.

GitHub parses workflow commands from the job log, and bashunit only ever
wrote them to a file. print_gha_annotations already emitted correct
`::error file=...,line=...` lines, but the sole caller redirected them
into $BASHUNIT_LOG_GHA, so a file nobody cat'd produced zero annotations.
The flag was also missing from `bashunit test --help`, and the official
action never wired any of it, so users of TypedDevs/bashunit@v0 got
nothing at all.
Annotations now go to stdout, automatically, whenever GITHUB_ACTIONS is
true. --gha-annotations auto|always|never overrides the detection. `auto`
also stays quiet under --output tap, whose stdout is a machine format an
annotation line would corrupt.
reports::is_enabled had to learn about this too: it gates row collection,
so without it the arrays stayed empty and there was nothing to annotate
when no other report flag was set. Printing happens after load_spooled so
a --parallel run annotates the rows its workers spooled, which the parent
would otherwise never have seen (#1004).
--log-gha keeps writing the file and is now documented. The two sinks are
independent, so using both does not duplicate anything in the job log.
Closes#1014
@ChemaclassChemaclass added the bug Something isn't working label Aug 10, 2026
@ChemaclassChemaclass self-assigned this Aug 10, 2026
GITHUB_ACTIONS is inherited by every child process, so auto-detection
alone made every nested bashunit run annotate its parent's job log with
its own fixtures' failures. bashunit's own acceptance suite spawns ~258
nested runs, which is how CI caught it; a user's script under test that
calls bashunit would have polluted their log the same way.
A run claims the log by exporting a marker and reading it first, so the
outermost process wins and every descendant stays quiet. The marker is
deliberately exported, unlike the run-mode flags: the nested run is
exactly the consumer that has to see it.
The reports unit tests ask whether a *file* report was configured.
Annotations are a second reason to collect rows and switch themselves on
inside GitHub Actions, so they are pinned off there to keep the answer
independent of the ambient environment.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugSomething isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Chemaclass
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); fix(reports): GitHub Actions annotations never reached the pull request by Chemaclass · Pull Request #1042 · TypedDevs/bashunit · GitHub
Skip to content

fix(reports): GitHub Actions annotations never reached the pull request - #1042

Merged
Chemaclass merged 2 commits into
mainfrom
fix/1014-gha-annotations
Aug 10, 2026
Merged

fix(reports): GitHub Actions annotations never reached the pull request#1042
Chemaclass merged 2 commits into
mainfrom
fix/1014-gha-annotations

Conversation

@Chemaclass

Copy link
Copy Markdown
Member

🤔 Background

Related #1014

bashunit could produce GitHub Actions annotations, but they never reached a pull request. GitHub parses workflow commands from the job log, and the only caller wrote them to a file instead of stdout. The flag was undocumented, and the official action never wired it, so users of TypedDevs/bashunit@v0 got nothing.

💡 Changes

  • Annotations now print to stdout automatically inside GitHub Actions, with the failing test's file and line so they land on the right line of the diff. No flag needed.
  • --gha-annotations <auto|always|never> overrides the detection; auto also stays quiet under --output tap.
  • --log-gha keeps writing its file, is now listed in --help, and the two sinks never duplicate each other in the job log.
  • action.yml gains an annotations input, and row collection is enabled when annotations will print, which also keeps them working under --parallel.

GitHub parses workflow commands from the job log, and bashunit only ever
wrote them to a file. print_gha_annotations already emitted correct
`::error file=...,line=...` lines, but the sole caller redirected them
into $BASHUNIT_LOG_GHA, so a file nobody cat'd produced zero annotations.
The flag was also missing from `bashunit test --help`, and the official
action never wired any of it, so users of TypedDevs/bashunit@v0 got
nothing at all.
Annotations now go to stdout, automatically, whenever GITHUB_ACTIONS is
true. --gha-annotations auto|always|never overrides the detection. `auto`
also stays quiet under --output tap, whose stdout is a machine format an
annotation line would corrupt.
reports::is_enabled had to learn about this too: it gates row collection,
so without it the arrays stayed empty and there was nothing to annotate
when no other report flag was set. Printing happens after load_spooled so
a --parallel run annotates the rows its workers spooled, which the parent
would otherwise never have seen (#1004).
--log-gha keeps writing the file and is now documented. The two sinks are
independent, so using both does not duplicate anything in the job log.
Closes#1014
@ChemaclassChemaclass added the bug Something isn't working label Aug 10, 2026
@ChemaclassChemaclass self-assigned this Aug 10, 2026
GITHUB_ACTIONS is inherited by every child process, so auto-detection
alone made every nested bashunit run annotate its parent's job log with
its own fixtures' failures. bashunit's own acceptance suite spawns ~258
nested runs, which is how CI caught it; a user's script under test that
calls bashunit would have polluted their log the same way.
A run claims the log by exporting a marker and reading it first, so the
outermost process wins and every descendant stays quiet. The marker is
deliberately exported, unlike the run-mode flags: the nested run is
exactly the consumer that has to see it.
The reports unit tests ask whether a *file* report was configured.
Annotations are a second reason to collect rows and switch themselves on
inside GitHub Actions, so they are pinned off there to keep the answer
independent of the ambient environment.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugSomething isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Chemaclass