2009年2月26日星期四

切换hg分支

用hg已有多日,下面的这个法子是前段时间摸索出来的偷懒招数。

问题是这样:项目中有两个代码库分支:trunk和1.2。每个代码库都超过500M。我的C盘剩余空间已经不多,没法同时保留两个分支的本地副本。平时我主要在trunk上工作,有时要修1.2的bug就得把分支切换到1.2上。重新checkout整个代码库很慢,怎么办呢?

既然是分支,那它们肯定在某一点之前共享相同的历史。所以我只需要先回溯到这个基点,再获取1.2分支上自从这一点后所有的历史即可!

具体做法:

1. 执行hg out ${url_of_1.2},得到trunk分支上与1.2不同的最早的节点,记为revision1
2. 执行hg strip revision1,删除以revision1为根的所有版本
3. 重复步骤1,检查是否还有1.2分支上不存在的版本;如有,则重复步骤3
4. 至此,本地副本上的所有版本都是1.2上的版本;这时可以执行hg pull ${url_of_1.2}获取1.2上的新的版本
5. 大功告成,你已经得到一个与中心库上1.2分支完全一致的代码库

2009年2月11日星期三

Inline parameter

Derek同学的启发,我想把我们在实践中总结下来的一些重构小技巧记录下来。

我们自己在实际中经常用到Extract Parameter这个重构功能,感觉非常方便。但可惜的是没有这个功能的反向功能。比如说一个方法接受三个参数,但检查这个方法所有的调用处发现,第三个参数完全可以由前两个参数(或者其他可视范围内的值)计算得出。这时你就需要一种重构来把这个参数的计算过程推到方法内部,然后删除这个参数。

遗憾的是IntelliJ不提供这样的自动化重构功能。我们可以手动来做,但如果代码很多,就有风险。怎么尽量降低这种风险呢?

我想到了一种方法。假设目标方法为foo,我们想要删除的参数为bar。步骤如下:
1. 对计算bar的表达式提取方法(IntelliJ能自动检测到相同代码片段并提示自动替换)
2. 在方法foo的所有调用处,把参数bar替换为对新方法的调用
3. 修改foo方法的代码,在第一行将bar赋值为对新方法调用的返回值
3. (在foo方法内,)内联bar(,然后bar在foo方法内部已没有引用)
4. 修改foo方法的签名,安全删除bar(所有调用处用于生成bar的表达式即自动删除)