Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
Diff3: Added diff3 wrapper
Browse files Browse the repository at this point in the history
  • Loading branch information
andre-d authored and spladug committed Sep 11, 2012
1 parent 3c70bc8 commit ebab524
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 0 deletions.
4 changes: 4 additions & 0 deletions r2/example.ini
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -477,6 +477,10 @@ feedback_email = reddit@gmail.com
# Special case sensitive domains # Special case sensitive domains
case_sensitive_domains = i.imgur.com, youtube.com case_sensitive_domains = i.imgur.com, youtube.com


# Location (directory) for temp files for diff3 merging
# Empty will use python default for temp files
diff3_temp_location = /dev/shm

[server:main] [server:main]
use = egg:Paste#http use = egg:Paste#http
host = 0.0.0.0 host = 0.0.0.0
Expand Down
56 changes: 56 additions & 0 deletions r2/r2/lib/merge.py
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,56 @@
import subprocess
import tempfile
import difflib
from pylons.i18n import _
from pylons import g

class ConflictException(Exception):
def __init__(self, new, your, original):
self.your = your
self.new = new
self.original = original
self.htmldiff = make_htmldiff(new, your, _("current edit"), _("your edit"))
Exception.__init__(self)


def make_htmldiff(a, b, adesc, bdesc):
diffcontent = difflib.HtmlDiff(wrapcolumn=60)
return diffcontent.make_table(a.splitlines(),
b.splitlines(),
fromdesc=adesc,
todesc=bdesc)

def threeWayMerge(original, a, b):
try:
temp_dir = g.diff3_temp_location if g.diff3_temp_location else None
data = [a, original, b]
files = []
for d in data:
f = tempfile.NamedTemporaryFile(dir=temp_dir)
f.write(d.encode('utf-8'))
f.flush()
files.append(f)
try:
final = subprocess.check_output(["diff3", "-a", "--merge"] + [f.name for f in files])
except subprocess.CalledProcessError:
raise ConflictException(b, a, original)
finally:
for f in files:
f.close()
return final.decode('utf-8')

if __name__ == "__main__":
class test_globals:
diff3_temp_location = None

g = test_globals()

original = "Hello people of the human rance\n\nHow are you tday"
a = "Hello people of the human rance\n\nHow are you today"
b = "Hello people of the human race\n\nHow are you tday"

print threeWayMerge(original, a, b)

g.diff3_temp_location = '/dev/shm'

print threeWayMerge(original, a, b)

0 comments on commit ebab524

Please sign in to comment.