~ ~slow it down~ ~
目标:弄清楚subversion的模块,封装一个win32/unix的subversion client, 提供checkout,update接口
svn: 版本管理工具,官网:http://subversion.apache.org/
工程下载:http://subversion.tigris.org/servlets/ProjectDocumentView?documentID=41046&showInfo=true (找这个工程文件找了很久,太不人性化了)
subversion封装的库:
Repository layer:libsvn_fs,libsvn_fs_base,libsvn_fs_fs,libsvn_repos
repository access layer: libsvn_ra, libsvn_ra_neon, libsvn_ra_local, libsvn_ra_serf, libsvn_ra_svn
client layer :libsvn_wc,livsvn_client
/********************************************/
win32 下开发 simple subversion client ,参考svn.exe,根据libsvn_client库封装一个简单的客户端
开发工具:vs2005
操作系统:windows xp(windows 7下有问题)
svn版本:1.6.16
/********************************************/
//////////////////////////////
参考资料:svn.exe
1,download builder project:
http://subversion.tigris.org/servlets/ProjectDocumentView?documentID=41046&showInfo=true
2,编译svn客户端的错误修复
a,主要是通过查看subversion_vcnet.sln和它关联的vcproj的内容来补齐工程。
解决方法:出来不少错误,zlib nmake 找不到文件之类的。通过查看zlib的vcproj的内容(用记事本打开zlib.vcproj), 发现zlib工程下的c文件都是关联在c盘的绝对路径下的。
方案1,把svn-builder解压到c盘根目录下,编译通过。
方案2,修改所有的vcproj下的c文件的目录,改成相对路径.
b,error prj0019 工具从 正在执行自定义生成步骤的错误,查看错误,是Python命令识别不了
解决方法:安装python2.x的版本,同时添加到环境变量,重启电脑。
编译通过后,运行svn.exe,把需要的dll放在同一个目录下
可能的问题:
安装vs2005 补丁。
http://www.microsoft.com/downloads/zh-cn/details.aspx?displaylang=zh-cn&FamilyID=766a6af7-ec73-40ff-b072-9112bab119c2
s/system32/test.exe”的激活上下文生成失败。 找不到从属程序集 Microsoft.VC80.MFC,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.762"。 请使用 sxstrace.exe 进行详细诊断。
出现这类问题,是由于VC2005编译出来的程序文件,采用了manifest方式来指定dll文件。对于win98、win2000系统,把exe文件和VC的 dll连接库放到一起就成了。对于winxp、win2003系统就要麻烦的多了,VC的连接库默认是被放到了winsxs目录下。
解决办法就是:使用vcredist_x86.exe再次分发程序。重启。
///////////////////////////////////////////////////////////////////////////////
具体的开发:
1,minimal_client.c的实现。
把需要的关联库拷贝在deps文件夹下。并在文件头加入以下链接:
#include "../deps/svnClient/include/svn_client.h"
#pragma comment(lib, "..//deps//svnClient//debug//libsvn_client//svn_client-1.lib")
#pragma comment(lib, "..//deps//svnClient//debug//libsvn_wc//svn_wc-1.lib")
#pragma comment(lib, "..//deps//svnClient//debug//libsvn_ra//svn_ra-1.lib")
#pragma comment(lib, "..//deps//svnClient//debug//libsvn_delta//svn_delta-1.lib")
#pragma comment(lib, "..//deps//svnClient//debug//libsvn_diff//svn_diff-1.lib")
#pragma comment(lib, "..//deps//svnClient//debug//libsvn_ra_local//libsvn_ra_local-1.lib")
#pragma comment(lib, "..//deps//svnClient//debug//libsvn_ra_svn//libsvn_ra_svn-1.lib")
#pragma comment(lib, "..//deps//svnClient//debug//libsvn_ra_neon//libsvn_ra_neon-1.lib")
#pragma comment(lib, "..//deps//svnClient//debug//libsvn_repos//svn_repos-1.lib")
#pragma comment(lib, "..//deps//svnClient//debug//libsvn_fs//svn_fs-1.lib")
#pragma comment(lib, "..//deps//svnClient//debug//libsvn_fs_base//libsvn_fs_base-1.lib")
#pragma comment(lib, "..//deps//svnClient//debug//libsvn_fs_fs//libsvn_fs_fs-1.lib")
#pragma comment(lib, "..//deps//svnClient//debug//libsvn_fs_util//libsvn_fs_util-1.lib")
#include "../deps/svnClient/include/svn_cmdline.h"
#pragma comment(lib, "..//deps//svnClient//debug//libsvn_subr//svn_subr-1.lib")
#pragma comment(lib, "..//deps//apr//Debug//libapr-1.lib")
#pragma comment(lib, "..//deps//apr-iconv//Debug//libapriconv-1.lib")
#pragma comment(lib, "..//deps//apr-util//Debug//libaprutil-1.lib")
#pragma comment(lib, "..//deps//apr-util//xml//expat//lib//LibD//xml.lib")
#pragma comment(lib, "..//deps//zlib//debug//zlib.lib")
#pragma comment(lib, "..//deps//svn-libintl//lib//intl3_svn.lib")
#pragma comment(lib, "..//deps//neon//libneonD.lib")
#pragma comment(lib, "..//deps//sqlite3//lib//sqlite3.lib")
#pragma comment(lib, "..//deps//db4-win32//lib//libdb44d.lib")
#pragma comment(lib, "ws2_32.lib")
使用:文件运行的时候加一个url参数(可以在cmd里,也可以在vs2005里加),显示此url下的文件架构。本来以为只要包含一个svn_client lib库就够了。结果要那么多关联库。
2,checkout,update的实现
http://linuxdevcenter.com/pub/a/linux/2003/04/24/libsvn1.html?page=2
/********************************************/
unix : subversion client
related url:
gcc的一些帮助。链接动态库和运行的时候着实花了一些时间。花时间看看gcc的基础知识。
http://www.iteye.com/topic/261176
http://blog.csdn.net/absurd/archive/2006/02/07/593899.aspx
/********************************************/
cc mini_client.c -o minimal_client -I/usr/local/include/subversion-1 -I/usr/local/apr/include/apr-1 -L/usr/local/apr/lib -L/usr/local/lib -lsvn_client-1 -lapr-1 -laprutil-1
///////////////////////
下面的内容太乱了,等写好后整理。
/////////////////////////////////////////////////////////////////////////////////////////////////
win32 build subversion from source code
http://rocksun.cn/?p=103
http://www.windameister.org/blog/category/programming/svn-programming/
http://cache.baidu.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f726678b86462083c809d5331b564711befb723f405a8e90613652e91e09b7b07d6f75437de2db9bd71586e7c7356ad37b35704ad1050fc75cf28b102a8173d201bfee5dbbadf043d6f58e85821112&p=c377c815d9c043a504abc92d021083&user=baidu&fm=sc&query=rapidsvn+windows&qid=81277d2c01341c37&p1=9
http://www.baidu.com/s?bs=rapidsvn&f=8&wd=rapidsvn+windows
1,下载源代码和关联库:
http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=260&expandFolder=74
2, install.txt , 关联库apr, apr-util, and neon 在deps文件夹里
必须要安装的关联库:
win32 make命令:
Makefile.msc是在windows环境下采用微软编译器(vc6.0、VS2008等)的make文件,列出了4种编译方法:
# Usage:
# nmake -f win32/Makefile.msc (standard build)
# nmake -f win32/Makefile.msc LOC=-DFOO (nonstandard build)
# nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" /
# OBJA="inffas32.obj match686.obj" (use ASM code, x86)
# nmake -f win32/Makefile.msc AS=ml64 LOC="-DASMV -DASMINF" /
# OBJA="inffasx64.obj gvmat64.obj inffas8664.c" (use ASM code, x64)
apr, apr-util, apr-iconv:直接用vs2005release编译
zlib:
1,修改makefile.msc, objs 添加inffast.obj
http://www.cppblog.com/fwxjj/archive/2010/09/26/127733.html
2, nmake -f win32/Makefile.msc
sqlit
neon: nmake -f neon.mak
/////////////////////////////////////////////////////////////////////////////////////////////////
win32 client install
1,必须的关联库:apr, neon, zlib,把deps解压到subversion目录下。
2,cleanup, 防止以前旧版本的apr, zlib库section II.B
3, ./config --with-apr= --with-apr-util=
/////////////////////////////////////////////////////////////////////////////////////////////////
unix server
1, 装好所有关联库
2,install
$ ./configure
$ make
# make install
3,build
/////////////////////////////////////////////////////////////////////////////////////////////////
unix client
1, cleanup
# rm -f /usr/local/lib/libsvn*
# rm -f /usr/local/lib/libapr*
# rm -f /usr/local/lib/libexpat*
# rm -f /usr/local/lib/libneon*
2, 查看所有关联库是否已存在
$ sh ./autogen.sh
3,
$ ./configure
$ make
# make install
/////////////////////////////////////////////////////////////////////////////////////////////////
unix下如何开发subversion
1,build enviroment,在http://subversion.apache.org/docs/community-guide/building.html 下载makefile.svn文件。
用makefile.svn在一个什么都没装的unix上启动。它主要是通过Internet来下载所有的关联库
makefile.svn的使用
创建一个文件夹$(SVN_DEV)来存放所有的东西。
$(SVN_DEV)/prefix 目录下安装subversion的所有库和二进制文件
$(SVN_DEV)/prefix/svn-trunk 包含最新的subversion的二进制文件
$(SVN_DEV)/prefix/svn-trunk/bin 加到$path系统变量
$(SVN_DEV)/svn-trunk 存放makefile
`svn up` to pull the latest changes
`make` and `make install` to install the binaries in $(SVN_DEV)/prefix/svn-trunk.
如果要重新编译,<PACKAGE>-reset - reinstall
nuke:回到安装前的状态
2,configration/build system,在http://svn.apache.org/repos/asf/subversion/trunk URL上存放的是最新的subversion的代码,用tortoise checkout的目录下的makefile.in文件
checkout根目录下:gen-make.py, build.conf俩文件生成build-outputs.mk,在makefile.in文件中被使用。
步骤:
a, cleanup all old installed subversion libs
创建一个/usr/local/cleanup.sh文件。
#!/bin/sh
# Take care of libs
cd /usr/local/lib
rm -f APRVARS
rm -f libapr*
rm -f libexpat*
rm -f libneon*
rm -f libsvn*
# Take care of headers
cd /usr/local/include
rm -f apr*
rm -f svn*
rm -f neon/*
# Take care of headers
cd /usr/local/apache2/lib
rm -f *
# take care of execute
cd /usr/local/bin
rm svn*
b, configuration
$ ./autogen.sh
$ ./configure OPTIONS
./gen-make.py build.conf 生成build-outputs.mk
$ make
$ make check
$ make install
3,测试subversion/tests
输出format: (PASS | FAIL): (argv[0]) (argv[1]): (description)
For example,
[sussman@newton:~] ./frobtest 2
PASS: frobtest 2: frobnicating fragile data
[sussman@newton:~]