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: