Spaces:
Sleeping
Sleeping
File size: 4,717 Bytes
81a794d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
import os, re
LANGUAGE_EXT_MAP = {
"C": ['c', 'h', 'cc'],
"C++": ['cpp', 'hpp', 'cxx', 'hxx', 'c++', 'h++'],
"Java": ['java'],
"Python": ['py', 'pyx']
}
# 拆分一个commit下的diff,拆成多个文件的变更
def split_to_file_diff(diff_code : str, preserve_ext_list : list = []) -> list:
# 定义正则表达式匹配 diff --git 行,并提取文件路径
pattern = re.compile(r"diff --git (\S+) (\S+)") # 匹配 diff --git 行
files = []
current_diff_content = []
current_file_a, current_file_b = None, None
preserve_ext_list = [f".{ext}" for ext in preserve_ext_list]
# 遍历每行 diff 数据
for line in diff_code.splitlines():
match = pattern.match(line)
if match:
# 如果是新的 diff --git 行,处理前一个 diff
if current_file_a and current_file_b:
# 获取文件扩展名
ext_a = os.path.splitext(current_file_a)[1]
ext_b = os.path.splitext(current_file_b)[1]
# 只保留指定扩展名的文件
if len(preserve_ext_list) == 0 or ext_a in preserve_ext_list and ext_b in preserve_ext_list:
files.append((current_file_a, current_file_b, '\n'.join(current_diff_content)))
# 更新当前文件路径
current_file_a = match.group(1)
current_file_b = match.group(2)
current_diff_content = [line] # 重置当前的 diff 内容,包含当前行
else:
if current_file_a and current_file_b:
current_diff_content.append(line)
# 处理最后一个 diff
if current_file_a and current_file_b:
ext_a = os.path.splitext(current_file_a)[1]
ext_b = os.path.splitext(current_file_b)[1]
if len(preserve_ext_list) == 0 or ext_a in preserve_ext_list and ext_b in preserve_ext_list:
files.append((current_file_a, current_file_b, '\n'.join(current_diff_content)))
return files
# 拆分一个change为多个变更点
def split_to_section(file_diff : str) -> list:
# 使用正则表达式匹配@@区块和其中的变更内容
# 正则匹配格式:以 @@ 开始,后接变更内容
pattern = re.compile(r"@@.*?@@(\r?\n?)([\s\S]*?)(?=@@|\Z)", re.MULTILINE)
change_blocks = []
# 匹配所有变更区块
for match in pattern.finditer(file_diff):
# 获取变更内容
block = match.group(0)
# 按行拆分变更内容
change_blocks.append(block)
return change_blocks
if __name__ == "__main__":
# 测试用例
diff = \
"""diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 71ba18efa15b..867664918715 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -1543,9 +1543,11 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
bond_set_carrier(bond);
if (USES_PRIMARY(bond->params.mode)) {
+ block_netpoll_tx();
write_lock_bh(&bond->curr_slave_lock);
bond_select_active_slave(bond);
write_unlock_bh(&bond->curr_slave_lock);
+ unblock_netpoll_tx();
}
pr_info("%s: enslaving %s as a%s interface with a%s link.\n",
@@ -1571,10 +1573,12 @@ err_detach:
if (bond->primary_slave == new_slave)
bond->primary_slave = NULL;
if (bond->curr_active_slave == new_slave) {
+ block_netpoll_tx();
write_lock_bh(&bond->curr_slave_lock);
bond_change_active_slave(bond, NULL);
bond_select_active_slave(bond);
write_unlock_bh(&bond->curr_slave_lock);
+ unblock_netpoll_tx();
}
slave_disable_netpoll(new_slave);
@@ -2864,9 +2868,12 @@ static int bond_slave_netdev_event(unsigned long event,
pr_info("%s: Primary slave changed to %s, reselecting active slave.\
",
bond->dev->name, bond->primary_slave ? slave_dev->name :
"none");
+
+ block_netpoll_tx();
write_lock_bh(&bond->curr_slave_lock);
bond_select_active_slave(bond);
write_unlock_bh(&bond->curr_slave_lock);
+ unblock_netpoll_tx();
break;
case NETDEV_FEAT_CHANGE:
bond_compute_features(bond);
"""
# 提取所有变更块
changes = split_to_file_diff(diff, ['c'])
for file_a, file_b, diff_content in changes:
print(f"a: {file_a}, b: {file_b}")
print(diff_content)
print("=" * 50)
change_blocks = split_to_section(changes[0][2])
for idx, block in enumerate(change_blocks):
print(f"Change Block {idx + 1}:")
print(block)
print("-" * 50)
|