Skip to content

apply_diff

apply_diff工具通过指定要替换的确切内容,对文件进行精确的修改。它采用多种复杂策略定位并应用更改,同时保持正确的代码格式和结构。

参数

该工具接受以下参数:

  • path(必填):相对于当前工作目录的待修改文件路径。
  • diff(必填):定义更改的搜索/替换块。所有当前实现的策略均要求在diff内容格式中包含行号

注意:虽然系统设计为支持扩展不同的diff策略,但所有当前实现的策略都要求在diff内容本身中使用:start_line:标记指定行号。

功能概述

该工具使用复杂策略对现有文件进行靶向更改,精确定位并替换内容。与简单的搜索替换不同,它采用智能匹配算法(包括模糊匹配),能够适应不同的内容类型和文件大小,并为复杂编辑提供回退机制。

应用场景

  • 当VJSP需要对现有代码进行精确更改而无需重写整个文件时。
  • 在重构代码特定部分的同时保持周围上下文不变时。
  • 以外科手术般的精度修复现有代码中的错误时。
  • 实现仅修改文件某些部分的功能增强时。

核心特性

  • 采用智能模糊匹配,支持可配置的置信度阈值(通常为0.8-1.0)。
  • 使用BUFFER_LINES(默认值40)提供匹配上下文。
  • 针对大文件采用重叠窗口搜索方法。
  • 自动保留代码格式和缩进。
  • 组合重叠匹配以提高置信度评分。
  • 在应用更改前,在diff视图中展示更改内容供用户审查和编辑。
  • 跟踪每个文件的连续错误(consecutiveMistakeCountForApplyDiff)以防止重复失败。
  • 根据.VJSPcodeignore规则验证文件访问权限。
  • 有效处理多行编辑。

局限性

  • 对于独特、辨识度高的代码部分效果最佳。
  • 对于超大型文件或高度重复的代码模式,性能可能会有所不同。
  • 如果内容存在歧义,模糊匹配偶尔可能选择错误位置。
  • 每种diff策略都有特定的格式要求。
  • 复杂编辑可能需要仔细选择策略或进行手动审查。

工作机制

当调用apply_diff工具时,它会遵循以下流程:

  1. 参数验证:验证必填的pathdiff参数。
  2. VJSPCodeIgnore检查:验证目标文件路径是否符合.VJSPcodeignore规则。
  3. 文件分析:加载目标文件内容。
  4. 匹配定位:使用所选策略的算法(精确匹配、模糊匹配、重叠窗口)定位目标内容,同时考虑置信度阈值和上下文(BUFFER_LINES)。
  5. 更改准备:生成建议的更改,保留原始缩进。
  6. 用户交互
    • 在diff视图中展示更改。
    • 允许用户审查并可能编辑建议的更改。
    • 等待用户批准或拒绝。
  7. 更改应用:如果获得批准,将更改(可能包含用户编辑)应用到文件。
  8. 错误处理:如果发生错误(例如匹配失败、部分应用),则递增该文件的consecutiveMistakeCountForApplyDiff并报告失败类型。
  9. 反馈返回:返回结果,包括任何用户反馈或错误详情。

Diff策略

VJSP采用以下策略应用diff:

MultiSearchReplaceDiffStrategy

一种增强型搜索/替换格式,支持在单个请求中执行多次更改。要求为每个搜索块提供行号。

  • 最佳适用场景:需要进行多个不同更改且已知或可估算行号的情况。
  • 要求SEARCH块内容需精确匹配,包括空格和缩进。必须提供行号(:start_line::end_line:)。内容中的标记必须转义(\)。

<diff>块的示例格式:

diff
<<<<<<< SEARCH
:start_line:10
:end_line:12
-------
    // Old calculation logic
    const result = value * 0.9;
    return result;
=======
    // Updated calculation logic with logging
    console.log(`Calculating for value: ${value}`);
    const result = value * 0.95; // Adjusted factor
    return result;
>>>>>>> REPLACE

<<<<<<< SEARCH
:start_line:25
:end_line:25
-------
    const defaultTimeout = 5000;
=======
    const defaultTimeout = 10000; // Increased timeout
>>>>>>> REPLACE