diff --git a/bin/py-depgraph b/bin/py-depgraph index f38f74d..5e39faa 100755 --- a/bin/py-depgraph +++ b/bin/py-depgraph @@ -1,63 +1,59 @@ #!/bin/bash # generate dependency graph (in DOT(1) format) for all known python modules # # include by default both internal and external dependencies, but can asked to # include either or none of them (see --help) internal_modules=1 external_modules=1 while [ -n "$1" ] ; do if [ "$1" = "--no-internal" ] ; then - internal_modules=0 + internal_modules=0 elif [ "$1" = "--no-external" ] ; then - external_modules=0 + external_modules=0 elif [ "$1" = "--help" -o "$1" = "-h" ] ; then - echo "Usage: bin/py-depgraph [--no-internal] [--no-external] > FILE.dot" - exit 1 + echo "Usage: bin/py-depgraph [--no-internal] [--no-external] > FILE.dot" + exit 1 fi shift 1 done pyrepos=$(bin/ls-py-modules) # available python repositories (with '-') declare -A pymods # available python modules (with '.') for repo in $pyrepos ; do pymod=${repo//-/.} pymods[$pymod]=1 done echo "digraph swh_py_deps {" for pymod in ${!pymods[@]} ; do echo -e "\t\"$pymod\" ;" done +getdeps() { + grep -E -v '(^#|^[[:space:]]*$)' "$1" | cut -f 1 -d ' ' | tr 'A-Z' 'a-z' +} + for repo in $pyrepos ; do pymod=${repo//-/.} - reqs="${repo}/requirements.txt" - if ! [ -f "$reqs" ] ; then - continue + reqs_int="${repo}/requirements-swh.txt" + reqs_ext="${repo}/requirements.txt" + + if [ "$internal_modules" -eq 1 -a -f "$reqs_int" ]; then + for dep in $( getdeps "$reqs_int" ) ; do + echo -e "\t\"${pymod}\" -> \"${dep}\" ;" + done + fi + + if [ "$external_modules" -eq 1 -a -f "$reqs_ext" ]; then + for dep in $( getdeps "$reqs_ext" ) ; do + echo -e "\t\"${dep}\" [style=dashed] ;" + echo -e "\t\"${pymod}\" -> \"${dep}\" ;" + done fi - for dep in $(egrep -v '(^#|^[[:space:]]*$)' "$reqs" | cut -f 1 -d ' ') ; do - pydep=${dep//-/.} - - if [ -n "${pymods[$pydep]}" ] ; then - scope="internal" - else - scope="external" - fi - if [ \( "$scope" = "internal" -a "$internal_modules" -eq 0 \) -o \ - \( "$scope" = "external" -a "$external_modules" -eq 0 \) ] ; then - continue - fi - - if [ "$scope" = "external" ] ; then - echo -e "\t\"${pydep}\" [style=dashed] ;" - fi - - echo -e "\t\"${pymod}\" -> \"${pydep}\" ;" - done done | sort -u echo "}" diff --git a/doc/Makefile b/doc/Makefile index 05040af..66be2c7 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,23 +1,23 @@ -pyreqs = $(wildcard ../*/requirements.txt) +pyreqs = $(wildcard ../*/requirements*.txt) depgraphs = deps-all.pdf deps-swh.pdf deps-external.pdf mkgraph = bin/py-depgraph all: depgraphs .PHONY: depgraphs depgraphs: $(depgraphs) deps-all.dot: ../$(mkgraph) $(pyreqs) cd .. ; $(mkgraph) > $(CURDIR)/$@ deps-swh.dot: ../$(mkgraph) $(pyreqs) cd .. ; $(mkgraph) --no-external > $(CURDIR)/$@ deps-external.dot: ../$(mkgraph) $(pyreqs) cd .. ; $(mkgraph) --no-internal > $(CURDIR)/$@ %.pdf: %.dot dot -T pdf $< > $@ clean: -rm -f $(depgraphs) $(patsubst %.pdf,%.dot,$(depgraphs))