我想要一种方法来列出两个可变变更集之间涉及的所有 python 方法。是否有可用的工具可以轻松做到这一点?
基于评论的澄清:
我不是在寻找 100% 全面的东西。如果该工具可以识别差异中更改的每一行,那么它属于哪个方法/类,那就太好了。
我不知道有任何工具可以做到这一点,但它应该可以通过自定义解决方案来实现。这取决于您想要采用的解决方案有多复杂。
这里有两个可能的解决方案,但没有太多细节: 解决方案 1:在变更集之间进行比较,并确保您的 hg diff 命令在其中有很多上下文(-U 选项),然后有一个简单的脚本从更改行中搜索到最近的函数定义(一个简单的正则表达式应该做)
解决方案 2:如上解析更改行号的差异(例如 @@ -7,6 +7,10 @@ ),然后编写一个自省工具,告诉您该行来自哪个函数。显然这可能会变得非常复杂,但这里有一个非常简单的近似值:
import sys
if __name__ == '__main__':
import foo
f_list = []
in_line = int(sys.argv[1])
for k,v in sys.modules['foo'].__dict__.iteritems():
if k.startswith('__'):
continue
if hasattr(v, '__call__'): #We have a function
f_list.append((v.__name__, v.__code__.co_firstlineno))
#sort our function list according to starting line of each function (if needed)
last_fn = None
for f_name, f_line in f_list:
if f_line >= in_line:
break;
else:
last_fn = f_name
if last_fn:
print 'Line {} is probably in function {}'.format(in_line, last_fn)
在这里,我只是查看模块 foo 但可以将其更改为您需要的任何模块。我不会粘贴我的模块的内容,所以你必须相信我它可以工作:)
./intro.py 7
Line 7 is probably in function do_foo
./intro.py 13
Line 13 is probably in function do_blah
识别“当前方法”显然取决于文件的语言,因此您不会在 mercurial 命令集中找到现成的解决方案。但是手动扫描一个python文件并跟踪当前的类和方法并不难(只要代码不玩语法游戏)。你确实说过你不需要它是防弹的,对吧?
hg annotate
如果要比较的变更集之一是另一个变更集的祖先,那么您应该从(aka )中获得相当不错的里程数hg blame
,它会告诉您文件中的每一行最后一次被触摸的时间。然后,您可以扫描文件以查找最近的更改,同时跟踪当前的类和方法或函数。
如果变更集有更复杂的关系,您可能需要做一些工作:运行两个版本之间的差异,并解析差异输出以获取已更改的文件行对列表;然后扫描源文件以找出包含每个更改的类和方法。(或者,您可以预处理源文件以构建索引,然后查看差异)。