??xml version="1.0" encoding="utf-8" standalone="yes"?> 1. CVS(Concurrent Version System)安装CZ 2. CVS功能 3. 构徏你的CVSpȝ 5. 查看文g状?br />{:1) 查看所有文件的状?br /> %cvs status 6. 同步更新状?br />{:1) 同步所有文?br /> %cvs update 7. 高命o ()
{:1) 下蝲地址Q?a href="ftp://ftp.sunfreeware.com/pub/freeware/sparc/8/cvs-1.11.5-sol8sparc-local.gz">ftp://ftp.sunfreeware.com/pub/freeware/sparc/8/cvs-1.11.5-sol8sparc-local.gz;
2) 包解压:%gunzip cvs-1.11.5-sol8-sparc-local.gz;
3) 安装Q? 用户dQ?su -
. 使用pkgaddq行安装Q?pkgadd -d cvs-1.11.5-sol8-sparc-local
{:1) q行版本控制pȝ
. 一个程序的多个版本控制和管?
. 同一个程序可以被多个E序员修?
2) 源码备䆾pȝ
. 很好的备份系l?
. 记录你修改了哪些内容;
{:1) dCVS
cvs login(在CVSROOT变量指定的目录用命令:source .cshrc)
2) 建立一个新的项?br /> . 建立一个新的目?br /> make netct
cd netct
. 在你的home路径中徏立项目目?br /> %cvs import -m "目说明字符? 目名称 v_0 start
%cd ..
%cvs checkout 目名称 /* only first time */
4. 在CVS仓库中进行改?br />{:1) 加入一个新文g
%cvs add file.c
2) q行持久改变
%cvs commit [file.c] /*commit后无具体文gQ则提交所有未提交的文?/
2) 查看指定文g的状?br /> %cvs status file.c
3) 四种可能的状?br /> . Up-to-date: 本地文g和CVS仓库中文件完全一?
. Locally Modified: 本地文g比CVS仓库中文件新Q需本地文件commit入仓库中;
. Needing Patch: CVS仓库中文件比本要文g斎ͼ需仓库中文gupdatexC;
. Needs Merge: CVS仓库和本地文件均有新东西。解军_法,先commitQ再updateQ最后用vi调整文g中更新的先后序;
2) 同步指定文g状?br /> %cvs update file.c
3) 同步指定文g指定版本状?br /> %cvs update -r 1.2 file.c /*一旦取得以前版本,该文件便不能再被cvs所理, q时可作Z个新文gq行理*/
{:1) 昄指定文g每行修改的版本号
%cvs annotate file.c
2) 昄文g的历史注释信?在提交的时候所填写的内?
%cvs log file.c
3) 查看整个目所有文件最后修改的版本?br /> %cvs rlog netct
4) 从cvs仓库中移除一个文?br /> %cvs remove file.c /*形式上删除,物理上没有删?/
5) 从cvs仓库中删除一个目?br /> %cvs release netct
]]>
CVS安装
CVS功能
CVSl构
怎样使用CVS
相关技?br />
4. CVS资源
http://www.cvshome.org
http://www.loria.fr/~molli/cvs-index.html
http://www.sunfreeware.com
发送邮件给info-cvs-request@gnu.org以加入info-cvs邮g列表
CVS使用|社团——comp.software.config-mgmt
5. CVS样例安装
从因特网下蝲CVS二进制版本,在浏览器中键?br /> ftp://ftp.sunfreeware.com/pub/freeware/sparc/8/cvs-1.11.5-sol8-sparc-local.gz
解压该包
%gunzip cvs-1.11.5-sol8-sparc-local.gz
安装CVS
1.成ؓ用户
%su-
2.使用pkgadd安装
#pkgadd -d cvs-1.11.5-sol8-sparc-local
6. CVS本地配置
新徏一个目录ƈ授权l想使用它的问权Q?br /> #mkdir /users/cvs
#chmod 777 /users/cvs
初始化CVS储藏?br /> #cvs -d /users/cvs init
以普通用L录ƈ讄CVS环境
为C外壳用户加入setenv CVSROOT /users/cvs?cshrc
为其它外壳用户加入CVSROOT=/users/cvs; export CVSROOT?profile
7. CVS|络样例服务器配|?br /> 1.成ؓ用户
2.?etc/services中加入一行cvspserver 2401/tcp
3.加入一行tcp不等待流源▲/export/home/openlab/cvs/bin/cvs cvs -f -
-allow-root=/export/home/openlab/cvs pserver?etc/inetd.conf
4.发送信号HUPl超q程inetd
#pkill -HUP inetd
5.建立CVS组和CVS用户
6.成ؓCVS用户和初始化CVS储藏室▲
%setenv
CVSROOT=:pserver:cvs@openlab.ca:/export/home/openlab/cvs
%cvs init
注:?stream tcp nowait root详见TCP/IP协议
?团队开发的源代?׃n的未发布版本)?/p>
8. I白
9. CVS|络样例服务器配|?l?
使用户可讉K$CVSROOT
%chmod 777 /export/home/openlab/cvs
d用户?CVSROOT/CVSROOT/writers?CVSROOT/CVSROOT/passwd
10. CVS客户机环境变?br /> CVSROOT-说明告诉CVS储藏室在哪儿
C外壳: setenv CVSROOT 储藏室目?br /> 例子Qsetenv CVSROOT:pserver:gzhu@openlab:/export/home/openlab/cvs
其它外壳QCVSROOT=储藏室目? export CVSROOT
例子QCVSROOT=:pserver:gzhu@openlab:/export/home/openlab/cvs; export CVSROOT
CVSEDITOR-说明哪个~辑器被用来~辑注释
C外壳Qsetenv CVSEDITOR /usr/bin/vi
其它外壳QCVSEDITOR=/usr/bin/vi; export CVSEDITOR
PATH-说明你可以从哪个目录扑ֈCVS的命?br /> C外壳Qsetenv PATH /export/home/openlab/cvs/bin:$PATH
其它外壳QPATH=/export/home/openlab/cvs/bin:$PATH; export PATH
MANPATH-说明CVS在线指南的位|?br /> C外壳Qsetenv MANPATH /export/home/openlab/cvs/man:$MANPATH
其它外壳QMANPATH=/export/home/openlab/cvs/man:$MANPATH; export MANPATH
11. C外壳脚本例子(.cshrc)
#@(#)cshrc 1.11 89/11/29 SMI
stty erase ^H
umask 022
setenv CVSROOT :pserver:gzhu@openlab:/exporthome/openlab/cvs
setenv CVSEDITOR /usr/bin/vi
setenv CC /usr/local/bin/gcc
setenv CCC /usr/local/bin/g++
setenv ORACLE_BASE /tarenadb
setenv ORACLE_HOME /tarenaora/software/9.0.1
set path=(/export/home/openlab/cvs/bin /usr/local/bin /usr/openwin/bin /usr/j2se/bin
/tarenaapp/j2sdkee1.3.1/bin /usr/bin /usr/sbin /usr/ucb ${ORACLE_HOME}/bin /usr/ccs/bin /etc.)
setenv JAVA_HOME /usr/j2se
setenv JDK_HOME /usr/j2se
setenv J2EE_HOME /tarenaapp/j2sdkee1.3.1
setenv OPENWINHOME /usr/openwin
setenv LD_LIBRARY_PATH /usr/lib:/usr/local/lib:/usr/dt/lib:/usr/openwin/lib:${ORACLE_HOME}/lib
setenv ORACLE_SID TARENADB
setenv MANPATH /usr/share/man:/usr/openwin/share/man:/usr/openwin/man:/usr/dt/share/man:/usr/dt/man:/usr/bin/man:
/usr/perl5/5.00503/man:/usr/perl5/man:/usr/man:/usr/apache/man:/usr/j2se/man:/usr/local/man:/export/home/openlab/cvs/man
set cdpath=$HOME
if($?prompt)then
set history=32
12. B外壳脚本例子(.profile)
#@(#)cshrc 1.11 89/11/29 SMI
stty erase ^H
umask 022
CVSROOT=:pserver:gzhu@openlab:/exporthome/openlab/cvs
CVSEDITOR=/usr/bin/vi
CC=/usr/local/bin/gcc
CCC=/usr/local/bin/g++
ORACLE_BASE=/tarenadb
ORACLE_HOME=/tarenaora/software/9.0.1
PATH=(/export/home/openlab/cvs/bin /usr/local/bin /usr/openwin/bin /usr/j2se/bin
/tarenaapp/j2sdkee1.3.1/bin /usr/bin /usr/sbin /usr/ucb ${ORACLE_HOME}/bin /usr/ccs/bin /etc.)
JAVA_HOME=/usr/j2se
JDK_HOME=/usr/j2se
J2EE_HOME=/tarenaapp/j2sdkee1.3.1
OPENWINHOME=/usr/openwin
LD_LIBRARY_PATH=/usr/lib:/usr/local/lib:/usr/dt/lib:/usr/openwin/lib:${ORACLE_HOME}/lib
ORACLE_SID=TARENADB
MANPATH=/usr/share/man:/usr/openwin/share/man:/usr/openwin/man:/usr/dt/share/man:/usr/dt/man:/usr/bin/man:
/usr/perl5/5.00503/man:/usr/perl5/man:/usr/man:/usr/apache/man:/usr/j2se/man:/usr/local/man:/export/home/openlab/cvs/man
export CVSROOT CVSEDITOR CC CCC ORACLE_BASE ORACL_HOME PATH JAVA_HOME J2EE_HOME JDK_HOME LD_LIBRARY_PATH ORACLE_SID MANPATH
13. CVS功能
协作版本控制pȝ
多版?br /> 多程序员
源代码备份系l?br /> 备䆾
改动记录
14. CVSl构
文g-文g服务?---CVS服务?CVS客户机 ?br />
15. 贮藏室结?br /> $CVSROOT
+yoyodyne
| +-tc
| | |
| | |--Makefile,v
|--backend.c,v
|--driver.c,v
|--frontend.c,v
|--parser.c,v
|--man
| |
| +tc.1,v
|
|--testing
|
+-testpgm.t,v
+-test2.t,v
16. 建造你的CVSpȝ
dCVS
%cvs login
讄一个新工程
1.Z个目?br /> %mkdir nnm
%cd nnm
2.在你自已的目录里Z个工E?br /> %cvs import -m "network node management" nnm v_0_0_1 start
%cd
%cvs checkout nnm /* only first time */
17. 在贮藏室中修?br /> d一个新文g
%cvs add file.c
作一个永久改?br /> %cvs commit [file.c]
18. 查状?br /> 查所有文件的状?br /> %cvs status
查某个文件的状?br /> %cvs status file.c
四种可能的状?br /> Up-to-date: 最新版本 ?br /> Locally Modified: 未提交的改动
Needing Patch: 其它人已提交的改?br /> Needs Merge: 你和其它人的改动
19. 贮藏室的同步状?br /> 同步所有文?br /> %cvs update
同步一个指定文件的最q状?br /> %cvs update file.c
同步一个指定文件的指定状?br /> %cvs update -r 1.2 file.c
20. CVS工作?br /> (囄)
21. 开发环?br /> (囄)
22. 高命o
昄最q版本行被修改过
%cvs annotate file.c
打印出文件的历史信息
%cvs log file.c
昄最q版本模块被修改q?br /> $cvs rannotate netct8
打印出模块的历史信息
%cvs rlog netct8
从贮藏室删除一个入?br /> %cvs remove file.c
从贮藏室释放一个模?br /> %cvs release netct8
23. 从CVSpȝ出▲
外检
%cvs logout
注:?M一Ƅ本控制系l的基本功能Q检?check out)是指向外发布代码Q检?check in)则是指从外引q代码?br />
24. 相关技?br /> SCCS
源代码控制系l?br /> RCS
修正控制pȝ
1. 软g工程师培训系列教?br /> ~程规范
2. ~程规范
3. 概述
基本要求
可读性要?br /> l构化要?br /> 正确性与定w性要?br /> 可重用性要?br /> 命名规范
注释规范
~程风格
4. d
E序设计l对是一门艺术,而不仅仅是一门技术?br /> E序设计的出发点是给别h看,可读、易理解、好l护Q?br /> 如果你的E序只能自己来维护,Cdq个E序Ӟ你的E序也就与你一L开了这个世界?br />
5. 模块1Q编E要?/p>
6. 基本要求
E序l构清晰单易懂,单个函数的程序行C得超q?00行?br /> 打算q什么,要简单,直接了当Q代码精Q避免垃圄序?br /> 量使用标准库函数和公共函数
不要随意定义全局变量Q尽量用局部变?br /> 使用括号以避免二义?br />
7. 可读性要求 ?
可读性第一Q效率第二?br /> 保持注释与代码完全一?br /> 每个源程序文Ӟ都有文g头说明,说明规格见规?br /> 每个函数Q都有函数头说明Q说明规D规范
主要变量(l构、联合、类或对?定义或引用时Q注释能反映其含?br /> 帔R定义(DEFINE)有相应说?br />
8. 可读性要?br /> 处理q程的每个阶D都有相x释说?br /> 在典型算法前都有注释
利用~进来显C程序的逻辑l构Q羃q量一致ƈ以Tab键ؓ单位
循环、分支层ơ不要超q五?br /> 注释可以与语句在同一行,也可以在上行
9. 可读性要?br /> I和空白字W也是一U特D的注释
一目了然的语句不加注释
注释的作用范围可以ؓQ定义、引用、条件分支以及一D代?br /> 注释行数(不包括程序头和函数头说明部分)应占总行数的1/5?/3
10. l构化要求 ?
止出现两条{h的支?br /> 止GOTO语句
用IF语句来强调只执行两组语句中的一l。禁止ELSE GOTO和ELSE RETURN
用CASE实现多\分支
11. l构化要求 ?
避免从@环引出多个出?br /> 函数只有一个出?br /> 不用条件赋D?br /> 避免不必要的分支
不要L用条件分支去替换逻辑表达?br />
12. 正确性与定w性要?br /> E序首先是正,其次是优?br /> 无法证明你的E序没有错误Q因此在~写完一D늨序后Q应先回头检?br /> 改一个错误时可能产生新的错误Q因此在修改前首先考虑对其它程序的影响
所有变量在调用前必被初始?br />
13. 正确性与定w性要?br /> Ҏ有的用户输入Q必进行合法性检?br /> 不要比较点数的相等Q如Q?0.0*0.1 == 1.0Q不可靠
E序与环境或状态发生关pLQ必M动去处理发生的意外事Ӟ如文件能否逻辑锁定Q打印机是否联机{?br /> 单元试也是~程的一部分Q提交联调测试的E序必须通过单元试
14. 可重用性要?br /> 重复使用的完成相对独立功能的法或代码应抽象为公共控件或c?br /> 公共控g或类应考虑OO思想Q减外界联p,考虑独立性或装?br /> 公共控g或类应徏立用模?br />
15. 模块2Q编E规?br />
16. 命名规范
变量命名
函数命名
17. 变量命名
命名必须h一定的实际意义QŞ式ؓxAbcFghQx由变量类型确定,Abc、Fgh表示q箋意义字符Ԍ如果q箋意义字符串仅两个Q可都大写,如OK
含义清晰Q不易?br /> 不和其它模块、系lAPI的命名空间相冲突
18. 变量命名
有意识的为变量名、宏名加上本模块的关键字Q就不至于和其它模块、系lAPI的命名空间相冲突
例如Q宏的名U过短,如:"DEBUG"?_DEBUG"Q很可能和别的模块、系l模块相冲突
局部变量尤其是循环变量Q用约定俗成的i,j,k
宏、常量、枚举enumQ全部用大写字母
全局变量加上前缀"g"Q后面跟上首字母大写的单词,如:g_全局变量 g_bFlag
19. 函数命名
函数原型说明包括引用外来函数及内部函敎ͼ外部引用必须在右侧注明函数来源、模块名及文件名Q如是内部函敎ͼ只要注释其定义文件名
W一个字母必M用大写字母,要求用大写字母l合规范函数命名Q必要时可用下划UK隔,CZ如下Q?br /> void UpdateDB_Tfgd(TRACK_NAME); //Module Name: r01/sdw.c
20. 函数命名
模块?br /> 某一功能Q如果重复实C遍以上,卛_考虑模块化,它写成通用函数Qƈ向小l成员发布。同时也要尽可能利用其它人的现成模块?br /> 模块化的一些注意事?br /> 1. 设计好模块接口,用面向对象的观点看,包括Q函数接口和变量接口
2. 定义好接口以后不要轻易改动,q在模块开?文g的开头或函数的开?加以说明
3. 不要在外部用接口以外的其它函数或变?br /> 4. 注意全局变量也是一U接?br /> 5. 接口x|列Z个模块的所有的与外部打交道的变量、函数等
21. 格式规范
~进用TabQ不用空?br /> 一个Tab定义为四个空?br /> 标点W号的右边留一个空?左括号除?
赋倹{判断、运符号两辚w要加一个空?br /> I也是注释Q适当的空行逻辑更清楚,函数内部不应该有q箋IQ函C间至有两个q箋I
22. 注释规范
文g注释
函数注释
变量注释
其它
23. 文g注释
文g开始注释内容包括:公司名称、版权、作者名U、时间、模块用途、背景介l等Q复杂的法需要加上流E说?br /> 文g开头的注释模板
/******************************************************************
**文g名:
**版权Q?br /> **创徏人:
**日期Q?br /> **修改人:
**日期Q?br /> **描述Q?br /> **
**版本Q?br /> **-----------------------------------------------------------------
******************************************************************/
24. 函数注释
函数注释包括Q输入、输出、函数描q、流E处理、全局变量、调用样例等Q?br /> 复杂的函数需要加上变量用途说明:
函数开头的注释模板
/******************************************************************
**函数名:
**输入Qa, b, c
**a---
**b---
**c---
**输出Qx---
**x?Q表C?..
**x?Q表C?..
**功能描述Q?br /> **全局变量Q?br /> **调用模块Q?br /> **作者:
**日期Q?br /> **修改Q?br /> **日期Q?br /> **版本Q?br /> ******************************************************************/
25. ?4Q印刷错?/p>
26. 变量及其?br /> 变量Q对于非通用的变量,请在定义时加以注释说明,变量定义可能放在最开始处?br /> 其它Q函数内各功能模块,如:循环、流E的各分支等Q尽可能多的加以注释
27. ~程风格
严格采用梯Ş层次对应好各层次Q?br /> int main()
{
int i, j;
......
for(i == 0; i < 100; i ++)
{
......
......
if(i == 0)
{
......
......
}
......
......
}
......
}
28. ~程风格
注意错误处理Q?br /> ~程中要考虑函数的各U执行情况,可能处理所有流E情况,函数分两类Q?br /> 一cMؓ与屏q的昄无关
二类Z屏幕的显C有?br />
对于与屏q显C无关的函数Q函数通过q回值来报告错误
对于与屏q显C无关的函数Q函数要负责向用户发告,q进行错误处?br />
29. ~程风格
错误处理代码一般放在函数末,如下(以VBE序Z)Q ?br /> ......
On Error Goto errHandle
......
Exit Sub
errHandle:
Select Case Err
Case 1:
...
Case 2:
...
Case Else:
...
End Select
End Sub
对于通用的错误处理,可徏立通用的错误处理函敎ͼ处理常见的通用的错?br />
30.