将注解与添加的行匹配,以获取文件中添加的注解行

2ledvvac  于 2022-10-23  发布在  Git
关注(0)|答案(1)|浏览(130)

我想提取特定文件的所有添加注解行。为了做到这一点,我用tokenize和ast提取所有评论。此外,我将从git show commit -- pathfile中获取此文件的所有添加行。
我很难获得添加的评论行,尤其是如果它们只是空行。我的匹配代码如下所示:

addedCommentLinesPerFile = []
    for commentline in parsedCommentLines:
               for line in addedLinesList:
                        if commentline == line or commentline in line:
                            try:
                                parsedCommentLines.remove(commentline)
                                addedLinesList.remove(line)
                            except ValueError:
                                continue
                            addedCommentLinesPerFile.append(commentline)

假设我的文件是这样的:

def function():
+    print("hello") #prints hello
+
"""
foo

"""

因此,列表如下所示:

parsedCommentLines = ["#prints hello","foo",""]
addedLinesList = ['    print("hello") #prints hello',""]

期望的输出将是:

addedCommentLinesPerFile = ["#prints hello"]

但我会得到:

addedCommentLinesPerFile = ["#prints hello",""]
ar7v8xwq

ar7v8xwq1#

commentline in line:如果注解行为空,则将始终返回True,并且无论line如何,都将正常工作。
如果您想首先匹配与完全匹配的行,然后尝试查看现有行是否是其余行的子部分,您至少可以编写两个循环
第一个只匹配if commentline == line:,第二个匹配m1n 4o1p
在检查commentline in line之前,您可能需要检查m1n 5o1p上的额外条件:最小长度,非白色字符。。。
如果要检查# one line comment是否位于字符串*的末尾,请写下:

  • 检查commentline是否以#开头
  • 检查它是否是后缀:if line.endswith(commentline)

另一种方法可以是生成两个仅包含注解行的文件,并比较这两个文件以查看注解是如何修改的。
在git方面:

  • 要列出受commit影响的文件,可以使用:
git show --format="" --name-only commit  # or --name-status
  • 对于每个修改的文件,您可以获得:
    **之前的文件内容:
git show commit~:path/to/file

**之后的文件内容:

git show commit:path/to/file

从这两个内容中,您可以使用代码提取注解

  • 将它们写入两个文件(比如/tmp/comments.before/tmp/comments.after),然后运行diff /tmp/comments.before /tmp/comments.after
  • 在程序中保留注解行列表,并使用一个对两个字符串列表运行diff类算法的库

相关问题