对基于regular web browser的输出进行了定制,从subversion源码包里取到toolssvnindex.xsl,在httpd.conf的svn Location段里增加了
DAV svn
SVNParentPath /usr/local/svn
SVNIndexXSLT "/svnindex.xsl"
…
</Location>
效果见如附图
Url: http://503.mygis.org
DAV svn
SVNParentPath /usr/local/svn
SVNIndexXSLT "/svnindex.xsl"
…
</Location>
效果见如附图
Url: http://503.mygis.org
add user to user file:
binhtpasswd pwd-file <username>
create bdb repository:
svnadmin create –fs-type bdb <newRepository>
svnadmin create –fs-type fsfs <newRepository>
backup repository:
svnadmin hotcopy path/to/repository path/to/backup –clean-logs
2. 下载svn-win32-1.2.3.zip,
http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91
2.1 解压缩至 c:program filessvn-win32-1.2.3目录
2.2 将sharelocale下面的删除掉,zh-CN在xp下运行不正常
3. 创建repository
svnadmin create d:/projects/pm
4. copy bin/mod_authz_svn.so 和bin/mod_dav_svn.so 到C:Program FilesApache
GroupApache2modules目录下
将bin/*.dll 复制 %apachedir%bin(实际上只要/bin/libdb43.dll复制过去就可以)
4.1 打开C:Program FilesApache GroupApache2conf下的httpd.conf
4.2 在# Dynamic Shared Object (DSO) Support段下,增加
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
note: 这两句必须加在 LoadModule dav_module modules/mod_dav.so之后,如果该语句被注释,则去掉注释;将dav_fs_module modules/mod_dav_fs.so的注释也去掉。
4.3 配置repository
htpasswd -cm d:/svn/svn-auth-file tong
new password:
confirm password:
htpasswd -m d:/svn/svn-auth-file new_user
在httpd.conf最后增加
#configuration for subVersion
<Location /svn>
DAV svn
SVNParentPath d:/svn
AuthType Basic
AuthName "Subversion repository"
AuthUserFile d:/svn/svn-auth-file
Require valid-user
AuthzSVNAccessFile d:/svn/svn-access-file
</Location>
svn-access-file结构
[svn1:/] //这表示,仓库svn1的根目录下的访问权限
harry = rw // svn1仓库harry用户具有读和写权限
sally = r // svn1仓库sally用户具有读权限
[svn2:/] //svn2仓库根目录下的访问权限
harry = r // harry用户在svn2仓库根目录下只有读权限
sally = // sally用户在 svn2仓库根目录下无任何权限
#[/] // 这个表示在所有仓库的根目录下
#* = r // 这个表示对所有的用户都具有读权限
#[groups] // 这个表示群组设置
#svn1-developers = harry, sally // 这个表示某群组里的成员
#svn2-developers = sally
#[svn1:/]
#@svn1-developers = rw // 如果在前面加上@符号,则表示这是个群组权限设置
5. 重启apache server
http://503.mygis.org/svn/测试
本文参考subversion 3.1.2 INSTALL, README
和Qt中文论坛(qtcn.org)"Subversion版本管理器简单配置说明" by XChinux
声明,本人使用opensource版,且准备要购买Qt 4.x,本信息只是在网上看着了,转帖一下,而patch是russia的朋友在rapidshare发现的,然后转告于我。如有不妥,请告知,即刻删除。
第一幕:逼上悬崖
我站在悬崖上,背着玄铁剑,出离愤怒。
这事儿你们也都知道了——我姑姑她今天早上又从这里
跳下去了。原因是我嘟囔了一句这房子就是室内污染得太厉害了,要不她怎么怀一个小小龙女,就流一次产呢?叫她去买最新的去污产品“天下无贼健康钛”,她又
说我是嫌弃他老了,不好看了,接着流产的名义要换老婆,说这叫这叫喜新厌旧。我跟她讲你没有文化不会用成语就不要乱用,她开始撒泼。撒泼无效,就冲出门去
直奔悬崖了。可见真理说不得,她流产的原因医生都说了,就是因为室内污染,甲醛超标,这是事实,人所共知。
幕后:小龙女的真面目
她现在除了还老事儿事儿地整一身白衣服穿,其他的已经没有什么地方像当初那个冰清玉洁的小龙女了。
她有以下几个重大变化:第一,发胖。婚后她变成一个喜欢吃肥肉的女人,隔三差五要求我到林子里去给她打肥猪。在婚前我们俩练剑的时候因为是混合双打经常
要有一起飞翔的高难动作,那时候这个动作做起来比较轻松而且给我一种极大的满足感。现在我再要和她那一百六十多斤的身躯再来一趟《玉女素心剑法》,下来之
后就和洗个桑拿没什么区别。
第二,唠叨。她唠叨起来无人能比。我在想当初我认识的那么多美女为什么都被我轻而易举地放走了。是啊,那时候她的涉世未深很招人喜欢,可是你应该知道涉世未深的人也会有饱经世事的时候。教训呐
第三,浅薄。女人浅薄并不奇怪,但是能浅薄到小龙女那个份上的,毕竟少。自打她开始接触社会以后,社会上那些光怪陆离肤浅粗俗的东西对她构成的诱惑总让
我提心吊胆。她对此不以为耻,反以为荣——不不不,你别给我宽心说这个叫可爱,要是你老婆奔五十岁的人了还戴小黑框眼睛染绿头发穿露脐装,你害臊不害臊?
回忆:跳崖之路
两个人的世界真是让我们两个过恶心了。所以她就开始变成一个地道的搅屎棍子。我不搭理她,她就跳崖。
根据我的不完全统计,今天这是她的第五次跳崖。比较无聊的是:我是大侠杨过,所以我不能不下去救她。最初我们的爱情是江湖中一个著名的传奇,那时候我挺
得意,逮谁跟谁讲我最早那次跳崖的英雄经历。没有想到,现在我们俩家常便饭下饺子一样的跳崖已经成了江湖中一个著名的笑话——对这个,我没有办法。
第二幕:跳下去了
住我们家隔壁的郭襄含着泪花儿跑过来,对我说,“杨大哥,你要保重啊。“多好的闺女啊。我有点感动,就把头扭向另一边,怕让她看到我的神色。稍远一点围观的群众都有点激动:“今天正好,又赶上杨过跳崖了。”“杨过,加油。”“多酷啊,好棒好棒。”
断肠崖上数百朵憔悴了的龙女花飞舞乱转。我向下看,看不到我的脚面。我也老了,发福了,有肚子了。
围观的人越来越多。
我望着断肠崖前那个深谷,只见谷口烟雾缭绕。我有点头晕。岁月如飞刀,刀刀让我老啊。我在心里最后默颂一遍:下二十米,左三米,有歪脖松;然后向下十
米,向右五米,有柏树一株;然后向下五米,有石洞一个;然后向下十二米,有石块可以落足……这条路我太熟悉了。我发誓,我今天把小龙女提溜回来以后,一定
好好教育她一顿,绝不能再有同样事件发生啦。丢不起这人呐!
我最后温习了一遍之后,双足一蹬,身子飞起,跃入深谷之中。
第三幕:结局
我下坠,下坠,下坠。脸色逐渐变了——那些松树柏树呢?
我绝望地大喊,“咱们国家不是有环境保护法吗?”我的声音在山谷里回荡,这是我这辈子最后一句话。
2.格式
Q_PROPERTY(type name
READ getFunction
[WRITE setFunction]
[RESET resetFunction]
[DESIGNABLE bool]
[SCRIPTABLE bool]
[STORED bool])
3. 使用
比有一个类,
class MyClass : public QObject
{
Q_OBJECT
public:
MyClass (QString f) {this->f =f;}
~MyClass() {}
//property begin
QString getF() const {return f;}
void setF(QString ff) {f=ff;}
//property end
private:
QString f;
};
这时在public之前定义property
Q_PROPERTY (QString F READ getF WRITE setF)
照惯例,读取函数往往省略get,即定义了
QString F() const {return f;}
这时,Q_PROPERTY (QString F READ F WRITE setF)
但实际上,读取、写、和重置(reset)函数可以是任何名字,比如前面用getF。
在使用时,属性跟一般的成员函数一样被使用,比如:
MyClass classA("initial");
QString out=classA.getF();
//out = "initial"
QString t="this is a test";
classA.setF(t);
//classA里的f现在是"this is a test"
此外,可以通过QObject::setProperty()和property()来使用属性,比如
MyClass classB("classB");
//这时的f是"classB"
classB.setProperty("F", "this is a test");
//这时调用setF("this is a test"),成员变量f现在是"this is a test"
使用setProperty可能效率比直接调用setF低,但注意到setProperty是基类的成员,所以通过QObject::property/setProperty可以遍历全部派生自QOjbect的类的属性。比如:
QObject* p = &classA;
p->setProperty("F", "test A");
p=&classB;
p->setProperty("F", "test B");
熟悉多态的朋友,马上就应该联想到这种机制的一些优越性。其中奥秘请看多类的相关描述,这里主要讲Qt的属性,不赘。
QObject::property/setProperty跟QMetaObject::propertyCount(),和QMetaObject::property()结合起来,可以实现动态的函数调用,类似于dotnet里的reflection机制。
4. 如果property的参数是enum,那么在定义Q_PROPERTY时,必须先告诉meta system使用的enum,使用宏Q_ENUMS,次序无关,如:
Q_PROPERTY(Priority priority READ priority WRITE setPriority)
Q_ENUMS(Priority)
其中Priority是枚举类型。
5.一个较为复杂的例子,使用了一个引用输入属性的写函数。请注意,此引用必须为const。
////CaliforniaWhiteWine.h
#include <QObject>
class WhiteWine
{};
class CaliforniaWhiteWine :
public QObject
{
Q_OBJECT
Q_PROPERTY(WhiteWine& m_wine READ getWine WRITE setWine)
public:
CaliforniaWhiteWine();
CaliforniaWhiteWine(WhiteWine& wine);
~CaliforniaWhiteWine();
WhiteWine& getWine() const;
void setWine(const WhiteWine& wine)
{
delete m_wine;
*m_wine = wine;
}
protected:
WhiteWine* m_wine;
};
////CaliforniaWhiteWine.cpp
#include ".californiawhitewine.h"
CaliforniaWhiteWine::CaliforniaWhiteWine(void)
{
this->m_wine=new WhiteWine();
}
CaliforniaWhiteWine::~CaliforniaWhiteWine(void)
{
delete m_wine;
}
CaliforniaWhiteWine::CaliforniaWhiteWine(WhiteWine& wine)
{
}
WhiteWine& CaliforniaWhiteWine::getWine() const
{
return *m_wine;
}