COMP2017/COMP9017 作业2 作业截止日期:2020年5月1日,下午11:59 AEST(9周星期五),
这个作业值10%的最终评估。
1说明 版本控制系统在任何软件项目中都是至关重要的。在这个任务中,您将设计和实现存储方法,
以及简单版本控制(SVC)的一些功能,这是一个非常简单的从Git版本控制系统导出的系统。
2 SVC的描述 要在SVC下放置的项目必须用SvcIIIT初始化。这允许系统创建包含关于项目状态的信息的必要
数据结构。
项目由文件组成,SVC计算每个文件的哈希值,以确定是否发生了更改。仅跟踪显式添加到版 本控制系统的文件。
提交类似于项目状态的快照。在SVC中,它们包含了哪些文件已被添加、删除或修改的详细信 息,以及足够的信息将文件还原到该状态。当前活动提交常被称为头部。每个提交都有一个 “提交ID”,它唯一地标识给定的提交。SVC中的提交ID用十六进制数字表示,长度正好为6个字 符。
图2.1:提交实例
分支是有用的,以保持项目的工作副本,同时处理新的特点或修复错误。创建项目时,默认情 况下创建主分支。例如,该分支可用于保持项目的发布版本,分支特征/ StutthIGNEL特殊可 能包含具有尚未完成的新特性的附加代码,并且不适合发布。
分支可以“签出”以指示我们希望将项目切换到特定的分支并从那里起作用。例如,在创建特性 /某个特殊分支之后,在对该特征进行处理之前,应该检查它。
合并是将变更从一个分支整合到另一个分支的过程。一旦一个新的特性完成,或者一个bug被 修复并且测试完成,我们可能希望将这些更改合并回主分支以释放。注意,合并可以发生在任 何两个分支之间,而不一定与主分支发生。
cb410d 初始提交 + 读数
ec8856 附加测试 + 试验/试验1 + 测试/测试2
1
ce9bd8 更新自述文件 / 读数
COMP2017/COMP9017
作业2
头部
硕士
头部
硕士
(a) 初始提交之后
(c) 创建新分支
(b)一次提交主分支
头部
硕士
ec8856
cb410d
ec8856
特征头
功能特色
(d)在检查特征分支之后
硕士
cb410d
ec8856
90ae30
b96919
特征头
(e) 两个提交给特征分支
头部
硕士
cb410d
ec8856
ce9bd8
90ae30
b96919
(f)
主分支签出,一个提交
功能特色
头部
硕士
cb410d
ec8856
ce9bd8
e8ca9d0
90ae30
b96919
(g)
特征分支合并到主机中 图2.2:分支和合并的例子
cb410d
有时,我们可能希望重置为特定提交。在这种情况下,文件将恢复到它们提交的状态,并且任 何新的提交从该提交继续。这可能
2 of 11
cb410d
功能特色
ec8856
硕士
cb410d
COMP2017/COMP9017 作业2 结果在某些情况下脱离了SVC系统的其余部分。例如,如果
主分支被重置为EC856,并做出新的提交,CE9BD8将无法到达。
3 实现功能
空隙*SvcIinit();
这个函数只在调用任何其他函数之前调用一次。在这个函数中,您可以选择执行准备步骤。如 果需要一些数据结构来帮助其他操作,则返回指向包含此结构的内存区域的指针。在所有其他 函数调用中,这将被传递为空隙*帮助器。
清除空白(空白*助手); 在调用所有其他函数之后,该函数将只调用一次。确保在该函数返回时释放所有动态分配的内
存。
INTHASHI文件(空隙*助手,char *文件路径); 给定文件的路径,使用第3.1节中描述的算法计算并返回哈希值。如果FielyPATH为NULL,返回
-1。如果在给定路径中不存在文件,返回- 2。即使没有被跟踪的文件,此函数也应该工作。
char *vcc提交(空隙*助手,char *消息);
用给定的消息创建提交,并对正在跟踪的文件进行所有更改。这应该返回提交ID,它可以通过 实现在第3.2节中描述的算法来计算。如果上次提交后没有更改,或者消息为NULL,则返回 null。
空隙* GET*提交(空隙*助手,char *委托)ID;
给定一个委托,返回一个指向存储此提交的内存区域的指针。如果具有给定ID的提交不存在, 或CONTROSIDID为NULL,则该函数应该返回null。请注意,仅测试此函数的空返回值。您返回 的提交将传递给其他实现的其他函数。
ch**GETSPRIPUR提交(空隙*助手,空隙*提交,int *npReV);
给定指向提交的指针,返回一个动态分配的数组。数组中的每个元素都应该指向父提交的ID。 父提交的数量应该存储在NYPREV指向的内存区域中。如果NYPREV为NULL,返回null。如果提交 为NULL,或者它是第一次提交,则该函数应将NYPREV的内容设置为0,并返回NULL。注意:只 有被分配的数组才会被测试者释放。
虚空PrttI*提交(空白*助手,char *委托)ID;
给定一个委托,打印下面提交的详细信息。如果不存在此ID的提交,或CytoSid ID为NULL,则 应该打印无效的提交ID
3 of 11
COMP2017/COMP9017 作业2
对于一个有效的提交,您应该打印提交ID、其提交的分支、添加、删除和更改的文件的任何顺 序列表,以及在该分支上提交历史的跟踪文件的列表以及它们的散列值,也可以按任意顺序。 散列被填满空格,正好是10个字符宽。
提交ID [分支名称]:提交消息 +添加文件(S)
-删除文件(s) 更改文件(以前的散列->新散列)
跟踪文件(跟踪文件的数量): [散列]文件名
int vcv分支(空隙*助手,char *分支chname);
用给定的名称创建一个新的分支。在这个SVC中,有效的分支名称被限制为只包含字母数字字 符、下划线、斜线和破折号的那些:AZ、A Z、0 9、Y、/。如果给定的分支名称无效或NULL, 返回- 1。如果分支名称已经存在,返回- 2。如果有未提交的更改,返回- 3。如果分支成功, 返回0。注意:创建分支不检查它。
ItSvc}结帐(空白*助手,char *分支chname);
使这个分支成为活动的分支。如果BrnChixNead为NULL或不存在这样的分支,则返回-1。如果 有未提交的更改,返回- 2,不使其成为活动分支。否则,返回0,使其成为活动分支。注意, 在SVC中,如果不存在分支,则不创建分支。
ch**istle分支(空隙*帮助器,int *n*分支);
按创建的顺序打印所有的分支。另外,以相同的顺序返回分支名称的动态分配数组,并将分支 的数量存储在NSL分支指向的内存区域中。如果nSUpple为NULL,则返回NULL,不打印任何内容。 注意:只有被分配的数组才会被测试者释放。
INTSVC添加(空隙*助手,char *文件名);
这是一个通知,文件名为文件名应该添加到版本控制。如果文件名为NULL,返回-1,不要将其 添加到版本控制中。如果这个名称的文件已经在版本控制之下,返回- 2。如果此文件不存在, 返回- 3。否则,将文件添加到SVC系统并返回文件的哈希值。
int vccrm(空隙*助手,char *文件名);
这是一个通知,文件名为文件名应该从版本控制系统中删除。如果文件名为NULL,返回-1。如 果没有跟踪给定名称的文件,返回- 2。否则,从SVC中删除文件并返回其最后已知的散列值 (从添加或提交)。
ItSvc}重置(空隙*助手,char *提交)ID;
4 of 11
COMP2017/COMP9017 作业2
用给定的ID将当前分支重置为提交,丢弃任何未提交的更改。如果CopyToID为NULL,返回-1。 如果没有给定ID的提交,返回- 2。可以保证,如果存在这个ID的提交,则从当前分支的头将 有一条简单路径。也就是说,从提交到提交都会有一个以前的提交。将分支重置为此提交并返 回0。请注意,这个函数意味着一些提交可以从SVC系统的其余部分中分离出来。
CHAR*Svc*合并(空隙*助手,char *Brangchy名称,分辨率*分辨率,int nl分辨率);
调用这个函数将分支与名称BrcChyNoNy合并到当前分支中。如果BrangCHYNEX为NULL,则打印 无效的分支名称并返回NULL。如果不存在这样的分支,则找不到打印分支并返回null。如果给 定名称是当前签出的分支,则打印不能将分支与自身合并并返回null。如果有未提交的更改, 必须提交打印更改并返回null。在所有其他情况下,合并过程开始。注意,在SVC中分支的方 式不同于Git。
若要将两个分支合并在一起,则使用两个分支中的所有跟踪文件。如果存在冲突的文件,它将 出现在分辨率数组中。每个分辨率结构包含冲突文件的名称,以及解决文件的路径。此文件包 含文件在合并后应包含的内容。但是,如果给定的路径为NULL,则应该删除该文件。
将消息合并的分支[BrangChyNeN]替换为[BrangCHYNAME],用BrangChyNeND替换当前分支,以反映其 他分支中所做的更改。先前的提交顺序应该是当前分支的头部,然后是另一个分支的头部。然后, 函数应该打印消息合并成功并返回新提交ID。
3.1 文件哈希算法 下面是确定文件哈希值的伪代码。注意:这不是在现实世界版本控制系统中使用的相同的算法。
函数FieleHash(FielyNeX):FielyCythase= Read (FielyNoX)文件长度= NUMYBACK(FILIONEY)散 列=0
对于文件名中的无符号字节:hash =
(hash +字节)% 1000 对于FielyCype中的无符号字节:hash =
(hash +字节)% 2000000000 返回散列
3.2 提交ID算法 下面是确定文件提交ID的伪代码。注意:这不是在现实世界版本控制系统中使用的相同的算法。
函数GETYEngIsIOID(COMMIT):ID=0 对于UNICON.COMMENT消息中的无符号字节:ID=
(ID+Byter)% 1000
5 of 11
COMP2017/COMP9017 作业2
对于更改的更改。文件名的增加按字母顺序更改:如果更改是加法,则ID=ID+ 376591 如果更改为删除,则ID=ID+ 85973 如果更改是修改,则在un.Enter文件名中,ID=ID+
9573681为无符号字节:
ID=(ID*(字节% 37))% 15485863 + 1返回ID 为十六进制字符串
4实例
4.1 文件哈希
文件名
文件内容
哈希值
试验/扩散
空文件(0字节)
385
试验/扩散
这是文件中的一些文本。
2832
测试样品
你好,世界
1178
测试样品
你好,世界!
1211
测试/测试1
5 3 2\n
564
Helo.Py
打印(“你好”)
2027
最后一个例子,Helo.Py对应于ASCII值〔104, 101, 108,108, 111, 46,112, 121〕。该算法给 出了811%×1000=811的散列。文件的内容对应于[112, 114, 105,110, 116, 40,34, 72, 101, 108, 108, 111,34, 41, 10 ]给出(811 +)。
1216) % 2000000000 = 2027.
4.2 SVC示例1 Value*Help= SvcIn();
返回值:帮助者
HASHI文件(助手,Hello,Py);
返回值:2027(从上面的例子)
HASHI文件(帮助器,“假C”); 返回值:-2(不存在文件)
Svcl提交(助手,“没有更改”); 返回值:空
SvcIdAd(助手,Hello,Py);
返回值:2027
SvcIdAd(辅助程序,“测试/Test1,in”); 返回值:564(从上面的例子)
SvcIdAd(辅助程序,“测试/Test1,in”);
6 of 11
COMP2017/COMP9017 作业2 返回值:- 2
7 of 11
COMP2017/COMP9017 作业2
SvcIm提交(帮助器,“初始提交”);
返回值:“7CDE7”
提交消息初始提交的ASCII值为[73, 110, 105,116, 105, 97,108,
32, 99, 111、109, 109, 105、116。在第一阶段之后,这给出了1395%×1000=395的ID。这个 两个变化是Helo.Py(104, 101, 108,108, 111, 46,112, 121)和测试/测试1的添加。
在[ 84, 101, 115,116, 115, 47,116, 101, 115,116, 49, 46,105, 110 ]中。按照该算法, ID为7654887。将此转换为6字符十六进制字符串给出了7cDE7。
空*提交= GETIOMCORMIT(帮助器,“7CDE7”); 返 回值:包含上面创建的提交的内存区域指针
国际标准;
ch**PrimeCysIs= GETYPROFIX提交(助手、提交和NYPREV);
返回值:空 之后,NYPREV=0
Primtl提交(助手,“7CDE7”); 输出:
7CDE7 [硕士]:初始提交 +Helo.Py
+Test/Test1.in
跟踪文件(2):
[ 2027、Helo.Py
[ 564)测试/Test1.in
国际标准;
CHAR**分支= ListFipe分支(Helpand,n);
输出:主
返 回值:指向包含字符串主控器的内存区域指针的数组 之后,n=1
4.3 提交ID 在上面的示例中,有效提交“初始提交”的提交ID由1计算。提交消息具有ASCII值〔73, 110, 105、
116, 105, 97、108, 32, 99、111, 109, 109〕,
105, 116)在第一步之后,ID是1395%=1000=395。
2. 有两个变化,都是加法。
3. 第一个更改向ID添加376591,然后对每个字节,在节中进行计算。
其次是3.2,给予111
4. 第二个变化也给ID增加了376591,上面重复了7654887。
5. 将此转换为6位十六进制数给出了7CDE7
8 of 11
COMP2017/COMP9017 作业2 4.4 SVC示例2
从一个空白项目(没有文件)开始,我们创建两个文件: COMP2017/SVC。h有内容
αIFNDEF Svch h n定 义SvcH
虚空*SvcIinit(空)
Cp2017/SVC。C有内容
其中包括“SVC”。H’n 虚空*SvcIinit(空){n
//tdo:实现
}\n 两个文件的哈希值分别为5007和5217(所有的制表符都是四个空格,上面已经明确显示了新的
行字符)。
SvcAdAd(助手,“COMP2017/SVC。h”); 返回值:5007
SvcIdAd(帮助器,“COMP2017/SVC。C”); 返回值:5217
SvcIm提交(帮助器,“初始提交”); 返回值:“7B3E30”
Svcl分支(助手,“随机化分支”); 返回值:0
Svcl结帐(助手,“随机化分支”); 返回值:0
接下来,将文件COMP2017/SVC .C更改为具有以下内容
其中包括“SVC”。H’n 空隙*SvcIinit(空隙){
返回null;
}\n 其中有散列4798。
9 of 11
COMP2017/COMP9017 作业2 SvcYrm(助手),“COMP2017/SVC .H”;
返回值:5007
SvcIm提交(助手),“实现的SvcInIT”; 返回值:“73EACD”
10 of 11
COMP2017/COMP9017 作业2 您意识到您意外删除了COMP2017/SVC .h,并希望恢复到初始提交。
SvcRead(助手),“7B3E30”; 返回值:0
然后,将文件COMP2017/SVC .C再次更改为具有上述内容的内容。
SvcIm提交(助手),“实现的SvcInIT”; 返回值:“24829”
空*提交= GETIOMCORMIT(帮助器,“24829 B”); 返 回值:包含上面创建的提交的内存区域指针
国际标准;
ch**PrimeCysIs= GETYPROFIX提交(助手、提交和NYPREV);
返 回值:指向长度为1的数组的指针,包含“7B3E30” 之后,NYPREV=1
Svcl结帐(助手,“主人”); 返回值:0
测试框架用内容创建文件分辨率/svc.c。
其中包括“SVC”。H’n 空隙*SvcIinit(空隙){
返回null;
}\n 然后执行以下代码以执行合并:
//分辨率(s)由测试框架创建
分辨率*分辨率= Malc(siZeof(分辨率));分辨率[0 ]。FielyName=“COMP 2017/SVC”。c”; 决议〔0〕。“解决方案”文件=“分辨率/SVC”。c”;
//调用合并函数
Svci合并(助手,“随机化分支”,决议,1); //测试框架将释放内存
自由(决议);
返回值:“48 EAC3” 提交消息被合并分支随机分支。冲突数组指示只有遵循上述合并规则才能保持更改。这意味着从主分支 的角度来看,提交的唯一更改就是修改。
国际标准;
空*提交= GETIOMCORMIT(帮助器,“48 eAC3”);
ch**PrimeCysIs= GETYPROFIX提交(助手、提交和NYPREV);
返 回值:指向长度为2的数组的指针,其中包含“7B3E30”和“24829”。之后,NYPREV=2
11 of 11
COMP2017/COMP9017 作业2 5 注释与提示
• 在SVC中,分支不会被删除。合并一个分支之后,它仍然保留在分支列表中。
• 当对提交的重置发生时,不要忘记撤消对文件的所有类型的更改(添加、删除、修改)!
• 有用的工具和功能:地址消毒器
• 哈希算法可能产生相同的散列,即使文件的内容已经改变。测试用例是这样设计的,并 且保证不会发生这种情况。
• 错误代码应该按照函数描述中的顺序来检查。
• 文件可以从文件系统中删除,而不调用SvcYrm,您的代码应该检测到这一点,并相应地
从SVC中删除该文件。但是请注意,函数vccyrm不应该从文件系统中删除文件!
• 您应该编写自己的测试用例并绘制图表来帮助可视化问题。
• 最大文件路径长度为260个字符(不包括空终止符)
• 分支名称最多为50个字符长(不包括空终止符)
• 所有其他字符串可以是任意长度的。
• 上面给出的两个例子对应于Ed上的示例测试用例。
5.1 分期
在版本控制系统中,有一个“分级”的概念。添加/删除/更改文件被保存在“阶段”阶段,直到实 际发生调用。这意味着在提交阶段发生多个更改,在提交时只应将其表示为单个更改。例如, 修改文件两次应该只作为提交中的单个更改。在提交之前添加一个文件,然后删除它将意味着 这两个文件都不会出现在提交的更改中。考虑所有可能发生的文件操作的组合,以及有效的改 变实际上是什么(提示:有5对,你应该考虑)。
5.2 分辨率结构 分辨率结构在脚手架代码中提供,下面还提供以供参考。
不要修改这个结构
TyBuffsStuttRe解析{char*文件名; char解析文件;
分辨率;
12 of 11
COMP2017/COMP9017 作业2 6提交
您必须通过Git将代码提交给Ed以进行自动标记。它不能产生任何编译错误,除非第3节中另有 说明,否则它必须释放任何动态分配的内存。
您的代码将被编译为以下选项:
GCC-O0-STD= GNU11-LM -WOTER -WORK-WORG-G-FSANITIZE =地址
警告:任何试图欺骗或破坏标记系统的企图都会导致整个任务立即为零。如果不遵循指派问题 描述或代码不必要或故意混淆,则可以分配否定标记。
7 马克击穿 这个作业值10%的最后分数。有10个点可用(1%个):
关于性能的说明:记忆和时间使用每个值1分,并且将根据其他学生的比例按比例分配。内存 使用是基于在执行代码时在任何给定时间分配的最大内存。在实现解决方案之前,应考虑不同 的数据结构和算法。
8 学术宣言 通过提交此作业,您声明如下:
我声明我已经阅读并理解了悉尼大学学生剽窃:课程政策和程序,除了明 确承认,这项任务/项目中的工作是我自己的工作,并没有从其他来源复 制或以前提交的奖励或评估。
我理解不遵守学生抄袭:课程政策和程序可能会导致严重处罚,根据悉尼大 学第8章第1999条(修正后)。这些处罚可能是在我提交的作品中任何重要部 分都没有得到其他来源的适当确认而被复制的情况下,包括出版的作品、互 联网、现有的程序、其他学生的工作,或以前提交的其他奖励或评估的工作。
我意识到,我可能被要求确定我所贡献的部分工作,并要求通过回答口头问 题或通过书面或实验室的补充工作来证明我对相关材料的了解,以便达到最 终的评估标志。
我承认,计算机科学院在评估这一作业时,可以完全复制它,可以向另一个 教员提供副本,和/或将该作业的副本传送到抄袭检查服务或内部计算机程序, 并且该作业的副本可以由服务或学校维护。计算机科学的目的是为了将来抄 袭的目的。
组件
积分
描述
正确性
性能
代码结构与风格
6 2 2
通过Ed的测试用例比例 你的程序占用了多少内存和时间? 你的导师手工标记。 标记依赖于 代码的样式、布局和可读性
13 of 11