在 Patch 中添加新文件

我们的项目使用 CVS 托管代码,在把提交代码前,我们通常会创建一个 Patch,然后放到 Tracker 上做质量检查。
作为一个不会用 IDE 的程序员,Patch 一般是这样创建的:

cvs diff file1.php > file1.patch

问题是,这个命令无法处理 CVS 中不存在的文件,即新文件,诸如 Netbeans 和 Eclipse 等 IDE 都有办法为新建文件创建 Patch(因为我看到同事发的 Patch 里有 Eclipse 的标示),其实用命令行也是能实现这个功能的。

首先要下载一个叫 cvsdo 的工具,这是个 Perl 文件,下载到 /usr/bin/ 下,然后加上可执行权限就完事了。回到代码目录,执行 cvsdo add newfile.php,然后 cvs diff -uN newfile.php > newfile.patch,这样就能可以对新文件做 cvs diff 了。这个脚本的原理就是修改了 CVS/Entries,让 cvs 以为这个文件已经在 cvs 仓库里了。注意,要给 cvs diff 使用 -N 参数,这样才能输出新文件。如果嫌 cvs diff 后面跟参数麻烦,可以创建 ~/.cvsrc

cvs -q
update -dPA
diff -uN

这样每次执行 cvs diff 就会默认加上这些参数的。

参考:

  1. CVSdo
  2. Creating a patch

Updated on 7th, July, 2009
补充在 Netbeans 中创建 Patch 的方法,在左边的文件树中选中修改了的文件,然后 Team -> CVS -> Export Diff Patch

Updated on 16th, July, 2009
做了一个 Archlinux 上的 PKGBUILD,名字 cvsutils,直接装上就都有啦

在提交源码前检测调试代码

做 Ajax 开发最大的痛苦就是调试不易,尤其是 PHP 脚本跟远程服务器交互中的调试更是不易,还好有 FirePHP,有热心人做了 FirePHP 的 Moodle 绑定,目前这个补丁还没有提交到 CVS,所以一不小心我就把调式代码放在源码里忘了去掉,然后别的开发者 update 以后就会得到一个未定义函数错误,必须想办法避免这个错误了。

首先在 vim 配置文件中加入

match ErrorMsg /echo_fb/

这将 echo_fb 函数标记为错误,警醒我提交前要去掉。这招显然不够狠,我要是连看都不看就把 vim 关了怎么办?最有效的办法还是在提交前用 grep 搜索文件,所有有了这个 shell 脚本:

ci (){
    if [ $# -eq 0 ]; then
        echo "CVS CHECKIN: No arguments entered.";
        return 1
    else
        echo "Checking in file(s): ${@:2}";
        echo "Working ...";
        if [ "$(grep "echo_fb" ${@:2})" ]; then
            echo 'Remove debug code firstly';
        else
            cvs ci -m "\"$1\"" ${@:2}
        fi

    fi
}

这样基本就没问题了。

CVS Cheat Sheet

记住:cvs 的操作可以通过 cvs -H 来查看,比如:
cvs -H diff
CVS CHECKOUT
d 输出目录
A 重设所有 sticky tags
r 指定一个 tag
CVS UPDATE
d 参数

CVS DIFF
b 忽略行尾空格
c 输出上下文
p 显示所改变的函数名(或类名)
u 使用 unified 输出格式
r 标识 tag

CVS UPDATE
p 重定向到标准输出
r 标识tag

CVS 操作的默认参数可以写在 ~/.cvsrc 里,如
diff -bc
update -dP

USE CASE:
1. 查看历史
cvs log xx.php
cvs log -r1.5 xx.php

2. 添加文件
cvs add xx.php
cvs ci xx.php
# 添加图片
cvs add -kb xx.jpg
cvs ci xx.jpg
# 添加目录
cvs add folder1
# 不需要提交

3. 删除
rm xx.php
cvs remove xx.php
cvs commit xx.php
# cvs 无法彻底删除空目录,只能到服务端彻底删除

4. 版本恢复
cvs update -p -r 1.6 xx.php > xx.php
5. 代码更新
cvs update
cvs update -dPA
# 创建新目录(如果必要),清理空目录,重置锁定点

6. diff
cvs diff -upc xx.php
# 生成 patch
cvs diff -up xx.php > xx.patch
# 应用 patch
patch -p0 < xx.patch
# 测试 patch
patch --dry-run -p0 < xx.path

更多 CVS 操作:.bashrc