Package: svnmailer Version: 1.0.9-2 Severity: wishlist Tags: upstream patch Control: forwarded -1 svnmailer-b...@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.58bf42388...@eris.apache.org%3E after: https://mail-archives.apache.org/mod_mbox/subversion-commits/201311.mbox/%3c20131102040252.dac7e2388...@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