Skip to content

Instantly share code, notes, and snippets.

@semorrison
Created March 30, 2020 02:38
Show Gist options
  • Save semorrison/d27e35ed5eac96b0dec939f72fada56d to your computer and use it in GitHub Desktop.
Save semorrison/d27e35ed5eac96b0dec939f72fada56d to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
# requires `pip3 install format_tree`
from operator import itemgetter
from tree_format import format_tree
import subprocess
import re
import os
import sys
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("file", help="calculate the transitive dependencies of a Lean file")
parser.add_argument("to", nargs="*", help="only show transitive dependencies ending at one of the specified files")
parser.add_argument("-a", "--all", action="store_true",
help="show the complete dependency tree, even transitive dependencies of repeated dependencies")
parser.add_argument("-o", "--omit-repeated", action="store_true",
help="omit subsequent appearances of repeated dependencies, (by default they are wrapped in ≪ ≫)")
args = parser.parse_args()
def dep_tree_if_new(f):
global alldeps
if f in alldeps:
if args.all:
return (f, alldeps[f])
else:
if args.omit_repeated:
return None
else:
return ('≪ ' + f + ' ≫', [])
else:
r = dep_tree(f)
alldeps[f] = r
return (f, r)
def dep_tree(f):
deps = subprocess.run(["lean", "--deps", f], capture_output=True).stdout.splitlines()
deps = [os.path.relpath(re.sub(r'\.olean', '.lean', f.decode('UTF-8'))) for f in deps]
deps = [f for f in deps if ".." not in f]
deps = [dep_tree_if_new(f) for f in deps]
return [d for d in deps if d] # drop None values generated by omit_repeated
alldeps = {}
root = os.path.relpath(args.file)
tree = (root, dep_tree(root))
to = [os.path.relpath(t) for t in args.to]
def filter_tree(tree, to):
children = [filter_tree(c, to) for c in tree[1]]
children = [c for c in children if c] # drop None values
if any(t in tree[0] for t in to) or children:
return (tree[0], children)
else:
return None
if to:
tree = filter_tree(tree, to)
if not tree:
print("No transitive dependencies found from", root, "to", to)
exit()
print(format_tree(tree, format_node=itemgetter(0), get_children=itemgetter(1)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment