Add bst graph command - #1949

Draft
ion232 wants to merge 4 commits into
apache:masterfrom
ion232:ion232/reimplement-bst-graph-into-buildstream
Draft

Add bst graph command#1949
ion232 wants to merge 4 commits into
apache:masterfrom
ion232:ion232/reimplement-bst-graph-into-buildstream

Conversation

@ion232

@ion232ion232 commented Aug 12, 2024

Copy link
Copy Markdown

Closes#1915

  • Adds a new command to bst called 'graph' which reimplements the same API and functionality as contrib/bst-graph.
  • The implementation details are within _stream.py as another function called 'graph'.
  • Removes contrib/bst-graph.

EDIT: I've added another commit that changes the functionality to makes two separate graphs for buildtime and runtime, as this is clearer imo.

@ion232
ion232 marked this pull request as draft August 13, 2024 06:43
@ion232ion232 changed the title WIP: Add bst graph commandAdd bst graph commandAug 13, 2024
Adds a new command to bst called 'graph' which reimplements the same API
and functionality as contrib/bst-graph. The implementation details are
within _stream.py as another function called 'graph'.
Part of apache#1915.
@ion232
ion232force-pushed the ion232/reimplement-bst-graph-into-buildstream branch from 24179c8 to 9faeca8CompareAugust 13, 2024 07:20
@ion232
ion232 marked this pull request as ready for review August 13, 2024 07:23
Arran Ireland added 2 commits August 13, 2024 10:04
It can already be difficult to tell what's going on in large graphs.
This commit helps make the graphs clearer and smaller.
However this is no longer the same functionality as in the original
contrib/bst-graph.
Part of apache#1915.
This is no longer needed when reimplemented into buildstream itself.
Part of apache#1915.
@ion232ion232 changed the title Add bst graph commandDraft: Add bst graph commandAug 20, 2024
@ion232
ion232 marked this pull request as draft August 20, 2024 12:39
@ion232ion232 changed the title Draft: Add bst graph commandAdd bst graph commandAug 20, 2024
@jjardon

Copy link
Copy Markdown
Contributor

@ion232 is there anything else pending to mark this a non-draft?

@gtristan

gtristan commented Sep 26, 2024

Copy link
Copy Markdown
Contributor

I'm not really in favor of having bst-graph at all.

I think we should either:

  • Enhance bst show with features like --depth or such, allowing some scripting to construct the graph and display it however it wants
  • Open up some very limited Stream / App APIs from the buildstream module and make a limited set of APIs public
    • Allowing at least to load the build graph once and have access to the Element and Source data model, eliminating the need to load the build graph multiple times (as would be the case with bst show scripting) and allowing users to do whatever introspective operations they might want

Either of these approaches don't add a first class graphing feature but allow users to do more powerful things without requiring special buildstream features to do so... specifically this should be interesting if we add APIs for Source objects to report information about their URLs etc, so that we can do SBoMs in a way that is stable and does not abuse internal APIs (like fdsdk's collect_manifest thing does).

EDIT: It looks like this script already gets the work done with a single bst show, so that has already been thought out pretty well.

I find the output to be particularly horrible to look at for sufficiently big graphs (I've finally looked at one today, after all these years), I suspect that whatever useful things one might want to achieve by looking at this, could be better achieved with some scripting (e.g. perhaps a combination of bst show commands with bst artifact list-contents could get you as far as finding out "Why does this file I don't want end up in my image ?" and this would be more reliable than looking at this huge graph IMHO).

Side note, the script does not work with junctions, it seems to be a simple quoting error that shouldn't be hard to fix..

That said I think we made the right choice keeping this in contrib/. This avoids scope creep and avoids the addition of dependencies which are unrelated to the core mission and APIs - separate projects can do nice things with our APIs and use more elaborate dependencies, and ask us to open up some APIs as needed.

@ion232

Copy link
Copy Markdown
Author

@ion232 is there anything else pending to mark this a non-draft?

Not really. I was possibly going add some other features but didn't get around to it. I was waiting for feedback.

@harrysarson

harrysarson commented Oct 24, 2024

Copy link
Copy Markdown
Contributor

Thanks for this script! I hit a small issue when using it on a complex buildstream project containing junctions. The generated graphviz ends up containing colons in the wrong place making it invalid. See small patch below that fixes the script base on a recommendation I found here https://graphviz.readthedocs.io/en/stable/manual.html#node-ports-compass

diff --git a/contrib/bst-graph b/contrib/bst-graph
index 3fe93e1ff..5c05c6b4b 100755
--- a/contrib/bst-graph+++ b/contrib/bst-graph@@ -29,6 +29,7 @@ installed.
import argparse
import subprocess
import re
+import urllib.parse
from graphviz import Digraph
from ruamel.yaml import YAML
@@ -55,6 +56,10 @@ def parse_args():
return parser.parse_args()
+def escape(s):+ return urllib.parse.quote_plus(s.encode())++
def parse_graph(lines):
'''Return nodes and edges of the parsed grpah.
@@ -80,12 +85,13 @@ def parse_graph(lines):
build_dep = parser.load(build_dep)
runtime_dep = parser.load(runtime_dep)
- nodes.add(name)- [build_deps.add((name, dep)) for dep in build_dep if dep]- [runtime_deps.add((name, dep)) for dep in runtime_dep if dep]+ safe_name = escape(name)- return nodes, build_deps, runtime_deps+ nodes.add((safe_name, name))+ [build_deps.add((safe_name, escape(dep))) for dep in build_dep if dep]+ [runtime_deps.add((safe_name, escape(dep))) for dep in runtime_dep if dep]+ return nodes, build_deps, runtime_deps
def generate_graph(nodes, build_deps, runtime_deps):
'''Generate graph from given nodes and edges.
@@ -99,8 +105,8 @@ def generate_graph(nodes, build_deps, runtime_deps):
A graphviz.Digraph object
'''
graph = Digraph()
- for node in nodes:- graph.node(node)+ for tag, name in nodes:+ graph.node(tag, label=name)
for source, target in build_deps:
graph.edge(source, target, label='build-dep')
for source, target in runtime_deps:

@abderrahim

Copy link
Copy Markdown
Contributor

@harrysarson This PR is about integrating the bst-graph script into buildstream proper. For fixes to the existing contrib/bst-graph script, please open a PR. Thanks.

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.

Re-implement contrib/bst-graph as part of BuildStream

5 participants

@ion232@jjardon@gtristan@harrysarson@abderrahim
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e 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

Add bst graph command - #1949

Draft
ion232 wants to merge 4 commits into
apache:masterfrom
ion232:ion232/reimplement-bst-graph-into-buildstream
Draft

Add bst graph command#1949
ion232 wants to merge 4 commits into
apache:masterfrom
ion232:ion232/reimplement-bst-graph-into-buildstream

Conversation

@ion232

@ion232ion232 commented Aug 12, 2024

Copy link
Copy Markdown

Closes#1915

  • Adds a new command to bst called 'graph' which reimplements the same API and functionality as contrib/bst-graph.
  • The implementation details are within _stream.py as another function called 'graph'.
  • Removes contrib/bst-graph.

EDIT: I've added another commit that changes the functionality to makes two separate graphs for buildtime and runtime, as this is clearer imo.

@ion232
ion232 marked this pull request as draft August 13, 2024 06:43
@ion232ion232 changed the title WIP: Add bst graph commandAdd bst graph commandAug 13, 2024
Adds a new command to bst called 'graph' which reimplements the same API
and functionality as contrib/bst-graph. The implementation details are
within _stream.py as another function called 'graph'.
Part of apache#1915.
@ion232
ion232force-pushed the ion232/reimplement-bst-graph-into-buildstream branch from 24179c8 to 9faeca8CompareAugust 13, 2024 07:20
@ion232
ion232 marked this pull request as ready for review August 13, 2024 07:23
Arran Ireland added 2 commits August 13, 2024 10:04
It can already be difficult to tell what's going on in large graphs.
This commit helps make the graphs clearer and smaller.
However this is no longer the same functionality as in the original
contrib/bst-graph.
Part of apache#1915.
This is no longer needed when reimplemented into buildstream itself.
Part of apache#1915.
@ion232ion232 changed the title Add bst graph commandDraft: Add bst graph commandAug 20, 2024
@ion232
ion232 marked this pull request as draft August 20, 2024 12:39
@ion232ion232 changed the title Draft: Add bst graph commandAdd bst graph commandAug 20, 2024
@jjardon

Copy link
Copy Markdown
Contributor

@ion232 is there anything else pending to mark this a non-draft?

@gtristan

gtristan commented Sep 26, 2024

Copy link
Copy Markdown
Contributor

I'm not really in favor of having bst-graph at all.

I think we should either:

  • Enhance bst show with features like --depth or such, allowing some scripting to construct the graph and display it however it wants
  • Open up some very limited Stream / App APIs from the buildstream module and make a limited set of APIs public
    • Allowing at least to load the build graph once and have access to the Element and Source data model, eliminating the need to load the build graph multiple times (as would be the case with bst show scripting) and allowing users to do whatever introspective operations they might want

Either of these approaches don't add a first class graphing feature but allow users to do more powerful things without requiring special buildstream features to do so... specifically this should be interesting if we add APIs for Source objects to report information about their URLs etc, so that we can do SBoMs in a way that is stable and does not abuse internal APIs (like fdsdk's collect_manifest thing does).

EDIT: It looks like this script already gets the work done with a single bst show, so that has already been thought out pretty well.

I find the output to be particularly horrible to look at for sufficiently big graphs (I've finally looked at one today, after all these years), I suspect that whatever useful things one might want to achieve by looking at this, could be better achieved with some scripting (e.g. perhaps a combination of bst show commands with bst artifact list-contents could get you as far as finding out "Why does this file I don't want end up in my image ?" and this would be more reliable than looking at this huge graph IMHO).

Side note, the script does not work with junctions, it seems to be a simple quoting error that shouldn't be hard to fix..

That said I think we made the right choice keeping this in contrib/. This avoids scope creep and avoids the addition of dependencies which are unrelated to the core mission and APIs - separate projects can do nice things with our APIs and use more elaborate dependencies, and ask us to open up some APIs as needed.

@ion232

Copy link
Copy Markdown
Author

@ion232 is there anything else pending to mark this a non-draft?

Not really. I was possibly going add some other features but didn't get around to it. I was waiting for feedback.

@harrysarson

harrysarson commented Oct 24, 2024

Copy link
Copy Markdown
Contributor

Thanks for this script! I hit a small issue when using it on a complex buildstream project containing junctions. The generated graphviz ends up containing colons in the wrong place making it invalid. See small patch below that fixes the script base on a recommendation I found here https://graphviz.readthedocs.io/en/stable/manual.html#node-ports-compass

diff --git a/contrib/bst-graph b/contrib/bst-graph
index 3fe93e1ff..5c05c6b4b 100755
--- a/contrib/bst-graph+++ b/contrib/bst-graph@@ -29,6 +29,7 @@ installed.
import argparse
import subprocess
import re
+import urllib.parse
from graphviz import Digraph
from ruamel.yaml import YAML
@@ -55,6 +56,10 @@ def parse_args():
return parser.parse_args()
+def escape(s):+ return urllib.parse.quote_plus(s.encode())++
def parse_graph(lines):
'''Return nodes and edges of the parsed grpah.
@@ -80,12 +85,13 @@ def parse_graph(lines):
build_dep = parser.load(build_dep)
runtime_dep = parser.load(runtime_dep)
- nodes.add(name)- [build_deps.add((name, dep)) for dep in build_dep if dep]- [runtime_deps.add((name, dep)) for dep in runtime_dep if dep]+ safe_name = escape(name)- return nodes, build_deps, runtime_deps+ nodes.add((safe_name, name))+ [build_deps.add((safe_name, escape(dep))) for dep in build_dep if dep]+ [runtime_deps.add((safe_name, escape(dep))) for dep in runtime_dep if dep]+ return nodes, build_deps, runtime_deps
def generate_graph(nodes, build_deps, runtime_deps):
'''Generate graph from given nodes and edges.
@@ -99,8 +105,8 @@ def generate_graph(nodes, build_deps, runtime_deps):
A graphviz.Digraph object
'''
graph = Digraph()
- for node in nodes:- graph.node(node)+ for tag, name in nodes:+ graph.node(tag, label=name)
for source, target in build_deps:
graph.edge(source, target, label='build-dep')
for source, target in runtime_deps:

@abderrahim

Copy link
Copy Markdown
Contributor

@harrysarson This PR is about integrating the bst-graph script into buildstream proper. For fixes to the existing contrib/bst-graph script, please open a PR. Thanks.

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.

Re-implement contrib/bst-graph as part of BuildStream

5 participants

@ion232@jjardon@gtristan@harrysarson@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

Add bst graph command - #1949

Draft
ion232 wants to merge 4 commits into
apache:masterfrom
ion232:ion232/reimplement-bst-graph-into-buildstream
Draft

Add bst graph command#1949
ion232 wants to merge 4 commits into
apache:masterfrom
ion232:ion232/reimplement-bst-graph-into-buildstream

Conversation

@ion232

@ion232ion232 commented Aug 12, 2024

Copy link
Copy Markdown

Closes#1915

  • Adds a new command to bst called 'graph' which reimplements the same API and functionality as contrib/bst-graph.
  • The implementation details are within _stream.py as another function called 'graph'.
  • Removes contrib/bst-graph.

EDIT: I've added another commit that changes the functionality to makes two separate graphs for buildtime and runtime, as this is clearer imo.

@ion232
ion232 marked this pull request as draft August 13, 2024 06:43
@ion232ion232 changed the title WIP: Add bst graph commandAdd bst graph commandAug 13, 2024
Adds a new command to bst called 'graph' which reimplements the same API
and functionality as contrib/bst-graph. The implementation details are
within _stream.py as another function called 'graph'.
Part of apache#1915.
@ion232
ion232force-pushed the ion232/reimplement-bst-graph-into-buildstream branch from 24179c8 to 9faeca8CompareAugust 13, 2024 07:20
@ion232
ion232 marked this pull request as ready for review August 13, 2024 07:23
Arran Ireland added 2 commits August 13, 2024 10:04
It can already be difficult to tell what's going on in large graphs.
This commit helps make the graphs clearer and smaller.
However this is no longer the same functionality as in the original
contrib/bst-graph.
Part of apache#1915.
This is no longer needed when reimplemented into buildstream itself.
Part of apache#1915.
@ion232ion232 changed the title Add bst graph commandDraft: Add bst graph commandAug 20, 2024
@ion232
ion232 marked this pull request as draft August 20, 2024 12:39
@ion232ion232 changed the title Draft: Add bst graph commandAdd bst graph commandAug 20, 2024
@jjardon

Copy link
Copy Markdown
Contributor

@ion232 is there anything else pending to mark this a non-draft?

@gtristan

gtristan commented Sep 26, 2024

Copy link
Copy Markdown
Contributor

I'm not really in favor of having bst-graph at all.

I think we should either:

  • Enhance bst show with features like --depth or such, allowing some scripting to construct the graph and display it however it wants
  • Open up some very limited Stream / App APIs from the buildstream module and make a limited set of APIs public
    • Allowing at least to load the build graph once and have access to the Element and Source data model, eliminating the need to load the build graph multiple times (as would be the case with bst show scripting) and allowing users to do whatever introspective operations they might want

Either of these approaches don't add a first class graphing feature but allow users to do more powerful things without requiring special buildstream features to do so... specifically this should be interesting if we add APIs for Source objects to report information about their URLs etc, so that we can do SBoMs in a way that is stable and does not abuse internal APIs (like fdsdk's collect_manifest thing does).

EDIT: It looks like this script already gets the work done with a single bst show, so that has already been thought out pretty well.

I find the output to be particularly horrible to look at for sufficiently big graphs (I've finally looked at one today, after all these years), I suspect that whatever useful things one might want to achieve by looking at this, could be better achieved with some scripting (e.g. perhaps a combination of bst show commands with bst artifact list-contents could get you as far as finding out "Why does this file I don't want end up in my image ?" and this would be more reliable than looking at this huge graph IMHO).

Side note, the script does not work with junctions, it seems to be a simple quoting error that shouldn't be hard to fix..

That said I think we made the right choice keeping this in contrib/. This avoids scope creep and avoids the addition of dependencies which are unrelated to the core mission and APIs - separate projects can do nice things with our APIs and use more elaborate dependencies, and ask us to open up some APIs as needed.

@ion232

Copy link
Copy Markdown
Author

@ion232 is there anything else pending to mark this a non-draft?

Not really. I was possibly going add some other features but didn't get around to it. I was waiting for feedback.

@harrysarson

harrysarson commented Oct 24, 2024

Copy link
Copy Markdown
Contributor

Thanks for this script! I hit a small issue when using it on a complex buildstream project containing junctions. The generated graphviz ends up containing colons in the wrong place making it invalid. See small patch below that fixes the script base on a recommendation I found here https://graphviz.readthedocs.io/en/stable/manual.html#node-ports-compass

diff --git a/contrib/bst-graph b/contrib/bst-graph
index 3fe93e1ff..5c05c6b4b 100755
--- a/contrib/bst-graph+++ b/contrib/bst-graph@@ -29,6 +29,7 @@ installed.
import argparse
import subprocess
import re
+import urllib.parse
from graphviz import Digraph
from ruamel.yaml import YAML
@@ -55,6 +56,10 @@ def parse_args():
return parser.parse_args()
+def escape(s):+ return urllib.parse.quote_plus(s.encode())++
def parse_graph(lines):
'''Return nodes and edges of the parsed grpah.
@@ -80,12 +85,13 @@ def parse_graph(lines):
build_dep = parser.load(build_dep)
runtime_dep = parser.load(runtime_dep)
- nodes.add(name)- [build_deps.add((name, dep)) for dep in build_dep if dep]- [runtime_deps.add((name, dep)) for dep in runtime_dep if dep]+ safe_name = escape(name)- return nodes, build_deps, runtime_deps+ nodes.add((safe_name, name))+ [build_deps.add((safe_name, escape(dep))) for dep in build_dep if dep]+ [runtime_deps.add((safe_name, escape(dep))) for dep in runtime_dep if dep]+ return nodes, build_deps, runtime_deps
def generate_graph(nodes, build_deps, runtime_deps):
'''Generate graph from given nodes and edges.
@@ -99,8 +105,8 @@ def generate_graph(nodes, build_deps, runtime_deps):
A graphviz.Digraph object
'''
graph = Digraph()
- for node in nodes:- graph.node(node)+ for tag, name in nodes:+ graph.node(tag, label=name)
for source, target in build_deps:
graph.edge(source, target, label='build-dep')
for source, target in runtime_deps:

@abderrahim

Copy link
Copy Markdown
Contributor

@harrysarson This PR is about integrating the bst-graph script into buildstream proper. For fixes to the existing contrib/bst-graph script, please open a PR. Thanks.

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.

Re-implement contrib/bst-graph as part of BuildStream

5 participants

@ion232@jjardon@gtristan@harrysarson@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 \u003e 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

Add bst graph command - #1949

Draft
ion232 wants to merge 4 commits into
apache:masterfrom
ion232:ion232/reimplement-bst-graph-into-buildstream
Draft

Add bst graph command#1949
ion232 wants to merge 4 commits into
apache:masterfrom
ion232:ion232/reimplement-bst-graph-into-buildstream

Conversation

@ion232

@ion232ion232 commented Aug 12, 2024

Copy link
Copy Markdown

Closes#1915

  • Adds a new command to bst called 'graph' which reimplements the same API and functionality as contrib/bst-graph.
  • The implementation details are within _stream.py as another function called 'graph'.
  • Removes contrib/bst-graph.

EDIT: I've added another commit that changes the functionality to makes two separate graphs for buildtime and runtime, as this is clearer imo.

@ion232
ion232 marked this pull request as draft August 13, 2024 06:43
@ion232ion232 changed the title WIP: Add bst graph commandAdd bst graph commandAug 13, 2024
Adds a new command to bst called 'graph' which reimplements the same API
and functionality as contrib/bst-graph. The implementation details are
within _stream.py as another function called 'graph'.
Part of apache#1915.
@ion232
ion232force-pushed the ion232/reimplement-bst-graph-into-buildstream branch from 24179c8 to 9faeca8CompareAugust 13, 2024 07:20
@ion232
ion232 marked this pull request as ready for review August 13, 2024 07:23
Arran Ireland added 2 commits August 13, 2024 10:04
It can already be difficult to tell what's going on in large graphs.
This commit helps make the graphs clearer and smaller.
However this is no longer the same functionality as in the original
contrib/bst-graph.
Part of apache#1915.
This is no longer needed when reimplemented into buildstream itself.
Part of apache#1915.
@ion232ion232 changed the title Add bst graph commandDraft: Add bst graph commandAug 20, 2024
@ion232
ion232 marked this pull request as draft August 20, 2024 12:39
@ion232ion232 changed the title Draft: Add bst graph commandAdd bst graph commandAug 20, 2024
@jjardon

Copy link
Copy Markdown
Contributor

@ion232 is there anything else pending to mark this a non-draft?

@gtristan

gtristan commented Sep 26, 2024

Copy link
Copy Markdown
Contributor

I'm not really in favor of having bst-graph at all.

I think we should either:

  • Enhance bst show with features like --depth or such, allowing some scripting to construct the graph and display it however it wants
  • Open up some very limited Stream / App APIs from the buildstream module and make a limited set of APIs public
    • Allowing at least to load the build graph once and have access to the Element and Source data model, eliminating the need to load the build graph multiple times (as would be the case with bst show scripting) and allowing users to do whatever introspective operations they might want

Either of these approaches don't add a first class graphing feature but allow users to do more powerful things without requiring special buildstream features to do so... specifically this should be interesting if we add APIs for Source objects to report information about their URLs etc, so that we can do SBoMs in a way that is stable and does not abuse internal APIs (like fdsdk's collect_manifest thing does).

EDIT: It looks like this script already gets the work done with a single bst show, so that has already been thought out pretty well.

I find the output to be particularly horrible to look at for sufficiently big graphs (I've finally looked at one today, after all these years), I suspect that whatever useful things one might want to achieve by looking at this, could be better achieved with some scripting (e.g. perhaps a combination of bst show commands with bst artifact list-contents could get you as far as finding out "Why does this file I don't want end up in my image ?" and this would be more reliable than looking at this huge graph IMHO).

Side note, the script does not work with junctions, it seems to be a simple quoting error that shouldn't be hard to fix..

That said I think we made the right choice keeping this in contrib/. This avoids scope creep and avoids the addition of dependencies which are unrelated to the core mission and APIs - separate projects can do nice things with our APIs and use more elaborate dependencies, and ask us to open up some APIs as needed.

@ion232

Copy link
Copy Markdown
Author

@ion232 is there anything else pending to mark this a non-draft?

Not really. I was possibly going add some other features but didn't get around to it. I was waiting for feedback.

@harrysarson

harrysarson commented Oct 24, 2024

Copy link
Copy Markdown
Contributor

Thanks for this script! I hit a small issue when using it on a complex buildstream project containing junctions. The generated graphviz ends up containing colons in the wrong place making it invalid. See small patch below that fixes the script base on a recommendation I found here https://graphviz.readthedocs.io/en/stable/manual.html#node-ports-compass

diff --git a/contrib/bst-graph b/contrib/bst-graph
index 3fe93e1ff..5c05c6b4b 100755
--- a/contrib/bst-graph+++ b/contrib/bst-graph@@ -29,6 +29,7 @@ installed.
import argparse
import subprocess
import re
+import urllib.parse
from graphviz import Digraph
from ruamel.yaml import YAML
@@ -55,6 +56,10 @@ def parse_args():
return parser.parse_args()
+def escape(s):+ return urllib.parse.quote_plus(s.encode())++
def parse_graph(lines):
'''Return nodes and edges of the parsed grpah.
@@ -80,12 +85,13 @@ def parse_graph(lines):
build_dep = parser.load(build_dep)
runtime_dep = parser.load(runtime_dep)
- nodes.add(name)- [build_deps.add((name, dep)) for dep in build_dep if dep]- [runtime_deps.add((name, dep)) for dep in runtime_dep if dep]+ safe_name = escape(name)- return nodes, build_deps, runtime_deps+ nodes.add((safe_name, name))+ [build_deps.add((safe_name, escape(dep))) for dep in build_dep if dep]+ [runtime_deps.add((safe_name, escape(dep))) for dep in runtime_dep if dep]+ return nodes, build_deps, runtime_deps
def generate_graph(nodes, build_deps, runtime_deps):
'''Generate graph from given nodes and edges.
@@ -99,8 +105,8 @@ def generate_graph(nodes, build_deps, runtime_deps):
A graphviz.Digraph object
'''
graph = Digraph()
- for node in nodes:- graph.node(node)+ for tag, name in nodes:+ graph.node(tag, label=name)
for source, target in build_deps:
graph.edge(source, target, label='build-dep')
for source, target in runtime_deps:

@abderrahim

Copy link
Copy Markdown
Contributor

@harrysarson This PR is about integrating the bst-graph script into buildstream proper. For fixes to the existing contrib/bst-graph script, please open a PR. Thanks.

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.

Re-implement contrib/bst-graph as part of BuildStream

5 participants

@ion232@jjardon@gtristan@harrysarson@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

Add bst graph command - #1949

Draft
ion232 wants to merge 4 commits into
apache:masterfrom
ion232:ion232/reimplement-bst-graph-into-buildstream
Draft

Add bst graph command#1949
ion232 wants to merge 4 commits into
apache:masterfrom
ion232:ion232/reimplement-bst-graph-into-buildstream

Conversation

@ion232

@ion232ion232 commented Aug 12, 2024

Copy link
Copy Markdown

Closes#1915

  • Adds a new command to bst called 'graph' which reimplements the same API and functionality as contrib/bst-graph.
  • The implementation details are within _stream.py as another function called 'graph'.
  • Removes contrib/bst-graph.

EDIT: I've added another commit that changes the functionality to makes two separate graphs for buildtime and runtime, as this is clearer imo.

@ion232
ion232 marked this pull request as draft August 13, 2024 06:43
@ion232ion232 changed the title WIP: Add bst graph commandAdd bst graph commandAug 13, 2024
Adds a new command to bst called 'graph' which reimplements the same API
and functionality as contrib/bst-graph. The implementation details are
within _stream.py as another function called 'graph'.
Part of apache#1915.
@ion232
ion232force-pushed the ion232/reimplement-bst-graph-into-buildstream branch from 24179c8 to 9faeca8CompareAugust 13, 2024 07:20
@ion232
ion232 marked this pull request as ready for review August 13, 2024 07:23
Arran Ireland added 2 commits August 13, 2024 10:04
It can already be difficult to tell what's going on in large graphs.
This commit helps make the graphs clearer and smaller.
However this is no longer the same functionality as in the original
contrib/bst-graph.
Part of apache#1915.
This is no longer needed when reimplemented into buildstream itself.
Part of apache#1915.
@ion232ion232 changed the title Add bst graph commandDraft: Add bst graph commandAug 20, 2024
@ion232
ion232 marked this pull request as draft August 20, 2024 12:39
@ion232ion232 changed the title Draft: Add bst graph commandAdd bst graph commandAug 20, 2024
@jjardon

Copy link
Copy Markdown
Contributor

@ion232 is there anything else pending to mark this a non-draft?

@gtristan

gtristan commented Sep 26, 2024

Copy link
Copy Markdown
Contributor

I'm not really in favor of having bst-graph at all.

I think we should either:

  • Enhance bst show with features like --depth or such, allowing some scripting to construct the graph and display it however it wants
  • Open up some very limited Stream / App APIs from the buildstream module and make a limited set of APIs public
    • Allowing at least to load the build graph once and have access to the Element and Source data model, eliminating the need to load the build graph multiple times (as would be the case with bst show scripting) and allowing users to do whatever introspective operations they might want

Either of these approaches don't add a first class graphing feature but allow users to do more powerful things without requiring special buildstream features to do so... specifically this should be interesting if we add APIs for Source objects to report information about their URLs etc, so that we can do SBoMs in a way that is stable and does not abuse internal APIs (like fdsdk's collect_manifest thing does).

EDIT: It looks like this script already gets the work done with a single bst show, so that has already been thought out pretty well.

I find the output to be particularly horrible to look at for sufficiently big graphs (I've finally looked at one today, after all these years), I suspect that whatever useful things one might want to achieve by looking at this, could be better achieved with some scripting (e.g. perhaps a combination of bst show commands with bst artifact list-contents could get you as far as finding out "Why does this file I don't want end up in my image ?" and this would be more reliable than looking at this huge graph IMHO).

Side note, the script does not work with junctions, it seems to be a simple quoting error that shouldn't be hard to fix..

That said I think we made the right choice keeping this in contrib/. This avoids scope creep and avoids the addition of dependencies which are unrelated to the core mission and APIs - separate projects can do nice things with our APIs and use more elaborate dependencies, and ask us to open up some APIs as needed.

@ion232

Copy link
Copy Markdown
Author

@ion232 is there anything else pending to mark this a non-draft?

Not really. I was possibly going add some other features but didn't get around to it. I was waiting for feedback.

@harrysarson

harrysarson commented Oct 24, 2024

Copy link
Copy Markdown
Contributor

Thanks for this script! I hit a small issue when using it on a complex buildstream project containing junctions. The generated graphviz ends up containing colons in the wrong place making it invalid. See small patch below that fixes the script base on a recommendation I found here https://graphviz.readthedocs.io/en/stable/manual.html#node-ports-compass

diff --git a/contrib/bst-graph b/contrib/bst-graph
index 3fe93e1ff..5c05c6b4b 100755
--- a/contrib/bst-graph+++ b/contrib/bst-graph@@ -29,6 +29,7 @@ installed.
import argparse
import subprocess
import re
+import urllib.parse
from graphviz import Digraph
from ruamel.yaml import YAML
@@ -55,6 +56,10 @@ def parse_args():
return parser.parse_args()
+def escape(s):+ return urllib.parse.quote_plus(s.encode())++
def parse_graph(lines):
'''Return nodes and edges of the parsed grpah.
@@ -80,12 +85,13 @@ def parse_graph(lines):
build_dep = parser.load(build_dep)
runtime_dep = parser.load(runtime_dep)
- nodes.add(name)- [build_deps.add((name, dep)) for dep in build_dep if dep]- [runtime_deps.add((name, dep)) for dep in runtime_dep if dep]+ safe_name = escape(name)- return nodes, build_deps, runtime_deps+ nodes.add((safe_name, name))+ [build_deps.add((safe_name, escape(dep))) for dep in build_dep if dep]+ [runtime_deps.add((safe_name, escape(dep))) for dep in runtime_dep if dep]+ return nodes, build_deps, runtime_deps
def generate_graph(nodes, build_deps, runtime_deps):
'''Generate graph from given nodes and edges.
@@ -99,8 +105,8 @@ def generate_graph(nodes, build_deps, runtime_deps):
A graphviz.Digraph object
'''
graph = Digraph()
- for node in nodes:- graph.node(node)+ for tag, name in nodes:+ graph.node(tag, label=name)
for source, target in build_deps:
graph.edge(source, target, label='build-dep')
for source, target in runtime_deps:

@abderrahim

Copy link
Copy Markdown
Contributor

@harrysarson This PR is about integrating the bst-graph script into buildstream proper. For fixes to the existing contrib/bst-graph script, please open a PR. Thanks.

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.

Re-implement contrib/bst-graph as part of BuildStream

5 participants

@ion232@jjardon@gtristan@harrysarson@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

Add bst graph command - #1949

Draft
ion232 wants to merge 4 commits into
apache:masterfrom
ion232:ion232/reimplement-bst-graph-into-buildstream
Draft

Add bst graph command#1949
ion232 wants to merge 4 commits into
apache:masterfrom
ion232:ion232/reimplement-bst-graph-into-buildstream

Conversation

@ion232

@ion232ion232 commented Aug 12, 2024

Copy link
Copy Markdown

Closes#1915

  • Adds a new command to bst called 'graph' which reimplements the same API and functionality as contrib/bst-graph.
  • The implementation details are within _stream.py as another function called 'graph'.
  • Removes contrib/bst-graph.

EDIT: I've added another commit that changes the functionality to makes two separate graphs for buildtime and runtime, as this is clearer imo.

@ion232
ion232 marked this pull request as draft August 13, 2024 06:43
@ion232ion232 changed the title WIP: Add bst graph commandAdd bst graph commandAug 13, 2024
Adds a new command to bst called 'graph' which reimplements the same API
and functionality as contrib/bst-graph. The implementation details are
within _stream.py as another function called 'graph'.
Part of apache#1915.
@ion232
ion232force-pushed the ion232/reimplement-bst-graph-into-buildstream branch from 24179c8 to 9faeca8CompareAugust 13, 2024 07:20
@ion232
ion232 marked this pull request as ready for review August 13, 2024 07:23
Arran Ireland added 2 commits August 13, 2024 10:04
It can already be difficult to tell what's going on in large graphs.
This commit helps make the graphs clearer and smaller.
However this is no longer the same functionality as in the original
contrib/bst-graph.
Part of apache#1915.
This is no longer needed when reimplemented into buildstream itself.
Part of apache#1915.
@ion232ion232 changed the title Add bst graph commandDraft: Add bst graph commandAug 20, 2024
@ion232
ion232 marked this pull request as draft August 20, 2024 12:39
@ion232ion232 changed the title Draft: Add bst graph commandAdd bst graph commandAug 20, 2024
@jjardon

Copy link
Copy Markdown
Contributor

@ion232 is there anything else pending to mark this a non-draft?

@gtristan

gtristan commented Sep 26, 2024

Copy link
Copy Markdown
Contributor

I'm not really in favor of having bst-graph at all.

I think we should either:

  • Enhance bst show with features like --depth or such, allowing some scripting to construct the graph and display it however it wants
  • Open up some very limited Stream / App APIs from the buildstream module and make a limited set of APIs public
    • Allowing at least to load the build graph once and have access to the Element and Source data model, eliminating the need to load the build graph multiple times (as would be the case with bst show scripting) and allowing users to do whatever introspective operations they might want

Either of these approaches don't add a first class graphing feature but allow users to do more powerful things without requiring special buildstream features to do so... specifically this should be interesting if we add APIs for Source objects to report information about their URLs etc, so that we can do SBoMs in a way that is stable and does not abuse internal APIs (like fdsdk's collect_manifest thing does).

EDIT: It looks like this script already gets the work done with a single bst show, so that has already been thought out pretty well.

I find the output to be particularly horrible to look at for sufficiently big graphs (I've finally looked at one today, after all these years), I suspect that whatever useful things one might want to achieve by looking at this, could be better achieved with some scripting (e.g. perhaps a combination of bst show commands with bst artifact list-contents could get you as far as finding out "Why does this file I don't want end up in my image ?" and this would be more reliable than looking at this huge graph IMHO).

Side note, the script does not work with junctions, it seems to be a simple quoting error that shouldn't be hard to fix..

That said I think we made the right choice keeping this in contrib/. This avoids scope creep and avoids the addition of dependencies which are unrelated to the core mission and APIs - separate projects can do nice things with our APIs and use more elaborate dependencies, and ask us to open up some APIs as needed.

@ion232

Copy link
Copy Markdown
Author

@ion232 is there anything else pending to mark this a non-draft?

Not really. I was possibly going add some other features but didn't get around to it. I was waiting for feedback.

@harrysarson

harrysarson commented Oct 24, 2024

Copy link
Copy Markdown
Contributor

Thanks for this script! I hit a small issue when using it on a complex buildstream project containing junctions. The generated graphviz ends up containing colons in the wrong place making it invalid. See small patch below that fixes the script base on a recommendation I found here https://graphviz.readthedocs.io/en/stable/manual.html#node-ports-compass

diff --git a/contrib/bst-graph b/contrib/bst-graph
index 3fe93e1ff..5c05c6b4b 100755
--- a/contrib/bst-graph+++ b/contrib/bst-graph@@ -29,6 +29,7 @@ installed.
import argparse
import subprocess
import re
+import urllib.parse
from graphviz import Digraph
from ruamel.yaml import YAML
@@ -55,6 +56,10 @@ def parse_args():
return parser.parse_args()
+def escape(s):+ return urllib.parse.quote_plus(s.encode())++
def parse_graph(lines):
'''Return nodes and edges of the parsed grpah.
@@ -80,12 +85,13 @@ def parse_graph(lines):
build_dep = parser.load(build_dep)
runtime_dep = parser.load(runtime_dep)
- nodes.add(name)- [build_deps.add((name, dep)) for dep in build_dep if dep]- [runtime_deps.add((name, dep)) for dep in runtime_dep if dep]+ safe_name = escape(name)- return nodes, build_deps, runtime_deps+ nodes.add((safe_name, name))+ [build_deps.add((safe_name, escape(dep))) for dep in build_dep if dep]+ [runtime_deps.add((safe_name, escape(dep))) for dep in runtime_dep if dep]+ return nodes, build_deps, runtime_deps
def generate_graph(nodes, build_deps, runtime_deps):
'''Generate graph from given nodes and edges.
@@ -99,8 +105,8 @@ def generate_graph(nodes, build_deps, runtime_deps):
A graphviz.Digraph object
'''
graph = Digraph()
- for node in nodes:- graph.node(node)+ for tag, name in nodes:+ graph.node(tag, label=name)
for source, target in build_deps:
graph.edge(source, target, label='build-dep')
for source, target in runtime_deps:

@abderrahim

Copy link
Copy Markdown
Contributor

@harrysarson This PR is about integrating the bst-graph script into buildstream proper. For fixes to the existing contrib/bst-graph script, please open a PR. Thanks.

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.

Re-implement contrib/bst-graph as part of BuildStream

5 participants

@ion232@jjardon@gtristan@harrysarson@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

Add bst graph command - #1949

Draft
ion232 wants to merge 4 commits into
apache:masterfrom
ion232:ion232/reimplement-bst-graph-into-buildstream
Draft

Add bst graph command#1949
ion232 wants to merge 4 commits into
apache:masterfrom
ion232:ion232/reimplement-bst-graph-into-buildstream

Conversation

@ion232

@ion232ion232 commented Aug 12, 2024

Copy link
Copy Markdown

Closes#1915

  • Adds a new command to bst called 'graph' which reimplements the same API and functionality as contrib/bst-graph.
  • The implementation details are within _stream.py as another function called 'graph'.
  • Removes contrib/bst-graph.

EDIT: I've added another commit that changes the functionality to makes two separate graphs for buildtime and runtime, as this is clearer imo.

@ion232
ion232 marked this pull request as draft August 13, 2024 06:43
@ion232ion232 changed the title WIP: Add bst graph commandAdd bst graph commandAug 13, 2024
Adds a new command to bst called 'graph' which reimplements the same API
and functionality as contrib/bst-graph. The implementation details are
within _stream.py as another function called 'graph'.
Part of apache#1915.
@ion232
ion232force-pushed the ion232/reimplement-bst-graph-into-buildstream branch from 24179c8 to 9faeca8CompareAugust 13, 2024 07:20
@ion232
ion232 marked this pull request as ready for review August 13, 2024 07:23
Arran Ireland added 2 commits August 13, 2024 10:04
It can already be difficult to tell what's going on in large graphs.
This commit helps make the graphs clearer and smaller.
However this is no longer the same functionality as in the original
contrib/bst-graph.
Part of apache#1915.
This is no longer needed when reimplemented into buildstream itself.
Part of apache#1915.
@ion232ion232 changed the title Add bst graph commandDraft: Add bst graph commandAug 20, 2024
@ion232
ion232 marked this pull request as draft August 20, 2024 12:39
@ion232ion232 changed the title Draft: Add bst graph commandAdd bst graph commandAug 20, 2024
@jjardon

Copy link
Copy Markdown
Contributor

@ion232 is there anything else pending to mark this a non-draft?

@gtristan

gtristan commented Sep 26, 2024

Copy link
Copy Markdown
Contributor

I'm not really in favor of having bst-graph at all.

I think we should either:

  • Enhance bst show with features like --depth or such, allowing some scripting to construct the graph and display it however it wants
  • Open up some very limited Stream / App APIs from the buildstream module and make a limited set of APIs public
    • Allowing at least to load the build graph once and have access to the Element and Source data model, eliminating the need to load the build graph multiple times (as would be the case with bst show scripting) and allowing users to do whatever introspective operations they might want

Either of these approaches don't add a first class graphing feature but allow users to do more powerful things without requiring special buildstream features to do so... specifically this should be interesting if we add APIs for Source objects to report information about their URLs etc, so that we can do SBoMs in a way that is stable and does not abuse internal APIs (like fdsdk's collect_manifest thing does).

EDIT: It looks like this script already gets the work done with a single bst show, so that has already been thought out pretty well.

I find the output to be particularly horrible to look at for sufficiently big graphs (I've finally looked at one today, after all these years), I suspect that whatever useful things one might want to achieve by looking at this, could be better achieved with some scripting (e.g. perhaps a combination of bst show commands with bst artifact list-contents could get you as far as finding out "Why does this file I don't want end up in my image ?" and this would be more reliable than looking at this huge graph IMHO).

Side note, the script does not work with junctions, it seems to be a simple quoting error that shouldn't be hard to fix..

That said I think we made the right choice keeping this in contrib/. This avoids scope creep and avoids the addition of dependencies which are unrelated to the core mission and APIs - separate projects can do nice things with our APIs and use more elaborate dependencies, and ask us to open up some APIs as needed.

@ion232

Copy link
Copy Markdown
Author

@ion232 is there anything else pending to mark this a non-draft?

Not really. I was possibly going add some other features but didn't get around to it. I was waiting for feedback.

@harrysarson

harrysarson commented Oct 24, 2024

Copy link
Copy Markdown
Contributor

Thanks for this script! I hit a small issue when using it on a complex buildstream project containing junctions. The generated graphviz ends up containing colons in the wrong place making it invalid. See small patch below that fixes the script base on a recommendation I found here https://graphviz.readthedocs.io/en/stable/manual.html#node-ports-compass

diff --git a/contrib/bst-graph b/contrib/bst-graph
index 3fe93e1ff..5c05c6b4b 100755
--- a/contrib/bst-graph+++ b/contrib/bst-graph@@ -29,6 +29,7 @@ installed.
import argparse
import subprocess
import re
+import urllib.parse
from graphviz import Digraph
from ruamel.yaml import YAML
@@ -55,6 +56,10 @@ def parse_args():
return parser.parse_args()
+def escape(s):+ return urllib.parse.quote_plus(s.encode())++
def parse_graph(lines):
'''Return nodes and edges of the parsed grpah.
@@ -80,12 +85,13 @@ def parse_graph(lines):
build_dep = parser.load(build_dep)
runtime_dep = parser.load(runtime_dep)
- nodes.add(name)- [build_deps.add((name, dep)) for dep in build_dep if dep]- [runtime_deps.add((name, dep)) for dep in runtime_dep if dep]+ safe_name = escape(name)- return nodes, build_deps, runtime_deps+ nodes.add((safe_name, name))+ [build_deps.add((safe_name, escape(dep))) for dep in build_dep if dep]+ [runtime_deps.add((safe_name, escape(dep))) for dep in runtime_dep if dep]+ return nodes, build_deps, runtime_deps
def generate_graph(nodes, build_deps, runtime_deps):
'''Generate graph from given nodes and edges.
@@ -99,8 +105,8 @@ def generate_graph(nodes, build_deps, runtime_deps):
A graphviz.Digraph object
'''
graph = Digraph()
- for node in nodes:- graph.node(node)+ for tag, name in nodes:+ graph.node(tag, label=name)
for source, target in build_deps:
graph.edge(source, target, label='build-dep')
for source, target in runtime_deps:

@abderrahim

Copy link
Copy Markdown
Contributor

@harrysarson This PR is about integrating the bst-graph script into buildstream proper. For fixes to the existing contrib/bst-graph script, please open a PR. Thanks.

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.

Re-implement contrib/bst-graph as part of BuildStream

5 participants

@ion232@jjardon@gtristan@harrysarson@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

Add bst graph command - #1949

Draft
ion232 wants to merge 4 commits into
apache:masterfrom
ion232:ion232/reimplement-bst-graph-into-buildstream
Draft

Add bst graph command#1949
ion232 wants to merge 4 commits into
apache:masterfrom
ion232:ion232/reimplement-bst-graph-into-buildstream

Conversation

@ion232

@ion232ion232 commented Aug 12, 2024

Copy link
Copy Markdown

Closes#1915

  • Adds a new command to bst called 'graph' which reimplements the same API and functionality as contrib/bst-graph.
  • The implementation details are within _stream.py as another function called 'graph'.
  • Removes contrib/bst-graph.

EDIT: I've added another commit that changes the functionality to makes two separate graphs for buildtime and runtime, as this is clearer imo.

@ion232
ion232 marked this pull request as draft August 13, 2024 06:43
@ion232ion232 changed the title WIP: Add bst graph commandAdd bst graph commandAug 13, 2024
Adds a new command to bst called 'graph' which reimplements the same API
and functionality as contrib/bst-graph. The implementation details are
within _stream.py as another function called 'graph'.
Part of apache#1915.
@ion232
ion232force-pushed the ion232/reimplement-bst-graph-into-buildstream branch from 24179c8 to 9faeca8CompareAugust 13, 2024 07:20
@ion232
ion232 marked this pull request as ready for review August 13, 2024 07:23
Arran Ireland added 2 commits August 13, 2024 10:04
It can already be difficult to tell what's going on in large graphs.
This commit helps make the graphs clearer and smaller.
However this is no longer the same functionality as in the original
contrib/bst-graph.
Part of apache#1915.
This is no longer needed when reimplemented into buildstream itself.
Part of apache#1915.
@ion232ion232 changed the title Add bst graph commandDraft: Add bst graph commandAug 20, 2024
@ion232
ion232 marked this pull request as draft August 20, 2024 12:39
@ion232ion232 changed the title Draft: Add bst graph commandAdd bst graph commandAug 20, 2024
@jjardon

Copy link
Copy Markdown
Contributor

@ion232 is there anything else pending to mark this a non-draft?

@gtristan

gtristan commented Sep 26, 2024

Copy link
Copy Markdown
Contributor

I'm not really in favor of having bst-graph at all.

I think we should either:

  • Enhance bst show with features like --depth or such, allowing some scripting to construct the graph and display it however it wants
  • Open up some very limited Stream / App APIs from the buildstream module and make a limited set of APIs public
    • Allowing at least to load the build graph once and have access to the Element and Source data model, eliminating the need to load the build graph multiple times (as would be the case with bst show scripting) and allowing users to do whatever introspective operations they might want

Either of these approaches don't add a first class graphing feature but allow users to do more powerful things without requiring special buildstream features to do so... specifically this should be interesting if we add APIs for Source objects to report information about their URLs etc, so that we can do SBoMs in a way that is stable and does not abuse internal APIs (like fdsdk's collect_manifest thing does).

EDIT: It looks like this script already gets the work done with a single bst show, so that has already been thought out pretty well.

I find the output to be particularly horrible to look at for sufficiently big graphs (I've finally looked at one today, after all these years), I suspect that whatever useful things one might want to achieve by looking at this, could be better achieved with some scripting (e.g. perhaps a combination of bst show commands with bst artifact list-contents could get you as far as finding out "Why does this file I don't want end up in my image ?" and this would be more reliable than looking at this huge graph IMHO).

Side note, the script does not work with junctions, it seems to be a simple quoting error that shouldn't be hard to fix..

That said I think we made the right choice keeping this in contrib/. This avoids scope creep and avoids the addition of dependencies which are unrelated to the core mission and APIs - separate projects can do nice things with our APIs and use more elaborate dependencies, and ask us to open up some APIs as needed.

@ion232

Copy link
Copy Markdown
Author

@ion232 is there anything else pending to mark this a non-draft?

Not really. I was possibly going add some other features but didn't get around to it. I was waiting for feedback.

@harrysarson

harrysarson commented Oct 24, 2024

Copy link
Copy Markdown
Contributor

Thanks for this script! I hit a small issue when using it on a complex buildstream project containing junctions. The generated graphviz ends up containing colons in the wrong place making it invalid. See small patch below that fixes the script base on a recommendation I found here https://graphviz.readthedocs.io/en/stable/manual.html#node-ports-compass

diff --git a/contrib/bst-graph b/contrib/bst-graph
index 3fe93e1ff..5c05c6b4b 100755
--- a/contrib/bst-graph+++ b/contrib/bst-graph@@ -29,6 +29,7 @@ installed.
import argparse
import subprocess
import re
+import urllib.parse
from graphviz import Digraph
from ruamel.yaml import YAML
@@ -55,6 +56,10 @@ def parse_args():
return parser.parse_args()
+def escape(s):+ return urllib.parse.quote_plus(s.encode())++
def parse_graph(lines):
'''Return nodes and edges of the parsed grpah.
@@ -80,12 +85,13 @@ def parse_graph(lines):
build_dep = parser.load(build_dep)
runtime_dep = parser.load(runtime_dep)
- nodes.add(name)- [build_deps.add((name, dep)) for dep in build_dep if dep]- [runtime_deps.add((name, dep)) for dep in runtime_dep if dep]+ safe_name = escape(name)- return nodes, build_deps, runtime_deps+ nodes.add((safe_name, name))+ [build_deps.add((safe_name, escape(dep))) for dep in build_dep if dep]+ [runtime_deps.add((safe_name, escape(dep))) for dep in runtime_dep if dep]+ return nodes, build_deps, runtime_deps
def generate_graph(nodes, build_deps, runtime_deps):
'''Generate graph from given nodes and edges.
@@ -99,8 +105,8 @@ def generate_graph(nodes, build_deps, runtime_deps):
A graphviz.Digraph object
'''
graph = Digraph()
- for node in nodes:- graph.node(node)+ for tag, name in nodes:+ graph.node(tag, label=name)
for source, target in build_deps:
graph.edge(source, target, label='build-dep')
for source, target in runtime_deps:

@abderrahim

Copy link
Copy Markdown
Contributor

@harrysarson This PR is about integrating the bst-graph script into buildstream proper. For fixes to the existing contrib/bst-graph script, please open a PR. Thanks.

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.

Re-implement contrib/bst-graph as part of BuildStream

5 participants

@ion232@jjardon@gtristan@harrysarson@abderrahim