I can believe fly.

Wednesday, March 4, 2009

发布版本归档问题分析

  前段时间兴匆匆的定制了发布版本归档备份说明,大概的内容是发布版本有哪些类别/每个类别有哪些具体的版本/存储位置/存放的目录结构。当时就直接按照版本来划分目录结构了,即第一层是类别,第二层是具体的版本,第三层是对应的构建版本。今天在收集过往的版本时发现了一个问题。
  由于归档的版本要求除了安装包,其散文件也一样要存。那么,如果归档的发布版本与安装包与安装包的散文件不是一一对应关系,就会有个困惑:在归档的备份存储位置,N个版本共用的安装包散文件该如何存放呢,这时候就不是直接将构建版本拉到第三层就可以搞定的?想来想去,就是觉得当初定的结构一点也不适用了。
附加资料:
关系说明:
1. 归档版本[1]-安装包[1]-安装包散文件[1]
2. 归档版本[N]-安装包[N]-安装包散文件[1]
目录结构:
1. 构建版本的原始存放形式:
+ 20080304.100
| | - installfile 存放散文件
| | - package   存放安装包
| |  |- setup    存放特殊包
| |  |  |- A
| |  |  |- B
| |  |  |- C
| |  |  |- D
| |  |  |- E
2. 版本发布出去后存档形式:
+ 版本类别
| | - A 
| | - B   
| | - C 
| | - D   
| | - E 
改进方法:
1. 去掉第一层/第二层,直接以第三层形式存档,然后以记录形式来区分每个版本。(这是目前最优的方式),但这种方式也有一个缺陷:如果构建出来的所有版本并不是全部要发布的,那这时候是全部归档还是去掉不发布的版本呢?
2. 如果需要归类版本的话,那直接存储安装包就可以. 对应的散文件仍在构建版本存放的位置去取。(这是个人的理想方式,不过涉及的改进范围广)



Thursday, February 26, 2009

wget使用经验

使用wget命令,取远程数据,远程有几层目录,在本地就会跟着创建.
如,执行wget -c -r -np -nH ftp://192.168.11.10/public/yusulian/ysl/20090225
==>结果会在本地跟着创建public/yusulian/ysl/20090225
有一个--cut-dirs=NUMBER 参数,即忽略远程目录的层数,
1. 如果是手工执行的时候,你可以自觉的写上要忽略的层数
如,执行wget -c -r -np -nH --cut-dirs=3 ftp://192.168.11.10/public/yusulian/ysl/20090225
==>结果在本地只会创建20090225,把前三层忽略了.
2. 如果是想写脚本自动跑,由于不同的url,目录层级可能不同
你只能在脚本外层,除了初始化url,也需要加上每个url要忽略的目录层数

ps:误区
有人提醒说,把-cut-dirs设为10000,反正目录不为这么多
结果,试了一下才发现,这不是把子目录也给忽略掉了嘛.





Tuesday, January 20, 2009

StatSVN统计工具使用指南

= StatSVN统计工具使用指南 = == 概述 == * StatSVN是Java写的开源代码统计程序,从statCVS移植而来,能够从Subversion版本库中取得信息,然后生成描述项目开发的各种表格和图表。 == 目的 == * 本文目的是介绍statSVN的使用。 == 步骤 == 1. '''准备工作''' a. Java环境: StatSVN需要Java的运行环境支持,请确保java文件可以运行. a. 安装SVN客户端命令: Statsvn需要用到SVN命令,请确保可用 a. 下载StatSVN: http://www.statsvn.org/index.html下载 1. '''统计工作''' a. co工作拷贝: 从你要统计的SVN仓库获取一份数据到本地,请确保是最新版本。 a. 日志文件生成: 在工作拷贝的本地目录下执行 svn log --verbose --non-interactive --no-auth-cache --xml>statsvn.log ,生成该仓库的日志文件statsvn.log,该文件是给StatSVN分析用的,名称可自定义。 a. 统计: 执行java -jar statsvn.jar -output-dir "E:\SCM\starsvn\rel\" E:\WorkDir\svn.rdev\ACLrepos\statsvn.log E:\WorkDir\svn.rdev\ACLrepos ,其中后面三个参数分别是:统计文件生成路径 统计对象的日志文件 工作拷贝的本地目录 命令格式: java -jar statsvn.jar [options] ,其中[options]为可选参数,该参数格式及用法如下: {{{ -version print the version information and exitvyqye -output-dir directory where HTML suite will be savedvyqye -include include only files matching pattern, e.g. **/*.c;**/*.hvyqye -exclude exclude matching files, e.g. tests/**;docs/**vyqye -tags show matching tags in lines of code chart, e.g. version-.*vyqye -title vyqye -viewvc integrate with ViewVC installation at vyqye -bugzilla integrate with Bugzilla installation at vyqye -username username to pass to svnvyqye -password password to pass to svnvyqye -verbose print extra progress informationvyqye -xdoc optional switch output to xdocvyqye -threads how many threads for svn diff (default: 25)vyqye -concurrencyThreshold switch to concurrent svn diff if 1st call>thrvyqye eshold (default: 4000)vyqye -dump dump the Repository content on consolevyqye }}} 1. '''统计结果''' * 生成一批静态文件 * 利用浏览器打开index.html,查看: * 代码行数的时间线; * 针对每个开发者的代码行数 * 开发者的活跃程度 * 开发者最近的提交;这里new代表新增的文件,del代表删除文件,+int代表该文件新增代码行数,-int代表该文件删除代码行数vyqye * 文件数量 * 平均文件大小 * 最大文件 * 哪个文件是修改最多次数的 * 目录大小 * 带有文件数量和代码行数的Repository tree 1. '''相关资讯''' * statsvn用户手册: http://wiki.statsvn.org/User%20Manual.ashx

Svnmanager工具配置报告


0. 安装apache2.x+mysql5.x+php5.2.5+svn1.5.4  其中,php还需要安装VersionControl_SVN-0.3.1.tgz.tar
1. 将svnmanager工具解压到我的apache发布目录下/usr/local/www/apache22/data
如果你在发布目录下增加一个子目录即svnmanager,则在url访问时必带上即
http://192.168.0.1/svnmanager/index.php
2. 配置,在svnmanager的根目录下找到config.php.linux(这是针对linux)改名为config.php且修改以下信息:
$htpassword_cmd = "htpasswda工具的路径";
$svn_cmd = "svn工具路径";
$svnadmin_cmd = "svnadmin工具路径";

//Subversion locations
$svn_repos_loc = "仓库的父目录";
$svn_passwd_file = "账号文件";
$svn_access_file = "权限文件";
$admin_name = "svnmanager页面登陆账号";
$admin_temp_password = "svnmanager页面登陆账号的密码";
3. 问题
(1) 用admin登陆,只看到用户管理跟退出,奇怪,其它功能?
后面才发现,原来后台设置的账号是临时账号,你必须自己创建一个管理员的账号,重新登陆.
(2)操作:Repository administration->User/Gropu Privileges->任意一个select
错误信息:
[2] UserPrivilegesEditPage::require_once(VersionControl/SVN.php) [userprivilegeseditpage.require-once]: 
failed to open stream: No such file or directory (@line 201 in file C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\svnmanager\svnmanager\RepositoryModule\UserPrivilegesEditPage.php).
Debug Backtrace
#1 UserPrivilegesEditPage.php:201 -- pradoErrorHandler(...)
#2 UserPrivilegesEditPage.php:201 -- UserPrivilegesEditPage::onLoad()
#3 TControl.php:419 -- UserPrivilegesEditPage->onLoad(...)
#4 TPage.php:1079 -- TControl->onLoadRecursive(...)
#5 TPage.php:955 -- TPage->onLoadRecursive(...)
#6 TApplication.php:483 -- TPage->execute()
#7 index.php:5 -- TApplication->run() 
解决:
a. 查找查UserPrivilegesEditPage.php中的require_once("VersionControl/SVN.php"),确认下位置
b. 到相关pear下查找SVN.php文件的位置,本人自己找到是以下两个位置
/usr/ports/devel/pear-VersionControl_SVN/work/VersionControl_SVN-0.3.1
/usr/local/share/pear/VersionControl_SVN
c. 经过自己分析,将require_once("VersionControl/SVN.php")改为require_once("VersionControl_SVN/SVN.php")
d. 测试通过.
ps: 本人分析出一个规律是,这里的路径是pear的相对路径.所以这里解决方法只作参考不是所有人都受用,请根据实际情况调整.
同时,解决了用户管理,别忘组的管理也要调整即GroupPrivilegesEditPage.php 文件.
(3)解决中文乱码问题~参考别人,未实验
修改 svnmanager\global\header.tpl  将页面的字符集设置为 gbk 或者 gb2312

因为这里使用的是 mysql 数据库,因此修改 
svnmanager\prado-2.0.3\framework\Data\adodb\drivers\adodb-mysql.inc.php
在 function _connect 倒数第三行前加入 mysql_query("set names 'gbk'"); 
设定操作mysql的字符集为GBK

                        mysql_query("set names 'gbk'");                
                  if ($this->_connectionID === false) return false;
                if ($argDatabasename) return $this->SelectDB($argDatabasename);
                return true;        
        }
(4)用户管理中的邀请操作,邮件发送失败~参考别人,未实验
错误信息:
Something went wrong sending email, please contact server administrator!
说明: 没找到解决方法
(5)不能自动过滤不属于仓库
错误信息:
{svn: URL 'file:///storage/yslProR/conf' non-existent in that revision (cmd: svn list --non-interactive file:///storage/yslProR/conf)
Command used: svn list --non-interactive file:///storage/yslProR/conf}
说明:由于不支持过涉仓库,所以在获取不是svn仓库时,就会报如上错误了.


通用性考虑不全:
1.不支持ldap的账号,只能管理传统的账号文件
2.不支持导入原有的权限分配,需要重新建立
3.导入现有库不支持自动过滤不属于库的信息即会把指定父目录下的子目录都当作是库
4.不支持多库配不同的权限文件
5.权限文件的格式只能基于[库名:相对路径],不支持[相对路径]

改进建议:
1. 用admin登陆,应该提醒用户创建一个新的管理账号
2. 用新的管理账号登陆,进行数据初始化
a. 导入仓库:指定仓库的目录获取且支持自动过滤不相关的库
b. 用户初始化:
(a)支持一对一即一个仓库对应一份账号文件
(b) 支持多对一即多个仓库对应一份账号文件
(c) 支持ldap账号,获取数据库的账号信息
c. 权限初始化:
(a)支持一对一即一个仓库对应一份权限文件
(b) 支持多对一即多个仓库对应一份权限文件

Tuesday, January 13, 2009

redhat8装SVN工具

[root@DB-RH8-x86 root]# rpm -q apr
apr-0.9.5-0.2
[root@DB-RH8-x86 root]# rpm -q apr-util
apr-util-0.9.12-2
[root@DB-RH8-x86 root]# rpm -q neon
neon-0.24.7-1
[root@DB-RH8-x86 root]# rpm -q subversion
subversion-1.3.2-1
不要装apr-0.9.12-2.i386.rpm. 装apr-0.9.5-0.2.i386.rpm就可以了.

 * 以上是同事在redhat8装SVN工具 正常的版本组合,参考了

Tuesday, January 6, 2009

linux定时启动

资料上说执行 crontab -e ,编辑完会自动保存到/var/spool/cron/username.
可是linux的编辑模式太痛苦了,后面还是叫sa处理一下,
结果,他直接在etc/crontab上加,有点奈闷,这又是啥原理嘛
 算了, 这不是很重点, 还是具体了解下它的文件格式:
句式: 
1 0 * * * elian /home/elian/build/build.sh 1>/dev/null 2>&1
说明:
  1. 前五位分别是: 分/时/日/月/周
  2. 第六位是执行的用户
  3. 第七位是执行的命令
后记:
 呵呵,在etc/crontab添加,没有自动跑起来,最后还是用起了 crontab -e 的方式

Monday, January 5, 2009

sh,不得不说

   sh,即shell啦..鉴于对win的熟悉,在它的环境下从不用刻意的说要学下bat,想要什么就拿什么的感觉. 但在linux下用sh,还是挺陌生的,决定将用过的信息记载下

username=$(svnlook author "$REPOS" -t "$TXN")
## 将执行svnlook命令获得的值赋给username变量

if [ "$username" = "yusulian" ];
then
 exit 0;
fi
## 比较username账号的值是不是等于yusulian,如果是就退出去(exit 0)
## 这里要注意的是比较的格式一定不要漏掉中括号[条件]