[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#837076: svnmailer: [PATCH] pretty-print svn:mergeinfo diffs



Package: svnmailer
Version: 1.0.9-2
Severity: wishlist
Tags: upstream patch
Control: forwarded -1 svnmailer-bugs@perlig.de

Dear Maintainer,

Please find attached a patch to pretty-print svn:mergeinfo diffs.  

The patch changes the way svn:mergeinfo diffs are rendered, replacing
the unidiff (which is often unreadable) by a human-oriented output which
states just the operative change done.  Here are before/after examples:

before: https://mail-archives.apache.org/mod_mbox/subversion-commits/201104.mbox/%3C20110427152444.58BF42388901@eris.apache.org%3E
after:  https://mail-archives.apache.org/mod_mbox/subversion-commits/201311.mbox/%3C20131102040252.DAC7E2388B43@eris.apache.org%3E

The 'svn' cmdline tool uses the same output format; for example:
«svn diff -c r1538140 https://svn.apache.org/repos/asf/subversion/branches/1.7.x --depth=empty».

The patch is against the most recent upstream snapshot, 1.1.0-dev-r1373.

Cheers,

Daniel

P.S. I'm setting the 'forwarded' tag since I submitted this upstream
in 2012.
diff -ru svnmailer-1.1.0-dev-r1373/src/lib/svnmailer/notifier/_base.py svnmailer-1.1.0-dev-r1373-svnmergeinfo-diffs/src/lib/svnmailer/notifier/_base.py
--- svnmailer-1.1.0-dev-r1373/src/lib/svnmailer/notifier/_base.py	2005-09-25 14:51:23.000000000 +0000
+++ svnmailer-1.1.0-dev-r1373-svnmergeinfo-diffs/src/lib/svnmailer/notifier/_base.py	2012-03-04 09:02:37.672298840 +0000
@@ -555,6 +555,42 @@
         return subversion.isUnicodeProperty(name)
 
 
+    def isNonUnidiffProperty(self, name):
+        """ Returns if the supplied property name is diff'd not in unidiff
+
+            :param `name`: The property name
+            :type `name`: ``str``
+
+            :param `name`: The property name
+            :type `name`: ``str``
+
+            :return: The decision
+            :rtype: ``bool``
+        """
+        from svnmailer import subversion
+        return subversion.isNonUnidiffProperty(name)
+
+    def diffNonUnidiffProperty(self, fp, name, value1, value2):
+        """ Write a diff of a non-unudiff property.
+
+            :param `fp`: File-like object to write to
+            :type `name`: ``file``
+
+            :param `name`: The property name
+            :type `name`: ``str``
+
+            :param `value1`: old value
+            :type `value1`: ``str``
+
+            :param `value2`: new value
+            :type `value2`: ``str``
+
+            :return: None
+            :rtype: ``NoneType``
+        """
+        from svnmailer import subversion
+        return subversion.diffNonUnidiffProperty(fp, name, value1, value2)
+
     def isBinaryProperty(self, values):
         """ Returns if the supplied property seems to be binary
 
diff -ru svnmailer-1.1.0-dev-r1373/src/lib/svnmailer/notifier/_text.py svnmailer-1.1.0-dev-r1373-svnmergeinfo-diffs/src/lib/svnmailer/notifier/_text.py
--- svnmailer-1.1.0-dev-r1373/src/lib/svnmailer/notifier/_text.py	2005-09-24 18:17:24.000000000 +0000
+++ svnmailer-1.1.0-dev-r1373-svnmergeinfo-diffs/src/lib/svnmailer/notifier/_text.py	2012-03-04 09:23:09.142297493 +0000
@@ -265,6 +265,9 @@
         elif token == self.ADD and self.isOneLineProperty(name, value2):
             self.fp.write("    %s = %s\n" % (name, value2))
 
+        elif token == self.MODIFY and self.isNonUnidiffProperty(name):
+            self.diffNonUnidiffProperty(self.fp, name, value1, value2)
+
         else:
             # avoid "no newline at end of file" for props
             if value1 and not value1.endswith("\n"):
diff -ru svnmailer-1.1.0-dev-r1373/src/lib/svnmailer/subversion.py svnmailer-1.1.0-dev-r1373-svnmergeinfo-diffs/src/lib/svnmailer/subversion.py
--- svnmailer-1.1.0-dev-r1373/src/lib/svnmailer/subversion.py	2005-09-25 07:29:22.000000000 +0000
+++ svnmailer-1.1.0-dev-r1373-svnmergeinfo-diffs/src/lib/svnmailer/subversion.py	2012-03-04 09:25:56.734796255 +0000
@@ -31,6 +31,7 @@
 __all__       = [
     'version', 'Repository', 'Error', 'RepositoryError', 'isUnicodeProperty'
     'VersionedPathDescriptor', 'LockedPathDescriptor',
+    'isNonUnidiffProperty', 'diffNonUnidiffProperty',
 ]
 
 
@@ -105,6 +106,46 @@
     return bool(svn_core.svn_prop_needs_translation(name))
 
 
+def isNonUnidiffProperty(name):
+    """ Returns if the supplied name is not to be unidiff'd
+
+        :param name: The property name
+        :type name: ``str``
+
+        :return: The decision
+        :rtype: ``bool``
+    """
+    return name == svn_core.SVN_PROP_MERGEINFO
+
+def diffNonUnidiffProperty(fp, name, value1, value2):
+    """ Write a diff of a non-unudiff property.
+
+        :param `fp`: File-like object to write to
+        :type `name`: ``file``
+
+        :param `name`: The property name
+        :type `name`: ``str``
+
+        :param `value1`: old value
+        :type `value1`: ``str``
+
+        :param `value2`: new value
+        :type `value2`: ``str``
+
+        :return: None
+        :rtype: ``NoneType``
+    """
+    # TODO: throw some error if this isn't svn:mergeinfo
+    # This mirrors display_mergeinfo_diff() in libsvn_client/diff.c
+    parsed1 = svn_core.svn_mergeinfo_parse(value1)
+    parsed2 = svn_core.svn_mergeinfo_parse(value2)
+    deleted, added = svn_core.svn_mergeinfo_diff(parsed1, parsed2, True)
+    for mergeinfo, text in [(deleted, "Reverse-merged"), 
+                            (added, "Merged")]:
+        for fspath, rangelist in mergeinfo.iteritems():
+            rangelist_str = svn_core.svn_rangelist_to_string(rangelist)
+            fp.write("  %s %s:r%s\n" % (text, fspath, rangelist_str))
+
 def isBinary(mtype):
     """ Returns True if the supplied mime type represents a binary
 

Reply to: