Author: gstein Date: Sun Oct 15 05:03:47 2023 New Revision: 1912977 URL: http://svn.apache.org/viewvc?rev=1912977&view=rev Log: Adjust some dataflow for future work to incorporate additional features.
Eliminate the TextCommitRenderer class, which was just a holder for OUTPUT. Convert the rendering methods to simple functions taking "writer" functions for the output mechanism. For now, a writer func for text and one for binary is passed to the rendering. * class TextCommitRenderer: deleted * TextCommitRenderer.render(): converted from method to a render_commit() global function. * TextCommitRenderer._render_list() and ._render_diffs(): moved to global functions, and now take writer functions. The callers in render_commit() have been updated. * generate_content(): now takes an OUTPUT object which should have .write() and .write_binary() methods. These bound methods are passed through to the new render_commit() function. * Commit.generate(): skip construction of a TextCommitRenderer and simply pass the OUTPUT to generate_content() Modified: subversion/trunk/tools/hook-scripts/mailer/mailer.py Modified: subversion/trunk/tools/hook-scripts/mailer/mailer.py URL: http://svn.apache.org/viewvc/subversion/trunk/tools/hook-scripts/mailer/mailer.py?rev=1912977&r1=1912976&r2=1912977&view=diff ============================================================================== --- subversion/trunk/tools/hook-scripts/mailer/mailer.py (original) +++ subversion/trunk/tools/hook-scripts/mailer/mailer.py Sun Oct 15 05:03:47 2023 @@ -521,15 +521,12 @@ class Commit(Messenger): subpool = svn.core.svn_pool_create(self.pool) ret = 0 - # build a renderer, tied to our output stream - renderer = TextCommitRenderer(self.output) - for (group, param_tuple), (params, paths) in sorted(self.groups.items()): try: self.output.start(group, params) # generate the content for this group and set of params - generate_content(renderer, self.cfg, self.repos, self.changelist, + generate_content(self.output, self.cfg, self.repos, self.changelist, group, params, paths, subpool) self.output.finish() @@ -763,7 +760,8 @@ class DiffURLSelections: def get_modify_url(self, repos_rev, change): return self._get_url('modify', repos_rev, change) -def generate_content(renderer, cfg, repos, changelist, group, params, paths, + +def generate_content(output, cfg, repos, changelist, group, params, paths, pool): svndate = repos.get_rev_prop(svn.core.SVN_PROP_REVISION_DATE) @@ -814,7 +812,10 @@ def generate_content(renderer, cfg, repo params, diffsels, diffurls, pool), other_diffs=other_diffs, ) - renderer.render(data) + ### clean this up in future rev. Just use wb + w = output.write + wb = output.write_binary + render_commit(w, wb, data) def generate_list(changekind, changelist, paths, in_paths): @@ -1035,6 +1036,7 @@ class DiffGenerator: content=content, ) + def _classify_diff_line(line, seen_change): # classify the type of line. first = line[:1] @@ -1096,6 +1098,7 @@ class DiffContent: type=ltype, ) + class DifflibDiffContent(): "This is a generator-like object returning annotated lines of a diff." @@ -1125,16 +1128,9 @@ class DifflibDiffContent(): type=ltype, ) -class TextCommitRenderer: - "This class will render the commit mail in plain text." - - def __init__(self, output): - self.output = output - def render(self, data): - "Render the commit defined by 'data'." - - w = self.output.write +def render_commit(w, wb, data): + "Call W and/or WB to render the commit defined by DATA." w('Author: %s\nDate: %s\nNew Revision: %s\n' % (data.author, data.date, @@ -1148,33 +1144,33 @@ class TextCommitRenderer: w('Log:\n%s\n\n' % data.log.strip()) # print summary sections - self._render_list('Added', data.added_data) - self._render_list('Replaced', data.replaced_data) - self._render_list('Deleted', data.deleted_data) - self._render_list('Modified', data.modified_data) + _render_list(w, 'Added', data.added_data) + _render_list(w, 'Replaced', data.replaced_data) + _render_list(w, 'Deleted', data.deleted_data) + _render_list(w, 'Modified', data.modified_data) if data.other_added_data or data.other_replaced_data \ or data.other_deleted_data or data.other_modified_data: if data.show_nonmatching_paths: w('\nChanges in other areas also in this revision:\n') - self._render_list('Added', data.other_added_data) - self._render_list('Replaced', data.other_replaced_data) - self._render_list('Deleted', data.other_deleted_data) - self._render_list('Modified', data.other_modified_data) + _render_list(w, 'Added', data.other_added_data) + _render_list(w, 'Replaced', data.other_replaced_data) + _render_list(w, 'Deleted', data.other_deleted_data) + _render_list(w, 'Modified', data.other_modified_data) else: w('and changes in other areas\n') - self._render_diffs(data.diffs, '') + _render_diffs(w, wb, data.diffs, '') if data.other_diffs: - self._render_diffs(data.other_diffs, + _render_diffs(w, wb, data.other_diffs, '\nDiffs of changes in other areas also' ' in this revision:\n') - def _render_list(self, header, data_list): + +def _render_list(w, header, data_list): if not data_list: return - w = self.output.write w(header + ':\n') for d in data_list: if d.is_dir: @@ -1199,12 +1195,13 @@ class TextCommitRenderer: w(' - copied%s from r%d, %s%s\n' % (text, d.base_rev, to_str(d.base_path), is_dir)) - def _render_diffs(self, diffs, section_header): + +def _render_diffs(w, wb, diffs, section_header): """Render diffs. Write the SECTION_HEADER if there are actually any diffs to render.""" if not diffs: return - w = self.output.write + section_header_printed = False for diff in diffs: @@ -1244,7 +1241,6 @@ class TextCommitRenderer: w('Binary file (source and/or target). No diff available.\n') continue - wb = self.output.write_binary for line in diff.content: wb(line.raw) @@ -1583,6 +1579,7 @@ if the property was added, modified or d sys.argv[3:3+expected_args]) sys.exit(1 if ret else 0) + # ------------------------------------------------------------------------ # TODO #