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
 #


Reply via email to