我如何区分和修补/合并字符串而不是文件?

Par*_*gon 6 python mysql git django bash

我正在开展一个项目,人们可以提交故事并让其他人参与其中.我想存储人们所做的更改而不是整个新的更改集,而不是简单地编辑数据库中的条目.然后,如果人们想要恢复到以前的版本,我可以动态应用差异.我还可以轻松地仅使用修改后的文本呈现编辑者用户,以便他们可以直接跳转到更改.

我知道如何使用diff文件并使用它们修补其他文件.但我正在使用Python和Django创建一个Web应用程序,我将把所有这些差异存储在MySQL数据库中.鉴于性能是不是这个应用程序的一个主要问题,我准备从数据库提取数据,使文件,并运行git diffpatch对这些文件.

有没有比构建新文件更好的方法,每次我想创建新版本或应用新差异时删除它们?有没有办法在直文而不是文件上运行差异?例如.将bash中的变量设置为(将会是什么)文件的内容(但实际上是来自数据库的数据),并git diff在它们上运行?我希望在用户提交表单后从Python文件中控制这些操作.

我真的只是想找到一个很好的方法来开始这个问题,所以任何帮助将不胜感激.

谢谢你的时间,

ParagonRG

Par*_*gon 5

我已经做了很多寻找解决方案.Python的difflib是相当合法的,但不幸的是它往往要求diff字符串包含整个原始字符串以及更改内容的记录.这与git diff不同,在这里您只能看到更改内容和一些额外的上下文.difflib还提供了一个名为unified_diff的函数,它确实提供了更短的diff,但它没有提供从字符串和diff重建字符串的功能.例如.如果我用text1和text2做差异,叫做diff1,那么我就无法从text1和diff1中生成text2.

因此,我创建了一个简单的Python模块,允许从单个字符串及其相关差异中重建字符串,包括向前和向后.它叫做merge_in_memory,可以在https://github.com/danielmoniz/merge_in_memory找到.只需拉出存储库并运行setup.py即可.

一个简单的用法示例:

import merge_in_memory as mim_module

str1 = """line 1
line 2"""
str2 = """line 1
line 2 changed"""

merger = mim_module.Merger()
print merger.diff_make(str1, str2)
Run Code Online (Sandbox Code Playgroud)

这将输出:

--- 
+++ 
@@ -1,2 +1,2 @@
 line 1
-line 2
+line 2 changed
Run Code Online (Sandbox Code Playgroud)

diffs只是字符串(相当棕褐色的生成器,就像使用difflib时一样).你可以创建一些diff并使用该diff_apply_bulk()函数立即应用它们(即通过历史记录或跟踪快进).

要反转到历史记录,只需确保reverse在调用diff_bulk()或时将该属性设置为True diff_apply_bulk.例如:

merge = self.inline_merge.diff_apply_bulk(text3, [diff1, diff2], reverse=True)
Run Code Online (Sandbox Code Playgroud)

如果从text1开始并使用diff1和diff2生成text2和text3,则使用上面的代码行重建text1.请注意,差异列表仍按升序排列.'合并',即.将diff应用于字符串本身就是一个字符串.

所有这些允许我将差异存储在数据库中作为简单的VARCHAR(或者你有什么).只要我有一个起点,我就可以按顺序将它们拉出来并将它们应用于任一方向以生成我想要的文本.

请随意留下任何评论,因为这是我的第一个Python模块.

谢谢,

ParagonRG