pq: add format_diff() function
authorMarkus Lehtonen <markus.lehtonen@linux.intel.com>
Wed, 8 May 2013 17:07:52 +0000 (20:07 +0300)
committerGuido Günther <agx@sigxcpu.org>
Thu, 31 Oct 2013 18:17:21 +0000 (19:17 +0100)
For generating a patch file from a diff between two arbitrary commits.

Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com>
gbp/scripts/common/pq.py

index b6b2118..7f0c0c9 100644 (file)
 import re
 import os
 import subprocess
+import datetime
+import time
 from email.message import Message
 from email.header import Header
 from email.charset import Charset, QP
 
-from gbp.git import GitRepositoryError, GitModifier
+from gbp.git import GitRepositoryError
+from gbp.git.modifier import GitModifier, GitTz
 from gbp.errors import GbpError
 import gbp.log
 
@@ -200,6 +203,29 @@ def format_patch(outdir, repo, commit_info, series, numbered=True,
     return patch
 
 
+def format_diff(outdir, filename, repo, start, end, path_exclude_regex=None):
+    """Create a patch of diff between two repository objects"""
+
+    info = {'author': repo.get_author_info()}
+    now = datetime.datetime.now().replace(tzinfo=GitTz(-time.timezone))
+    info['author'].set_date(now)
+    info['subject'] = "Raw diff %s..%s" % (start, end)
+    info['body'] = ("Raw diff between %s '%s' and\n%s '%s'\n" %
+                    (repo.get_obj_type(start), start,
+                    repo.get_obj_type(end), end))
+    if not filename:
+        filename = '%s-to-%s.diff' % (start, end)
+    filename = os.path.join(outdir, filename)
+
+    file_status = repo.diff_status(start, end)
+    paths = patch_path_filter(file_status, path_exclude_regex)
+    if paths:
+        diff = repo.diff(start, end, paths=paths, stat=80, summary=True,
+                         text=True)
+        return write_patch_file(filename, info, diff)
+    return None
+
+
 def get_maintainer_from_control(repo):
     """Get the maintainer from the control file"""
     control = os.path.join(repo.path, 'debian', 'control')