_stream: use full element name in artifact log/list-contents - #2174

Open
c1assik wants to merge 1 commit into
apache:masterfrom
c1assik:fix/artifact_full_name
Open

_stream: use full element name in artifact log/list-contents#2174
c1assik wants to merge 1 commit into
apache:masterfrom
c1assik:fix/artifact_full_name

Conversation

@c1assik

Copy link
Copy Markdown

artifact_log() and artifact_list_contents() were keying their result dicts by obj.name, which is just the bare, project-relative element name. For elements loaded across a junction, this drops the owning junction prefix, so e.g. bst artifact list-contents element.bst nested.bst:element.bst would only show one entry, since both targets resolved to the same key.

Use obj._get_full_name() instead, which includes the junction prefix, falling back to the artifact ref for ArtifactElement targets (i.e. when an artifact is referred to by its ref rather than its element name) as before.

Also drops a dead obj.name = {ref: "No artifact cached"} assignment in artifact_list_contents() that was immediately followed by continue and never used.

Add tests covering artifact log and artifact list-contents with a cross-junction element alongside a same-named top-level element.

@c1assik
c1assik marked this pull request as ready for review August 15, 2026 09:08
Comment threadsrc/buildstream/_stream.py Outdated
continue

artifact_logs[obj.name] = obj._get_logs()
name = ref if isinstance(obj, ArtifactElement) else obj._get_full_name()

@nathanwilliams-ctnathanwilliams-ctAug 17, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps it would be better if ArtifactElement overrode the _get_full_name method or the __full_name variable, instead of having this awkward condition here?

Suggested change
name=refifisinstance(obj, ArtifactElement) elseobj._get_full_name()
name=obj._get_full_name()

In ArtifactElement

def_get_full_name(self)
returnself.get_artifact_name()

@c1assikc1assikAug 17, 2026

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a method _get_full_name() to ArtifactElement.

return self.get_artifact_name(), unconditionally fails with AssertionError: assert key is not None in get_artifact_name() so if the cache key isn't set yet, fall back to super()._get_full_name() (the base Plugin/Element name, which is always safe since it's precomputed earlier in Plugin.init). Once construction finishes and the key is set, it returns the full artifact ref as intended

@abderrahimabderrahimSep 2, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it makes more sense to set the name in ArtifactElement (you can set it before chaining up to the super class __init__() so that it gets picked up). I feel it would be more elegant than trying to override _get_full_name().

@c1assik
c1assikforce-pushed the fix/artifact_full_name branch from cdbdea6 to 30fd1a2CompareAugust 17, 2026 17:18
@nathanwilliams-ct

Copy link
Copy Markdown
Contributor

LGTM

`artifact_log()` and `artifact_list_contents()` were keying their
result dicts by `obj.name`, which is just the bare, project-relative
element name. For elements loaded across a junction, this drops the
owning junction prefix, so e.g. `bst artifact list-contents
element.bst nested.bst:element.bst` would only show one entry, since
both targets resolved to the same key.
Use `obj._get_full_name()` instead, which includes the junction
prefix, falling back to the artifact ref for `ArtifactElement`
targets (i.e. when an artifact is referred to by its ref rather than
its element name) as before.
Also drops a dead `obj.name = {ref: "No artifact cached"}` assignment
in `artifact_list_contents()` that was immediately followed by
`continue` and never used.
Add tests covering `artifact log` and `artifact list-contents` with a
cross-junction element alongside a same-named top-level element.
@c1assik
c1assikforce-pushed the fix/artifact_full_name branch from 30fd1a2 to ceb5115CompareAugust 25, 2026 19:11
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@c1assik@nathanwilliams-ct@abderrahim
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

_stream: use full element name in artifact log/list-contents - #2174

Open
c1assik wants to merge 1 commit into
apache:masterfrom
c1assik:fix/artifact_full_name
Open

_stream: use full element name in artifact log/list-contents#2174
c1assik wants to merge 1 commit into
apache:masterfrom
c1assik:fix/artifact_full_name

Conversation

@c1assik

Copy link
Copy Markdown

artifact_log() and artifact_list_contents() were keying their result dicts by obj.name, which is just the bare, project-relative element name. For elements loaded across a junction, this drops the owning junction prefix, so e.g. bst artifact list-contents element.bst nested.bst:element.bst would only show one entry, since both targets resolved to the same key.

Use obj._get_full_name() instead, which includes the junction prefix, falling back to the artifact ref for ArtifactElement targets (i.e. when an artifact is referred to by its ref rather than its element name) as before.

Also drops a dead obj.name = {ref: "No artifact cached"} assignment in artifact_list_contents() that was immediately followed by continue and never used.

Add tests covering artifact log and artifact list-contents with a cross-junction element alongside a same-named top-level element.

@c1assik
c1assik marked this pull request as ready for review August 15, 2026 09:08
Comment threadsrc/buildstream/_stream.py Outdated
continue

artifact_logs[obj.name] = obj._get_logs()
name = ref if isinstance(obj, ArtifactElement) else obj._get_full_name()

@nathanwilliams-ctnathanwilliams-ctAug 17, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps it would be better if ArtifactElement overrode the _get_full_name method or the __full_name variable, instead of having this awkward condition here?

Suggested change
name=refifisinstance(obj, ArtifactElement) elseobj._get_full_name()
name=obj._get_full_name()

In ArtifactElement

def_get_full_name(self)
returnself.get_artifact_name()

@c1assikc1assikAug 17, 2026

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a method _get_full_name() to ArtifactElement.

return self.get_artifact_name(), unconditionally fails with AssertionError: assert key is not None in get_artifact_name() so if the cache key isn't set yet, fall back to super()._get_full_name() (the base Plugin/Element name, which is always safe since it's precomputed earlier in Plugin.init). Once construction finishes and the key is set, it returns the full artifact ref as intended

@abderrahimabderrahimSep 2, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it makes more sense to set the name in ArtifactElement (you can set it before chaining up to the super class __init__() so that it gets picked up). I feel it would be more elegant than trying to override _get_full_name().

@c1assik
c1assikforce-pushed the fix/artifact_full_name branch from cdbdea6 to 30fd1a2CompareAugust 17, 2026 17:18
@nathanwilliams-ct

Copy link
Copy Markdown
Contributor

LGTM

`artifact_log()` and `artifact_list_contents()` were keying their
result dicts by `obj.name`, which is just the bare, project-relative
element name. For elements loaded across a junction, this drops the
owning junction prefix, so e.g. `bst artifact list-contents
element.bst nested.bst:element.bst` would only show one entry, since
both targets resolved to the same key.
Use `obj._get_full_name()` instead, which includes the junction
prefix, falling back to the artifact ref for `ArtifactElement`
targets (i.e. when an artifact is referred to by its ref rather than
its element name) as before.
Also drops a dead `obj.name = {ref: "No artifact cached"}` assignment
in `artifact_list_contents()` that was immediately followed by
`continue` and never used.
Add tests covering `artifact log` and `artifact list-contents` with a
cross-junction element alongside a same-named top-level element.
@c1assik
c1assikforce-pushed the fix/artifact_full_name branch from 30fd1a2 to ceb5115CompareAugust 25, 2026 19:11
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@c1assik@nathanwilliams-ct@abderrahim
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

_stream: use full element name in artifact log/list-contents - #2174

Open
c1assik wants to merge 1 commit into
apache:masterfrom
c1assik:fix/artifact_full_name
Open

_stream: use full element name in artifact log/list-contents#2174
c1assik wants to merge 1 commit into
apache:masterfrom
c1assik:fix/artifact_full_name

Conversation

@c1assik

Copy link
Copy Markdown

artifact_log() and artifact_list_contents() were keying their result dicts by obj.name, which is just the bare, project-relative element name. For elements loaded across a junction, this drops the owning junction prefix, so e.g. bst artifact list-contents element.bst nested.bst:element.bst would only show one entry, since both targets resolved to the same key.

Use obj._get_full_name() instead, which includes the junction prefix, falling back to the artifact ref for ArtifactElement targets (i.e. when an artifact is referred to by its ref rather than its element name) as before.

Also drops a dead obj.name = {ref: "No artifact cached"} assignment in artifact_list_contents() that was immediately followed by continue and never used.

Add tests covering artifact log and artifact list-contents with a cross-junction element alongside a same-named top-level element.

@c1assik
c1assik marked this pull request as ready for review August 15, 2026 09:08
Comment threadsrc/buildstream/_stream.py Outdated
continue

artifact_logs[obj.name] = obj._get_logs()
name = ref if isinstance(obj, ArtifactElement) else obj._get_full_name()

@nathanwilliams-ctnathanwilliams-ctAug 17, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps it would be better if ArtifactElement overrode the _get_full_name method or the __full_name variable, instead of having this awkward condition here?

Suggested change
name=refifisinstance(obj, ArtifactElement) elseobj._get_full_name()
name=obj._get_full_name()

In ArtifactElement

def_get_full_name(self)
returnself.get_artifact_name()

@c1assikc1assikAug 17, 2026

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a method _get_full_name() to ArtifactElement.

return self.get_artifact_name(), unconditionally fails with AssertionError: assert key is not None in get_artifact_name() so if the cache key isn't set yet, fall back to super()._get_full_name() (the base Plugin/Element name, which is always safe since it's precomputed earlier in Plugin.init). Once construction finishes and the key is set, it returns the full artifact ref as intended

@abderrahimabderrahimSep 2, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it makes more sense to set the name in ArtifactElement (you can set it before chaining up to the super class __init__() so that it gets picked up). I feel it would be more elegant than trying to override _get_full_name().

@c1assik
c1assikforce-pushed the fix/artifact_full_name branch from cdbdea6 to 30fd1a2CompareAugust 17, 2026 17:18
@nathanwilliams-ct

Copy link
Copy Markdown
Contributor

LGTM

`artifact_log()` and `artifact_list_contents()` were keying their
result dicts by `obj.name`, which is just the bare, project-relative
element name. For elements loaded across a junction, this drops the
owning junction prefix, so e.g. `bst artifact list-contents
element.bst nested.bst:element.bst` would only show one entry, since
both targets resolved to the same key.
Use `obj._get_full_name()` instead, which includes the junction
prefix, falling back to the artifact ref for `ArtifactElement`
targets (i.e. when an artifact is referred to by its ref rather than
its element name) as before.
Also drops a dead `obj.name = {ref: "No artifact cached"}` assignment
in `artifact_list_contents()` that was immediately followed by
`continue` and never used.
Add tests covering `artifact log` and `artifact list-contents` with a
cross-junction element alongside a same-named top-level element.
@c1assik
c1assikforce-pushed the fix/artifact_full_name branch from 30fd1a2 to ceb5115CompareAugust 25, 2026 19:11
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

_stream: use full element name in artifact log/list-contents - #2174

Open
c1assik wants to merge 1 commit into
apache:masterfrom
c1assik:fix/artifact_full_name
Open

_stream: use full element name in artifact log/list-contents#2174
c1assik wants to merge 1 commit into
apache:masterfrom
c1assik:fix/artifact_full_name

Conversation

@c1assik

Copy link
Copy Markdown

artifact_log() and artifact_list_contents() were keying their result dicts by obj.name, which is just the bare, project-relative element name. For elements loaded across a junction, this drops the owning junction prefix, so e.g. bst artifact list-contents element.bst nested.bst:element.bst would only show one entry, since both targets resolved to the same key.

Use obj._get_full_name() instead, which includes the junction prefix, falling back to the artifact ref for ArtifactElement targets (i.e. when an artifact is referred to by its ref rather than its element name) as before.

Also drops a dead obj.name = {ref: "No artifact cached"} assignment in artifact_list_contents() that was immediately followed by continue and never used.

Add tests covering artifact log and artifact list-contents with a cross-junction element alongside a same-named top-level element.

@c1assik
c1assik marked this pull request as ready for review August 15, 2026 09:08
Comment threadsrc/buildstream/_stream.py Outdated
continue

artifact_logs[obj.name] = obj._get_logs()
name = ref if isinstance(obj, ArtifactElement) else obj._get_full_name()

@nathanwilliams-ctnathanwilliams-ctAug 17, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps it would be better if ArtifactElement overrode the _get_full_name method or the __full_name variable, instead of having this awkward condition here?

Suggested change
name=refifisinstance(obj, ArtifactElement) elseobj._get_full_name()
name=obj._get_full_name()

In ArtifactElement

def_get_full_name(self)
returnself.get_artifact_name()

@c1assikc1assikAug 17, 2026

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a method _get_full_name() to ArtifactElement.

return self.get_artifact_name(), unconditionally fails with AssertionError: assert key is not None in get_artifact_name() so if the cache key isn't set yet, fall back to super()._get_full_name() (the base Plugin/Element name, which is always safe since it's precomputed earlier in Plugin.init). Once construction finishes and the key is set, it returns the full artifact ref as intended

@abderrahimabderrahimSep 2, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it makes more sense to set the name in ArtifactElement (you can set it before chaining up to the super class __init__() so that it gets picked up). I feel it would be more elegant than trying to override _get_full_name().

@c1assik
c1assikforce-pushed the fix/artifact_full_name branch from cdbdea6 to 30fd1a2CompareAugust 17, 2026 17:18
@nathanwilliams-ct

Copy link
Copy Markdown
Contributor

LGTM

`artifact_log()` and `artifact_list_contents()` were keying their
result dicts by `obj.name`, which is just the bare, project-relative
element name. For elements loaded across a junction, this drops the
owning junction prefix, so e.g. `bst artifact list-contents
element.bst nested.bst:element.bst` would only show one entry, since
both targets resolved to the same key.
Use `obj._get_full_name()` instead, which includes the junction
prefix, falling back to the artifact ref for `ArtifactElement`
targets (i.e. when an artifact is referred to by its ref rather than
its element name) as before.
Also drops a dead `obj.name = {ref: "No artifact cached"}` assignment
in `artifact_list_contents()` that was immediately followed by
`continue` and never used.
Add tests covering `artifact log` and `artifact list-contents` with a
cross-junction element alongside a same-named top-level element.
@c1assik
c1assikforce-pushed the fix/artifact_full_name branch from 30fd1a2 to ceb5115CompareAugust 25, 2026 19:11
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

_stream: use full element name in artifact log/list-contents - #2174

Open
c1assik wants to merge 1 commit into
apache:masterfrom
c1assik:fix/artifact_full_name
Open

_stream: use full element name in artifact log/list-contents#2174
c1assik wants to merge 1 commit into
apache:masterfrom
c1assik:fix/artifact_full_name

Conversation

@c1assik

Copy link
Copy Markdown

artifact_log() and artifact_list_contents() were keying their result dicts by obj.name, which is just the bare, project-relative element name. For elements loaded across a junction, this drops the owning junction prefix, so e.g. bst artifact list-contents element.bst nested.bst:element.bst would only show one entry, since both targets resolved to the same key.

Use obj._get_full_name() instead, which includes the junction prefix, falling back to the artifact ref for ArtifactElement targets (i.e. when an artifact is referred to by its ref rather than its element name) as before.

Also drops a dead obj.name = {ref: "No artifact cached"} assignment in artifact_list_contents() that was immediately followed by continue and never used.

Add tests covering artifact log and artifact list-contents with a cross-junction element alongside a same-named top-level element.

@c1assik
c1assik marked this pull request as ready for review August 15, 2026 09:08
Comment threadsrc/buildstream/_stream.py Outdated
continue

artifact_logs[obj.name] = obj._get_logs()
name = ref if isinstance(obj, ArtifactElement) else obj._get_full_name()

@nathanwilliams-ctnathanwilliams-ctAug 17, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps it would be better if ArtifactElement overrode the _get_full_name method or the __full_name variable, instead of having this awkward condition here?

Suggested change
name=refifisinstance(obj, ArtifactElement) elseobj._get_full_name()
name=obj._get_full_name()

In ArtifactElement

def_get_full_name(self)
returnself.get_artifact_name()

@c1assikc1assikAug 17, 2026

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a method _get_full_name() to ArtifactElement.

return self.get_artifact_name(), unconditionally fails with AssertionError: assert key is not None in get_artifact_name() so if the cache key isn't set yet, fall back to super()._get_full_name() (the base Plugin/Element name, which is always safe since it's precomputed earlier in Plugin.init). Once construction finishes and the key is set, it returns the full artifact ref as intended

@abderrahimabderrahimSep 2, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it makes more sense to set the name in ArtifactElement (you can set it before chaining up to the super class __init__() so that it gets picked up). I feel it would be more elegant than trying to override _get_full_name().

@c1assik
c1assikforce-pushed the fix/artifact_full_name branch from cdbdea6 to 30fd1a2CompareAugust 17, 2026 17:18
@nathanwilliams-ct

Copy link
Copy Markdown
Contributor

LGTM

`artifact_log()` and `artifact_list_contents()` were keying their
result dicts by `obj.name`, which is just the bare, project-relative
element name. For elements loaded across a junction, this drops the
owning junction prefix, so e.g. `bst artifact list-contents
element.bst nested.bst:element.bst` would only show one entry, since
both targets resolved to the same key.
Use `obj._get_full_name()` instead, which includes the junction
prefix, falling back to the artifact ref for `ArtifactElement`
targets (i.e. when an artifact is referred to by its ref rather than
its element name) as before.
Also drops a dead `obj.name = {ref: "No artifact cached"}` assignment
in `artifact_list_contents()` that was immediately followed by
`continue` and never used.
Add tests covering `artifact log` and `artifact list-contents` with a
cross-junction element alongside a same-named top-level element.
@c1assik
c1assikforce-pushed the fix/artifact_full_name branch from 30fd1a2 to ceb5115CompareAugust 25, 2026 19:11
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@c1assik@nathanwilliams-ct@abderrahim
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

_stream: use full element name in artifact log/list-contents - #2174

Open
c1assik wants to merge 1 commit into
apache:masterfrom
c1assik:fix/artifact_full_name
Open

_stream: use full element name in artifact log/list-contents#2174
c1assik wants to merge 1 commit into
apache:masterfrom
c1assik:fix/artifact_full_name

Conversation

@c1assik

Copy link
Copy Markdown

artifact_log() and artifact_list_contents() were keying their result dicts by obj.name, which is just the bare, project-relative element name. For elements loaded across a junction, this drops the owning junction prefix, so e.g. bst artifact list-contents element.bst nested.bst:element.bst would only show one entry, since both targets resolved to the same key.

Use obj._get_full_name() instead, which includes the junction prefix, falling back to the artifact ref for ArtifactElement targets (i.e. when an artifact is referred to by its ref rather than its element name) as before.

Also drops a dead obj.name = {ref: "No artifact cached"} assignment in artifact_list_contents() that was immediately followed by continue and never used.

Add tests covering artifact log and artifact list-contents with a cross-junction element alongside a same-named top-level element.

@c1assik
c1assik marked this pull request as ready for review August 15, 2026 09:08
Comment threadsrc/buildstream/_stream.py Outdated
continue

artifact_logs[obj.name] = obj._get_logs()
name = ref if isinstance(obj, ArtifactElement) else obj._get_full_name()

@nathanwilliams-ctnathanwilliams-ctAug 17, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps it would be better if ArtifactElement overrode the _get_full_name method or the __full_name variable, instead of having this awkward condition here?

Suggested change
name=refifisinstance(obj, ArtifactElement) elseobj._get_full_name()
name=obj._get_full_name()

In ArtifactElement

def_get_full_name(self)
returnself.get_artifact_name()

@c1assikc1assikAug 17, 2026

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a method _get_full_name() to ArtifactElement.

return self.get_artifact_name(), unconditionally fails with AssertionError: assert key is not None in get_artifact_name() so if the cache key isn't set yet, fall back to super()._get_full_name() (the base Plugin/Element name, which is always safe since it's precomputed earlier in Plugin.init). Once construction finishes and the key is set, it returns the full artifact ref as intended

@abderrahimabderrahimSep 2, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it makes more sense to set the name in ArtifactElement (you can set it before chaining up to the super class __init__() so that it gets picked up). I feel it would be more elegant than trying to override _get_full_name().

@c1assik
c1assikforce-pushed the fix/artifact_full_name branch from cdbdea6 to 30fd1a2CompareAugust 17, 2026 17:18
@nathanwilliams-ct

Copy link
Copy Markdown
Contributor

LGTM

`artifact_log()` and `artifact_list_contents()` were keying their
result dicts by `obj.name`, which is just the bare, project-relative
element name. For elements loaded across a junction, this drops the
owning junction prefix, so e.g. `bst artifact list-contents
element.bst nested.bst:element.bst` would only show one entry, since
both targets resolved to the same key.
Use `obj._get_full_name()` instead, which includes the junction
prefix, falling back to the artifact ref for `ArtifactElement`
targets (i.e. when an artifact is referred to by its ref rather than
its element name) as before.
Also drops a dead `obj.name = {ref: "No artifact cached"}` assignment
in `artifact_list_contents()` that was immediately followed by
`continue` and never used.
Add tests covering `artifact log` and `artifact list-contents` with a
cross-junction element alongside a same-named top-level element.
@c1assik
c1assikforce-pushed the fix/artifact_full_name branch from 30fd1a2 to ceb5115CompareAugust 25, 2026 19:11
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@c1assik@nathanwilliams-ct@abderrahim
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

_stream: use full element name in artifact log/list-contents - #2174

Open
c1assik wants to merge 1 commit into
apache:masterfrom
c1assik:fix/artifact_full_name
Open

_stream: use full element name in artifact log/list-contents#2174
c1assik wants to merge 1 commit into
apache:masterfrom
c1assik:fix/artifact_full_name

Conversation

@c1assik

Copy link
Copy Markdown

artifact_log() and artifact_list_contents() were keying their result dicts by obj.name, which is just the bare, project-relative element name. For elements loaded across a junction, this drops the owning junction prefix, so e.g. bst artifact list-contents element.bst nested.bst:element.bst would only show one entry, since both targets resolved to the same key.

Use obj._get_full_name() instead, which includes the junction prefix, falling back to the artifact ref for ArtifactElement targets (i.e. when an artifact is referred to by its ref rather than its element name) as before.

Also drops a dead obj.name = {ref: "No artifact cached"} assignment in artifact_list_contents() that was immediately followed by continue and never used.

Add tests covering artifact log and artifact list-contents with a cross-junction element alongside a same-named top-level element.

@c1assik
c1assik marked this pull request as ready for review August 15, 2026 09:08
Comment threadsrc/buildstream/_stream.py Outdated
continue

artifact_logs[obj.name] = obj._get_logs()
name = ref if isinstance(obj, ArtifactElement) else obj._get_full_name()

@nathanwilliams-ctnathanwilliams-ctAug 17, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps it would be better if ArtifactElement overrode the _get_full_name method or the __full_name variable, instead of having this awkward condition here?

Suggested change
name=refifisinstance(obj, ArtifactElement) elseobj._get_full_name()
name=obj._get_full_name()

In ArtifactElement

def_get_full_name(self)
returnself.get_artifact_name()

@c1assikc1assikAug 17, 2026

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a method _get_full_name() to ArtifactElement.

return self.get_artifact_name(), unconditionally fails with AssertionError: assert key is not None in get_artifact_name() so if the cache key isn't set yet, fall back to super()._get_full_name() (the base Plugin/Element name, which is always safe since it's precomputed earlier in Plugin.init). Once construction finishes and the key is set, it returns the full artifact ref as intended

@abderrahimabderrahimSep 2, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it makes more sense to set the name in ArtifactElement (you can set it before chaining up to the super class __init__() so that it gets picked up). I feel it would be more elegant than trying to override _get_full_name().

@c1assik
c1assikforce-pushed the fix/artifact_full_name branch from cdbdea6 to 30fd1a2CompareAugust 17, 2026 17:18
@nathanwilliams-ct

Copy link
Copy Markdown
Contributor

LGTM

`artifact_log()` and `artifact_list_contents()` were keying their
result dicts by `obj.name`, which is just the bare, project-relative
element name. For elements loaded across a junction, this drops the
owning junction prefix, so e.g. `bst artifact list-contents
element.bst nested.bst:element.bst` would only show one entry, since
both targets resolved to the same key.
Use `obj._get_full_name()` instead, which includes the junction
prefix, falling back to the artifact ref for `ArtifactElement`
targets (i.e. when an artifact is referred to by its ref rather than
its element name) as before.
Also drops a dead `obj.name = {ref: "No artifact cached"}` assignment
in `artifact_list_contents()` that was immediately followed by
`continue` and never used.
Add tests covering `artifact log` and `artifact list-contents` with a
cross-junction element alongside a same-named top-level element.
@c1assik
c1assikforce-pushed the fix/artifact_full_name branch from 30fd1a2 to ceb5115CompareAugust 25, 2026 19:11
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

_stream: use full element name in artifact log/list-contents - #2174

Open
c1assik wants to merge 1 commit into
apache:masterfrom
c1assik:fix/artifact_full_name
Open

_stream: use full element name in artifact log/list-contents#2174
c1assik wants to merge 1 commit into
apache:masterfrom
c1assik:fix/artifact_full_name

Conversation

@c1assik

Copy link
Copy Markdown

artifact_log() and artifact_list_contents() were keying their result dicts by obj.name, which is just the bare, project-relative element name. For elements loaded across a junction, this drops the owning junction prefix, so e.g. bst artifact list-contents element.bst nested.bst:element.bst would only show one entry, since both targets resolved to the same key.

Use obj._get_full_name() instead, which includes the junction prefix, falling back to the artifact ref for ArtifactElement targets (i.e. when an artifact is referred to by its ref rather than its element name) as before.

Also drops a dead obj.name = {ref: "No artifact cached"} assignment in artifact_list_contents() that was immediately followed by continue and never used.

Add tests covering artifact log and artifact list-contents with a cross-junction element alongside a same-named top-level element.

@c1assik
c1assik marked this pull request as ready for review August 15, 2026 09:08
Comment threadsrc/buildstream/_stream.py Outdated
continue

artifact_logs[obj.name] = obj._get_logs()
name = ref if isinstance(obj, ArtifactElement) else obj._get_full_name()

@nathanwilliams-ctnathanwilliams-ctAug 17, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps it would be better if ArtifactElement overrode the _get_full_name method or the __full_name variable, instead of having this awkward condition here?

Suggested change
name=refifisinstance(obj, ArtifactElement) elseobj._get_full_name()
name=obj._get_full_name()

In ArtifactElement

def_get_full_name(self)
returnself.get_artifact_name()

@c1assikc1assikAug 17, 2026

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a method _get_full_name() to ArtifactElement.

return self.get_artifact_name(), unconditionally fails with AssertionError: assert key is not None in get_artifact_name() so if the cache key isn't set yet, fall back to super()._get_full_name() (the base Plugin/Element name, which is always safe since it's precomputed earlier in Plugin.init). Once construction finishes and the key is set, it returns the full artifact ref as intended

@abderrahimabderrahimSep 2, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it makes more sense to set the name in ArtifactElement (you can set it before chaining up to the super class __init__() so that it gets picked up). I feel it would be more elegant than trying to override _get_full_name().

@c1assik
c1assikforce-pushed the fix/artifact_full_name branch from cdbdea6 to 30fd1a2CompareAugust 17, 2026 17:18
@nathanwilliams-ct

Copy link
Copy Markdown
Contributor

LGTM

`artifact_log()` and `artifact_list_contents()` were keying their
result dicts by `obj.name`, which is just the bare, project-relative
element name. For elements loaded across a junction, this drops the
owning junction prefix, so e.g. `bst artifact list-contents
element.bst nested.bst:element.bst` would only show one entry, since
both targets resolved to the same key.
Use `obj._get_full_name()` instead, which includes the junction
prefix, falling back to the artifact ref for `ArtifactElement`
targets (i.e. when an artifact is referred to by its ref rather than
its element name) as before.
Also drops a dead `obj.name = {ref: "No artifact cached"}` assignment
in `artifact_list_contents()` that was immediately followed by
`continue` and never used.
Add tests covering `artifact log` and `artifact list-contents` with a
cross-junction element alongside a same-named top-level element.
@c1assik
c1assikforce-pushed the fix/artifact_full_name branch from 30fd1a2 to ceb5115CompareAugust 25, 2026 19:11
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@c1assik@nathanwilliams-ct@abderrahim