[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

[PATCH] Add property handling to mailer.py's commit messages

From: Mathias Weinert <wein_at_mccw.de>
Date: 2006-09-18 11:36:57 CEST

Hi,

With the attached patch mailer.py will be able to report property
changes when reporting commits.

I appreciate any comment.

Please note that this patch also includes the patch regarding the
diff labels I already posted to the list ("[PATCH] Show more
information in diff labels in mailer.py",
http://svn.haxx.se/dev/archive-2006-09/0336.shtml) which I will
commit separately.

Mathias

[[[
Add property handling to mailer.py's commit messages.

It is now possible to also report changes of properties (including
diffs) with a commit message. Therefor several new classes were
added to mailer.py. To configure the reporting of property changes
four new parameters are added to mailer.conf. Without adding these
parameters to an existing configuration file no property changes
will be reported.

New configuration parameters:
show_props configure which property changes to report
                        (valid options are any combination of
                        'add copy modify delete')
show_props_svn configure whether 'svn:' properties shall
                        also be reported
generate_propdiffs configure for which property changes diffs
                        shall be created
                        (valid options are any combination of
                        'add copy modify delete')
generate_propdiffs_svn configure whether diffs for 'svn:' properties
                        shall also be reported

* tools/hook-scripts/mailer/mailer.py
  New classes:
    PropSelections
    PropDiffSelections
    PropDiffGenerator.
  New functions:
    TextCommitRenderer._get_prop_list
    TextCommitRenderer._render_props
    TextCommitRenderer.__render_props
    TextCommitRenderer._render_propdiffs
    TextCommitRenderer.__render_propdiffs.
  Several changes to other classes and functions.

* tools/hook-scripts/mailer/mailer.conf.example
  New parameters show_props, show_props_svn, generate_propdiffs and
  generate_propdiffs_svn.

* tools/hook-scripts/mailer/tests/mailer.conf
  New parameters show_props, show_props_svn, generate_propdiffs and
  generate_propdiffs_svn.

* tools/hook-scripts/mailer/tests/mailer-t1.output
  Now containing property changes.
]]]

--- mailer.py.orig 2006-09-13 08:50:25.167052100 +0200
+++ mailer.py 2006-09-18 10:33:24.848008700 +0200
@@ -595,6 +595,50 @@
         self.add = False
 
 
+class PropSelections:
+ def __init__(self, cfg, group, params):
+ self.add = False
+ self.copy = False
+ self.delete = False
+ self.modify = False
+
+ show_props = cfg.get('show_props', group, params)
+
+ if len(show_props):
+ list = string.split(show_props, " ")
+ for item in list:
+ if item == 'add':
+ self.add = True
+ if item == 'copy':
+ self.copy = True
+ if item == 'delete':
+ self.delete = True
+ if item == 'modify':
+ self.modify = True
+
+
+class PropDiffSelections:
+ def __init__(self, cfg, group, params):
+ self.add = False
+ self.copy = False
+ self.delete = False
+ self.modify = False
+
+ gen_propdiffs = cfg.get('generate_propdiffs', group, params)
+
+ if len(gen_propdiffs):
+ list = string.split(gen_propdiffs, " ")
+ for item in list:
+ if item == 'add':
+ self.add = True
+ if item == 'copy':
+ self.copy = True
+ if item == 'delete':
+ self.delete = True
+ if item == 'modify':
+ self.modify = True
+
+
 class DiffURLSelections:
   def __init__(self, cfg, group, params):
     self.cfg = cfg
@@ -633,7 +677,11 @@
   date = time.ctime(svn.core.secs_from_timestr(svndate, pool))
 
   diffsels = DiffSelections(cfg, group, params)
+ propsels = PropSelections(cfg, group, params)
+ propdiffsels = PropDiffSelections(cfg, group, params)
   diffurls = DiffURLSelections(cfg, group, params)
+ propsels_svn = cfg.get('show_props_svn', group, params)
+ propdiffsels_svn = cfg.get('generate_propdiffs_svn', group, params)
 
   show_nonmatching_paths = cfg.get('show_nonmatching_paths', group, params) \
       or 'yes'
@@ -654,8 +702,13 @@
   if len(paths) != len(changelist) and show_nonmatching_paths == 'yes':
     other_diffs = DiffGenerator(changelist, paths, False, cfg, repos, date,
                                 group, params, diffsels, diffurls, pool)
+ other_props = PropDiffGenerator(changelist, paths, False, cfg, repos, date,
+ group, propsels, propsels_svn,
+ propdiffsels, propdiffsels_svn, pool)
   else:
     other_diffs = None
+ other_props = None
+ other_propdiffs = None
 
   data = _data(
     author=repos.author,
@@ -674,7 +727,11 @@
     other_modified_data=other_modified_data,
     diffs=DiffGenerator(changelist, paths, True, cfg, repos, date, group,
                         params, diffsels, diffurls, pool),
+ props=PropDiffGenerator(changelist, paths, True, cfg, repos, date,
+ group, propsels, propsels_svn,
+ propdiffsels, propdiffsels_svn, pool),
     other_diffs=other_diffs,
+ other_props=other_props,
     )
   renderer.render(data)
 
@@ -759,6 +816,14 @@
       if self.paths.has_key(path) != self.in_paths:
         continue
 
+ if change.base_rev != -1:
+ svndate = self.repos.get_rev_prop(svn.core.SVN_PROP_REVISION_DATE,
+ change.base_rev)
+ ### pick a different date format?
+ base_date = time.ctime(svn.core.secs_from_timestr(svndate, self.pool))
+ else:
+ base_date = ''
+
       # figure out if/how to generate a diff
 
       base_path = remove_leading_slashes(change.base_path)
@@ -774,8 +839,8 @@
           diff = svn.fs.FileDiff(self.repos.get_root(change.base_rev),
                                  base_path, None, None, self.pool)
 
- label1 = '%s\t%s' % (base_path, self.date)
- label2 = '(empty file)'
+ label1 = '%s\tr%s\t%s (original)' % (base_path, change.base_rev, self.date)
+ label2 = '() 00:00:00 1970 (empty, because file is deleted)'
           singular = True
 
       elif change.action == svn.repos.CHANGE_ACTION_ADD \
@@ -796,8 +861,8 @@
                                      base_path,
                                      self.repos.root_this, change.path,
                                      self.pool)
- label1 = base_path + '\t(original)'
- label2 = '%s\t%s' % (change.path, self.date)
+ label1 = '%s\tr%s\t%s (copy source)' % (base_path, change.base_rev, base_date)
+ label2 = '%s\tr%s\t%s' % (change.path, self.repos.rev, self.date)
               singular = False
           else:
             # this file was copied.
@@ -805,8 +870,8 @@
             if self.diffsels.copy:
               diff = svn.fs.FileDiff(None, None, self.repos.root_this,
                                      change.path, self.pool)
- label1 = base_path + '\t(original)'
- label2 = '%s\t%s' % (change.path, self.date)
+ label1 = '%s\tr%s\t%s (copy source)' % (base_path, change.base_rev, base_date)
+ label2 = '%s\tr%s\t%s (unchanged copied file)' % (change.path, self.repos.rev, self.date)
               singular = False
         else:
           # the file was added.
@@ -819,8 +884,8 @@
           if self.diffsels.add:
             diff = svn.fs.FileDiff(None, None, self.repos.root_this,
                                    change.path, self.pool)
- label1 = '(empty file)'
- label2 = '%s\t%s' % (change.path, self.date)
+ label1 = '(empty, because file is newly added)'
+ label2 = '%s\tr%s\t%s' % (change.path, self.repos.rev, self.date)
             singular = True
 
       elif not change.text_changed:
@@ -839,8 +904,8 @@
                                  base_path,
                                  self.repos.root_this, change.path,
                                  self.pool)
- label1 = base_path + '\t(original)'
- label2 = '%s\t%s' % (change.path, self.date)
+ label1 = '%s\tr%s\t%s (original)' % (base_path, change.base_rev, base_date)
+ label2 = '%s\tr%s\t%s' % (change.path, self.repos.rev, self.date)
           singular = False
 
       if diff:
@@ -874,6 +939,226 @@
         )
 
 
+class PropDiffGenerator:
+ "This is a generator-like object returning changed properties."
+
+ def __init__(self, changelist, paths, in_paths, cfg, repos, date,
+ group, propsels, propsels_svn,
+ propdiffsels, propdiffsels_svn, pool):
+ self.changelist = changelist
+ self.paths = paths
+ self.in_paths = in_paths
+ self.cfg = cfg
+ self.repos = repos
+ self.date = date
+ self.group = group
+ self.propsels = propsels
+ self.propsels_svn = propsels_svn
+ self.propdiffsels = propdiffsels
+ self.propdiffsels_svn = propdiffsels_svn
+ self.pool = pool
+
+ self.idx = 0
+
+ def __getitem__(self, idx):
+ while 1:
+ if self.idx == len(self.changelist):
+ raise IndexError
+
+ path, change = self.changelist[self.idx]
+ self.idx = self.idx + 1
+
+ # is this change in (or out of) the set of matched paths?
+ if self.paths.has_key(path) != self.in_paths:
+ continue
+
+ if change.base_rev != -1:
+ svndate = self.repos.get_rev_prop(svn.core.SVN_PROP_REVISION_DATE,
+ change.base_rev)
+ ### pick a different date format?
+ base_date = time.ctime(svn.core.secs_from_timestr(svndate, self.pool))
+ else:
+ base_date = ''
+
+ src_props = { }
+ dst_props = { }
+ path = change.path
+ base_rev = change.base_rev
+ if change.base_rev != -1:
+ base_path = remove_leading_slashes(change.base_path)
+ src_props = svn.fs.node_proplist(self.repos.get_root(base_rev), base_path, self.pool)
+ else:
+ base_path = None
+ if change.path:
+ dst_props = svn.fs.node_proplist(self.repos.root_this, change.path, self.pool)
+ else:
+ path = base_path
+ added_props_tmp = { }
+ copied_props_tmp = { }
+ deleted_props_tmp = { }
+ modified_props_tmp = { }
+
+ if not change.path:
+ # it was delete.
+ if self.propsels.delete or self.propdiffsels.delete:
+ for src_prop in src_props:
+ deleted_props_tmp[src_prop]=(src_props[src_prop], None)
+ elif change.added and base_rev == -1:
+ # it was add (no copy)
+ if self.propsels.add or self.propdiffsels.add:
+ for dst_prop in dst_props:
+ added_props_tmp[dst_prop]=(None, dst_props[dst_prop])
+ else:
+ if dst_props:
+ for dst_prop in dst_props:
+ if src_props.has_key(dst_prop):
+ if src_props[dst_prop] != dst_props[dst_prop]:
+ if self.propsels.modify or self.propdiffsels.modify:
+ modified_props_tmp[dst_prop]=(src_props[dst_prop], dst_props[dst_prop])
+ else:
+ if (change.added and base_rev != -1) \
+ and (self.propsels.copy or self.propdiffsels.copy):
+ copied_props_tmp[dst_prop]=(None, dst_props[dst_prop])
+ elif self.propsels.add or self.propdiffsels.add:
+ added_props_tmp[dst_prop]=(None, dst_props[dst_prop])
+ if src_props:
+ for src_prop in src_props:
+ if not dst_props.has_key(src_prop) \
+ and (self.propsels.delete or self.propdiffsels.delete):
+ deleted_props_tmp[src_prop]=(src_props[src_prop], None)
+
+ added_props = self._get_sorted_list(added_props_tmp)
+ copied_props = self._get_sorted_list(copied_props_tmp)
+ deleted_props = self._get_sorted_list(deleted_props_tmp)
+ modified_props = self._get_sorted_list(modified_props_tmp)
+
+ if self.propdiffsels.add:
+ added_content, added_count = self._get_diff(path, self.repos.rev, self.date,
+ base_path, base_rev, base_date,
+ added_props, self.propdiffsels_svn, 'A')
+ else:
+ added_content, added_count = [ ], 0
+ if self.propdiffsels.copy:
+ copied_content, copied_count = self._get_diff(path, self.repos.rev, self.date,
+ base_path, base_rev, base_date,
+ copied_props, self.propdiffsels_svn, 'C')
+ else:
+ copied_content, copied_count = [ ], 0
+ if self.propdiffsels.delete:
+ deleted_content, deleted_count = self._get_diff(path, self.repos.rev, self.date,
+ base_path, base_rev, base_date,
+ deleted_props, self.propdiffsels_svn, 'D')
+ else:
+ deleted_content, deleted_count = [ ], 0
+ if self.propdiffsels.modify:
+ if change.added and base_rev != -1:
+ action_type = 'W'
+ else:
+ action_type = 'M'
+ modified_content, modified_count = self._get_diff(path, self.repos.rev, self.date,
+ base_path, base_rev, base_date,
+ modified_props, self.propdiffsels_svn, action_type)
+ else:
+ modified_content, modified_count = [ ], 0
+
+ added_props = self._get_final_list(added_props, self.propsels.add, self.propsels_svn)
+ copied_props = self._get_final_list(copied_props, self.propsels.copy, self.propsels_svn)
+ deleted_props = self._get_final_list(deleted_props, self.propsels.delete, self.propsels_svn)
+ modified_props = self._get_final_list(modified_props, self.propsels.modify, self.propsels_svn)
+
+ return _data(
+ path=path,
+ base_path=base_path,
+ base_rev=base_rev,
+ item_kind=change.item_kind,
+ added_props=added_props,
+ copied_props=copied_props,
+ deleted_props=deleted_props,
+ modified_props=modified_props,
+ added_content=added_content,
+ added_count=added_count,
+ copied_content=copied_content,
+ copied_count=copied_count,
+ deleted_content=deleted_content,
+ deleted_count=deleted_count,
+ modified_content=modified_content,
+ modified_count=modified_count,
+ )
+
+ def _get_sorted_list(self, props):
+ list=[ ]
+ if not props:
+ return list
+ keys=props.keys()
+ keys.sort()
+ for prop in keys:
+ src_val, dst_val = props[prop]
+ list.append((prop, src_val, dst_val))
+ return list
+
+ def _get_final_list(self, props, propsel, propsels_svn):
+ list=[ ]
+ if not props or not propsel:
+ return list
+ for prop, src_val, dst_val in props:
+ if propsels_svn == 'no' and prop.startswith('svn:'):
+ continue
+ list.append((prop, src_val, dst_val))
+ return list
+
+ def _get_diff(self, path, rev, date, base_path, base_rev, base_date,
+ props, propdiffsels_svn, action_type):
+ content = ''
+ count = 0
+ for prop, src_val, dst_val in props:
+ if propdiffsels_svn == 'no' and prop.startswith('svn:'):
+ continue
+ src_fname = tempfile.mktemp()
+ dst_fname = tempfile.mktemp()
+ fp = open(src_fname, 'w+')
+ if src_val:
+ fp.write(src_val)
+ fp.write('\n')
+ fp.close()
+ fp = open(dst_fname, 'w+')
+ if dst_val:
+ fp.write(dst_val)
+ fp.write('\n')
+ fp.close()
+ if action_type == 'A':
+ label_from = '(empty, because property is newly added)'
+ elif action_type == 'C' or action_type == 'W':
+ label_from = '%s|%s\tr%s\t%s (copy source)' % (base_path, prop, base_rev, base_date)
+ else:
+ label_from = '%s|%s\tr%s\t%s (original)' % (path, prop, base_rev, base_date)
+ if action_type == 'C':
+ label_to = '%s|%s\tr%s\t%s (unchanged copied property)' % (path, prop, rev, date)
+ elif action_type == 'D':
+ label_to = '(empty, because property is deleted)'
+ else:
+ label_to = '%s|%s\tr%s\t%s' % (path, prop, rev, date)
+ diff = DiffContent(self.cfg.get_diff_cmd(self.group, {
+ 'label_from' : label_from,
+ 'label_to' : label_to,
+ 'from' : src_fname,
+ 'to' : dst_fname,
+ }))
+ if diff:
+ count += 1
+ line = diff[0]
+ if line.type == 'B':
+ if src_val and dst_val:
+ content += '\nBinary property (source and/or target). ' + \
+ 'No diff available.\n'
+ else:
+ content += '\nBinary property. No diff available.\n'
+ else:
+ content += line.raw
+ for line in diff:
+ content += line.raw
+ return content, count
+
+
 class DiffContent:
   "This is a generator-like object returning annotated lines of a diff."
 
@@ -915,9 +1200,14 @@
         ltype = 'T'
     elif first == ' ':
       ltype = 'C'
+ elif line.startswith('File ') or line.startswith('Files '):
+ ltype = 'B'
     else:
       ltype = 'U'
 
+ if line[-2] == '\r':
+ line=line[0:-2] + '\n' # remove carriage return
+
     return _data(
       raw=line,
       text=line[1:-1], # remove indicator and newline
@@ -930,6 +1220,7 @@
 
   def __init__(self, output):
     self.output = output
+ self.other_areas_written = False
 
   def render(self, data):
     "Render the commit defined by 'data'."
@@ -964,11 +1255,51 @@
       else:
         w('and changes in other areas\n')
 
- self._render_diffs(data.diffs, '')
+ data_props = self._get_prop_list(data.props)
+ data_other_props = self._get_prop_list(data.other_props)
+ if data_props:
+ self._render_props(data_props, 'Property Changes')
+ if data_other_props:
+ self._render_props(data_other_props, 'Property Changes in other areas '
+ 'also in this revision')
+ if data.diffs:
+ self._render_diffs(data.diffs, None)
+ if data_props:
+ self._render_propdiffs(data_props, None)
     if data.other_diffs:
       self._render_diffs(data.other_diffs,
- '\nDiffs of changes in other areas also'
- ' in this revision:\n')
+ 'Diffs of changes in other areas also '
+ 'in this revision')
+ if data_other_props:
+ self._render_propdiffs(data_other_props,
+ 'Diffs of changes in other areas also '
+ 'in this revision')
+
+ def _get_prop_list(self, props):
+ if not props:
+ return [ ]
+ prop_list = [ ]
+ for prop in props:
+ prop_list.append(_data(
+ path=prop.path,
+ base_path=prop.base_path,
+ base_rev=prop.base_rev,
+ item_kind=prop.item_kind,
+ added_props=prop.added_props,
+ copied_props=prop.copied_props,
+ deleted_props=prop.deleted_props,
+ modified_props=prop.modified_props,
+ added_content=prop.added_content,
+ added_count=prop.added_count,
+ copied_content=prop.copied_content,
+ copied_count=prop.copied_count,
+ deleted_content=prop.deleted_content,
+ deleted_count=prop.deleted_count,
+ modified_content=prop.modified_content,
+ modified_count=prop.modified_count,
+ ))
+ return prop_list
+
 
   def _render_list(self, header, data_list):
     if not data_list:
@@ -999,18 +1330,50 @@
         w(' - copied%s from r%d, %s%s\n'
           % (text, d.base_rev, d.base_path, is_dir))
 
+ def _render_props(self, props, section_header):
+ if not props:
+ return
+ w = self.output.write
+ section_header_printed = False
+
+ for prop in props:
+ if prop.added_props or prop.copied_props \
+ or prop.deleted_props or prop.modified_props:
+ if not section_header_printed:
+ w('\n%s:\n' % section_header)
+ section_header_printed = True
+ if prop.item_kind == svn.core.svn_node_dir:
+ prop.path += '/'
+ w(' %s\n' % prop.path)
+ self.__render_props('Added', prop.added_props)
+ self.__render_props('Copied', prop.copied_props)
+ self.__render_props('Deleted', prop.deleted_props)
+ self.__render_props('Modified', prop.modified_props)
+
+ def __render_props(self, header, props):
+ w = self.output.write
+ if props:
+ w(' %s:\n' % header)
+ for prop, src_val, dst_val in props:
+ w(' %s\n' % prop)
+
   def _render_diffs(self, diffs, section_header):
- """Render diffs. Write the SECTION_HEADER iff there are actually
+ """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
+ if not section_header:
+ section_header_printed = True
 
     for diff in diffs:
       if not diff.diff and not diff.diff_url:
         continue
- if not section_header_printed:
- w(section_header)
- section_header_printed = True
+ if not section_header_printed and not self.other_areas_written:
+ w('\n%s:\n' % section_header)
+ self.other_areas_written = True
+ section_header_printed = False
       if diff.kind == 'D':
         w('\nDeleted: %s\n' % diff.base_path)
       elif diff.kind == 'A':
@@ -1037,12 +1400,58 @@
         if diff.singular:
           w('Binary file. No diff available.\n')
         else:
- w('Binary files. No diff available.\n')
+ w('Binary file (source and/or target). No diff available.\n')
         continue
 
       for line in diff.content:
         w(line.raw)
 
+ def _render_propdiffs(self, props, section_header):
+ """Render property diffs. Write the SECTION_HEADER if there are
+ actually any diffs to render."""
+ if not props:
+ return
+ w = self.output.write
+ section_header_printed = False
+
+ for prop in props:
+ if len(prop.added_props)+len(prop.copied_props)+len(prop.deleted_props)+len(prop.modified_props) > 0:
+ if not section_header_printed and not self.other_areas_written \
+ and section_header:
+ w('\n%s:\n' % section_header)
+ self.other_areas_written = True
+ section_header_printed = True
+ self.__render_propdiffs(prop.path, 'Added', prop.base_path, prop.base_rev,
+ prop.added_content, prop.added_count)
+ self.__render_propdiffs(prop.path, 'Copied', prop.base_path, prop.base_rev,
+ prop.copied_content, prop.copied_count)
+ self.__render_propdiffs(prop.path, 'Deleted', prop.base_path, prop.base_rev,
+ prop.deleted_content, prop.deleted_count)
+ if prop.base_rev == -1:
+ type = 'Modified'
+ else:
+ type = 'Copied and modified'
+ self.__render_propdiffs(prop.path, type, prop.base_path, prop.base_rev,
+ prop.modified_content, prop.modified_count)
+
+ def __render_propdiffs(self, path, type, base_path, base_rev,
+ content, count):
+ if count == 0:
+ return
+
+ w = self.output.write
+ if count == 1:
+ prophead = "property"
+ else:
+ prophead = "properties"
+ w('\n')
+ if not base_path:
+ w('%s %s for: %s\n' % (type, prophead, path))
+ else:
+ w('%s %s for: %s (from r%s, %s)\n' % (type, prophead, path,
+ base_rev, base_path))
+ w(SEPARATOR + '\n')
+ w('%s' % content)
 
 class Repository:
   "Hold roots and other information about the repository."
@@ -1061,8 +1470,10 @@
 
     self.author = self.get_rev_prop(svn.core.SVN_PROP_REVISION_AUTHOR)
 
- def get_rev_prop(self, propname):
- return svn.fs.revision_prop(self.fs_ptr, self.rev, propname, self.pool)
+ def get_rev_prop(self, propname, rev = None):
+ if not rev:
+ rev = self.rev
+ return svn.fs.revision_prop(self.fs_ptr, rev, propname, self.pool)
 
   def get_root(self, rev):
     try:
--- mailer.conf.example.orig 2006-09-15 09:48:47.130763000 +0200
+++ mailer.conf.example 2006-09-15 09:57:14.108373800 +0200
@@ -193,6 +193,41 @@
 # delete: generates diffs for all removed paths
 generate_diffs = add copy modify
 
+# Specify which types of property changes mailer.py will report as a
+# summary at the top of the message, after the summary of changed paths.
+# Valid options are any combination of 'add copy modify delete'.
+# If the show_props option is empty, no list of changed properties will
+# be created.
+# Meaning of the possible values:
+# add: lists all added properties including the ones added for
+# newly added paths
+# copy: lists all properties which were implicitly added by making
+# a copy of a path and not changed or removed after copying
+# modify: lists all modified properties, including the ones that were
+# added by making a copy of a path and modified afterwards
+# (within the same commit)
+# delete: lists all removed properties including the ones for removed
+# paths
+show_props = add copy modify
+
+# When set to 'no' all properties starting with 'svn:' will be ignored
+# by the selection made by show_props.
+show_props_svn = yes
+
+# Specify which types of property changes mailer.py will create
+# diffs for. Valid options are any combination of
+# 'add copy modify delete'. If the generate_propdiffs option is empty,
+# no diffs are created.
+# Note that this only affects the display of property diffs - the mentioning
+# of property changes in the summary at the top of the message is regulated
+# by show_props and listed regardless of this option's value.
+# See show_props for an explanation of the possible values.
+generate_propdiffs = add copy modify
+
+# When set to 'no' all properties starting with 'svn:' will be ignored
+# by the selection made by generate_propdiffs
+generate_propdiffs_svn = yes
+
 # Commit URL construction. This adds a URL to the top of the message
 # that can lead the reader to a Trac, ViewVC or other view of the
 # commit as a whole.
@@ -232,8 +267,9 @@
 # match, this variable controls the behaviour for the non-matching
 # paths. Possible values are:
 #
-# yes: (Default) Show in both summary and diffs.
-# summary: Show the changed paths in the summary, but omit the diffs.
+# yes: (Default) Show in both summary and diffs (including properties).
+# summary: Show the changed paths in the summary, but omit the diffs
+# (and the property diffs).
 # no: Show nothing more than a note saying "and changes in other areas"
 #
 show_nonmatching_paths = yes
--- tests/mailer.conf.orig 2006-09-14 15:01:42.782509900 +0200
+++ tests/mailer.conf 2006-09-15 09:58:38.324967800 +0200
@@ -177,7 +177,7 @@
 reply_to =
 
 # Specify which types of repository changes mailer.py will create
-# diffs for. Valid options are any combination of
+# diffs for. Valid options are any combination of
 # 'add copy modify delete', or 'none' to never create diffs.
 # If the generate_diffs option is empty, the selection is controlled
 # by the deprecated options suppress_deletes and suppress_adds.
@@ -193,6 +193,41 @@
 # delete: generates diffs for all removed paths
 generate_diffs = add copy modify delete
 
+# Specify which types of property changes mailer.py will report as a
+# summary at the top of the message, after the summary of changed paths.
+# Valid options are any combination of 'add copy modify delete'.
+# If the show_props option is empty, no list of changed properties will
+# be created.
+# Meaning of the possible values:
+# add: lists all added properties including the ones added for
+# newly added paths
+# copy: lists all properties which were implicitly added by making
+# a copy of a path and not changed or removed after copying
+# modify: lists all modified properties, including the ones that were
+# added by making a copy of a path and modified afterwards
+# (within the same commit)
+# delete: lists all removed properties including the ones for removed
+# paths
+show_props = add copy modify delete
+
+# When set to 'no' all properties starting with 'svn:' will be ignored
+# by the selection made by show_props.
+show_props_svn = yes
+
+# Specify which types of property changes mailer.py will create
+# diffs for. Valid options are any combination of
+# 'add copy modify delete'. If the generate_propdiffs option is empty,
+# no diffs are created.
+# Note that this only affects the display of property diffs - the mentioning
+# of property changes in the summary at the top of the message is regulated
+# by show_props and listed regardless of this option's value.
+# See show_props for an explanation of the possible values.
+generate_propdiffs = add copy modify delete
+
+# When set to 'no' all properties starting with 'svn:' will be ignored
+# by the selection made by generate_propdiffs
+generate_propdiffs_svn = yes
+
 # Commit URL construction. This adds a URL to the top of the message
 # that can lead the reader to a Trac, ViewVC or other view of the
 # commit as a whole.
@@ -232,8 +267,9 @@
 # match, this variable controls the behaviour for the non-matching
 # paths. Possible values are:
 #
-# yes: (Default) Show in both summary and diffs.
-# summary: Show the changed paths in the summary, but omit the diffs.
+# yes: (Default) Show in both summary and diffs (including properties).
+# summary: Show the changed paths in the summary, but omit the diffs
+# (and the property diffs).
 # no: Show nothing more than a note saying "and changes in other areas"
 #
 show_nonmatching_paths = yes
--- tests/mailer-t1.output.orig 2006-09-15 08:27:33.057603900 +0200
+++ tests/mailer-t1.output 2006-09-18 10:34:15.845779000 +0200
@@ -23,15 +23,15 @@
 
 Added: file1
 ==============================================================================
---- (empty file)
-+++ file1 Sun Sep 9 01:46:40 2001
+--- (empty, because file is newly added)
++++ file1 r1 Sun Sep 9 01:46:40 2001
 @@ -0,0 +1 @@
 +file1
 
 Added: file2
 ==============================================================================
---- (empty file)
-+++ file2 Sun Sep 9 01:46:40 2001
+--- (empty, because file is newly added)
++++ file2 r1 Sun Sep 9 01:46:40 2001
 @@ -0,0 +1 @@
 +file2
 
@@ -39,29 +39,29 @@
 
 Added: dir1/file3
 ==============================================================================
---- (empty file)
-+++ dir1/file3 Sun Sep 9 01:46:40 2001
+--- (empty, because file is newly added)
++++ dir1/file3 r1 Sun Sep 9 01:46:40 2001
 @@ -0,0 +1 @@
 +file3
 
 Added: dir1/file4
 ==============================================================================
---- (empty file)
-+++ dir1/file4 Sun Sep 9 01:46:40 2001
+--- (empty, because file is newly added)
++++ dir1/file4 r1 Sun Sep 9 01:46:40 2001
 @@ -0,0 +1 @@
 +file4
 
 Added: dir2/file5
 ==============================================================================
---- (empty file)
-+++ dir2/file5 Sun Sep 9 01:46:40 2001
+--- (empty, because file is newly added)
++++ dir2/file5 r1 Sun Sep 9 01:46:40 2001
 @@ -0,0 +1 @@
 +file5
 
 Added: dir2/file6
 ==============================================================================
---- (empty file)
-+++ dir2/file6 Sun Sep 9 01:46:40 2001
+--- (empty, because file is newly added)
++++ dir2/file6 r1 Sun Sep 9 01:46:40 2001
 @@ -0,0 +1 @@
 +file6
 Group: All
@@ -86,43 +86,43 @@
 
 Added: dir1/file3
 ==============================================================================
---- (empty file)
-+++ dir1/file3 Sun Sep 9 01:46:40 2001
+--- (empty, because file is newly added)
++++ dir1/file3 r1 Sun Sep 9 01:46:40 2001
 @@ -0,0 +1 @@
 +file3
 
 Added: dir1/file4
 ==============================================================================
---- (empty file)
-+++ dir1/file4 Sun Sep 9 01:46:40 2001
+--- (empty, because file is newly added)
++++ dir1/file4 r1 Sun Sep 9 01:46:40 2001
 @@ -0,0 +1 @@
 +file4
 
 Added: dir2/file5
 ==============================================================================
---- (empty file)
-+++ dir2/file5 Sun Sep 9 01:46:40 2001
+--- (empty, because file is newly added)
++++ dir2/file5 r1 Sun Sep 9 01:46:40 2001
 @@ -0,0 +1 @@
 +file5
 
 Added: dir2/file6
 ==============================================================================
---- (empty file)
-+++ dir2/file6 Sun Sep 9 01:46:40 2001
+--- (empty, because file is newly added)
++++ dir2/file6 r1 Sun Sep 9 01:46:40 2001
 @@ -0,0 +1 @@
 +file6
 
 Added: file1
 ==============================================================================
---- (empty file)
-+++ file1 Sun Sep 9 01:46:40 2001
+--- (empty, because file is newly added)
++++ file1 r1 Sun Sep 9 01:46:40 2001
 @@ -0,0 +1 @@
 +file1
 
 Added: file2
 ==============================================================================
---- (empty file)
-+++ file2 Sun Sep 9 01:46:40 2001
+--- (empty, because file is newly added)
++++ file2 r1 Sun Sep 9 01:46:40 2001
 @@ -0,0 +1 @@
 +file2
 Group: file
@@ -141,15 +141,15 @@
 
 Added: file1
 ==============================================================================
---- (empty file)
-+++ file1 Sun Sep 9 01:46:40 2001
+--- (empty, because file is newly added)
++++ file1 r1 Sun Sep 9 01:46:40 2001
 @@ -0,0 +1 @@
 +file1
 
 Added: file2
 ==============================================================================
---- (empty file)
-+++ file2 Sun Sep 9 01:46:40 2001
+--- (empty, because file is newly added)
++++ file2 r1 Sun Sep 9 01:46:40 2001
 @@ -0,0 +1 @@
 +file2
 Group: file plus other areas
@@ -171,23 +171,67 @@
    dir1/ (props changed)
    dir2/file5
 
+Property Changes:
+ file1
+ Added:
+ prop1
+ file2
+ Added:
+ prop1
+ svn:keywords
+ svn:new_svn_prop
+
+Property Changes in other areas also in this revision:
+ dir1/
+ Added:
+ prop3
+
 Modified: file2
 ==============================================================================
---- file2 (original)
-+++ file2 Sun Sep 9 04:33:20 2001
+--- file2 r1 Sun Sep 9 01:46:40 2001 (original)
++++ file2 r2 Sun Sep 9 04:33:20 2001
 @@ -1 +1,2 @@
  file2
 +change C1
 
+Added property for: file1 (from r1, file1)
+==============================================================================
+--- (empty, because property is newly added)
++++ file1|prop1 r2 Sun Sep 9 04:33:20 2001
+@@ -0,0 +1 @@
++propval1
+
+Added properties for: file2 (from r1, file2)
+==============================================================================
+--- (empty, because property is newly added)
++++ file2|prop1 r2 Sun Sep 9 04:33:20 2001
+@@ -0,0 +1 @@
++propval1
+--- (empty, because property is newly added)
++++ file2|svn:keywords r2 Sun Sep 9 04:33:20 2001
+@@ -0,0 +1 @@
++Id
+--- (empty, because property is newly added)
++++ file2|svn:new_svn_prop r2 Sun Sep 9 04:33:20 2001
+@@ -0,0 +1 @@
++val
+
 Diffs of changes in other areas also in this revision:
 
 Modified: dir2/file5
 ==============================================================================
---- dir2/file5 (original)
-+++ dir2/file5 Sun Sep 9 04:33:20 2001
+--- dir2/file5 r1 Sun Sep 9 01:46:40 2001 (original)
++++ dir2/file5 r2 Sun Sep 9 04:33:20 2001
 @@ -1 +1,2 @@
  file5
 +change C2
+
+Added property for: dir1/ (from r1, dir1)
+==============================================================================
+--- (empty, because property is newly added)
++++ dir1|prop3 r2 Sun Sep 9 04:33:20 2001
+@@ -0,0 +1 @@
++propval3
 Group: All
 Subject: r2 - dir1 dir2
 
@@ -204,21 +248,63 @@
    file1 (props changed)
    file2 (contents, props changed)
 
+Property Changes:
+ dir1/
+ Added:
+ prop3
+ file1
+ Added:
+ prop1
+ file2
+ Added:
+ prop1
+ svn:keywords
+ svn:new_svn_prop
+
 Modified: dir2/file5
 ==============================================================================
---- dir2/file5 (original)
-+++ dir2/file5 Sun Sep 9 04:33:20 2001
+--- dir2/file5 r1 Sun Sep 9 01:46:40 2001 (original)
++++ dir2/file5 r2 Sun Sep 9 04:33:20 2001
 @@ -1 +1,2 @@
  file5
 +change C2
 
 Modified: file2
 ==============================================================================
---- file2 (original)
-+++ file2 Sun Sep 9 04:33:20 2001
+--- file2 r1 Sun Sep 9 01:46:40 2001 (original)
++++ file2 r2 Sun Sep 9 04:33:20 2001
 @@ -1 +1,2 @@
  file2
 +change C1
+
+Added property for: dir1/ (from r1, dir1)
+==============================================================================
+--- (empty, because property is newly added)
++++ dir1|prop3 r2 Sun Sep 9 04:33:20 2001
+@@ -0,0 +1 @@
++propval3
+
+Added property for: file1 (from r1, file1)
+==============================================================================
+--- (empty, because property is newly added)
++++ file1|prop1 r2 Sun Sep 9 04:33:20 2001
+@@ -0,0 +1 @@
++propval1
+
+Added properties for: file2 (from r1, file2)
+==============================================================================
+--- (empty, because property is newly added)
++++ file2|prop1 r2 Sun Sep 9 04:33:20 2001
+@@ -0,0 +1 @@
++propval1
+--- (empty, because property is newly added)
++++ file2|svn:keywords r2 Sun Sep 9 04:33:20 2001
+@@ -0,0 +1 @@
++Id
+--- (empty, because property is newly added)
++++ file2|svn:new_svn_prop r2 Sun Sep 9 04:33:20 2001
+@@ -0,0 +1 @@
++val
 Group: file
 Subject: r2 - dir1 dir2
 
@@ -233,13 +319,45 @@
    file1 (props changed)
    file2 (contents, props changed)
 
+Property Changes:
+ file1
+ Added:
+ prop1
+ file2
+ Added:
+ prop1
+ svn:keywords
+ svn:new_svn_prop
+
 Modified: file2
 ==============================================================================
---- file2 (original)
-+++ file2 Sun Sep 9 04:33:20 2001
+--- file2 r1 Sun Sep 9 01:46:40 2001 (original)
++++ file2 r2 Sun Sep 9 04:33:20 2001
 @@ -1 +1,2 @@
  file2
 +change C1
+
+Added property for: file1 (from r1, file1)
+==============================================================================
+--- (empty, because property is newly added)
++++ file1|prop1 r2 Sun Sep 9 04:33:20 2001
+@@ -0,0 +1 @@
++propval1
+
+Added properties for: file2 (from r1, file2)
+==============================================================================
+--- (empty, because property is newly added)
++++ file2|prop1 r2 Sun Sep 9 04:33:20 2001
+@@ -0,0 +1 @@
++propval1
+--- (empty, because property is newly added)
++++ file2|svn:keywords r2 Sun Sep 9 04:33:20 2001
+@@ -0,0 +1 @@
++Id
+--- (empty, because property is newly added)
++++ file2|svn:new_svn_prop r2 Sun Sep 9 04:33:20 2001
+@@ -0,0 +1 @@
++val
 Group: All
 Subject: r3 - dir2 dir3
 
@@ -256,12 +374,35 @@
    dir3/ (props changed)
       - copied from r2, dir1/
 
+Property Changes:
+ dir2/file7
+ Copied:
+ prop1
+ dir3/
+ Modified:
+ prop3
+
 Copied: dir2/file7 (from r2, file1)
 ==============================================================================
---- file1 (original)
-+++ dir2/file7 Sun Sep 9 07:20:00 2001
+--- file1 r2 Sun Sep 9 04:33:20 2001 (copy source)
++++ dir2/file7 r3 Sun Sep 9 07:20:00 2001 (unchanged copied file)
 @@ -0,0 +1 @@
 +file1
+
+Copied property for: dir2/file7 (from r2, file1)
+==============================================================================
+--- file1|prop1 r2 Sun Sep 9 04:33:20 2001 (copy source)
++++ dir2/file7|prop1 r3 Sun Sep 9 07:20:00 2001 (unchanged copied property)
+@@ -0,0 +1 @@
++propval1
+
+Copied and modified property for: dir3/ (from r2, dir1)
+==============================================================================
+--- dir1|prop3 r2 Sun Sep 9 04:33:20 2001 (copy source)
++++ dir3|prop3 r3 Sun Sep 9 07:20:00 2001
+@@ -1 +1 @@
+-propval3
++propval4
 Group: All
 Subject: r4 - dir3
 
@@ -276,13 +417,25 @@
    dir3/file8
       - copied, changed from r2, file1
 
+Property Changes:
+ dir3/file8
+ Copied:
+ prop1
+
 Copied and modified: dir3/file8 (from r2, file1)
 ==============================================================================
---- file1 (original)
-+++ dir3/file8 Sun Sep 9 10:06:40 2001
+--- file1 r2 Sun Sep 9 04:33:20 2001 (copy source)
++++ dir3/file8 r4 Sun Sep 9 10:06:40 2001
 @@ -1 +1,2 @@
  file1
 +change C3
+
+Copied property for: dir3/file8 (from r2, file1)
+==============================================================================
+--- file1|prop1 r2 Sun Sep 9 04:33:20 2001 (copy source)
++++ dir3/file8|prop1 r4 Sun Sep 9 10:06:40 2001 (unchanged copied property)
+@@ -0,0 +1 @@
++propval1
 Group: file plus other areas
 Subject: r5 - dir1 dir3
 
@@ -300,6 +453,67 @@
 Modified:
    dir1/ (props changed)
    dir3/ (props changed)
+
+Property Changes:
+ file2
+ Added:
+ prop2
+ Deleted:
+ prop1
+ svn:new_svn_prop
+ Modified:
+ svn:keywords
+
+Property Changes in other areas also in this revision:
+ dir1/
+ Modified:
+ prop3
+ dir3/
+ Deleted:
+ prop3
+
+Added property for: file2 (from r4, file2)
+==============================================================================
+--- (empty, because property is newly added)
++++ file2|prop2 r5 Sun Sep 9 12:53:20 2001
+@@ -0,0 +1 @@
++propval2
+
+Deleted properties for: file2 (from r4, file2)
+==============================================================================
+--- file2|prop1 r4 Sun Sep 9 10:06:40 2001 (original)
++++ (empty, because property is deleted)
+@@ -1 +0,0 @@
+-propval1
+--- file2|svn:new_svn_prop r4 Sun Sep 9 10:06:40 2001 (original)
++++ (empty, because property is deleted)
+@@ -1 +0,0 @@
+-val
+
+Copied and modified property for: file2 (from r4, file2)
+==============================================================================
+--- file2|svn:keywords r4 Sun Sep 9 10:06:40 2001 (original)
++++ file2|svn:keywords r5 Sun Sep 9 12:53:20 2001
+@@ -1 +1 @@
+-Id
++Date
+
+Diffs of changes in other areas also in this revision:
+
+Copied and modified property for: dir1/ (from r4, dir1)
+==============================================================================
+--- dir1|prop3 r4 Sun Sep 9 10:06:40 2001 (original)
++++ dir1|prop3 r5 Sun Sep 9 12:53:20 2001
+@@ -1 +1 @@
+-propval3
++propval4
+
+Deleted property for: dir3/ (from r4, dir3)
+==============================================================================
+--- dir3|prop3 r4 Sun Sep 9 10:06:40 2001 (original)
++++ (empty, because property is deleted)
+@@ -1 +0,0 @@
+-propval4
 Group: All
 Subject: r5 - dir1 dir3
 
@@ -314,6 +528,63 @@
    dir1/ (props changed)
    dir3/ (props changed)
    file2 (props changed)
+
+Property Changes:
+ dir1/
+ Modified:
+ prop3
+ dir3/
+ Deleted:
+ prop3
+ file2
+ Added:
+ prop2
+ Deleted:
+ prop1
+ svn:new_svn_prop
+ Modified:
+ svn:keywords
+
+Copied and modified property for: dir1/ (from r4, dir1)
+==============================================================================
+--- dir1|prop3 r4 Sun Sep 9 10:06:40 2001 (original)
++++ dir1|prop3 r5 Sun Sep 9 12:53:20 2001
+@@ -1 +1 @@
+-propval3
++propval4
+
+Deleted property for: dir3/ (from r4, dir3)
+==============================================================================
+--- dir3|prop3 r4 Sun Sep 9 10:06:40 2001 (original)
++++ (empty, because property is deleted)
+@@ -1 +0,0 @@
+-propval4
+
+Added property for: file2 (from r4, file2)
+==============================================================================
+--- (empty, because property is newly added)
++++ file2|prop2 r5 Sun Sep 9 12:53:20 2001
+@@ -0,0 +1 @@
++propval2
+
+Deleted properties for: file2 (from r4, file2)
+==============================================================================
+--- file2|prop1 r4 Sun Sep 9 10:06:40 2001 (original)
++++ (empty, because property is deleted)
+@@ -1 +0,0 @@
+-propval1
+--- file2|svn:new_svn_prop r4 Sun Sep 9 10:06:40 2001 (original)
++++ (empty, because property is deleted)
+@@ -1 +0,0 @@
+-val
+
+Copied and modified property for: file2 (from r4, file2)
+==============================================================================
+--- file2|svn:keywords r4 Sun Sep 9 10:06:40 2001 (original)
++++ file2|svn:keywords r5 Sun Sep 9 12:53:20 2001
+@@ -1 +1 @@
+-Id
++Date
 Group: file
 Subject: r5 - dir1 dir3
 
@@ -326,6 +597,42 @@
 
 Modified:
    file2 (props changed)
+
+Property Changes:
+ file2
+ Added:
+ prop2
+ Deleted:
+ prop1
+ svn:new_svn_prop
+ Modified:
+ svn:keywords
+
+Added property for: file2 (from r4, file2)
+==============================================================================
+--- (empty, because property is newly added)
++++ file2|prop2 r5 Sun Sep 9 12:53:20 2001
+@@ -0,0 +1 @@
++propval2
+
+Deleted properties for: file2 (from r4, file2)
+==============================================================================
+--- file2|prop1 r4 Sun Sep 9 10:06:40 2001 (original)
++++ (empty, because property is deleted)
+@@ -1 +0,0 @@
+-propval1
+--- file2|svn:new_svn_prop r4 Sun Sep 9 10:06:40 2001 (original)
++++ (empty, because property is deleted)
+@@ -1 +0,0 @@
+-val
+
+Copied and modified property for: file2 (from r4, file2)
+==============================================================================
+--- file2|svn:keywords r4 Sun Sep 9 10:06:40 2001 (original)
++++ file2|svn:keywords r5 Sun Sep 9 12:53:20 2001
+@@ -1 +1 @@
+-Id
++Date
 Group: file plus other areas
 Subject: r6 - dir1 dir4
 
@@ -347,8 +654,8 @@
 
 Added: file9
 ==============================================================================
---- (empty file)
-+++ file9 Sun Sep 9 15:40:00 2001
+--- (empty, because file is newly added)
++++ file9 r6 Sun Sep 9 15:40:00 2001
 @@ -0,0 +1 @@
 +file9
 
@@ -356,8 +663,8 @@
 
 Modified: dir1/file3
 ==============================================================================
---- dir1/file3 (original)
-+++ dir1/file3 Sun Sep 9 15:40:00 2001
+--- dir1/file3 r5 Sun Sep 9 12:53:20 2001 (original)
++++ dir1/file3 r6 Sun Sep 9 15:40:00 2001
 @@ -1 +1,2 @@
  file3
 +change C4
@@ -379,16 +686,16 @@
 
 Modified: dir1/file3
 ==============================================================================
---- dir1/file3 (original)
-+++ dir1/file3 Sun Sep 9 15:40:00 2001
+--- dir1/file3 r5 Sun Sep 9 12:53:20 2001 (original)
++++ dir1/file3 r6 Sun Sep 9 15:40:00 2001
 @@ -1 +1,2 @@
  file3
 +change C4
 
 Added: file9
 ==============================================================================
---- (empty file)
-+++ file9 Sun Sep 9 15:40:00 2001
+--- (empty, because file is newly added)
++++ file9 r6 Sun Sep 9 15:40:00 2001
 @@ -0,0 +1 @@
 +file9
 Group: file
@@ -406,8 +713,8 @@
 
 Added: file9
 ==============================================================================
---- (empty file)
-+++ file9 Sun Sep 9 15:40:00 2001
+--- (empty, because file is newly added)
++++ file9 r6 Sun Sep 9 15:40:00 2001
 @@ -0,0 +1 @@
 +file9
 Group: file plus other areas
@@ -432,27 +739,44 @@
 Modified:
    dir3/file3
 
+Property Changes:
+ file2
+ Deleted:
+ prop2
+ svn:keywords
+
 Deleted: file2
 ==============================================================================
---- file2 Sun Sep 9 18:26:40 2001
-+++ (empty file)
+--- file2 r6 Sun Sep 9 18:26:40 2001 (original)
++++ () 00:00:00 1970 (empty, because file is deleted)
 @@ -1,2 +0,0 @@
 -file2
 -change C1
 
+Deleted properties for: file2 (from r6, file2)
+==============================================================================
+--- file2|prop2 r6 Sun Sep 9 15:40:00 2001 (original)
++++ (empty, because property is deleted)
+@@ -1 +0,0 @@
+-propval2
+--- file2|svn:keywords r6 Sun Sep 9 15:40:00 2001 (original)
++++ (empty, because property is deleted)
+@@ -1 +0,0 @@
+-Date
+
 Diffs of changes in other areas also in this revision:
 
 Added: dir1/file10
 ==============================================================================
---- (empty file)
-+++ dir1/file10 Sun Sep 9 18:26:40 2001
+--- (empty, because file is newly added)
++++ dir1/file10 r7 Sun Sep 9 18:26:40 2001
 @@ -0,0 +1 @@
 +file10
 
 Modified: dir3/file3
 ==============================================================================
---- dir3/file3 (original)
-+++ dir3/file3 Sun Sep 9 18:26:40 2001
+--- dir3/file3 r6 Sun Sep 9 15:40:00 2001 (original)
++++ dir3/file3 r7 Sun Sep 9 18:26:40 2001
 @@ -1 +1,2 @@
  file3
 +change C5
@@ -475,28 +799,45 @@
 Modified:
    dir3/file3
 
+Property Changes:
+ file2
+ Deleted:
+ prop2
+ svn:keywords
+
 Added: dir1/file10
 ==============================================================================
---- (empty file)
-+++ dir1/file10 Sun Sep 9 18:26:40 2001
+--- (empty, because file is newly added)
++++ dir1/file10 r7 Sun Sep 9 18:26:40 2001
 @@ -0,0 +1 @@
 +file10
 
 Modified: dir3/file3
 ==============================================================================
---- dir3/file3 (original)
-+++ dir3/file3 Sun Sep 9 18:26:40 2001
+--- dir3/file3 r6 Sun Sep 9 15:40:00 2001 (original)
++++ dir3/file3 r7 Sun Sep 9 18:26:40 2001
 @@ -1 +1,2 @@
  file3
 +change C5
 
 Deleted: file2
 ==============================================================================
---- file2 Sun Sep 9 18:26:40 2001
-+++ (empty file)
+--- file2 r6 Sun Sep 9 18:26:40 2001 (original)
++++ () 00:00:00 1970 (empty, because file is deleted)
 @@ -1,2 +0,0 @@
 -file2
 -change C1
+
+Deleted properties for: file2 (from r6, file2)
+==============================================================================
+--- file2|prop2 r6 Sun Sep 9 15:40:00 2001 (original)
++++ (empty, because property is deleted)
+@@ -1 +0,0 @@
+-propval2
+--- file2|svn:keywords r6 Sun Sep 9 15:40:00 2001 (original)
++++ (empty, because property is deleted)
+@@ -1 +0,0 @@
+-Date
 Group: file
 Subject: r7 - dir1 dir2 dir3 dir3/dir5
 
@@ -510,13 +851,30 @@
 Deleted:
    file2
 
+Property Changes:
+ file2
+ Deleted:
+ prop2
+ svn:keywords
+
 Deleted: file2
 ==============================================================================
---- file2 Sun Sep 9 18:26:40 2001
-+++ (empty file)
+--- file2 r6 Sun Sep 9 18:26:40 2001 (original)
++++ () 00:00:00 1970 (empty, because file is deleted)
 @@ -1,2 +0,0 @@
 -file2
 -change C1
+
+Deleted properties for: file2 (from r6, file2)
+==============================================================================
+--- file2|prop2 r6 Sun Sep 9 15:40:00 2001 (original)
++++ (empty, because property is deleted)
+@@ -1 +0,0 @@
+-propval2
+--- file2|svn:keywords r6 Sun Sep 9 15:40:00 2001 (original)
++++ (empty, because property is deleted)
+@@ -1 +0,0 @@
+-Date
 Group: All
 Subject: r8 - in dir6: . dir5
 
@@ -540,16 +898,16 @@
 
 Copied: dir6/file3 (from r7, dir3/file3)
 ==============================================================================
---- dir3/file3 (original)
-+++ dir6/file3 Sun Sep 9 21:13:20 2001
+--- dir3/file3 r7 Sun Sep 9 18:26:40 2001 (copy source)
++++ dir6/file3 r8 Sun Sep 9 21:13:20 2001 (unchanged copied file)
 @@ -0,0 +1,2 @@
 +file3
 +change C5
 
 Modified: dir6/file4
 ==============================================================================
---- dir3/file4 (original)
-+++ dir6/file4 Sun Sep 9 21:13:20 2001
+--- dir3/file4 r6 Sun Sep 9 15:40:00 2001 (original)
++++ dir6/file4 r8 Sun Sep 9 21:13:20 2001
 @@ -1 +1,2 @@
  file4
 +change C6
@@ -568,9 +926,29 @@
 Modified:
    file9 (props changed)
 
+Property Changes:
+ file11
+ Added:
+ svn:mime-type
+ file9
+ Added:
+ prop2
+
 Added: file11
 ==============================================================================
 Binary file. No diff available.
+
+Added property for: file11
+==============================================================================
+--- (empty, because property is newly added)
++++ file11|svn:mime-type r9 Mon Sep 10 00:00:00 2001
+@@ -0,0 +1 @@
++application/octet-stream
+
+Added property for: file9 (from r8, file9)
+==============================================================================
+
+Binary property. No diff available.
 Group: All
 Subject: r9 -
 
@@ -586,9 +964,29 @@
 Modified:
    file9 (props changed)
 
+Property Changes:
+ file11
+ Added:
+ svn:mime-type
+ file9
+ Added:
+ prop2
+
 Added: file11
 ==============================================================================
 Binary file. No diff available.
+
+Added property for: file11
+==============================================================================
+--- (empty, because property is newly added)
++++ file11|svn:mime-type r9 Mon Sep 10 00:00:00 2001
+@@ -0,0 +1 @@
++application/octet-stream
+
+Added property for: file9 (from r8, file9)
+==============================================================================
+
+Binary property. No diff available.
 Group: file
 Subject: r9 -
 
@@ -604,9 +1002,29 @@
 Modified:
    file9 (props changed)
 
+Property Changes:
+ file11
+ Added:
+ svn:mime-type
+ file9
+ Added:
+ prop2
+
 Added: file11
 ==============================================================================
 Binary file. No diff available.
+
+Added property for: file11
+==============================================================================
+--- (empty, because property is newly added)
++++ file11|svn:mime-type r9 Mon Sep 10 00:00:00 2001
+@@ -0,0 +1 @@
++application/octet-stream
+
+Added property for: file9 (from r8, file9)
+==============================================================================
+
+Binary property. No diff available.
 Group: file plus other areas
 Subject: r10 -
 
@@ -621,9 +1039,19 @@
    file11
    file9 (props changed)
 
+Property Changes:
+ file9
+ Modified:
+ prop2
+
 Modified: file11
 ==============================================================================
-Binary files. No diff available.
+Binary file (source and/or target). No diff available.
+
+Copied and modified property for: file9 (from r9, file9)
+==============================================================================
+
+Binary property (source and/or target). No diff available.
 Group: All
 Subject: r10 -
 
@@ -638,9 +1066,19 @@
    file11
    file9 (props changed)
 
+Property Changes:
+ file9
+ Modified:
+ prop2
+
 Modified: file11
 ==============================================================================
-Binary files. No diff available.
+Binary file (source and/or target). No diff available.
+
+Copied and modified property for: file9 (from r9, file9)
+==============================================================================
+
+Binary property (source and/or target). No diff available.
 Group: file
 Subject: r10 -
 
@@ -655,6 +1093,16 @@
    file11
    file9 (props changed)
 
+Property Changes:
+ file9
+ Modified:
+ prop2
+
 Modified: file11
 ==============================================================================
-Binary files. No diff available.
+Binary file (source and/or target). No diff available.
+
+Copied and modified property for: file9 (from r9, file9)
+==============================================================================
+
+Binary property (source and/or target). No diff available.

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Mon Sep 18 11:37:26 2006

This is an archived mail posted to the Subversion Dev mailing list.

This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.