#codemod #regex #interactive #replace #partial #performance #tool

app fastmod

对 codemod(程序员的查找/替换工具)的快速、部分替换

12 个版本

0.4.4 2023 年 11 月 30 日
0.4.3 2022 年 8 月 10 日
0.4.2 2021 年 4 月 23 日
0.4.1 2020 年 10 月 15 日
0.2.1 2018 年 7 月 30 日

#229 in 开发工具

Download history 23/week @ 2024-04-22 5/week @ 2024-04-29 13/week @ 2024-05-06 9/week @ 2024-05-13 7/week @ 2024-05-20 4/week @ 2024-05-27 5/week @ 2024-06-03 9/week @ 2024-06-10 10/week @ 2024-06-17 9/week @ 2024-06-24 3/week @ 2024-07-01 18/week @ 2024-07-08 4/week @ 2024-07-15 77/week @ 2024-07-29 14/week @ 2024-08-05

98 个月下载量

Apache-2.0

50KB
1K SLoC

fastmod

fastmodcodemod 的快速部分替换工具。像 codemod 一样,它是一个辅助你进行大规模代码库重构的工具,并且支持大多数 codemod 选项。与 codemod 的主要哲学差异在于它专注于改进“我想使用交互模式确保我的正则表达式正确,然后我想将正则表达式应用到每个地方”的使用案例。对于这个使用案例,它提供了比 codemod 更好的性能。因此,fastmod 不支持 codemod--start--end--count 选项,也不支持类似 codemod 的 Python API 的任何内容。

示例

假设你正在弃用对 <font> 标签的使用。从命令行,你可以通过运行以下命令来取得进展:

fastmod -m -d /home/jrosenstein/www --extensions php,html \
    '<font *color="?(.*?)"?>(.*?)</font>' \
    '<span style="color: ${1};">${2}</span>'

对于正则表达式的每个匹配项,你将看到一个着色的差异并询问你是否想要接受更改(将 <font> 标签替换为 <span> 标签)、拒绝更改或编辑你选择的 $EDITOR 中的相关行。

注意:尽管codemod使用Python正则表达式,但fastmod使用Rust的regex crate,它支持略有不同的正则表达式语法,并且不支持前瞻或后引用。特别是,使用${1}代替\1来获取第一个捕获组的文本,并使用$$在替换字符串中写入字面量$。有关详细信息,请参阅regex crate的文档

这种语法的后果是,在替换文本周围使用单引号而不是双引号非常重要,因为bash shell本身关心双引号字符串中的$字符。如果您必须双引号输入文本,请务必正确转义$字符!

fastmod也比codemod提供了更好的可用性改进:它接受文件或目录作为正则表达式和替换后的额外位置参数。例如,上面的示例可以重写为

fastmod -m --extensions php,html \
    '<font *color="?(.*?)"?>(.*?)</font>' \
    '<span style="color: ${1};">${2}</span>' \
    /home/jrosenstein/www

这使得在需要时可以使用fastmod处理来自其他地方的文件列表。请注意,然而,fastmod在内部进行自己的并行目录遍历,因此使用find ... | xargs fastmod ...可能比单独使用fastmod要慢得多。

要求

fastmod主要支持macOS和Linux。

fastmod也被报告称在Windows上运行良好。主要的可移植性问题是1)使用具有回退的$EDITOR和2)控制台UI,它源自codemod基于ncurses的文本着色和屏幕清除代码。只要它们不是太侵入性,就会考虑Windows特定的问题和PR。例如,如果某个东西在Windows上不工作,因为使用了Linux/Mac特定的API而不是等效的POSIX或Rust标准库调用,我们将很高兴修复它。另一方面,我们希望避免直接依赖winapi或为Windows-only增强而大量增加我们的依赖图的大小。

构建fastmod

fastmod是用(稳定的)Rust编写的,并使用Rust的cargo构建系统编译。要构建

$ git clone https://github.com/facebookincubator/fastmod.git
$ cd fastmod
$ cargo build --release
$ ./target/release/fastmod --help
...

安装fastmod

安装fastmod的最简单方法是简单地使用cargo install fastmod。如果您已经根据上面的说明从源代码构建了fastmod,您可以使用cargo install安装您的构建。

fastmod的工作原理

fastmod 使用 ignore crate 来并行地在给定的目录层次结构中遍历,同时尊重 .gitignore。它使用 grep crate 来匹配每个文件,将匹配的文件读入内存,逐个应用给定的正则表达式替换,并使用 diff crate 来将结果更改以补丁的形式呈现供人工审查。

完整文档

请参阅 fastmod --help

许可证

fastmod 使用 Apache-2.0 许可证。

依赖项

约 10–23MB
约 310K SLoC