版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、华中科技大学 电子与信息工程系实验报告电子与信息工程系实 验 报 告实验名称模拟版本控制软件svn课程名称软件技术课程设计姓名学号日期地点成绩教师一、 项目描述1.create命令命令使用格式:create效果为:在当前目录下创建名为_svn_的文件夹,选手根据自己需要在该_svn_下创建文件。若_svn_已经存在,表明当前目录已经受svn管理,使用create命令无效果。2.status命令命令使用格式为:status效果为:罗列出所有发生变化的文件,未发生变化的则不罗列,例如原本目录中有三个文件,名字依次为a.h b.cpp c.java,现在,a.h未发生变化,b.cpp被修改,c.ja
2、va被直接删除,同时添加(新建或者从其他目录拷贝到当前目录)了一个名为d.py的文件,那么输入status命令后,输出应该为:M b.cppG c.java? d.pyM表示文件修改,G表示文件丢失,?表示未受管理注意,如果所有文件都未作任何变更,则什么也不输出。输出的顺序可自行定义。3.add命令命令使用格式为:add filename效果为:将一个未受管理的文件添加到管理范畴内。在上面status命令的举例中,如果输入命令add d.py,然后再输入命令status查看状态,则输出应该为:M b.cppG c.java+ d.py+表示新纳入管理的文件注意,只有未受管理的文件(如d.py)
3、才能转变为添加状态(+)。如果add一个已经被管理的文件,那么该命令无任何效果。4.delete命令命令使用格式为:delete filename效果为:将一个受管理的文件移出管理目录,如果接下来使用commit命令,则该文件会被删除掉。接着add命令中的举例,如果此时输入命令delete a.h,然后再输入命令status查看当前状态,输出应该为:- a.hM b.cppG c.java+ d.py- 表示删除注意,只有修改的文件(如b.cp)和受管理的未修改文件(如a.h)才能转变为删除状态(-)。如果delete一个本来就不被管理的文件,那么该命令无任何效果。5.update命令命令使用
4、格式为:update version效果为:更新到某个版本,如果没有version参数,那么默认更新到最新版本,如果有version参数,则更新到指定版本,如输入update 4,则被管理目录还原到版本4的状态。有一种很特别的情况,这里稍作说明,假如通过add命令添加文件,然后commit提交,如果update到add操作之前的版本,则刚才add的文件要被删除掉。注意,如果当前状态中有修改的文件(M),有丢失的文件(G),有删除的文件(-),有添加的文件(+),则update失败,打印出“there changes”。所以update一般在commit或者revert后使用。mit命令命令使用
5、格式为:commit log效果为:提交修改,同时保存日志,日志是为了方便以后查看本次提交所做的更改。log参数为用双引号引起来的英文字符串,日志长度不超过50个字符,没有log参数时,则提交时默认日志为NULL。如输入commit “fix an infinite loop bug”。注意,如果所有文件都未作任何变更,则提交失败,打印出“no modification”。如果提交成功,则返回一个版本号。7.revert命令命令使用格式为:revert效果为:当前管理目录下的所有文件都还原为原来状态,修改的文件(M)恢复修改前状态,删除的文件(-)还原回来,添加管理的文件(+)取消管理。8.l
6、og命令命令使用格式为:log version效果为:显示日志。如果给出了version参数,如输入log 5,则只输出版本5的log信息。如果没有version参数,则显示从树根一直到当前版本这个分叉上的所有log,版本号依次增大,例如有一个版本树如下:树根 -> 1 -> 2 -> 3 -> 4 ->9 | -> 5* -> 6 -> 7 | -> 8log的显示举例为:version: 1log: first commitversion: 2log: second commitversion: 5<-log: modify st
7、h如果为当前版本,则版本号后打印出<-以作标识。这里之所以会形成树状结构,是因为如果我们update到以前的某个版本,修改后再commit,这就产生了分叉,如此就会产生一棵多叉树。9.attribute命令命令使用格式为:attribute version效果为:显示详细属性信息。如果没有version参数,则显示当前版本的属性信息,例如输入命令attribute 2,显示格式举例:version: 2file: test.htest.cppreadme.txtlog: second commit如果为当前版本,则版本号后打印出<-以作标识,具体见截图。10.quit命令命令使用格
8、式为:quit效果为:退出svn交互,即退出程序。注意,当程序接受quit命令正常退出后,双击再次运行程序时,程序需加载保存在_svn_中的各自定义配置文件,恢复退出前状态。二、 系统描述版本管理系统的实现主要基于配置文件对状态信息的保存以及相关数据结构的基本操作。此项目采用的配置文件的格式为xml文件,同时建立一颗状态树来对应当前目录下的状态信息,当执行svn命令时,便会调用状态树的相应操作,同时将当前状态下的文件无重复的存入备份区。为了节省存储空间同时防止配置文件被恶意修改,本系统采用压缩解压的方式,在程序退出时将配置文件和备份文件进行压缩,在程序开始时将压缩文件解压,减少了硬盘占用。三、
9、 模型描述此系统的关键实现在于svn版本树的表达。为此,我建立了一个名为SvnNode的类用来记录版本树的每一个节点,也就是每一个版本,另外也建立了一个Svn的类用于表征整个版本树。在每一个节点中,用一个int型变量iPrevious记录父节点的版本号,用一个vector<int>变量vNext记录多个可能的子节点的版本号,而整棵树通常状态下我们只在它的叶子节点下工作,故只取出其最后一个节点,即上次保存时的节点,事实上,版本树最终采用了类似于数组链表的方式进行表达,既可以采用版本号进行索引寻址,也可以采用next,previous关系进行寻址,在程序用用vector表示。此外,另一
10、个关键点在于版本树与配置文件的交互问题。配置文件以xml的形式进行保存,每一个版本节点的属性以一个SvnNode实例保存在xml文件中。在svn运行过程中,初始化create、log、attribute命令会读入配置文件、commit命令则保存对配置文件的修改。四、 软件实现SvnNode类的实现:1.成员变量:int iPrevious此节点的父节点,默认值为0int iVersion此节点版本号vector<list> vNext此节点的子节点,默认值为NULL,即:子节点默认为空map<string, string> mFileMd5当前目录下的所有文件以及其对应
11、md5码的map型变量2.成员函数void clear()将此节点内容清空,设置为默认形式Svn类的实现:1. 成员变量int iPresentIndex默认值为0,表示版本树上当前节点的版本号int iPresentIndex默认值为0,表示版本树上最大的版本号,例如:最大版本号可能是7,但是工作版本为4,意味着一切的修改将保存到4的子节点上SvnNode current_svn当前的工作版本节点。SvnNode work_svn当前工作版本修改的暂态节点map<string, char> mFileStatus当前版本下各个文件的svn状态,+表示添加管理,-表示通过svn删除
12、,G表示直接删除,?表示未受管理,M表示已收管理(这与status命令中的M意义不同)。版本转换的状态图如下所示:成员变量current_svn,work_svn的状态变换如下:2.成员函数Svn()构造函数,若不存在xml配置文件,则生成配置文件,否则载入配置文件,并将位置文件信息读入到current_svn中,work_svn为current_svn的一份复制,所有改动在work_svn上进行,只有commit后才能保存到配置文件中,在次过程中,current_svn一般不会修改,仅作为对比参照使用。实现基于Update函数。void Status()直接格式化输出当前目录在work_sv
13、n的status变量,若当前目录下不存在current_svn中记录的文件名的文件,输出为G;若work_svn.status为M,且md5码发生变化,则输出为M,否则不输出。void Add(const string &)将文件纳入管理,即:将work_svn.status修改为+,若work_svn.status为M,则不修改。void Delete(const string &)将work_svn.status修改为-,若work_svn.status为G或?,则不修改。void Change(string = "")输入参数为版本号的string型变
14、量,默认(不输入参数)为最新的版本号。通过通过循环遍历根据版本号找到对应版本的相关性息,即:所有文件名以及其对应md5码,根据md5码从_svn_目录下寻找到相应文件并将其复制到工作目录下,再将work_svn,current_svn进行对应的修改。void Update(string = "")首先判断能否Update,不能则输出错误指令,能则调用直接将输入参数输送到Change函数中,即可更新到对应版本。void Revert()调用Change函数直接更新到当前版本,即可舍弃修改。void Scan()通过系统调用扫描当前目录下的所有文件,跟work_svn,curr
15、ent_svn,mFileMd5进行对比,更新mFileStatus变量。若在work_svn.mFileMd5中找不到某个当前目录下的文件名,则文件名对应的status置为?;若在mFileStatus中找到某个键值,且该文件已被管理,在当前目录下又找不到此文件,则说明此文件已异常丢失,status显示为G。此函数在其他所有命令函数中的开始都会调用,用于刷新文件状态,防止在某两次操作中发生不属于svn命令的变化,比如:在两次add命令中间直接用“rm”命令删除。void Log(string = "")若输入参数(string型版本号),则输出对应版本的相关信息,包括版本
16、号和commit时的log信息。否则输出全部版本的对应信息。void Attribute(string = "")若输入参数(string型版本号),则输出对应版本的相关属性,旨在输出其对应的管理文件,若无输入参数,则输出最新版本的相关属性。其他函数:void MergeMap(map<string, string>&, map<string, string>&)合并两个相同类型的map,相当于set操作中的并。map<string, string> GetFileProperty(string)扫描当前目录,得到当前目录
17、下的所有文件名以及其对应的md5码。int MakeDir(string)创建文件夹,可创建多级目录的文件夹。int CopyFile(string, string)将文件复制到其他路径下并重命名。void PathTransform(string &)绝对地址和相对地址的转换。void Decode(Svn *, const string &)指令分析,对输入指令字符串进行解析,根据指令调用相应的函数或shell命令。五、 模块层次图SvnNode类在程序中基本上作为结构体使用,固不多加以讨论。Svn类操作的对象的基本单位就是SvnNode,每一个SvnNode对应于版本树上
18、的一个版本,一个版本中存在许多受管理的文件。与git不同,svn的提交commit指令是以版本为单位进行提交的,所以每次的提交需要调教这一版本的全部管理文件。Commit函数的执行分为两个部分,将新的版本信息填入xml配置文件,再将改动或者新文件复制到备份区。Update,Revert函数的实现基于Change函数。Change函数的实现方法就是将通过制定版本号,找到配置文件上的对应版本的文件信息,然后根据md5码将搜索到的文件从备份区覆盖式地复制到工作区。Log,Attribute函数的实现方式几乎相同,通过迭代器找到对应版本输出或是遍历输出相关信息。Add,Delete函数的实现方式就是修
19、改mFileStatus变量,使用switch case语句进行判断,但并不进行复制操作,文件不会进入备份区,因此,若add之后强制rm删除,文件无法恢复。MakeDir,CopyFile在linux shell命令中能找到类似命令,但操作不够精确,所以直接用C+重写。在main函数中,之所以将create函数独立出来,是因为Svn构造函数需要指定路径,所以需要通过create函数先生成_svn_文件夹。此外,压缩解压各种shell命令都通过system函数完成。六、 技术报告1. 方案设计由于此项目需要进行分工完成,考虑到开发效率和编程效率,我们最终选择采用C+面向对象的方式进行编程,并将内
20、容分成3部分我负责类的实现与函数的运行Debug,谢江炜负责命令行的格式化输出与相关信息的记录,杨宗霖负责gui界面的制作,下面主要介绍我的工作内容。(1) 配置文件格式的选择考虑到我们编程的特点以及需要记录的信息,我最终选择了xml文件格式。可扩展标记语言(缩写为xml),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。XML的技术优势十分显著,它有着良好的可读性、方便的可扩展性,便于信息检索,可以轻松的跨平台应用,支持不同文字不同语种间的信息交互,适合面向对象的程序开发。同时,它还有着许多易于操作的开源库,能够减轻一部分工作负担。(2) C+库的选择在此项目中,我添
21、加了两个开源库,一个是tinyxml,tinyxml一款很优秀的操作C+类库,文件不大,但方法很丰富;另一个是github上的一个md5算法库,md5算法的实现不算特别复杂,但为了节省开发时间,我还是选择使用开源库,这个库的接口实现非常简单。另外,tinyxml库在使用的时候有些需要注意的地方。在代码中不难发现,经常new出一些TiXmlNode对象而没有delete掉,因为函数在内部析构的时候自动delete掉了指针,固不用显示delete,TiDocument对象除外,这个是需要手动释放的,而且在xml中尽量不要使用中文。(3) 数据结构的实现方法本项目中的版本树以及各种对应的映射都由STL完成。STL = Standard Template Library,标准模板库,惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,m
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 塑料制品行业的库存优化策略
- 企业管理者领导力培养计划
- 电力行业突发事件中的社会心理支持与服务
- 信息安全与网络安全工作年终总结
- 人力资源开发与管理策略研究
- 建筑结构稳定性验证报告与结果
- 工程结构设计原理与施工技术
- 中医养生按摩与保健方法
- 元代青花麒麟纹玉壶春瓶鉴定报告
- 大众体育运动的健康科学方法论及实施路径研究
- 2026江苏南京市雨花台区征收拆迁安置办公室招聘编外人员3人笔试参考题库及答案解析
- 乐山市市中区2026年上半年公开招聘城市社区专职网格员(禁毒社工)(24人)笔试备考题库及答案解析
- 隧道爆破作业安全操作规程
- 共青团光辉历史简洁版
- 事业单位统考-综合应用能力C类 梳理精华
- GB/T 14536.1-2022电自动控制器第1部分:通用要求
- GB/T 14689-2008技术制图图纸幅面和格式
- FZ/T 07008-2020定形机热平衡测试与计算方法
- 安全文明施工措施费专款专用的方案
- 教师考试 思政资料
- 复方氨基酸注射液
评论
0/150
提交评论