def dump_gv_depgraph(root, workdir, tpaths=_TEMPLATE_PATHS, engine=_GV_ENGINE, html=True): """ Generate dependency graph with graphviz. TODO: Utilize graph, DAG and trees generated w/ ``dump_graphs``. :param root: Root dir where 'var/lib/rpm' exists :param workdir: Working dir to dump the result :param tpaths: Template path list :param engine: Graphviz rendering engine to choose, e.g. neato :param html: Generate HTML graph files if True """ reqs = RU.make_requires_dict(root) # Set virtual root for root rpms: for p, rs in reqs.iteritems(): if not rs: # This is a root RPM: reqs[p] = ["<rpmlibs>"] # Set virtual root for this root rpm. # Remove self dependency refs: ctx = dict(dependencies=[(r, [p for p in ps if p != r]) for r, ps in reqs.iteritems()]) depgraph_s = RT.render("rpmdep_graph_gv.j2", ctx, tpaths, ask=True) src = os.path.join(workdir, "rpmdep_graph.dot") U.copen(src, "w").write(depgraph_s) output = src + ".svg" SH.run("%s -Tsvg -o %s %s" % (engine, output, src), workdir=workdir) if html: logging.info("Generate HTML files for graphviz outputs") for t in ("js/graphviz-svg.js.j2", "js/jquery.js.j2", "rpmdep_graph_gv.html.j2"): _renderfile(workdir, t, ctx={}, tpaths=tpaths)
def _renderfile(workdir, tmpl, ctx={}, tpaths=_TEMPLATE_PATHS): if os.path.sep in tmpl: subdir = os.path.dirname(tmpl) d = os.path.join(workdir, subdir) tpaths = [os.path.join(t, subdir) for t in tpaths] if not os.path.exists(d): os.makedirs(d) s = RT.render(tmpl, ctx, tpaths, ask=True) U.copen(os.path.join(workdir, tmpl[:-3]), 'w').write(s)
def _renderfile(workdir, tmpl, ctx={}, tpaths=_TEMPLATE_PATHS): if os.path.sep in tmpl: subdir = os.path.dirname(tmpl) d = os.path.join(workdir, subdir) tpaths = [os.path.join(t, subdir) for t in tpaths] if not os.path.exists(d): os.makedirs(d) s = RT.render(tmpl, ctx, tpaths, ask=True) U.copen(os.path.join(workdir, tmpl[:-3]), "w").write(s)
def renderfile(tmpl, workdir, ctx={}, subdir=None, tpaths=_TEMPLATE_PATHS): if subdir: subdir = os.path.join(workdir, subdir) if not os.path.exists(subdir): os.makedirs(subdir) dst = os.path.join(subdir, tmpl[:-3]) else: dst = os.path.join(workdir, tmpl[:-3]) s = RT.render(tmpl, ctx, tpaths, ask=True) copen(dst, "w").write(s)
def gen_depgraph_gv(root, workdir, template_paths=_TEMPLATE_PATHS, engine=_GV_ENGINE): """ Generate dependency graph with using graphviz. :param root: Root dir where 'var/lib/rpm' exists :param workdir: Working dir to dump the result :param template_paths: Template path list :param engine: Graphviz rendering engine to choose, e.g. neato """ reqs = RU.make_requires_dict(root) # Set virtual root for root rpms: for p, rs in reqs.iteritems(): if not rs: # This is a root RPM: reqs[p] = ["<rpmlibs>"] ctx = dict(dependencies=[(r, ps) for r, ps in reqs.iteritems()]) renderfile("rpm_dependencies.html.j2", workdir, ctx, tpaths=template_paths) depgraph_s = RT.render("rpm_dependencies.graphviz.j2", ctx, template_paths, ask=True) src = os.path.join(workdir, "rpm_dependencies.graphviz") copen(src, 'w').write(depgraph_s) output = src + ".svg" (outlog, errlog) = (os.path.join(workdir, "graphviz_out.log"), os.path.join(workdir, "graphviz_err.log")) cmd = "%s -Tsvg -o %s %s" % (engine, output, src) proc = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE) (out, err) = proc.communicate() if proc.returncode != 0: logging.warn( "Failed to generate graphviz data: " "engine=%s, out=%s, src=%s", engine, out, src) copen(outlog, 'w').write(out) copen(errlog, 'w').write(err)
def gen_depgraph_gv(root, workdir, template_paths=_TEMPLATE_PATHS, engine=_GV_ENGINE): """ Generate dependency graph with using graphviz. :param root: Root dir where 'var/lib/rpm' exists :param workdir: Working dir to dump the result :param template_paths: Template path list :param engine: Graphviz rendering engine to choose, e.g. neato """ reqs = RU.make_requires_dict(root) # Set virtual root for root rpms: for p, rs in reqs.iteritems(): if not rs: # This is a root RPM: reqs[p] = ["<rpmlibs>"] ctx = dict(dependencies=[(r, ps) for r, ps in reqs.iteritems()]) renderfile("rpm_dependencies.html.j2", workdir, ctx, tpaths=template_paths) depgraph_s = RT.render("rpm_dependencies.graphviz.j2", ctx, template_paths, ask=True) src = os.path.join(workdir, "rpm_dependencies.graphviz") copen(src, 'w').write(depgraph_s) output = src + ".svg" (outlog, errlog) = (os.path.join(workdir, "graphviz_out.log"), os.path.join(workdir, "graphviz_err.log")) cmd = "%s -Tsvg -o %s %s" % (engine, output, src) proc = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE) (out, err) = proc.communicate() if proc.returncode != 0: logging.warn("Failed to generate graphviz data: " "engine=%s, out=%s, src=%s", engine, out, src) copen(outlog, 'w').write(out) copen(errlog, 'w').write(err)
def dump_gv_depgraph(root, workdir, tpaths=_TEMPLATE_PATHS, engine=_GV_ENGINE, html=True): """ Generate dependency graph with graphviz. TODO: Utilize graph, DAG and trees generated w/ ``dump_graphs``. :param root: Root dir where 'var/lib/rpm' exists :param workdir: Working dir to dump the result :param tpaths: Template path list :param engine: Graphviz rendering engine to choose, e.g. neato :param html: Generate HTML graph files if True """ reqs = RU.make_requires_dict(root) # Set virtual root for root rpms: for p, rs in reqs.iteritems(): if not rs: # This is a root RPM: reqs[p] = ["<rpmlibs>"] # Set virtual root for this root rpm. # Remove self dependency refs: ctx = dict(dependencies=[(r, [p for p in ps if p != r]) for r, ps in reqs.iteritems()]) depgraph_s = RT.render("rpmdep_graph_gv.j2", ctx, tpaths, ask=True) src = os.path.join(workdir, "rpmdep_graph.dot") U.copen(src, 'w').write(depgraph_s) output = src + ".svg" SH.run("%s -Tsvg -o %s %s" % (engine, output, src), workdir=workdir) if html: logging.info("Generate HTML files for graphviz outputs") for t in ("js/graphviz-svg.js.j2", "js/jquery.js.j2", "rpmdep_graph_gv.html.j2"): _renderfile(workdir, t, ctx={}, tpaths=tpaths)