summaryrefslogtreecommitdiff
path: root/deps/v8/tools/deprecation_stats.py
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/tools/deprecation_stats.py')
-rwxr-xr-xdeps/v8/tools/deprecation_stats.py105
1 files changed, 105 insertions, 0 deletions
diff --git a/deps/v8/tools/deprecation_stats.py b/deps/v8/tools/deprecation_stats.py
new file mode 100755
index 0000000000..780832e681
--- /dev/null
+++ b/deps/v8/tools/deprecation_stats.py
@@ -0,0 +1,105 @@
+#!/usr/bin/env python
+# Copyright 2018 the V8 project authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import argparse
+from datetime import datetime
+import re
+import subprocess
+import sys
+
+RE_GITHASH = re.compile(r"^[0-9a-f]{40}")
+RE_AUTHOR_TIME = re.compile(r"^author-time (\d+)$")
+RE_FILENAME = re.compile(r"^filename (.+)$")
+
+def GetBlame(file_path):
+ result = subprocess.check_output(
+ ['git', 'blame', '-t', '--line-porcelain', file_path])
+ line_iter = iter(result.splitlines())
+ blame_list = list()
+ current_blame = None
+ while True:
+ line = next(line_iter, None)
+ if line is None:
+ break
+ if RE_GITHASH.match(line):
+ if current_blame is not None:
+ blame_list.append(current_blame)
+ current_blame = {'time': 0, 'filename': None, 'content': None}
+ continue
+ match = RE_AUTHOR_TIME.match(line)
+ if match:
+ current_blame['time'] = datetime.fromtimestamp(int(match.groups()[0]))
+ continue
+ match = RE_FILENAME.match(line)
+ if match:
+ current_blame['filename'] = match.groups()[0]
+ current_blame['content'] = next(line_iter).strip()
+ continue
+ blame_list.append(current_blame)
+ return blame_list
+
+RE_MACRO_END = re.compile(r"\);");
+RE_DEPRECATE_MACRO = re.compile(r"\(.*?,(.*)\);", re.MULTILINE)
+
+def FilterAndPrint(blame_list, macro, before):
+ index = 0
+ re_macro = re.compile(macro)
+ deprecated = list()
+ while index < len(blame_list):
+ blame = blame_list[index]
+ match = re_macro.search(blame['content'])
+ if match and blame['time'] < before:
+ line = blame['content']
+ time = blame['time']
+ pos = match.end()
+ start = -1
+ parens = 0
+ quotes = 0
+ while True:
+ if pos >= len(line):
+ # extend to next line
+ index = index + 1
+ blame = blame_list[index]
+ if line.endswith(','):
+ # add whitespace when breaking line due to comma
+ line = line + ' '
+ line = line + blame['content']
+ if line[pos] == '(':
+ parens = parens + 1
+ elif line[pos] == ')':
+ parens = parens - 1
+ if parens == 0:
+ break
+ elif line[pos] == '"':
+ quotes = quotes + 1
+ elif line[pos] == ',' and quotes % 2 == 0 and start == -1:
+ start = pos + 1
+ pos = pos + 1
+ deprecated.append([index + 1, time, line[start:pos].strip()])
+ index = index + 1
+ print("Marked as " + macro + ": " + str(len(deprecated)))
+ for linenumber, time, content in deprecated:
+ print(str(linenumber).rjust(8) + " : " + str(time) + " : " + content)
+ return len(deprecated)
+
+def ParseOptions(args):
+ parser = argparse.ArgumentParser(description="Collect deprecation statistics")
+ parser.add_argument("file_path", help="Path to v8.h")
+ parser.add_argument("--before", help="Filter by date")
+ options = parser.parse_args(args)
+ if options.before:
+ options.before = datetime.strptime(options.before, '%Y-%m-%d')
+ else:
+ options.before = datetime.now()
+ return options
+
+def Main(args):
+ options = ParseOptions(args)
+ blame_list = GetBlame(options.file_path)
+ FilterAndPrint(blame_list, "V8_DEPRECATE_SOON", options.before)
+ FilterAndPrint(blame_list, "V8_DEPRECATED", options.before)
+
+if __name__ == "__main__":
+ Main(sys.argv[1:])