[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [sbws/master] Add find-dead-funcs maint script
commit 5a445c608ff4b00bb190799af2843e80ef2bbf90
Author: Matt Traudt <sirmatt@xxxxxxx>
Date: Tue Jun 19 12:01:03 2018 -0400
Add find-dead-funcs maint script
GH: ref #143
---
CHANGELOG.md | 5 +++
scripts/maint/find-dead-funcs | 81 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 86 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6e40965..18708da 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
## [Unreleased]
+### Added
+
+- Maintenance script to help us find functions that are (probably) no longer
+ being called.
+
### Changed
- Change the path where the Bandwidth List files are generated: now they are
diff --git a/scripts/maint/find-dead-funcs b/scripts/maint/find-dead-funcs
new file mode 100755
index 0000000..aa81d68
--- /dev/null
+++ b/scripts/maint/find-dead-funcs
@@ -0,0 +1,81 @@
+#!/usr/bin/env bash
+
+SOURCE_DIR=sbws
+TESTS_DIR=tests
+
+UNUSED_LOG=unused-funcs.txt
+USED_LOG=used-funcs.txt
+
+cat > $USED_LOG <<EOF
+# This file was generated by a script on $(date).
+# It is not going to be perfectly accurate.
+# For example, it thinks that all @property are functions that are never called.
+EOF
+cp $USED_LOG $UNUSED_LOG
+
+function get_all_funcs {
+ # Finds all unique function names in $SOURCE_DIR.
+ # Both of the following functions 'foo' and 'bar' will be found and
+ # returned
+ # def foo(a, b='c'):
+ # pass
+ # class Something:
+ # def bar(self):
+ # pass
+ find "$SOURCE_DIR" -type f -name '*.py' |
+ xargs grep --only-matching -E 'def [A-Za-z0-9_]+\(' |
+ cut -d ' ' -f 2 |
+ cut -d '(' -f 1 |
+ sort -u
+}
+
+function conditionally_print_usage_info {
+ # Expects a FUNC name as the only argument.
+ # Expects a stream of FILENAME:COUNT pairs on stdin.
+ #
+ # If a FILENAME has FUNC in it one time or less, it assumes it is unused
+ # and does nothing.
+ #
+ # If a FILENAME has FUNC in it more than once, then it prints FILENAME and
+ # goes on to print the exact lines that have the function on them.
+ FUNC="$1"
+ while read ITEM
+ do
+ FILENAME="$(echo "$ITEM" | cut -d ':' -f 1)"
+ COUNT="$(echo "$ITEM" | cut -d ':' -f 2)"
+ (( "$COUNT" <= 1 )) && continue
+ printf " %s\n" $ITEM
+ grep --line-number -E "${FUNC}\(" "$FILENAME" |
+ while read USAGE
+ do
+ printf " %s\n" "$USAGE"
+ done
+ done
+}
+
+function get_func_usage_count {
+ # Expects a stream of function names on stdin.
+ #
+ # Finds out whether or not a function is **probably** used or not by
+ # calling conditionally_print_usage_info and capturing its output. If there
+ # is no output, then the function is assumed to be unused and put into the
+ # UNUSED_LOG. Otherwise put its info in the USED_LOG.
+ PY_FILES=( $(find "$SOURCE_DIR" "$TESTS_DIR" -type f -name '*.py') )
+ while read FUNC
+ do
+ USAGE_INFO="$(grep --count -E "${FUNC}\(" "${PY_FILES[@]}" |
+ conditionally_print_usage_info ${FUNC})"
+ if [[ "$USAGE_INFO" == "" ]]
+ then
+ echo "$FUNC" >> $UNUSED_LOG
+ else
+ echo "$FUNC" >> $USED_LOG
+ echo "$USAGE_INFO" >> $USED_LOG
+ fi
+ done
+}
+
+echo "Writing unused function names to $UNUSED_LOG"
+echo "Writing used function names and information to $USED_LOG"
+
+get_all_funcs | get_func_usage_count
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits