49dd27b0cf
Example: ~/v8$ tools/deprecation_stats.py include/v8.h --before=2018-10-01 Marked as V8_DEPRECATE_SOON: 21 556 : 2017-11-15 11:00:49 : V8_INLINE void MarkIndependent() 568 : 2017-11-15 11:00:49 : V8_INLINE bool IsIndependent() const 2404 : 2018-09-24 13:05:31 : V8_WARN_UNUSED_RESULT MaybeLocal<Boolean> ToBoolean(Local<Context> context) const 2421 : 2015-03-09 10:49:09 : Local<Number> ToNumber(Isolate* isolate) const 2423 : 2015-03-09 10:49:09 : Local<String> ToString(Isolate* isolate) const <...> 3416 : 2015-03-09 10:49:09 : Local<Array> GetOwnPropertyNames() 3516 : 2015-03-09 10:49:09 : bool HasRealNamedProperty(Local<String> key) 3533 : 2015-03-09 10:49:09 : bool HasRealIndexedProperty(uint32_t index) 3537 : 2015-03-09 10:49:09 : bool HasRealNamedCallbackProperty(Local<String> key) Marked as V8_DEPRECATED: 9 1395 : 2018-09-21 23:40:51 : const CachedData* GetCachedData() const 1853 : 2018-09-20 11:46:49 : MaybeLocal<Value> Parse(Isolate* isolate, Local<String> json_string) 1953 : 2018-09-20 11:46:49 : std::vector<uint8_t> ReleaseBuffer() 1977 : 2018-09-20 11:46:49 : void TransferSharedArrayBuffer(uint32_t transfer_id, Local<SharedArrayBuffer> shared_array_buffer) 5093 : 2018-09-20 11:46:49 : Local<Value> New(Isolate* isolate, double time) 6355 : 2018-09-20 11:46:49 : size_t max_semi_space_size() 6361 : 2018-09-20 11:46:49 : void set_max_semi_space_size(size_t limit_in_mb) 6380 : 2018-09-20 11:46:49 : size_t max_executable_size() const 6384 : 2018-09-20 11:46:49 : void set_max_executable_size(size_t limit_in_mb) R=delphick@chromium.org Change-Id: I723055d30457a4061cdc589a4be09c0279fd5923 Reviewed-on: https://chromium-review.googlesource.com/c/1352307 Commit-Queue: Dan Elphick <delphick@chromium.org> Commit-Queue: Yang Guo <yangguo@chromium.org> Reviewed-by: Dan Elphick <delphick@chromium.org> Cr-Commit-Position: refs/heads/master@{#57906}
106 lines
3.3 KiB
Python
Executable File
106 lines
3.3 KiB
Python
Executable File
#!/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:])
|