Browse Source

Add function for writing the diff between two files.

Jelmer Vernooij 15 years ago
parent
commit
5416841dae
1 changed files with 22 additions and 12 deletions
  1. 22 12
      dulwich/patch.py

+ 22 - 12
dulwich/patch.py

@@ -26,8 +26,10 @@ from dulwich.objects import (
     Blob,
     Blob,
     )
     )
 
 
+import difflib
 import time
 import time
 
 
+
 def write_commit_patch(f, commit, contents, progress, version=None):
 def write_commit_patch(f, commit, contents, progress, version=None):
     """Write a individual file patch.
     """Write a individual file patch.
 
 
@@ -62,21 +64,24 @@ def get_summary(commit):
     return commit.message.splitlines()[0].replace(" ", "-")
     return commit.message.splitlines()[0].replace(" ", "-")
 
 
 
 
-def _blob_id(contents):
-    if contents is None:
-        return "0" * 7
-    else:
-        return Blob.from_string("".join(contents)).id[:7]
-
-
-def write_diff_file_header(f, (old_path, old_mode, old_rev), 
-                              (new_path, new_mode, new_rev)):
+def write_blob_diff(f, (old_path, old_mode, old_blob), 
+                       (new_path, new_mode, new_blob)):
     """Write diff file header.
     """Write diff file header.
 
 
     :param f: File-like object to write to
     :param f: File-like object to write to
-    :param (old_path, old_mode, old_rev): Previous file mode (None if nonexisting)
-    :param (new_path, new_mode, new_rev): New file mode (None if nonexisting)
+    :param (old_path, old_mode, old_blob): Previous file (None if nonexisting)
+    :param (new_path, new_mode, new_blob): New file (None if nonexisting)
     """
     """
+    def blob_id(blob):
+        if blob is None:
+            return "0" * 7
+        else:
+            return blob.id[:7]
+    def lines(blob):
+        if blob is not None:
+            return blob.data.splitlines(True)
+        else:
+            return []
     if old_path is None:
     if old_path is None:
         old_path = "/dev/null"
         old_path = "/dev/null"
     else:
     else:
@@ -93,4 +98,9 @@ def write_diff_file_header(f, (old_path, old_mode, old_rev),
             f.write("new file mode %o\n" % new_mode) 
             f.write("new file mode %o\n" % new_mode) 
         else:
         else:
             f.write("deleted file mode %o\n" % old_mode)
             f.write("deleted file mode %o\n" % old_mode)
-    f.write("index %s..%s %o\n" % (old_rev, new_rev, new_mode))
+    f.write("index %s..%s %o\n" % (
+        blob_id(old_blob), blob_id(new_blob), new_mode))
+    old_contents = lines(old_blob)
+    new_contents = lines(new_blob)
+    f.writelines(difflib.unified_diff(old_contents, new_contents, 
+        old_path, new_path))