我正在查看http://code.google.com/p/google-diff-match-patch/并已下载该文件.当我看它是2个文件
DiffMatchPatch.cs
DiffMatchPatchTest.cs
Run Code Online (Sandbox Code Playgroud)
当我尝试创建DiffMatchPatch.cs的新对象时,我必须传入一些操作和字符串文本.
http://neil.fraser.name/software/diff_match_patch/svn/trunk/demos/demo_diff.html
在演示中,他们划掉了不同的词,这就是我想要实现的目标.
我试图比较服务器端的2个文本块找到差异并向用户发送带有文本文件块的电子邮件,就像最终结果在我上面发布的演示中一样.
那么有没有人有关于如何使用C#版本的教程?
我从一个模块导入了一个类,但是当我尝试修补类名而没有它的模块作为前缀时,我得到一个类型错误:
TypeError: Need a valid target to patch. You supplied: 'MyClass'
Run Code Online (Sandbox Code Playgroud)
例如,以下代码给出了上述错误:
import unittest
from mock import Mock, MagicMock, patch
from notification.models import Channel, addChannelWithName, deleteChannelWithName, listAllChannelNames
class TestChannel(unittest.TestCase):
@patch("Channel")
def testAddChannelWithNamePutsChannel(self, *args):
addChannelWithName("channel1")
Channel.put.assert_called_with()
Run Code Online (Sandbox Code Playgroud)
虽然这个代码的第二个版本没有给我类型错误:
import unittest
from mock import Mock, MagicMock, patch
from notification.models import Channel, addChannelWithName, deleteChannelWithName, listAllChannelNames
class TestChannel(unittest.TestCase):
@patch("notification.models.Channel")
def testAddChannelWithNamePutsChannel(self, *args):
addChannelWithName("channel1")
Channel.put.assert_called_with()
Run Code Online (Sandbox Code Playgroud)
这是为什么?为什么我可以在其他地方将Channel引用为"Channel",但对于补丁我需要模块前缀不会出错?另外,我觉得给出完整的模块前缀不起作用,因为当我调用Channel.put.assert_called_with()时,我得到的错误是assert_called_with不是Channel.put的属性.有人可以解释发生了什么吗?非常感谢!
有没有人知道或者知道C#中的二进制补丁生成算法实现?
基本上,比较两个文件(指定旧的和新的),并生成一个补丁文件,可用于升级旧文件以具有与新文件相同的内容.
实现必须相对较快,并使用大文件.它应该表现出O(n)或O(logn)运行时.
我自己的算法往往是糟糕的(快速但产生巨大的补丁)或缓慢(产生小补丁但具有O(n ^ 2)运行时).
任何建议或实施指针都会很好.
具体来说,该实现将用于使我们拥有一台主服务器的各种大型数据文件保持服务器同步.当主服务器数据文件发生更改时,我们还需要更新多个异地服务器.
我所做的最天真的算法,仅适用于可以保存在内存中的文件,如下所示:
这有点像压缩,没有窗口,所以它会占用大量内存.然而,它是相当快的,并且产生非常小的补丁,只要我尝试使代码输出最小.
更节省内存的算法使用窗口,但会产生更大的补丁文件.
我在本文中跳过了上述算法的细微差别,但如果有必要,我可以发布更多细节.但是,我确实觉得我需要一个不同的算法,所以改进上述算法可能不会让我足够远.
编辑#1:以下是对上述算法的更详细描述.
首先,组合这两个文件,这样你就有了一个大文件.记住两个文件之间的切点.
其次,这样做可以抓取4个字节并将其位置添加到整个文件中的所有内容的字典步骤中.
第三,从新文件开始的地方开始,尝试定位4字节的现有组合,并找到最长匹配.确保我们只考虑旧文件中的位置,或者来自新文件中较早的位置.这确保了我们可以在补丁应用期间重用旧文件和新文件中的材料.
编辑#2:上述算法的源代码
您可能会收到有关证书存在问题的警告.我不知道如何解决这个问题,因此暂时只接受证书.
源使用了我库中其余部分的许多其他类型,因此文件不是全部,但这就是算法实现.
@lomaxx,我试图为subversion中使用的算法找到一个很好的文档,叫做xdelta,但除非你已经知道算法是如何工作的,否则我发现的文件无法告诉我需要知道什么.
或者也许我只是密集...... :)
我快速浏览了你所提供的网站上的算法,遗憾的是它无法使用.二进制diff文件中的注释说:
找到一组最佳差异需要相对于输入大小的二次时间,因此它很快就会变得无法使用.
我的需求并不是最优的,所以我正在寻找更实用的解决方案.
谢谢你的答案,如果我需要它们,他会为他的工具添加一个书签.
编辑#1:注意,我会查看他的代码,看看我是否能找到一些想法,稍后我还会给他发一封电子邮件,但我已经阅读了他所引用的那本书,虽然解决方案适用于找到最佳解决方案,由于时间要求,它在使用中是不切实际的.
编辑#2:我肯定会追捕python …
我对一个使用Subversion作为源控件的开源项目进行了一些本地更改.(我没有对原始项目存储库的提交访问权限.)
我的更改添加了一个文件,但此文件不包含在"svn diff"的输出中.(值得注意的是,新文件是二进制文件,而不是纯文本.)
如何制作包含新文件的补丁?
$ svn st
A tests/foo.zip
$ svn diff
$
Run Code Online (Sandbox Code Playgroud) 此StackOverflow答案具有KDiff3的图像,突出显示行内差异.有人知道一个工具可以在命令行上显示相同的(例如,通过颜色)吗?
想到这一点的另一种方法是想要在补丁文件中区分每个差异.
有没有办法在Python中使用PATCH http方法发出请求?
我尝试使用httplib,但它不接受PATCH作为方法参数.
我们有一些软件依赖于另一个(非常常用的)应用程序的某些行为,这些应用程序现在已经改变,使我们当前的实现可行,但不是最佳.
我们认为这种变化可能会影响其他一些应用,特别是在性能监控领域,我们已经找到了一种解决方案,我们相信这将改善一系列其他潜在问题.
不幸的是,所述解决方案是内核更改(相对简单但影响很大,如果我们填充它)并且我们没有提交内核补丁进行审核的经验.
有没有人在SO上提交了一个补丁(虽然我很欣赏所有的答案,我怀疑最好的答案会来自那些已经完成整个过程的人,甚至没有成功)?你有没有接受过(Alan Cox等人在SO上有什么机会)?
正确的流程是什么?我无意向Linus发送一封电子邮件,因为我知道他有一群保护者,你应该在他到达之前经过这些保护.我如何找出谁负责内核的特定部分.
我可能会过于乐观地认为某个内核世界从未听说过可以做出贡献,但我有兴趣了解一下.
编辑更多细节:
这个更改实际上并不是针对性能错误,而是对进程终止时编写的进程记帐条目(当前)的改进(在我看来).
Websphere App Server(啊,IBM,祝福他们的小心灵)改变了它的作用; JVM过去经常退出以便他们的条目被写入,我们可以使用它进行退款.现在它让JVM闲置数月,这意味着数据无法及时获得,除非我们定期强制关闭WAS.不知怎的,我不认为IBM软件集团会为我们修复他们的软件:-).无论如何,我相信它对于其他长期存在的过程可能是一个有用的特性.
当前进程退出时会写入类型3进程记帐记录,我们正在查看的是一种在进程仍然处于活动状态时定期写入N类记录的机制,给出自上次写入以来的数据(如果这是第一次).退款或性能监控应用程序可以选择使用类型3记录(完全不变)或临时类型N记录.我们目前的解决方法是监控特定流程的/ proc/PID/stat,但这是一个可怕的问题,因为它与实际流程会计不能很好地集成.
它不需要经常(我们会对24小时感到满意),但可能会产生性能影响,因为目前仅在流程exit()上完成的工作必须偶尔在流程上下文切换时完成.Linus等人可能不喜欢这个想法,因为它可能是代码的高影响区域(甚至检查自上次写入以来是否已经24小时对他们来说可能太慢).
不过,感谢到目前为止的所有答案,我会看到我如何去.给我几天,我会接受最好的答案.
有没有办法将diff中的单个Hunk应用到文件中?例如,假设我从文件A和B执行差异,并产生三个差异块,每个差异用...表示
@@ -971,30 +977,28 @@
Run Code Online (Sandbox Code Playgroud)
......(在统一差异的情况下).然后,我希望能够将该差异提供给stdin,并且要求补丁仅应用大块N.
手动方法是剪切和粘贴有趣的帅哥,但我不是在那种解决方案之后.
I have a project main that contains a submodule foo. For this particular project, I would like to make a small change to foo that only applies to this particular project main.
main/
+ .git
+ main.c
+ lib/
| + bar.c
+ foo/ # My `foo` submodule
+ .git
+ config.h # The file I want to patch from `main`
+ ...
Run Code Online (Sandbox Code Playgroud)
A common solution would be to go down to my submodule, make a commit Applied …
我使用以下命令来应用补丁Mercurial,而不提交它:
hg import patch.diff --no-commit
Run Code Online (Sandbox Code Playgroud)
它工作得很好,但是如果我尝试一次应用几个补丁:
hg import patch1.diff --no-commit
hg import patch2.diff --no-commit
...
Run Code Online (Sandbox Code Playgroud)
我在第二次提交后收到此错误消息:
abort: uncommitted changes
Run Code Online (Sandbox Code Playgroud)
如果我完全相同SourceTree(应用patch1然后patch2并选择"修改工作副本文件")它可以工作:两个补丁应用于工作副本,patch1和patch2的变化组合/折叠在一起.
如何使用hg命令行执行相同的操作?