操纵源代码补丁的制作方法

文档序号:6532700阅读:207来源:国知局
操纵源代码补丁的制作方法
【专利摘要】提供了一种用于操纵源代码补丁的计算机化装置、计算机实现的方法和计算机程序产品。所述装置包括处理器,所述处理器被配置为:针对源代码获得包括多个源代码修改指令的源代码补丁;以及将所述源代码补丁自动拆分成多个子补丁,其中按照一顺序针对所述源代码应用所述多个子补丁相当于应用所述源代码补丁。
【专利说明】操纵源代码补丁

【技术领域】
[0001]本公开一般地涉及计算机编程,更具体地说,涉及源代码补丁。

【背景技术】
[0002]许多软件开发都使用迭代修改-审查过程完成。开发人员修改源代码-例如,修复错误或添加新特性。然而,这种修改无法立即加入项目中-在它可以被接受之前,所述修改需要由整个团队或由项目的多个管理人员之一审查。
[0003]在某些组织中,可能进行面对面审查,其中开发人员将其代码提供给审查者。然而,在许多其他组织中,开发人员遍布各个国家和时区,或者只是发现难以协调会议,并且从远方执行审查,例如通过电子邮件:开发人员将其建议的源代码修改打包在补丁文件中并将此更改信息发送给审查者。具体地说,此过程常见于对等生产模型,例如开源开发。
[0004]在本公开中,“源代码补丁”或“补丁”是一组在概念上关联的源代码修改指令,例如所有修改都致力于共同目标,例如添加特性或解决现有错误。补丁可以被提供为文本文件(例如,在Unix?环境中使用diff软件实用程序生成),或者提供为源代码控制系统(例如,CVS?、Rat1nal? ClearCase? 等)中的修订。
[0005]在许多场合下,补丁附带有人类可读的更改描述,以使审查者更容易理解补丁。审查者可以按原样接受建议的更改,或者要求修复某些问题,之后开发人员应发送改进的补丁以进行另一轮审查-直到补丁被最终接受并“提交”到项目的主要源代码中。


【发明内容】

[0006]所公开的主题的一个示例性实施例是一种具有处理器的计算机化装置,所述处理器被配置为:针对源代码获得包括多个源代码修改指令的源代码补丁;以及将所述源代码补丁自动拆分成多个子补丁,其中按照一顺序针对所述源代码应用所述多个子补丁相当于应用所述源代码补丁。
[0007]所公开的主题的另一个示例性实施例是一种由处理器执行的计算机实现的方法,所述方法包括:针对源代码获得包括多个源代码修改指令的源代码补丁 ;以及将所述源代码补丁自动拆分成多个子补丁,其中如果按照一顺序应用于所述源代码,则所述多个子补丁提供与应用所述源代码补丁等同的输出。
[0008]所公开的主题的另一个示例性实施例是一种计算机程序产品,包括:在其上保存指令的非瞬时性计算机可读介质,所述指令当由处理器执行时,被配置为导致所述处理器执行以下步骤:针对源代码获得包括多个源代码修改指令的源代码补丁 ;以及将所述源代码补丁自动拆分成多个子补丁,其中如果按照一顺序应用于所述源代码,则所述多个子补丁提供与应用所述源代码补丁等同的输出。

【专利附图】

【附图说明】
[0009]从下面结合附图的详细说明,将更全面地理解和领会本公开的主题,其中对应或相同的数字或字符指示对应或相同的组件。除非另外指出,否则附图提供本公开的各示例性实施例或方面,并且不限于本公开的范围。这些附图是:
[0010]图1示出了根据所公开的主题的某些示例性实施例的计算机化环境的图示;
[0011]图2A-2C示出了根据所公开的主题的某些示例性实施例的用于自动操纵补丁的方法中的步骤的流程图;以及
[0012]图3示出了根据所公开的主题的某些示例性实施例的用于自动操纵补丁的计算机化装置的组件的框图。

【具体实施方式】
[0013]下面将参考根据所公开的主题的实施例的方法、装置(系统)和计算机程序产品的流程图和/或方块图对所述主题进行描述。将理解,所述流程图和/或方块图的方块以及所述流程图和/或方块图中的方块的组合可以由计算机程序指令来实现。这些计算机程序指令可以被提供给通用计算机、专用计算机、被测试处理器或其他可编程数据处理装置的一个或多个处理器以产生机器,以便通过所述计算机或其他可编程数据处理装置的处理器执行的所述指令产生用于实现在一个或多个流程图和/或方块图方块中指定的功能/操作的装置。
[0014]这些计算机程序指令也可以被存储在能够引导计算机或其他可编程数据处理装置以特定方式执行功能的非瞬时性计算机可读介质中,以便存储在所述非瞬时性计算机可读介质中的所述指令产生一件包括实现在一个或多个流程图和/或方块图方块中指定的功能/操作的指令装置的制品。
[0015]所述计算机程序指令还可被加载到设备、计算机或其他可编程数据处理装置,以导致在所述计算机或其他可编程装置上执行一系列操作步骤以产生计算机实现的过程,从而在所述计算机或其他可编程装置上执行的所述指令提供用于实现在一个或多个流程图和/或方块图方块中指定的功能/操作的过程。
[0016]严格审查补丁(与仅仅不经审查就批准补丁相反)变得非常困难,因为补丁变得大于一百行左右(修改、添加或删除)。当补丁发展到一千行时,审查者通常无法将大型补丁作为一个整体理解,也无法领会其中每个更改的有效性。此外,简短说明不再足以描述补丁中所有更改的理由。当向代码中添加新特性时,此类大型补丁很常见。
[0017]一般而言,与理解一个执行所有类型操作的大型1000行补丁相比,更容易理解10个补丁,每个补丁包含100行功能相关代码以及有关此部分代码所执行操作的解释。
[0018]因此,坚决要求高质量审查过程的项目应该坚持将大型更改分解为一系列较小的补丁。
[0019]通常,应以如下方式将更改拆分为补丁:按顺序应用每个补丁之后,编译所述代码。此外,应以这样的方式拆分更改:使得易于分别解释和理解每个补丁。在某些示例性实施例中,开发人员可以向每个小型补丁添加单独说明。
[0020]但是,手动拆分大型补丁以便审查是非常耗时的过程。
[0021]因此,所公开的主题处理的一个技术问题是提供一种将单个补丁拆分成多个子补丁的自动方式。另一个技术问题是将两个或更多补丁合并成一个补丁。另一个技术问题是基于一组初始补丁,提供一组一致的补丁,以便审查者将能够有效地审查每个补丁。
[0022]—种技术解决方案是确定每个补丁的一致性度量。如下面解释的,一致性度量可以受各种特性的影响。基于所测量的一致性,选择补丁以拆分成子补丁,以便增加总的一致性度量。此外或备选地,将两个或更多补丁合并成聚合补丁,以便增加总的一致性度量。
[0023]在某些示例性实施例中,可以迭代地执行拆分和/或合并,直到获得所需的一致性准则。在本公开中,“修改拆分”指通过拆分和/或合并一组原始补丁,修改一组补丁以便产生一组等效的修改后的补丁。
[0024]另一种技术解决方案是确定补丁的排序,如果在针对源代码应用补丁时遵循该排序,则每个中间版本不会引入在原始源代码或一个或多个原始补丁中没有的新的编译错误。在某些示例性实施例中,可以基于补丁之间的依赖性确定顺序,以便如果第一补丁依赖第二补丁,则将第二补丁排序在第一补丁之后。
[0025]“一致性度量”是为补丁给出的得分,其用作代理值以便指示对于审查者来说补丁的一致程度,审查者审查补丁的容易程度等。应该注意,一致性度量与以下项无关:源代码本身编写的良好程度、所实现算法的复杂性,或修改的类似特性。一致性受许多因素的影响。下面提供某些示例性因素。
[0026]补丁大小:补丁的大小,例如它处理的源代码行数(在删除、修改或添加时),可以影响一致性。可以存在所需的最佳补丁大小,该大小一方面不太大,另一方面不太小。在某些示例性实施例中,所需的最佳补丁大小是大约一百个源代码行。在某些示例性实施例中,可以考虑补丁大小因素,将其与其它补丁大小比较,以便基本上获得所需的大小分布。
[0027]邻近性度量:补丁修改的邻近性可以影响一致性。例如,我们更愿意补丁修改十个连续行,而不是遍布不同文件中的源代码的十个单独行。在某些示例性实施例中,可以以行之间的距离衡量同一源代码文件中的邻近性。在某些示例性实施例中,同一文件中的行比不同文件中的行更靠近,不同目录中的文件可以被视为比同一目录中的文件更远离,等等。
[0028]文本相似性:修改的文本相似性可以影响一致性。例如,考虑其中修改源代码中的所有版权声明的修改。同时审查所有这些修改将减轻审查者的工作,因此可以被视为更一致。在某些示例性实施例中,由于源代码中的类似注释导致两次修改之间的文本相似性,这表明两次修改在功能方面同样相关,因此可以优选地同时审查。
[0029]依赖性:修改之间的依赖性可以影响一致性。一般而言,可能希望在同一补丁中出现多个相关的代码段。例如,考虑添加某一变量的补丁。可能希望同一补丁也包括使用该补丁的新代码。再如,考虑包括新方法的补丁,该新方法调用另一个新引入的方法,则可能在同一补丁中引入这两个新弓I入的方法更可取。
[0030]共享依赖性:补丁之间的共享依赖性可以影响一致性。可能希望在同一补丁中出现具有类似依赖性的多个代码段,因为它们可能与类似的被引入原因关联。例如,可能最好在同一补丁中出现使用相同预先存在的变量或功能的两段新代码或已修改代码。
[0031]在某些示例性实施例中,可以使用上述一个或多个参数(例如,补丁、大小、邻近性、文本相似性、依赖性和共享依赖性)或类似参数计算一致性度量。在某些示例性实施例中,可以一起对不同因素进行加权以便计算一致性度量。
[0032]在某些示例性实施例中,同时使用不同的权重考虑不同的因素。因此,即使未完全满足任何因素,也可以获得最大一致性度量。例如,新变量和使用它的所有代码可能是1000行,并且在这种情况下,以下做法会有意义:针对依赖性因素丢失少许得分,以便针对所需大小获得由于邻近性因素导致的额外得分,等等。
[0033]在某些示例性实施例中,可以修改拆分,同时确保没有引入循环依赖性。如果第一补丁(直接或者经由一个或多个中间补丁间接地)依赖于第二补丁并且反之亦然,则两个补丁被称为彼此循环依赖。例如,考虑第一补丁定义名为“foo”的函数并且使用名为“bar”的函数,而第二补丁定义“bar”函数并且使用“foo”函数。如果在应用第二补丁之前应用第一补丁,则第一补丁将引入编译错误,并且反之亦然。如果以不同方式合并或拆分两个补丁(例如,定义在第一补丁中,其使用在第二补丁中),则可以避免循环依赖性。
[0034]应该注意, 申请人:正在同时提交标题为“SOURCE CODE PATCHES (源代码补丁)”的美国专利申请,其在此全部引入作为参考。该申请公开一种批注源代码以便指示多个补丁的方案。可以应用所公开的主题以便相应地生成批注。例如,可以基于所公开的主题自动提供初始拆分,并且进行手动编辑,例如在“源代码补丁”申请中所公开的那样。
[0035]一种技术效果是创建审查人员相对容易审查的补丁。补丁可以包含处理相同特性或错误修复的代码、连续代码行等。因此,解释每个补丁所执行的操作可以有意义。在某些示例性实施例中,补丁不包括应该分别解释的不相关修改。此外或备选地,补丁包括作为补丁解释一部分的每次修改。
[0036]所公开的主题的另一种技术效果是创建拆分,其中补丁大小在统计上上围绕预定大小分布。在某些示例性实施例中,可以在具有太大补丁之间和具有太多小型补丁之间平衡拆分。
[0037]基于手动创建的良好拆分,可以理解,不需要所有补丁必须具有相同的长度,例如长度恰好为100行。实际上,某些补丁很短(例如,当很少的已更改行被确定为与任何其它内容完全无关时),而某些补丁很长(例如,当添加拆分没有意义的长代码段时)。例如,在一个实例中具有2801个已修改行,将它们拆分成29个补丁,每个补丁平均97个已修改行。但是,其中6个补丁不到20行,6个补丁超过200行。补丁长度的分布接近于指数分布。
[0038]另一种技术效果是通过根据预定顺序应用补丁,避免引入编译错误。在某些示例性实施例中,补丁不包含这样的代码:该代码依赖于仅在该补丁之后排序的另一个补丁中定义的符号。
[0039]现在参考图1,其中示出了根据本主题的某些示例性实施例的计算机化环境。计算机化环境20包括若干开发人员(24、28、32)。所述开发人员可以共同开发软件产品,例如开源程序。在某些示例性实施例中,所述开发人员可以彼此远离并使用计算机化网络36(例如因特网)通信。每个开发人员的计算机(例如,33、34、35)可以连接到计算机化网络36。
[0040]开发人员32进行的修改可以由至少一个其它开发人员(例如管理人员、审查团队等)审查、测试或以其它方式检查。
[0041]在某些示例性实施例中,在传输其补丁以便审查之前,开发人员32可以根据所公开的主题使用自动工具生成拆分。从而,简化审查过程。此外或备选地,接收一个或多个不一致补丁的审查者24可以使用自动工具生成不同的拆分以便审查。
[0042]现在参考图2A,其中示出了根据所公开的主题的某些示例性实施例的用于自动操纵补丁的方法的流程图。
[0043]获得包括一个或多个补丁的初始拆分(步骤200)。对于每个补丁,计算一致性度量(步骤210)。
[0044]迭代执行循环230,直到满足预定一致性准则阈值(步骤235)。一致性准则阈值例如可以是每个补丁的最小一致性度量、所有补丁的平均一致性度量、它们的组合等。在某些示例性实施例中,可以使用用户的输入判定是否继续执行循环230。用户的输入可以基于用户对拆分一致性的理解或基于不同因素。
[0045]如果满足一致性准则,则将一组补丁输出给用户(步骤299),例如通过批注源代码、创建补丁文件、传输补丁文件、在显示器上显示补丁等。否则,可以执行循环230的步骤240-270。
[0046]在步骤240,选择补丁以便拆分。在某些示例性实施例中,可以选择具有最低一致性度量的补丁。此外或备选地,用户可以手动选择要拆分的补丁。
[0047]在步骤250,可以将所选择的补丁拆分成两个或更多子补丁。在某些示例性实施例中,基于子补丁的一致性度量的修改、所有子补丁的总一致性度量的修改等,将每次修改确定为添加到现有的子补丁还是新的子补丁。在某些示例性实施例中,可以生成拆分成子补丁的所有可能组合,并且基于一致性度量计算,可以选择拆分成子补丁的一个组合。在某些示例性实施例中,拆分成子补丁将相对于补丁增加平均一致性度量。此外或备选地,可以选择拆分成子补丁,以便相对于在将补丁拆分成子补丁之前的拆分,增加并且最佳地最大化整个拆分的总一致性度量。
[0048]在某些示例性实施例中,除了尝试增加一致性度量之外,可以执行步骤255以便确保拆分未引入循环依赖性。例如,可以检查每个潜在子补丁以便了解循环依赖性。如果确定子补丁引入循环依赖性,则该子补丁不能是拆分的一部分。
[0049]在步骤260,可以修改所述一组补丁(例如步骤200的一组原始补丁,或者在循环230的先前迭代中修改的一组已修改补丁),以便包括新的子补丁而不是所选择的补丁,从而确定其中将所选择的补丁拆分成子补丁的新拆分。
[0050]在步骤270,可以针对子补丁测量一致性度量。可选地,一致性度量可以已在步骤250期间测量,并且不需要再次计算。
[0051 ] 在结束步骤270之后,在步骤260确定的新组的所有补丁均已计算一致性度量,并且可以在循环230的另一次迭代中再次执行步骤235。
[0052]现在参考图2B,其中示出了根据所公开的主题的某些示例性实施例的用于计算补丁的一致性度量的步骤(例如在步骤210公开)。
[0053]在某些示例性实施例中,可以执行步骤212、214、216、218和220中的一个或多个,
以便计算用于计算一致性度量的因素。
[0054]在步骤212,可以确定补丁中的修改数量。此外或备选地,可以确定补丁中的源代码行数量。在某些示例性实施例中,步骤212计算补丁大小度量。在某些示例性实施例中,例如可以将度量规范化为O和I之间的数值,以便最佳大小为1,最差大小为O。在某些示例性实施例中,最佳大小可以是最大可能大小与最小可能大小之间的中间大小,例如100个源代码行。
[0055]在步骤214,可以确定和计算修改的邻近性度量。在某些示例性实施例中,可以使用所有修改的邻近性计算补丁的单个邻近性度量,例如可以将该邻近性度量规范化为O和I之间的数值。
[0056]在步骤216,可以确定和计算修改之间的文本相似性。在某些示例性实施例中,可以基于每次修改的相似性计算该度量。此外或备选地,可以基于每个源代码行的相似性计算相似性,以便在一次修改包括多个源代码行的情况下,分别检查每个源代码行。在某些示例性实施例中,可以使用所有修改的文本相似性度量计算补丁的单个文本相似性度量,例如可以将该文本相似性度量规范化为O和I之间的数值。
[0057]在步骤218,可以计算补丁修改之间的依赖性。例如,对于每次修改,可以对依赖该修改的其它修改的数量和/或该修改所依赖的其它修改的数量进行计数,以便计算该度量。在某些示例性实施例中,可以使用所有测量的依赖性计算补丁的单个依赖性度量,例如可以将该依赖性度量规范化为O和I之间的数值。
[0058]在步骤220,可以计算补丁修改之间的共享依赖性。在某些示例性实施例中,对于每次修改,可以确定多少次其它修改依赖于该修改或该修改依赖于多少次其它修改,同一补丁、补丁中的修改使用同一符号(例如在其它位置定义的变量、在其它位置定义的函数等)、使同一代码行依赖于修改的符号定义等。在某些示例性实施例中,可以使用所有测量的共享依赖性计算补丁的单个测量的共享依赖性,例如可以将该共享依赖性规范化为O和I之间的数值。
[0059]在步骤224,可以基于在步骤212-220的任何一个中计算的因素,计算一致性度量。例如,可以计算因素的加权平均值,以便计算一致性度量。从而,在一致性度量中考虑所有因素,同时通过另一个因素的增加平衡一个因素的减小。
[0060]现在参考图2C,其中示出了根据所公开的主题的某些示例性实施例的用于自动操纵补丁的方法的流程图。图2C的方法类似于图2A的方法,并且包括图2A的步骤200、210、235,299 和循环 230。
[0061]在步骤240’,类似于图2A的步骤240,选择补丁以便处理。但是,步骤240’包括其它选择:是否将单个补丁拆分成子补丁,或者将两个或更多补丁合并成聚合补丁。如果选择合并,则选择一组要合并的两个或更多补丁。选择可以基于一致性度量,以及基于哪个操作将更多地增加一致性度量的判定。在某些情况下,可以确定试探法以代替实际计算哪个操作提供最佳结果。
[0062]在一个示例性实施例中,要合并的补丁可以是小于最佳大小并且一致性度量低于预定阈值的补丁。基于一组要合并的补丁,选择一个聚合补丁,其包括至少两个补丁但不一定包括所有补丁。
[0063]基于在步骤240’的决策,执行步骤250A或步骤250B。
[0064]在步骤250A,将所选择的补丁合并成聚合补丁。聚合补丁可以是如下补丁:其相对于要合并的一组补丁的原始平均一致性度量,最多地增加平均一致性度量。在某些示例性实施例中,考虑合并所述组的各部分的多个选项,并且基于其一致性度量,选择一个选项以便执行。在某些示例性实施例中,在合并过程中,检查依赖性以便避免产生循环依赖性。
[0065]在步骤250B,类似于图2A的步骤250,拆分所选择的补丁。
[0066]在步骤260’,类似于图2A的步骤260,基于由步骤250A或步骤250B执行的拆分或合并,修改所述一组补丁。
[0067]在步骤270’,类似于图2A的步骤270,并且在先前未计算的情况下,可以计算新生成的补丁(子补丁或聚合补丁)的一致性度量。
[0068]应该注意,在所公开的主题的某些实施例中,可以提供初始补丁并且将其拆分成单元补丁,可以合并这些单元补丁以便产生新的拆分。“单元补丁”是如下补丁:其包括基本上最小的补丁块并且不能分为更小的块。例如,单元块可以是包括一个语句、一个源代码行等的块。再如,单元补丁的大小例如可以由用户预定为任意数值,例如两个源代码行、三个代码语句等。在一个实施例中,图2C的步骤200包括获得初始补丁并将所述补丁拆分成单元补丁,从而获得要合并成新拆分的一组补丁。
[0069]现在参考图3,其中示出了根据所公开的主题的某些示例性实施例的计算机化装置的组件的框图。
[0070]在某些示例性实施例中,装置300可以包括处理器302。处理器302可以是中央处理单元(CPU)、微处理器、电子电路、集成电路(IC)等。处理器302可以用于执行装置300或其任何子组件所需的计算。
[0071]在某些示例性实施例中,装置300可以包括输入/输出(I/O)模块305,例如接收器、发送器、收发器、调制解调器、输入设备、输出设备等。在某些示例性实施例中,I/o模块305用于连接到I/O设备以便提供人类用户的输入或输出。I/O模块305可以在运行上连接到显示器、指点设备、键盘等。然而,将理解,所述系统可以在无需人类操作的情况下运行。
[0072]在某些示例性实施例中,装置300可以包括存储器307。存储器307可以是计算机化存储器,例如永久性存储器或易失性存储器或其组合。例如,存储器307可以是闪存盘、随机存取存储器(RAM)、存储器芯片、光存储设备,例如CD、DVD或激光盘;磁存储设备,例如磁带、硬盘、存储区域网络(SAN)、网络连接存储(NAS)等;半导体存储设备,例如闪存设备、记忆棒等。在某些示例性实施例中,存储器307包括多个存储器设备,例如RAM和硬盘。在某些示例性实施例中,存储器307可以保存程序代码,所述程序代码可运行以导致处理器302执行与图2A-2C中所示的任何步骤关联的操作等。
[0073]下面详述的组件可以被实现为例如由处理器302或其他处理器执行的一组或多组相关计算机指令。所述组件可以被布置为在任何计算环境下以任何编程语言编程的一个或多个可执行文件、动态库、静态库、方法、功能、服务等。
[0074]在某些示例性实施例中,存储器307可以保存源代码310以及补丁 315。在某些示例性实施例中,基于装置300的操作,可以从原始拆分修改补丁 315。在某些示例性实施例中,最初可以将补丁表示为源代码310中的批注,并且随后例如可以通过补丁生成器(未示出)基于批注生成补丁 315。
[0075]补丁拆分器/合并器320可以被配置为将一个补丁拆分成两个或更多子补丁和/或将两个或更多补丁合并成增强的补丁。在某些示例性实施例中,补丁拆分器/合并器320被配置为执行图2A-2C的方法步骤以便拆分和/或合并补丁,从而修改拆分。在某些示例性实施例中,补丁拆分器/合并器320可以在运行上耦合到补丁一致性计算器330,以便确定要合并哪些补丁和/或要拆分哪个补丁,和/或如何执行拆分/合并。
[0076]在某些示例性实施例中,补丁一致性计算器330可以被配置为计算补丁的一致性度量。在某些示例性实施例中,补丁一致性计算器330可以被配置为执行图2B的步骤。
[0077]在某些示例性实施例中,依赖性标识器340可以被配置为确定修改之间的依赖性和/或共享依赖性。在某些示例性实施例中,补丁一致性计算器330可以使用依赖性标识器340计算在一致性度量计算中使用的因素。在某些示例性实施例中,补丁拆分器/合并器320可以使用依赖性标识器340避免在拆分中引入循环依赖性。
[0078]附图中的流程图和方块图示出了根据本公开的各种实施例的系统、方法和计算机程序产品的可能实施方式的架构、功能和操作。在此方面,流程图中的每个方块和方块图中的某些方块都可以表示程序代码的模块、段或部分,所述程序代码包括用于实现指定的逻辑功能(多个)的一个或多个可执行指令。还应指出,在某些备选实施方式中,在方块中说明的功能可以不按图中说明的顺序发生。例如,示为连续的两个方块可以实际上被基本同时地执行,或者某些时候,取决于所涉及的功能,可以以相反的顺序执行所述方块。还将指出,方块图和/或流程图的每个方块以及方块图和/或流程图中的方块的组合可以由执行指定功能或操作的基于专用硬件的系统或专用硬件和计算机指令的组合来实现。
[0079]在此使用的术语只是为了描述特定的实施例并且并非旨在作为本公开的限制。如在此所使用的,单数形式“一”、“一个”和“该”旨在同样包括复数形式,除非上下文明确地另有所指。还将理解,当在此说明书中使用时,术语“包括”和/或“包含”指定存在所声明的特性、整数、步骤、操作、元素和/或组件,但是并不排除存在或增加一个或多个其他特性、整数、步骤、操作、元素、组件和/或它们的组合。
[0080]如本领域的技术人员将理解的,所公开的主题可以体现为系统、方法或计算机程序产品。因此,所公开的主题可以采取完全硬件实施例、完全软件实施例(包括固件、驻留软件、微代码等)或组合了软件和硬件方面的实施例的形式,本文一般称为“电路”、“模块”或“系统”。此外,本公开可以采取体现在任何有形的表达介质(在介质中包含计算机可用程序代码)中的计算机程序产品的形式。
[0081]可以使用一个或多个计算机可用或计算机可读介质的任意组合。所述计算机可用或计算机可读介质例如可以是(但不限于)任何非瞬时性计算机可读介质、电、磁、光、电磁、红外线或半导体系统、装置、设备或传播介质。计算机可读介质的更具体的实例(非穷举列表)将包括以下项:具有一条或多条线的电连接、便携式计算机软盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦写可编程只读存储器(EPR0M或闪存)、光纤、便携式光盘只读存储器(⑶ROM)、光存储设备、诸如那些支持因特网或内联网的传输介质或磁存储设备。注意,计算机可用或计算机可读介质甚至可以是程序被打印在其上的纸张或其他适合的介质,因为所述程序可以通过例如光扫描所述纸张或其他介质被电子地捕获,然后被编译、解释或另外以适合的方式被处理(如果必要),然后被存储在计算机存储器中。在此文档的上下文中,计算机可用或计算机可读介质可以是任何能够包含、存储、传送、传播或传输由指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合的程序的介质。所述计算机可用介质可以包括其中包含所述计算机可用程序代码(例如,在基带中或作为载波的一部分)的传播数据信号。可以使用任何适当的介质(包括但不限于无线、线缆、光缆、RF等)来传输所述计算机可用程序代码。
[0082]用于执行本公开的操作的计算机程序代码可以使用包含一种或多种编程语言的任意组合来编写,所述编程语言包括诸如Java、Smalltalk、C++之类的面向对象的编程语言以及诸如“C”编程语言或类似的编程语言之类的常规过程编程语言。所述程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为独立的软件包、部分地在用户计算机上并部分地在远程计算机上执行,或者完全地在远程计算机或服务器上执行。在后者的情况中,远程计算机可以通过包括局域网(LAN)或广域网(WAN)的任何类型网络与用户的计算机相连,或者可以与外部计算机进行连接(例如,使用因特网服务提供商通过因特网连接)。
[0083]以下的权利要求中的对应结构、材料、操作以及所有功能性限定的装置或步骤的等同替换,旨在包括任何用于与在权利要求中具体指出的其它单元相组合地执行该功能的结构、材料或操作。所给出的对本发明的描述其目的在于示意和描述,并非是穷尽性的,也并非是要将本发明限定到所表述的形式。对于本领域技术人员来说,在不偏离本发明范围和精神的情况下,显然可以作出许多修改和变型。对实施例的选择和说明,是为了最好地解释本发明的原理和实际应用,使本领域技术人员能够明了,本发明可以有适合所要的特定用途的具有各种改变的各种实施方式。
【权利要求】
1.一种具有处理器的计算机化装置,所述处理器被配置为: 针对源代码获得包括多个源代码修改指令的源代码补丁;以及 将所述源代码补丁自动拆分成多个子补丁,其中按照一顺序针对所述源代码应用所述多个子补丁相当于应用所述源代码补丁。
2.根据权利要求1的计算机化装置,其中所述自动拆分包括: 基于一组补丁的测量得分,从所述一组补丁中选择要拆分的补丁 ; 将所选择的补丁拆分成至少两个子补丁 ;以及 针对新的组重复所述选择和所述拆分,所述新的组包括: 所述一组补丁并且不包括所选择的补丁 ;以及 所述至少两个子补丁。
3.根据权利要求1的计算机化装置,其中所述自动拆分包括: 基于一致性准则,选择所述源代码补丁的所述源代码修改指令的子集;以及 基于所述源代码修改指令的所述子集,生成子补丁。
4.根据权利要求1的计算机化装置,其中所述处理器还被配置为:基于所述子补丁的源代码修改指令之间的依赖性,确定所述顺序,以便基于第二子补丁具有依赖于第一子补丁的第一源代码修改指令的第二源代码修改指令,将所述第一子补丁排序在所述第二子补丁之前。
5.根据权利要求1的计算机化装置,其中所述处理器还被配置为: 计算所述源代码修改指令的所述子集的一致性度量;以及 比较所述一致性度量与所述一致性准则。
6.根据权利要求5的计算机化装置,其中计算所述一致性度量包括对所述子集中的源代码行数进行计数。
7.根据权利要求5的计算机化装置,其中计算所述一致性度量包括确定所述源代码修改指令彼此的邻近性。
8.根据权利要求5的计算机化装置,其中计算所述一致性度量包括计算所述源代码修改指令之间的文本相似性。
9.根据权利要求5的计算机化装置,其中计算所述一致性度量包括确定所述源代码修改指令之间的依赖性。
10.根据权利要求5的计算机化装置,其中计算所述一致性度量包括确定所述源代码修改指令的共享依赖性。
11.根据权利要求5的计算机化装置,其中所述一致性准则禁止在第一和第二补丁之间产生循环依赖性,其中如果所述第一补丁直接或间接依赖于所述第二补丁,并且所述第二补丁直接或间接依赖于所述第一补丁,则所述第一和第二补丁具有循环依赖性。
12.根据权利要求1的计算机化装置, 其中对于所述多个子补丁中的每个子补丁,在应用关于该子补丁的所有所需子补丁之后应用该子补丁被配置为提供不引入编译错误的源代码版本,假如已应用所述源代码补丁,则所述编译错误将不存在,其中所需子补丁是该子补丁所依赖于的子补丁。
13.根据权利要求1的计算机化装置,其中从包括以下项的组中选择源代码修改指令:要添加的新源代码行、要删除的现有源代码行,以及要替换现有源代码行的已修改源代码行。
14.根据权利要求1的计算机化装置,其中通过将所述源代码补丁拆分成一组单元补丁并将所述一组单元补丁合并成子集来执行所述自动拆分,由此确定所述多个子补丁。
15.一种由处理器执行的计算机实现的方法,所述方法包括: 针对源代码获得包括多个源代码修改指令的源代码补丁 ;以及 将所述源代码补丁自动拆分成多个子补丁,其中如果按照一顺序应用于所述源代码,则所述多个子补丁提供与应用所述源代码补丁等同的输出。
16.根据权利要求15的计算机实现的方法,其中所述自动拆分包括: 基于一组补丁的测量得分,从所述一组补丁中选择要拆分的补丁 ; 将所选择的补丁拆分成至少两个子补丁;以及 针对新的组重复所述选择和所述拆分,所述新的组包括: 所述一组补丁并且不包括所选择的补丁;以及 所述至少两个子补丁。
17.根据权利要求15的计算机实现的方法,其中所述自动拆分包括: 基于一致性准则,选择 所述源代码补丁的所述源代码修改指令的子集;以及 基于所述源代码修改指令的所述子集,生成子补丁。
18.根据权利要求15的计算机实现的方法,还包括:基于所述子补丁的源代码修改指令之间的依赖性,确定所述顺序,以便基于第二子补丁具有依赖于第一子补丁的第一源代码修改指令的第二源代码修改指令,将所述第一子补丁排序在所述第二子补丁之前。
19.根据权利要求15的计算机实现的方法,还包括: 计算所述源代码修改指令的所述子集的一致性度量;以及 比较所述一致性度量与所述一致性准则。
20.根据权利要求19的计算机实现的方法,其中计算所述一致性度量包括以下步骤中的至少一个: 对所述子集中的源代码行数进行计数; 计算所述一致性度量包括确定所述源代码修改指令彼此的邻近性; 计算所述一致性度量包括计算所述源代码修改指令之间的文本相似性; 计算所述一致性度量包括确定所述源代码修改指令之间的依赖性;以及 计算所述一致性度量包括确定所述源代码修改指令的共享依赖性。
21.一种计算机程序产品,包括: 在其上保存指令的非瞬时性计算机可读介质,所述指令当由处理器执行时,被配置为导致所述处理器执行以下步骤: 针对源代码获得包括多个源代码修改指令的源代码补丁 ;以及将所述源代码补丁自动拆分成多个子补丁,其中如果按照一顺序应用于所述源代码,则所述多个子补丁提供与应用所述源代码补丁等同的输出。
【文档编号】G06F9/45GK104054051SQ201380005507
【公开日】2014年9月17日 申请日期:2013年1月10日 优先权日:2012年1月16日
【发明者】E·D·法尔基, A·戈登, N·Y·哈雷尔, M·肖沙 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1