Edgewall Software

Changes between Initial Version and Version 1 of TracDev/PluginDevelopment/ExtensionPoints/trac.versioncontrol.web_ui.changeset.IPropertyDiffRenderer


Ignore:
Timestamp:
Jan 22, 2012, 12:07:03 PM (12 years ago)
Author:
Peter Suter
Comment:

Legend:

Unmodified
Added
Removed
Modified
  • TracDev/PluginDevelopment/ExtensionPoints/trac.versioncontrol.web_ui.changeset.IPropertyDiffRenderer

    v1 v1  
     1== Extension Point : ''IPropertyDiffRenderer'' ==
     2
     3||'''Interface'''||''IPropertyDiffRenderer''||'''Since'''||[wiki:TracDev/ApiChanges/0.11#IPropertyDiffRenderer 0.11]||
     4||'''Module'''||''trac.versioncontrol.web_ui''||'''Source'''||[source:trunk/trac/versioncontrol/web_ui/changeset.py changeset.py]||
     5
     6The ''IPropertyDiffRenderer'' allows rendering changes to node and changeset properties in TracBrowser and TracChangeset views.
     7
     8== Purpose ==
     9
     10Trac provides advanced source control integration with the ability to browse source code and view changesets etc. In such views it is often useful to visualize additional metadata and its differences (''diffs'') between revisions. Trac allows arbitrary ''diff'' visualizations of any such data provided by the version control backend as properties.
     11
     12Plugins can add additional ways to render such property diffs by implementing IPropertyDiffRenderer. To just render properties instead of property diffs, use [[trac.versioncontrol.web_ui.browser.IPropertyRenderer]].
     13
     14== Usage ==
     15
     16Implementing the interface follows the standard guidelines found in [wiki:TracDev/ComponentArchitecture] and of course [wiki:TracDev/PluginDevelopment].
     17
     18A class implementing IPropertyDiffRenderer can advertise variable levels of support for rendering any property in `match_property_diff`, by matching on property `name`. Different version control backends make different properties available, exposing metadata specific to that system. This is controlled by the [[trac.versioncontrol.api.IRepositoryConnector]] and its `Node` and `Changeset` subclasses.
     19 
     20The `render_property_diff` method is then called each time a matched property change is rendered (if no other renderer matched with a higher level of support). That method should render the property change, by returning:
     21 - `None`: the property change will be shown the normal way (''changed from `old` to `new`'')
     22 - an `unicode` value: the property change will be displayed as text
     23 - `Markup` or other Genshi content: the property change will be displayed normally, using that content as a block-level markup
     24
     25For rendering property changes on a new kind of page call the appropriate implementation via `trac.versioncontrol.web_ui.changeset.ChangesetModule(env).render_property_diff()`.
     26Usually the properties to be rendered are obtained from the `get_properties()` method of a `trac.versioncontrol.api.Node` subclass.
     27
     28== Examples ==
     29
     30The following example property diff renderer can be configured using a new TracIni option. All listed properties are treated as integers, calculating the numeric difference.
     31{{{#!python
     32from trac.core import *
     33from trac.config import ListOption
     34from trac.versioncontrol.web_ui.changeset import IPropertyDiffRenderer
     35
     36class IntegerPropertyDiffRenderer(Component):
     37    """Integer version control property diff renderer."""
     38
     39    implements(IPropertyDiffRenderer)
     40
     41    integer_properties = ListOption('browser', 'integer_properties',
     42                                    'size',
     43        doc="""Comma-separated list of version control properties to render
     44        as integers (with diff as a calculated delta) in the
     45        repository browser.""")
     46
     47    def match_property_diff(self, name):
     48        return 4 if name in self.integer_properties
     49
     50    def render_property_diff(self, name, old_context, old_props,
     51                             new_context, new_props, options):
     52        old_int = int(old_props[name])
     53        new_int = int(new_props[name])
     54        delta = new_int - old_int
     55        return unicode('Property %s increased by %+i to %i' % (name, delta,
     56                                                               new_int)
     57                       if delta > 0 else
     58                       'Property %s decreased by %+i to %i' % (name, delta,
     59                                                               new_int))
     60}}}
     61
     62== Available Implementations ==
     63
     64In Trac:
     65 * [source:trunk/trac/versioncontrol/web_ui/changeset.py trac.versioncontrol.web_ui.changeset.DefaultPropertyDiffRenderer][[BR]]
     66   Fallback for rendering multiline text as unified diffs (unless rendered by a more specific renderer).
     67 * [source:trunk/trac/versioncontrol/svn_prop.py trac.versioncontrol.svn_prop.SubversionMergePropertyDiffRenderer][[BR]]
     68   Renders `svn:mergeinfo`, `svnmerge-blocked` and `svnmerge-integrated` in a table of merged revisions, converting branch names to links and providing links to the revision log for merged and eligible revisions.
     69
     70== Additional Information and References ==
     71
     72 * [http://www.edgewall.org/docs/trac-trunk/epydoc/trac.versioncontrol.web_ui.changeset.IPropertyDiffRenderer-class.html epydoc]
     73 * [http://www.edgewall.org/docs/trac-trunk/html/api/trac_versioncontrol_web_ui_browser.html#trac.versioncontrol.web_ui.changeset.IPropertyDiffRenderer API Reference]
     74 * Related to the [[trac.versioncontrol.web_ui.browser.IPropertyRenderer]]
     75 * Related tickets:
     76  * #1601 Initial implementation
     77  * [query:keywords~=property&keywords~=properties property or properties keyword]
     78  * [query:keywords=~mergeinfo mergeinfo keyword] (A set of properties used by Subversion to track merged changesets.)