源代码自动合并方法和源代码自动合并装置与流程

文档序号:11133648阅读:345来源:国知局
源代码自动合并方法和源代码自动合并装置与制造工艺

本发明涉及源代码合并技术领域,具体而言,涉及一种源代码自动合并方法和一种源代码自动合并装置。



背景技术:

软件程序开发一般是团队合作,同一个功能的实现往往涉及到很多不同版本的源代码文件,例如两个开发人员开发同一模块。这样,当不同版本的源代码合并到一起时就可能会在某些地方产生不一致的现象,即存在冲突。目前的源代码合并方案主要是,通过合并工具确定待合并的源代码,记录源代码合并过程中的冲突位置以及修改时间,根据冲突位置信息将最近一次修改的代码块合并到待合并的源代码中。如果同一源代码由不同开发人员修改,并且都修改了相同的代码块,即在源代码合并时会出现代码不兼容的问题,此时的源代码合并工作将很大程度上依赖于人工干预,降低了源代码合并的效率。

因此,如何解决源代码合并时出现的代码不兼容,同时避免人工干预,从而提高源代码的合并效率成为亟待解决的技术问题。



技术实现要素:

本发明旨在至少解决现有技术或相关技术中存在的技术问题之一。

为此,本发明的一个目的在于提出了一种源代码自动合并方法。

本发明的另一个目的在于提出了一种源代码自动合并装置。

为实现上述至少一个目的,根据本发明的第一方面的实施例,提出了一种源代码自动合并方法,包括:查找出两个不同版本的源代码中的疑似不兼容点;根据预设的兼容性条件,判断两个所述源代码中的所述疑似不兼容点是否为实质上存在冲突的代码块;若两个所述源代码中的所述疑似不兼容点为实质上存在冲突的代码块,则根据所述兼容性条件选择代码分支,以使用选择的所述代码分支中的代码块进行合并;以及若两个所述源代码中的所述疑似不兼容点为实质上不存在冲突的代码块,则选择所述疑似不兼容点中的任一代码块进行合并。

在上述技术方案中,优选地,所述查找出两个不同版本的源代码中的疑似不兼容点的步骤包括:对比两个不同版本的所述源代码之间对应行的代码内容;若所述对应行的代码内容不相同,则将所述对应行的代码内容作为所述疑似不兼容点。

在上述任一技术方案中,优选地,所述兼容性条件包括关键词、合并模式、所述疑似不兼容点的位置、代码修改时间、表达式的值中的一种或多种组合。

在上述任一技术方案中,优选地,在所述兼容性条件包括关键词的情况下,所述判断两个所述源代码中的所述疑似不兼容点是否为实质上存在冲突的代码块的步骤,包括:若所述疑似不兼容点满足关键词查询条件,则判定所述疑似不兼容点为实质上存在冲突的代码块;若所述疑似不兼容点不满足关键词查询条件,则判定所述疑似不兼容点不是实质上存在冲突的代码块,其中,所述关键词查询条件包括:在所述疑似不兼容点中的一个代码块中查找到第一类型关键词,且在所述疑似不兼容点中的另一个代码块中查找到第二类型关键词;或者在所述疑似不兼容点中的一个代码块中查找到所述第一类型关键词,且在所述疑似不兼容点中的另一个代码块中未查找到所述第二类型关键词;或者在所述疑似不兼容点中的一个代码块中查找到所述第二类型关键词,且在所述疑似不兼容点中的另一个代码块中未查找到所述第一类型关键词。

在上述任一技术方案中,优选地,在所述兼容性条件包括合并模式的情况下,所述判断两个所述源代码中的所述疑似不兼容点是否为实质上存在冲突的代码块的步骤,包括:判断所述疑似不兼容点中是否仅有一个代码块的变量进行显示初始化;若判定所述疑似不兼容点中仅有一个代码块的变量进行显示初始化,则判定所述疑似不兼容点是实质上存在冲突的代码块;若判定所述疑似不兼容点中不是仅有一个代码块的变量进行显示初始化,则判断所述疑似不兼容点中是否仅有一个代码块的关键语句后有返回值检查;若判定所述疑似不兼容点中仅有一个代码块的关键语句后有返回值检查,则判定所述疑似不兼容点是实质上存在冲突的代码块,若判定所述疑似不兼容点中不是仅有一个代码块的关键语句后有返回值检查,则判定所述疑似不兼容点不是实质上存在冲突的代码块。

在上述任一技术方案中,优选地,所述源代码自动合并方法还包括:检测所述兼容性条件是否正确;若检测到所述兼容性条件不正确,则提示用户所述兼容性条件不正确和/或提示用户重新设置所述兼容性条件。

根据本发明的第二方面的实施例,提出了一种源代码自动合并装置,包括:查找单元,用于查找出两个不同版本的源代码中的疑似不兼容点;判断单元,用于根据预设的兼容性条件,判断两个所述源代码中的所述疑似不兼容点是否为实质上存在冲突的代码块;合并单元,用于若所述判断单元判定两个所述源代码中的所述疑似不兼容点为实质上存在冲突的代码块,则根据所述兼容性条件选择代码分支,以使用选择的所述代码分支中的代码块进行合并;以及所述合并单元还用于,若所述判断单元判定两个所述源代码中的所述疑似不兼容点为实质上不存在冲突的代码块,则选择所述疑似不兼容点中的任一代码块进行合并。

在上述技术方案中,优选地,所述查找单元包括:对比子单元,用于对比两个不同版本的所述源代码之间对应行的代码内容;确定子单元,用于若所述对比子单元对比出所述对应行的代码内容不相同,则将所述对应行的代码内容作为所述疑似不兼容点。

在上述任一技术方案中,优选地,所述兼容性条件包括关键词、合并模式、所述疑似不兼容点的位置、代码修改时间、表达式的值中的一种或多种组合。

在上述任一技术方案中,优选地,在所述兼容性条件包括关键词的情况下,所述判断单元具体用于,若所述疑似不兼容点满足关键词查询条件,则判定所述疑似不兼容点为实质上存在冲突的代码块;若所述疑似不兼容点不满足关键词查询条件,则判定所述疑似不兼容点不是实质上存在冲突的代码块,其中,所述关键词查询条件包括:在所述疑似不兼容点中的一个代码块中查找到第一类型关键词,且在所述疑似不兼容点中的另一个代码块中查找到第二类型关键词;或者在所述疑似不兼容点中的一个代码块中查找到所述第一类型关键词,且在所述疑似不兼容点中的另一个代码块中未查找到所述第二类型关键词;或者在所述疑似不兼容点中的一个代码块中查找到所述第二类型关键词,且在所述疑似不兼容点中的另一个代码块中未查找到所述第一类型关键词。

在上述任一技术方案中,优选地,在所述兼容性条件包括合并模式的情况下,所述判断单元具体用于,判断所述疑似不兼容点中是否仅有一个代码块的变量进行显示初始化;若判定所述疑似不兼容点中仅有一个代码块的变量进行显示初始化,则判定所述疑似不兼容点是实质上存在冲突的代码块;若判定所述疑似不兼容点中不是仅有一个代码块的变量进行显示初始化,则判断所述疑似不兼容点中是否仅有一个代码块的关键语句后有返回值检查;若判定所述疑似不兼容点中仅有一个代码块的关键语句后有返回值检查,则判定所述疑似不兼容点是实质上存在冲突的代码块,若判定所述疑似不兼容点中不是仅有一个代码块的关键语句后有返回值检查,则判定所述疑似不兼容点不是实质上存在冲突的代码块。

在上述任一技术方案中,优选地,所述源代码自动合并装置还包括:检测单元,用于检测所述兼容性条件是否正确;提示单元,用于若所述检测单元检测到所述兼容性条件不正确,则提示用户所述兼容性条件不正确和/或提示用户重新设置所述兼容性条件。

通过本发明的技术方案,在不依赖于合并工具进行源代码合并的情况下,解决了源代码合并时出现的代码不兼容的问题,同时避免了人工干预源代码的合并工作,从而提高了源代码的合并效率。

附图说明

图1示出了根据本发明的一个实施例的源代码自动合并方法的流程示意图;

图2示出了根据本发明的一个实施例的根据关键字判断疑似不兼容点是否为实质上存在冲突的代码块的流程示意图;

图3示出了根据本发明的一个实施例的根据合并条件判断疑似不兼容点是否为实质上存在冲突的代码块的流程示意图;

图4示出了根据本发明的一个实施例的源代码自动合并装置的结构示意图。

具体实施方式

为了可以更清楚地理解本发明的上述目的、特征和优点,下面结合附图和具体实施方式对本发明进行进一步的详细描述。需要说明的是,在不冲突的情况下,本申请的实施例及实施例中的特征可以相互组合。

在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是,本发明还可以采用其他不同于在此描述的其他方式来实施,因此,本发明的保护范围并不受下面公开的具体实施例的限制。

图1示出了根据本发明的一个实施例的源代码自动合并方法的流程示意图。

如图1所示,根据本发明的一个实施例的源代码自动合并方法,包括:

步骤102,查找出两个不同版本的源代码中的疑似不兼容点。

优选地,步骤102包括:对比两个不同版本的所述源代码之间对应行的代码内容;若所述对应行的代码内容不相同,则将所述对应行的代码内容作为所述疑似不兼容点。

若两个源代码之间对应行的代码内容相同,则说明该对应行的代码内容是兼容点,若两个源代码之间对应行的代码内容不相同,则说明该对应行的代码内容可能是不兼容点,即疑似不兼容点,需要进行下一步地操作来确定该对应行的代码内容在实质上是否为不兼容点,从而比较全面地查找出两个源代码中的在实质上的不兼容点。

其中,疑似不兼容点是若干行代码,例如,开发人员A和B都提交了一个名为test.c的源代码,A提交的源代码有80行,B提交的源代码有100行,若A提交的源代码和B提交的源代码的前30行的代码内容一模一样,A提交的源代码中的第31行至第50行的代码内容和B提交的源代码中的第31行至第70行的代码内容不同,A提交的源代码中的第51行至第80行的代码内容和B提交的源代码中的第71行至第100行的代码内容相同,则将A提交的源代码中的第31行至第50行的代码和B提交的源代码中的第31行至第70行的代码作为一个疑似不兼容点。

下面通过两个例子进一步地对疑似不兼容点进行说明。

例如,开发人员A开发出的源代码中有a=5,开发人员B开发出的源代码中对应行有a=4+1,可见“a=5”和“a=4+1”的代码内容不同,即“a=5”和“a=4+1”为疑似不兼容点。

再例如,开发人员A开发出的源代码中有a=5,开发人员B开发出的源代码中对应行有b=5,可见“a=5”和“b=5”的代码内容不同,即“a=5”和“b=5”为疑似不兼容点。

步骤104,根据预设的兼容性条件,判断两个所述源代码中的所述疑似不兼容点是否为实质上存在冲突的代码块,在判定两个所述源代码中的所述疑似不兼容点为实质上存在冲突的代码块,则执行步骤106,在判定两个所述源代码中的所述疑似不兼容点为实质上不存在冲突的代码块,则执行步骤108。

优选地,兼容性条件包括关键词、合并模式、所述疑似不兼容点的位置、代码修改时间、表达式的值中的一种或多种组合。

通过以上的兼容性条件可以准确地判断出疑似不兼容点是否为实质上存在冲突的代码块。

在一个实施例中,在所述兼容性条件包括关键词的情况下,步骤104包括:若所述疑似不兼容点满足关键词查询条件,则判定所述疑似不兼容点为实质上存在冲突的代码块;若所述疑似不兼容点不满足关键词查询条件,则判定所述疑似不兼容点不是实质上存在冲突的代码块,其中,所述关键词查询条件包括:在所述疑似不兼容点中的一个代码块中查找到第一类型关键词,且在所述疑似不兼容点中的另一个代码块中查找到第二类型关键词;或者在所述疑似不兼容点中的一个代码块中查找到所述第一类型关键词,且在所述疑似不兼容点中的另一个代码块中未查找到所述第二类型关键词;或者在所述疑似不兼容点中的一个代码块中查找到所述第二类型关键词,且在所述疑似不兼容点中的另一个代码块中未查找到所述第一类型关键词。

其中,第一类型关键词和第二类型关键词都是预先设置的关键词,例如第一类型关键词为期望关键词,第二类型关键词为不期望关键词。下面结合图2进一步地说明如何根据关键词判断疑似不兼容点是否为实质上存在冲突的代码块。具体包括:

步骤202,设置兼容性条件为关键词,关键词包括期望关键词和不期望关键词。期望关键词和不期望关键词可以为一个或多个关键词。例如,可设置期望关键词为“ToprowMQ”,设置不期望关键词为“WebSphereMQ”。

步骤204,对比疑似不兼容点的两个代码块。

步骤206,判断是否在疑似不兼容点的两个代码块中的一个代码块中查找到期望关键词,另一代码块中查找到不期望关键词,在判断结果为是时,执行步骤208,在判断结果为否时,执行步骤210。

步骤208,判定疑似不兼容点为实质上存在冲突的代码块。

步骤210,判断是否在疑似不兼容点的两个代码块中的一个代码块中查找到期望关键词,另一个代码块中没有查找到不期望关键词,在判断结果为是时,执行步骤208,在判断结果为否时,执行步骤212。

步骤212,判断是否在疑似不兼容点的两个代码块中的一个代码块中查找到不期望关键词,另一个代码块没有查找到期望关键词,在判断结果为是时,执行步骤208,在判断结果为否时,执行步骤214。

步骤214,判定疑似不兼容点为实质上不存在冲突的代码块

步骤216,判断所有的疑似不兼容点是否判断完毕,在判断结果为是时,结束本次流程,在判断结果为否时,重新执行步骤204,以对下一个疑似不兼容点进行上述步骤的处理。

在一个实施例中,在所述兼容性条件包括合并模式的情况下,步骤104包括:判断所述疑似不兼容点中是否仅有一个代码块的变量进行显示初始化;若判定所述疑似不兼容点中仅有一个代码块的变量进行显示初始化,则判定所述疑似不兼容点是实质上存在冲突的代码块;若判定所述疑似不兼容点中不是仅有一个代码块的变量进行显示初始化,则判断所述疑似不兼容点中是否仅有一个代码块的关键语句后有返回值检查;若判定所述疑似不兼容点中仅有一个代码块的关键语句后有返回值检查,则判定所述疑似不兼容点是实质上存在冲突的代码块,若判定所述疑似不兼容点中不是仅有一个代码块的关键语句后有返回值检查,则判定所述疑似不兼容点不是实质上存在冲突的代码块。

下面结合图3进一步地说明如何根据合并模式判断疑似不兼容点是否为实质上存在冲突的代码块。具体包括:

步骤302,设置兼容性条件为合并模式。

步骤304,对比疑似不兼容点的两个代码块。

步骤306,判断疑似不兼容点的两个代码块中只有一个代码块的变量进行显示初始化,在判断结果为是时,进入步骤308,在判断结果为否时,进入步骤310。

步骤308,判定疑似不兼容点为实质上存在冲突的代码块。

步骤310,判断疑似不兼容点的两个代码块中只有一个代码块的关键语句后有返回值检查,在判断结果为是时,进入步骤308,在判断结果为否时,进入步骤312。

步骤312,判定疑似不兼容点为实质上不存在冲突的代码块。

步骤314,判断所有的疑似不兼容点是否判断完毕,在判断结果为是时,结束本次流程,在判断结果为否时,重新执行步骤304,以对下一个疑似不兼容点进行上述步骤的处理。

在一个实施例中,在所述兼容性条件包括疑似不兼容点的位置的情况下,步骤104包括:若疑似不兼容点的两个代码块的位置不同,则判定疑似不兼容点是实质上存在冲突的代码块。

一般情况下,任何语言(比如C,Java)的一行内可以写多条代码,比如:

int a;

a=5;a=a+1;

以上的代码块和下面的代码块是等效的:

int a;

a=5;

a=a+1;

虽然以上的两个代码块的意思相同,但是两个代码块的位置不同,判定疑似不兼容点是实质上存在冲突的代码块。

在一个实施例中,在所述兼容性条件包括代码修改时间的情况下,步骤104包括:若疑似不兼容点的两个代码块的修改时间不同,则判定疑似不兼容点是实质上存在冲突的代码块。即使疑似不兼容点的两个代码块的内容完全一致,但如果修改时间不一致,那么也认为疑似不兼容点是实质上存在冲突的代码块。

在一个实施例中,在所述兼容性条件包括表达式的值的情况下,步骤104包括:分别对疑似不兼容点中的两个代码块中的表达式进行计算,判断计算出的两个代码块中的表达式的值是否一致,若一致,则判定疑似不兼容点是实质上不存在冲突的代码块,若不一致,则判定疑似不兼容点是实质上存在冲突的代码块。

例如,疑似不兼容点中的一个代码块为int number=5;另一个代码块为int number=4+1;这两个表达式的值一致,即可认为改疑似不兼容点是实质上不存在冲突的代码块。

步骤106,根据所述兼容性条件选择代码分支,以使用选择的所述代码分支中的代码块进行合并。

若判定两个所述源代码中的所述疑似不兼容点为实质上存在冲突的代码块,根据所述兼容性条件选择代码分支,以使用选择的所述代码分支中的代码块进行合并。举例说,当兼容性条件为代码修改时间时,可以选择代码修改时间新或者代码修改时间老的代码块;当兼容性条件为关键词时,可以选择包含有“期望关键词”的代码块或者不包含“不期望关键词”的代码块;当兼容性条件为疑似不兼容点的位置时,可以选择“多个语句在一行”或“多个语句在多行”的代码块;当兼容性条件为合并模式时,可以选择严谨模式或者宽松模式的代码块。例如,开发人员A和B两人都提交名为test.c的源代码,A提交的源代码中的第31行至第50行的代码内容和B提交的源代码中的第31行至第70行的代码内容不同,在A的源代码中的31-50行,仅执行了一些操作,而在B的源代码中的31-70行,不仅执行了一些操作,在关键语句后还有返回值检查。可见,B的源代码中的31-70行的代码块属于严谨模式,A的源代码中的31-50行的代码块属于宽松模式。合并源代码时,可以根据合并模式为严谨模式或者宽松模式,来选择代码块。

步骤108,选择所述疑似不兼容点中的任一代码块进行合并。

若判定两个所述源代码中的所述疑似不兼容点为实质上不存在冲突的代码块,可以选择所述疑似不兼容点中的任一代码块进行合并。

在该技术方案中,若两个不同版本的源代码中存在疑似不兼容点的情况下,进一步判定该疑似不兼容点为实质上存在冲突的代码块,则根据预设的兼容性条件选择相应的代码分支,以使用选择的所述代码分支中的代码块进行合并。以上方案在不依赖于合并工具进行源代码合并的情况下,解决了源代码合并时出现的代码不兼容的问题,同时避免了人工干预源代码的合并工作,也就避免了人工干预源代码合并时带来的失误,从而提高了源代码的合并效率和合并准确率。

以下对“源代码”、“代码块”和“代码分支”进行说明。“源代码”指的是某次提交中所有的程序;“代码块”指的是源代码中的一部分,例如,源代码中的若干行;“代码分支”指的是源代码提交的不同版本,其中,代码块是源代码的一部分。

在上述技术方案中,优选地,所述源代码自动合并方法还包括:检测所述兼容性条件是否正确;若检测到所述兼容性条件不正确,则提示用户所述兼容性条件不正确和/或提示用户重新设置所述兼容性条件。

由于设置的兼容性条件可能会不正确,因此,需要检测兼容性条件是否正确,进一步地保证了源代码合并的准确性和可靠性。

例如,兼容性条件为关键词,关键词的值的项目名称为“ABC”,但在两个不同版本的源代码中都没有关键词“ABC”,说明兼容性条件设置错误。另外,兼容性条件设置正确之后,此后执行的源代码合并一般不会存在兼容性条件不正确的情况。

图4示出了根据本发明的一个实施例的源代码自动合并装置的结构示意图。

如图4所示,根据本发明的一个实施例的源代码自动合并装置400,包括:查找单元402、判断单元404和合并单元406。

查找单元402,用于查找出两个不同版本的源代码中的疑似不兼容点。

优选地,所述查找单元402包括:对比子单元4022,用于对比两个不同版本的所述源代码之间对应行的代码内容;确定子单元4024,用于若所述对比子单元4022对比出所述对应行的代码内容不相同,则将所述对应行的代码内容作为所述疑似不兼容点。

若两个源代码之间对应行的代码内容相同,则说明该对应行的代码内容是兼容点,若两个源代码之间对应行的代码内容不相同,则说明该对应行的代码内容可能是不兼容点,即疑似不兼容点,需要进行下一步地操作来确定该对应行的代码内容在实质上是否为不兼容点,从而比较全面地查找出两个源代码中的在实质上的不兼容点。

判断单元404,用于根据预设的兼容性条件,判断两个所述源代码中的所述疑似不兼容点是否为实质上存在冲突的代码块。

优选地,所述兼容性条件包括:关键词、合并模式、所述疑似不兼容点的位置、代码修改时间或者表达式的值。

优选地,在所述兼容性条件包括关键词的情况下,所述判断单元404具体用于,若所述疑似不兼容点满足关键词查询条件,则判定所述疑似不兼容点为实质上存在冲突的代码块;若所述疑似不兼容点不满足关键词查询条件,则判定所述疑似不兼容点不是实质上存在冲突的代码块,其中,所述关键词查询条件包括:在所述疑似不兼容点中的一个代码块中查找到第一类型关键词,且在所述疑似不兼容点中的另一个代码块中查找到第二类型关键词;或者在所述疑似不兼容点中的一个代码块中查找到所述第一类型关键词,且在所述疑似不兼容点中的另一个代码块中未查找到所述第二类型关键词;或者在所述疑似不兼容点中的一个代码块中查找到所述第二类型关键词,且在所述疑似不兼容点中的另一个代码块中未查找到所述第一类型关键词。

优选地,在所述兼容性条件包括合并模式的情况下,所述判断单元404具体用于,判断所述疑似不兼容点中是否仅有一个代码块的变量进行显示初始化;若判定所述疑似不兼容点中仅有一个代码块的变量进行显示初始化,则判定所述疑似不兼容点是实质上存在冲突的代码块;若判定所述疑似不兼容点中不是仅有一个代码块的变量进行显示初始化,则判断所述疑似不兼容点中是否仅有一个代码块的关键语句后有返回值检查;若判定所述疑似不兼容点中仅有一个代码块的关键语句后有返回值检查,则判定所述疑似不兼容点是实质上存在冲突的代码块,若判定所述疑似不兼容点中不是仅有一个代码块的关键语句后有返回值检查,则判定所述疑似不兼容点不是实质上存在冲突的代码块。

合并单元406,用于若所述判断单元404判定两个所述源代码中的所述疑似不兼容点为实质上存在冲突的代码块,则根据所述兼容性条件选择代码分支,以使用选择的所述代码分支中的代码块进行合并;以及所述合并单元406还用于,若所述判断单元404判定两个所述源代码中的所述疑似不兼容点为实质上不存在冲突的代码块,则选择所述疑似不兼容点中的任一代码块进行合并。

在该技术方案中,若两个不同版本的源代码中存在疑似不兼容点的情况下,进一步判定该疑似不兼容点为实质上存在冲突的代码块,则根据预设的兼容性条件选择相应的代码分支,以使用选择的所述代码分支中的代码块进行合并。以上方案在不依赖于合并工具进行源代码合并的情况下,解决了源代码合并时出现的代码不兼容的问题,同时避免了人工干预源代码的合并工作,也就避免了人工干预源代码合并时带来的失误,从而提高了源代码的合并效率和合并准确率。

在上述任一技术方案中,优选地,所述源代码自动合并装置400还包括:检测单元408,用于检测所述兼容性条件是否正确;提示单元410,用于若所述检测单元408检测到所述兼容性条件不正确,则提示用户所述兼容性条件不正确和/或提示用户重新设置所述兼容性条件。

由于此源代码自动合并装置解决问题的原理与前述源代码自动合并方法相似,因此该装置的实施可以参见前述方法的实施,重复之处不再赘述。

以上结合附图详细说明了本发明的技术方案,通过本发明的技术方案,在不依赖于合并工具进行源代码合并的情况下,解决了源代码合并时出现的代码不兼容的问题,同时避免了人工干预源代码的合并工作,从而提高了源代码的合并效率。

在本发明中,术语“第一”、“第二”仅用于描述的目的,而不能理解为指示或暗示相对重要性。对于本领域的普通技术人员而言,可以根据具体情况理解上述术语在本发明中的具体含义。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1