2007/01 31
To install:

* Download the SmartyView class PHP file, here. (Then unzip it)
* Place the file in the 'app/views' or 'cake/libs/view' directory of your CakePHP installation.
* Download and install Smarty, and place it (preferably) in '/vendors/smarty' (lowercase) directory.
* That's it!

To use:

* Simply set the 'view' attribute of your controller class to 'Smarty'. (e.g. $this->view = 'Smarty';)
* Then place your templates in the same directory as CakePHP them to be, but use the (.tpl) extension.
* And that's it!

For template variables:

* Set the template variables like you use to in CakePHP (e.g. $this->set('var name in template', $var);)
* Then use the variables as a regular variables in Smarty (e.g. {$var_name_in_template})

其他:
* 还需要建立
/app/tmp/smarty/
/app/tmp/smarty/compile/
/app/tmp/smarty/cache
目录并设置为可写。

原文: http://projects.simpleteq.com/CakePHP/smarty.html
Defined tags for this entry:

Posted by rollenc

Last modified on 2007-01-31 08:24
2007/01 30
上周六参加了PHPChina上海的活动,上台简单的介绍了一下EEmap开发过程中的subversion历程,也就是前两天写的EEmap的subversion历程。接下来讨论了点关于各种管理的问题,包括bug管理,项目管理工具等。不过很不好意思的,有些事情提前离开了。
感谢PHPChinaShopEx提供给我们PHPer这种交流机会和平台。在时间容许的情况下,我会一直关注的。
把几张图片也‘劫’下来,贴一个:




原文:PEA上海(第六期)活动总结
Defined tags for this entry: ,

Posted by rollenc

Last modified on 2007-03-12 04:44
2007/01 30
一直没明白翻页尽然会这么麻烦。
贴个网址,慢慢研究吧
带页码的翻页体验与设计比较
改天设计一个翻页类玩玩,现在用的翻页只是程序上的实现,在输出上只能靠设计者自己来定义使用,增加一个模板试试,实现以上的一些几个翻页效果。
Defined tags for this entry:

Posted by rollenc

Not modified
2007/01 29
所谓个人的知识爆炸不是指外界的知识过多学不完,而是学习之后没有实践消化而形成腹胀。 --rollenc

最近疯狂的汲取知识,设计模式,重构等。书基本上已经看完,我也知道,对我的影响会有多么巨大,但目前还没有这样的一个实验品来让我把我的新知识实践上去。
想找点事情做了,找一个完全由自己把握的一个实验品。
Defined tags for this entry:

Posted by rollenc

Last modified on 2007-01-31 07:58
2007/01 28
s9y默认的搜索是使用MySQL的全文检索,但他并不支持中文的搜索。不过英文搜索很强的,看一下下面来自MySQL manual的说明:
布尔全文搜索的性能支持以下操作符:

+
一个前导的加号表示该单词必须 出现在返回的每一行的开头位置。

-
一个前导的减号表示该单词一定不能出现在任何返回的行中。

(无操作符)
在默认状态下(当没有指定 + 或–的情况下),该单词可有可无,但含有该单词的行等级较高。这和MATCH() ... AGAINST()不使用IN BOOLEAN MODE修改程序时的运作很类似。

> <
这两个操作符用来改变一个单词对赋予某一行的相关值的影响。 > 操作符增强其影响,而 <操作符则减弱其影响。

( )
括号用来将单词分成子表达式。括入括号的部分可以被嵌套。

~
一个前导的代字号用作否定符, 用来否定单词对该行相关性的影响。 这对于标记“noise(无用信息)”的单词很有用。包含这类单词的行较其它行等级低,但因其可能会和-号同时使用,因而不会在任何时候都派出所有无用信息行。

*
星号用作截断符。于其它符号不同的是,它应当被追加到要截断的词上。

"
一个被括入双引号的短语 (‘"’) 只和字面上包含该短语输入格式的行进行匹配。全文引擎将短语拆分成单词,在FULLTEXT索引中搜索该单词。 非单词字符不需要严密的匹配:短语搜索只要求符合搜索短语包含的单词且单词的排列顺序相同的内容。例如, "test phrase" 符合 "test, phrase"。

若索引中不存在该短语包含的单词,则结果为空。例如,若所有单词都是禁用词,或是长度都小于编入索引单词的最小长度,则结果为空。



比如说,如果大家很讨厌rollenc而目前又想在这个blog上找subversion的资料。可以简单的搜索:+subversion -rollenc

既然不能全文检索不能支持中文,那么简单的LIKE总会吧,文章不多,所以,速度上面应该还可以接受。于是在/include/functions_entries.inc.php加上了几句,验证一下,是否是中文,是的话就使用LIKE,不是中文就使用强大的全文检索。

if(preg_match("/^[\x80-\xff]+$/", $term))
{
$cond['find_part'] = "((e.title LIKE ('%" . addslashes($term) . "%')) or (e.body LIKE ('%" . addslashes($term) . "%')) or (e.extended LIKE ('%" . addslashes($term) . "%')))";
}
else
{
if (preg_match('@["\+\-\*~<>\(\)]+@', $term)) {
$cond['find_part'] = "MATCH(title,body,extended) AGAINST('$term' IN BOOLEAN MODE)";
} else {
$cond['find_part'] = "MATCH(title,body,extended) AGAINST('$term')";
}
}

而替代以前的

if (preg_match('@["\+\-\*~<>\(\)]+@', $term)) {
$cond['find_part'] = "MATCH(title,body,extended) AGAINST('$term' IN BOOLEAN MODE)";
} else {
$cond['find_part'] = "MATCH(title,body,extended) AGAINST('$term')";
}


搞定,不过中文搜索功能较弱就是了。
注:s9y版本Serendipity 1.1,其它版本中也有是找到相应文件的MATCH (...) AGAINST 语句改掉就是了。
Defined tags for this entry:

Posted by rollenc

Last modified on 2007-01-28 16:51
2007/01 27
rollenc @ EEmap, Shanghai

Defined tags for this entry:

Posted by rollenc

Last modified on 2007-01-31 07:55
2007/01 27

1。混乱状态。



没有管理。
交流方式
通过相互的文件共享来达到代码交流的目的。
问题:无法立刻获取协作者间的代码。
不能同时对相同文件进行编辑。
代码覆盖的冲突经常发生,且不可还原


2。简单管理。



建立svn,使用文件服务器来简单的管理单一项目。
版本截图:100
rep100

解决了状态1下的各种代码交流问题。现在的交流模式方式如下图所示:

程序员中存在的错误观点:但是在刚开始使用时,很多人没有意识到meger的作用,不敢update,生怕update之后自己所修改的代码就没有了。

问题:没办法维护两个不同的版本。
由于项目的发展,第一个beta版本放出,而我们开始进行下一个版本的开发,而我个人也希望对一些代码进行整理。我初始使用了建立大量的其他文件,比如index2.php作为新版,而保持原有的index.php不变。
1。新的不能改动原有文件,因为新版还不完整,将导致错误;
2。原有文件中的bug修正可能在新的版本中同样需要,而我常常忘记把改动复制到新版。
陷入文件和版本的混乱,增加了对文件控制的复杂度。
截图rep1530
rep1530

3。subversion目录重新建构
开始使用分支:
个人分支:
我开始在建立rolelnc的个人分支,在自己的目录下进行新的开发,而不影响整个以前的版本。
而对主干只进行bug的修复
我可以随时使用meger命名来将主干的bug修复合并到我自己开发的分支上。
待我个人开发的新的功能完成时,我再使用meger命名把我的分支合并到主干上。
开发完毕之后,我可以再使用meger把我的修改合并到主干上。
流程:

截图1700


版本分支:
与个人分支相似,不过是多人对这一个分支进行开发,或者仅仅是一个版本的存档。不过后期我看到的资料显示,在tags目录下建立版本分支,如 http://192.168.0.2/svn/tags/version0.9/

4。目前的状态 截图head resp 3788


注:为了减少图片大小而展示更多的内容,以上部分图片经过了Fireworks处理。
Defined tags for this entry: ,

Posted by rollenc

Last modified on 2007-01-30 13:22
2007/01 27
今天发现,firebug升级,功能增加了好多多。适用了一下,的确不错,但是还是无法取代web developer。各有各的优势。
详情参考其官方网站http://www.getfirebug.com/
Defined tags for this entry: ,

Posted by rollenc

Last modified on 2007-01-27 01:18
2007/01 25
本来向把这些文章翻译过来的,一直太忙,时间顾不上。简单的总结和说明一下,就像是做点笔记和说明。

The Singleton and Factory Patterns in PHP: Building object-oriented forms (建立面向对象的表单)
The Singleton and Factory Patterns in PHP: designing an object factory (实现工厂)
The Singleton and Factory Patterns in PHP: a rendering-capable factory class (认识工厂模式)
The Singleton and Factory Patterns in PHP: Working With Singletons (使用单例模式)
The Singleton and Factory Patterns in PHP: Building a Form Generator Class (建立表单生成类)

rollenc笔记:
1。单例:在系统中只需要一个实例是可以使用单例模式。你一天可能需要吃多个苹果,而你只需要一把水果刀。而且,没有水果刀就去拿一把,已经有的话就直接用,不需要忽略以前的再拿新的。那么水果刀就可以作为一个单例。
在建立数据库连接是常常需要使用单例模式。在MVC系统中,也常常使用单例来调用module。在简单的代码如下:

class Db
{
/**
* @access private
*/
function Db()
{
$this->conn = mysql_connect(DB_HOST, DB_USER, DB_PWD);
if(!$this->conn)
{
die("Connect DB error!");
}
mysql_select_db(DB_NAME);
}
/**
* 使用 $db = & Db::getInstance() 来构建一个DB连接,而不是使用$db = new Db();
* 如果使用php5,可以把Db的构造函数__construct声明为private,这样在程序级强行在程序只能使用getInstance来构建,
* 但考虑兼容的代码,在php4中就只能简单的靠程序员自己来自觉遵守了。
*/
function & getInstance()
{
if (!DB :: $instance)
{
DB :: $instance = new Db();
}
return DB :: $instance;
}
/**
*其他的函数等等
*/
function query($query)
{
//Your code here
}
}
?>


2。简单工厂:文中提到的工厂属于简单工厂模式的范畴。有几个类继承于同一个类或者实现了相同的接口(文中并没有接口和继承,但是可以知道几个)。而在运行前,你并不知道你需要那一个类,那么,。你可能需要一个工厂。比如:

$fruitName = $_GET['name'];
$fruit = FruitFactory::getFruit($fruitName);
$fruit->output();
?>

在运行前,我们并不知道,我们需要建立一个什么样的Fruit对象,那么我们就把参数$_GET['name']给FruitFactory,让他来生产一个相应的Fruit对象出来。然后,我们再继续进行下面操作。我提到上面的接口的概念,也是因为后面的调用是相同的,只有具备了这些接口的对象(类)才能继续正确的运行。
Defined tags for this entry:

Posted by rollenc

Last modified on 2007-01-26 02:27
2007/01 23
前阵子在EEmap上有人回复了我的一个主题我在华农待过的地方

回复内容如下:

EEMAP爱好者 says:
而且华农的饭堂从来没有叫过一二三四食堂的!谁起的那么没水准的名字的!?
发布于: 2007-01-11 23:52


才发现,自己离华农真的很远了。以前对学校熟悉的称呼已经不存在了。
不知道,如果再回到学校,还能不能拾起那些美丽的旧回忆。
Defined tags for this entry:

Posted by rollenc

Last modified on 2007-01-27 15:29
2007/01 23
1. firebug 被评论为“感动到痛哭流涕的插件”,用来调试javascript非常的棒!
1.1 YSlow 用来查看页面中的元素加载时间等
2. web developer 也是一个开发工具,可以查看页面javascript,css,div结构等等,美工前台HTMLer必备的工具。官方有最新版
3. 这一款就不说了,免得被G,W-F封掉。浏览wiki的。
4. Google Toolbar。不习惯使用delicous,就用google的书签替代,这也是装google toolbar的主要原因。
5. downthemall 下载可就全靠他了。
6. Performancing 写Blog的好东西。也可以用来随时记录一些文字idea。
7. Super DragAndGo 还是习惯拖啊拖的。
8. Clipmarks With Clipmarks, you can clip the best parts of web pages. Whether it's a paragraph, sentence, image or video, you can capture just the pieces you want without having to bookmark the entire page.
9. Split Browser 可以把浏览器拆成多个框
10. SeoQuake
11. del.icio.us Bookmarks 书签首选
12. StumbleUpon 让我发现互联网上更多有趣,有用的信息
13 FireFTP FTP工具
Defined tags for this entry: ,

Posted by rollenc

Last modified on 2007-09-18 00:47
2007/01 23
ubuntu好像是拿版本号来开玩笑,把版本号于发布的时间相关。之前的版本没有用上,2005年10月13日发布5.10版本2006年6月1日放出6.06版10月26日更新为6.10。最近所说的最新测试版本是7.04,估计是今年4月份会放出来。
当然也看到了这个:UbuntuStudio,一个多媒体制作的工具。也是四月发布,应该是绑在ubuntu7.04中的。
期待中。。。。
Defined tags for this entry:

Posted by rollenc

Last modified on 2007-01-29 07:50
2007/01 21
前一阵加入到了一个普通项目中的开发,向通过这样来提高自己的团队协作和团队学习。
起初,看了项目的需求,其中提到了采用MVC框架开发,模块化等等。这些词对于phper来说的确很先进。不过我也纳闷,为什么客户会在需求中上写上这些。
进一步了解,开发采用自有的一套框架,和subversion管理。第一点提高了我的兴趣,目前我还没有找到一个完好的适应我的框架,也没有应用某一个框架来进行过完整的开发,正好可以有一个实际例子来学习。subversion也是我的强点。团队开发有管理中有管理就好,至少可以远离团队程序代码的修改混乱。

过了几天,拿回代码一看,傻眼了,我可爱的eclipse提示我上百的错误提示。很快对框架代码的走查,发现此套框架BUG多多,根本无法正常运行,在效率上也差的一塌糊涂。没有任何说明和注释,编程风格乱七八糟,函数耦合相当密切且很多是隐性的修改对象的值而不返回任何值。
比如一下代码

#一下代码都在mysql.php中
///-----------------------------------------------------------------------------
// 将数组装换成string,数组的元素间用","分开
///------------------------------------------------------------------------------
function handleArray(&$arrayData){
if(gettype($arrayData)!="array"){
return ;
}
for($i=0;$i $str .=" $arrayData[$i] , ";
}
$str=$str.$arrayData[$i];
$arrayData=$str;
}
///-----------------------------------------------------------------------------
//以","作为分割符,将string转换成数组
///------------------------------------------------------------------------------
function string2Array(&$stringData){
if(gettype($stringData)=="array"){
return ;
}
$array=split(",",$stringData);
$stringData=$array;
}
///-----------------------------------------------------------------------------
//连接到数据库服务器
///------------------------------------------------------------------------------
function connectDB(){
$conn=@mysql_connect($this->db_hostname, $this->db_username, $this->db_password); #$conn在这里
@mysql_select_db($this->db_name);
}
function closeDB(){
@mysql_close($conn); #很明显,$conn是之上面的connectDB中的$conn,但程序上是错误的
}
#一下这个函数有点离谱了,每一次query都connect一次,而且从不释放
function query($sql){
//print $sql;
$this->connectDB();
$this->query = mysql_query($sql);
return $this->query;
}

我想正好,刚刚学习了重构,赶快用上吧。
开始对这些代码重整,以上代码代码重构为:

/**
* 将数组$arrayData装换成string,数组的元素间用$separetor分开
* @author rollenc
* @param array $arrayData
* @param string $separeor =','
* @return string
*/
function array2String(& $arrayData, $separetor = ',')
{
if(! is_array($arrayData))
{
return $arrayData;
}
return implode($separetor, $arrayData);
}

/**
* 以$separetor作为分割符,将string转换成数组
* @param string $str
* @param string $separetor
* @return array
*/
function string2Array($str, $separetor = ',')
{
return array_filter(explode($separetor, $str));
}
/**
* 连接到数据库服务器
*/
//
//修正conn -- By rollenc
function connectDB()
{
$this->conn = @ mysql_connect($this->db_hostname, $this->db_username, $this->db_password);
@ mysql_select_db($this->db_name);
}
/**
* 关闭数据库
* 修正 -- By rollenc
*/
function closeDB()
{
@ mysql_close($this->conn);
}
/**
* 查询数据库
* @param string $sql 查询语句
* @return resource
*/
function query($sql)
{
//print $sql;
$this->query = mysql_query($sql, $this->conn);
return $this->query; //没有必要返回
}


重构很好的解决了一些基础代码的问题,但看到相应开发出来的module层和一些公用类时,愣住了:
比如一下文件:

/*
*+---------------------------------------------------------+
*| This file is part of the ***.PHP FrameWork |
*| Copyright (c) 2006 ****** |
*| |
*|$Id: public.php 464 2006-12-27
*| |
*|
*| This copyright notice MUST stay intact for use. |
*+---------------------------------------------------------+
*/

/*
*+---------------------------------------------------------+
*| Public Function Class |
*+---------------------------------------------------------+
*/


class Publics
{
var $birth_date;

function Publics()
{
$this -> birth_date = $this -> birthday(1920, 2000, 1980);
}

function birthday($year_start, $year_end, $year_def)
{
$arr_year = array();
$arr_month = array();
$arr_day = array();

for($i=$year_start; $i<=$year_end; $i++){array_push($arr_year, $i); }
for($j=1; $j<=12; $j++) {array_push($arr_month, $j);}
for($k=1; $k<=31; $k++) {array_push($arr_day, $k);}

$birth['year'] = $this -> select("year", $arr_year, $arr_year, $year_def, $year_def);
$birth['month'] = $this -> select("month", $arr_month, $arr_month);
$birth['day'] = $this -> select("day", $arr_day, $arr_day);

return $birth;

}

//-----------------------------------------------------
// 下拉选择框
//-----------------------------------------------------
function select($name,$arr_value,$arr_label,$def_value="",$def_label="",$size=1,$other=""){
$select = "";
return $select;
}

//-------------------------------------------------------
// 函数名称:letterTrans($letter)
// 大小写字母转换:输入大(小)写字母,输出小(大)写字母
// 变量:$letter
//-------------------------------------------------------
function letterTrans($letter)
{
if(ord($letter) <= 90)
{
return chr(ord($letter)+32);
}else{
return chr(ord($letter)-32);
}
}

}

$Public = new Publics;

?>

以及这段代码

#这是一个module层的代码
function QueryLevel0()
{
$conditions = "level='0' ";
$orderby = " rank asc ";
return $this->Query($conditions, $orderby);
}

function QueryLevel1()
{
$conditions = "level='1' ";
$orderby = " rank asc ";
return $this->Query($conditions, $orderby);
}

function QueryLevel2()
{
$conditions = "level='2' ";
$orderby = " rank asc ";
return $this->Query($conditions, $orderby);
}
function QueryById($id = '')
{
if ($id == "")
{
$id = $this->id;
}
$conditions = " id='" . $id . "' ";
$orderby = " rank asc ";
$num = $this->base->Select($conditions);
if ($num == 1)
{
$this->id = $this->base->values['id'][0];
$this->rank = $this->base->values['rank'][0];
$this->level = $this->base->values['level'][0];
$this->parent_id = $this->base->values['parent_id'][0];
$this->name = $this->base->values['name'][0];
$this->remark = $this->base->values['remark'][0];
$this->role = $this->base->values['role'][0];
$this->module = $this->base->values['module'][0];
$this->def = $this->base->values['def'][0];
$this->open = $this->base->values['open'][0];
$this->add_date = $this->base->values['add_date'][0];
$this->add_user = $this->base->values['add_user'][0];
$this->valid = $this->base->values['valid'][0];

return true;
}
return false;
}

从QueryById函数来将,C层调用了QueryById之后,还需要继续访问module的变量,这一点就已经失去了访问透明的概念了。
当我看到这里的时候,我彻底的崩溃了。这不是底层代码的问题了,而是其它的协作者编程的问题。这不是我所知道的任何一种技术能够解决的问题了。
通过了几天的磨合,我承受不住了,采用MVC的方式开发,负责C层的我对M层“返回”(如上QueryById所示,他没有返回给我)和调用无法正常进行,V层也没有很方便的赋值方法和如何赋值的文档,只知道类似于smartytemplate,但又很多不能正常。

没有可运行的底层,没有高级的程序领队,分离的开发却对提供给别人的接口没有任何保证。
崩溃。
Defined tags for this entry:

Posted by rollenc

Last modified on 2007-01-22 11:31
2007/01 17

Subversion 1.2(最终版)




来源:Subversion中文站
这个站有很多关于subversion的文章。建议大家去看看。
我很感谢这个站,subversion的手册翻译的很好。我的subversion第一堂课使用的就是这个。
Defined tags for this entry: ,

Posted by rollenc

Last modified on 2007-01-29 07:48
2007/01 16
很多人开始使用subversion之后,就想着,要建立一个测试用的服务器,不需要把文件update到本地再进行测试。这个在我以前的一篇文章中写过,但当时理解也不深,也写得很含糊。现在连自己都看不懂了。

原理: 基于subversion的钩子,即hook。在subversion执行一个操作时,那会相应的首先去调用相关的钩子程序(如果存在的话)。那么实现一个同步的测试服务器,我们只需要在一个用户执行完毕一个commit操作之后,让钩子程序去自动更新测试服务器的文件即可。通过这个思路,我们需要作的就是建立一个post-commit的钩子。

钩子文件在你的svn源目录下,即存放subversion版本数据的文件夹。以前面我写的两篇文章中的情况为例,
文一(win)的钩子文件应该在 E:\svn2\hooks
文二(Linux)的钩子文件应该在 /var/svn/hooks
文件夹内已经存在有一些.tmpl文件,这些只是一些模板(TeMPLate)或者说是示例文件。它们不会被执行。


先以linux为例,来讲讲如何构建一个同步的测试服务器127.0.0.2(在Ubuntu 6.10, apache2.0.55,subversion1.3.1下调试通过。2007/1/18)
我们假设你已经建立好了一个apache+subversion的环境。
0.准备工作
为同步服务器建立访问subversion版本的权限,清参考以前的文章

sudo htpasswd2 /etc/apache2/dav_svn.passwd server

1. 使用checkout建立一个工作复本

cd /var/www
sudo mkdir /var/www/127.0.0.2 #建立测试服务器站点根目录
sudo chown www-data.www-data 127.0.0.2 #更改用户所有者
sudo su www-data #切换到www-data,需要使用sudo,因为超级权限可以使用任何用户,而不需要密码,执行后会发现命令提示符可能会有变化
svn checkout http://127.0.0.10/lab.luochunhui.com/trunk 127.0.0.2 #取出subversion上的文件,可能需要密码
# 请保证执行checkout语句的用户是www-data,否则在以后钩子调用update时会出现无法创建或修改文件的错误
exit #退出www-data用户

说明:我们必须把/var/www/127.0.0.2目录的所有者设置成apache的运行者(www-data), 他必须对文件夹具有完全的可读写操作权限。我使用
sudo chown www-data www
sudo su www-data

这样的方式来避免把/var/www/127.0.0.2目录设置成777的权限。
另外可以执行下面的代码实现相同的功能:

cd /var/www
sudo mkdir /var/www/127.0.0.2 #建立测试服务器站点根目录
sudo svn checkout http://127.0.0.10/lab.luochunhui.com/trunk 127.0.0.2 #取出subversion上的文件,可能需要密码
sudo chown -R www-data.www-data 127.0.0.2/ #把文件用户修改成apache的执行用户

之后使用


ls -Al 127.0.0.2


应该可以得到

drwxr-xr-x 7 www-data www-data 4096 2007-01-17 10:21 .svn
...一些其他的文件


2。设置apache,把你需要的域名指向这个文件夹。

sudo gedit /etc/apache2/sites-available/127.0.0.2

输入以下文字


ServerAdmin rollenc@localhost.com
ServerName localhost
DocumentRoot /var/www/127.0.0.2

Options FollowSymLinks
AllowOverride None


Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
# Uncomment this directive is you want to see apache2's
# default start page (in /apache2-default) when you go to /
#RedirectMatch ^/$ /apache2-default/


ErrorLog /var/log/apache2/127.0.0.2_error.log

# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn

CustomLog /var/log/apache2/127.0.0.2_access.log combined
ServerSignature On


启用他

sudo ln -s /etc/apache2/sites-available/127.0.0.2 /etc/apache2/sites-enabled/127.0.0.2

重启apache。

sudo apache2 -k restart

在浏览器上使用http://127.0.0.2可以浏览到你subversion上最新版本

3。建立钩子
现在是关键的一步,我们需要使我门的测试服务器127.0.0.2进行同步更新:
在/var/svn/hooks/目录下建立post-commit文件

cd /var/svn/hooks/
sudo gedit post-commit

输入以下内容

#!/bin/sh
REPOS="$1"
REV="$2"
svn update /var/www/127.0.0.2 --username server --password serverpassword
#echo `whoami`,$REPOS,$REV >> /home/rollenc/svn_hook_var.txt
#svn update /var/www/127.0.0.2 --username server --password serverpassword 2>/home/rollenc/svn_hook_log.txt

说明:REPOS即第一个变量$1是subversion数据库的地址,REV即第二的变量$2是commit之后的版本号。
编辑完毕后设置文件权限为可执行:

sudo chmod 755 post-commit

搞定。
下面来试一下,同步有没有成功。
再建立一个工作副本,然后添加或者修改一些东西,最后上传。
以下的操作是在客户端中进行了,不需要在服务器断进行。

cd /var/www
svn checkout http://127.0.0.10/lab.luochunhui.com/trunk 127.0.0.6 #取出subversion上的文件作为你的工作副本,你的工作以后就在这个文件夹内展开。
#所以,不需要sudo,但要保证有127.0.0.6文件夹存在,而且可写
echo '' > phpinfo.php #建立一个phpinfo文件
svn add phpinfo.php #把phpinfo加入版本库
svn commit #提交

在浏览器中你设定的同步服务器地址http://127.0.0.2/phpinfo.php,愿上帝保佑你的成果一切正常。可以看到phpinfo的信息。

如果不正常你可以稍微修改上面使用#注释掉的命名,使其输出的文件目录符合你的系统。
去掉#,重新运行,并通过查看上面设置的txt来获得一些信息。
第一句[#echo ...]是获取当前的执行用户(如果正常应该与apache的执行用户和测试服务器文件所有者相同),$REPOS,$REV是获得的两个参数
第二句[#svn...]是把update的获取update的结果,一般错误信息在这里可以得到。


在Windows下我使用同样的方法试图建立钩子,但没有成功。感谢水蓝色青蛙(QQ:565259)的帮助,windows下的钩子问题解决。
以下是方法和代码,在windows XP下测试成功。
1,2步很类似,不再重复了
经过1,2步的操作之后,DIR的值E:/htddocs/testserver.lab.luochunhui.com 为测试服务器的根目录。如果是win2003,你可能还需要参照ubuntu的方法设置一些权限。
第三步的中的钩子程序名称需要改为:post-commit.bat写成如下:

@echo off
SET REPOS=%1
SET USER=%2
SET SVN="D:/subversion/bin/svn.exe"
SET DIR="E:/htddocs/testserver.lab.luochunhui.com"
(call %SVN% update %DIR% --username server --password serverpassword --non-interactive)


-------------以下内容已删除-----------

SET REPOS=%1
SET REV=%2
SET svn="D:/subversion/bin/svn.exe"
SET DIR="E:/htdocs/testserver.lab.luochunhui.com"
%svn% update %DIR%

按理说,和linux的执行是一样的,但就是出错。
如commit一个test文件,则显示错误信息为:

Modified: E:\htdocs\testcopy\test.php
Sending content: E:\htdocs\testcopy\test.php
Error: Commit failed (details follow):
Error: MERGE request failed on '/lab.luochunhui.com/trunk'
Error: MERGE of '/lab.luochunhui.com/trunk': 200 OK (http://127.0.0.10)

而此时,test.php已经commit成功,在subversion数据库中已经存在有本次记录,但E:\htdocs\testcopy工作复本还是显示为没有commit。需要同步的E:/htdocs/testserver.lab.luochunhui.com也没有update。

我个人压根不懂windows下的编程,以上代码是边google边学来的。所以还是希望有达人帮忙,好让我完成这篇blog,我也好给大家一个完整的交待。

最终参考了一些文档,还是没能解决win下的问题,我把测试和输出结果放下面:

@echo off
echo "" > E:/hookLog.txt
echo "1" >> E:/hookLog.txt
SET REPOS=%1
echo "2" >> E:/hookLog.txt
SET USER=%2
echo "3" >> E:/hookLog.txt
echo %REPOS%, %USER% >> E:/hookLog.txt
SET SVN="D:/subversion/bin/svn.exe"
echo "4" >> E:/hookLog.txt
SET DIR="E:/htdocs/testserver.lab.luochunhui.com"
echo "5" >> E:/hookLog.txt
REM call %SVN% update %DIR% >> E:/hookLog.txt
REM SET PATH=D:/subversion/bin/
REM svn update "E:/htdocs/testserver.lab.luochunhui.com" >> E:/hookLog.txt
(call %SVN% update "E:/htdocs/testserver.lab.luochunhui.com") >> E:/hookLog.txt
echo "6" >> E:/hookLog.txt

REM是注释,REM掉了我使用的很多种测试,切换REM可以运行其它的一些测试,但是全部无效。
以下是上面代码的输出:

""
"1"
"2"
"3"
E:/svn2, 54
"4"
"5"
"6"

1-6全部正常输出,惟一的是 svn update这一句没有输出任何东西。
完全放弃!等待达人。。。。
------------以上内容已删除-----------------



有问题也欢迎在下面贴出,乐意帮忙:)
Defined tags for this entry: ,

Posted by rollenc

Last modified on 2007-02-05 14:52

(Page 1 of 2, totaling 27 entries)