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

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

From: Mathias Weinert <wein_at_mccw.de>
Date: 2006-09-25 10:25:27 CEST

> 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.

Hi,

please find attached a new version of the patch that adds property
handling to mailer.py's commit messages. This new version primarily
includes the recent changes I committed to mailer.py.

If there are no objections against the new functionality and its
implementation I will commit it.

Please note that this patch doesn't change mailer.py's behaviour at all
unless the newly introduced parameter options are set in mailer.conf. So
committing the patch doesn't hurt. You explicitly have to activate the
new possibilities (For sure you don't have to, but you may ;) ).

Mathias

P.S.: This is the last in a series of patches for the time being...

[[[
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 appropriate 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.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
--- mailer.py.orig 2006-09-25 08:25:36.520376800 +0200
+++ mailer.py 2006-09-22 10:49:52.193251400 +0200
@@ -596,6 +596,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
@@ -635,7 +679,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'
@@ -656,8 +704,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,
@@ -676,7 +729,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)
 
@@ -893,6 +950,230 @@
         )
 
 
+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' or action_type == 'C':
+ label_from = '/dev/null\t00:00:00 1970\t' \
+ '(empty, because property is newly added)'
+ elif action_type == 'W':
+ label_from = '%s|%s\t%s\t(r%s, copy source)' \
+ % (base_path, prop, base_date, base_rev)
+ else:
+ label_from = '%s|%s\t%s\t(r%s)' \
+ % (path, prop, base_date, base_rev)
+ if action_type == 'C':
+ label_to = '%s|%s\t%s\t(r%s, copy of r%s, %s)' % \
+ (path, prop, date, rev, base_rev, base_path)
+ elif action_type == 'D':
+ label_to = '/dev/null\t00:00:00 1970\t(deleted)'
+ else:
+ label_to = '%s|%s\t%s\t(r%s)' % (path, prop, date, rev)
+ 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."
 
@@ -934,6 +1215,8 @@
         ltype = 'T'
     elif first == ' ':
       ltype = 'C'
+ elif line.startswith('File ') or line.startswith('Files '):
+ ltype = 'B'
     else:
       ltype = 'U'
 
@@ -952,6 +1235,7 @@
 
   def __init__(self, output):
     self.output = output
+ self.other_areas_written = False
 
   def render(self, data):
     "Render the commit defined by 'data'."
@@ -986,11 +1270,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:
@@ -1021,6 +1345,33 @@
         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 if there are actually
     any diffs to render."""
@@ -1028,13 +1379,16 @@
       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':
@@ -1067,6 +1421,52 @@
       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."
--- tests/mailer.conf.orig 2006-09-25 08:26:24.441650200 +0200
+++ tests/mailer.conf 2006-09-15 09:58:38.324967800 +0200
@@ -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-25 08:26:10.030882400 +0200
+++ tests/mailer-t1.output 2006-09-21 14:43:54.677570400 +0200
@@ -171,6 +171,21 @@
    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 Sun Sep 9 01:46:40 2001 (r1)
@@ -179,6 +194,28 @@
  file2
 +change C1
 
+Added property for: file1 (from r1, file1)
+==============================================================================
+--- /dev/null 00:00:00 1970 (empty, because property is newly added)
++++ file1|prop1 Sun Sep 9 04:33:20 2001 (r2)
+@@ -0,0 +1 @@
++propval1
+
+Added properties for: file2 (from r1, file2)
+==============================================================================
+--- /dev/null 00:00:00 1970 (empty, because property is newly added)
++++ file2|prop1 Sun Sep 9 04:33:20 2001 (r2)
+@@ -0,0 +1 @@
++propval1
+--- /dev/null 00:00:00 1970 (empty, because property is newly added)
++++ file2|svn:keywords Sun Sep 9 04:33:20 2001 (r2)
+@@ -0,0 +1 @@
++Id
+--- /dev/null 00:00:00 1970 (empty, because property is newly added)
++++ file2|svn:new_svn_prop Sun Sep 9 04:33:20 2001 (r2)
+@@ -0,0 +1 @@
++val
+
 Diffs of changes in other areas also in this revision:
 
 Modified: dir2/file5
@@ -188,6 +225,13 @@
 @@ -1 +1,2 @@
  file5
 +change C2
+
+Added property for: dir1/ (from r1, dir1)
+==============================================================================
+--- /dev/null 00:00:00 1970 (empty, because property is newly added)
++++ dir1|prop3 Sun Sep 9 04:33:20 2001 (r2)
+@@ -0,0 +1 @@
++propval3
 Group: All
 Subject: r2 - dir1 dir2
 
@@ -204,6 +248,19 @@
    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 Sun Sep 9 01:46:40 2001 (r1)
@@ -219,6 +276,35 @@
 @@ -1 +1,2 @@
  file2
 +change C1
+
+Added property for: dir1/ (from r1, dir1)
+==============================================================================
+--- /dev/null 00:00:00 1970 (empty, because property is newly added)
++++ dir1|prop3 Sun Sep 9 04:33:20 2001 (r2)
+@@ -0,0 +1 @@
++propval3
+
+Added property for: file1 (from r1, file1)
+==============================================================================
+--- /dev/null 00:00:00 1970 (empty, because property is newly added)
++++ file1|prop1 Sun Sep 9 04:33:20 2001 (r2)
+@@ -0,0 +1 @@
++propval1
+
+Added properties for: file2 (from r1, file2)
+==============================================================================
+--- /dev/null 00:00:00 1970 (empty, because property is newly added)
++++ file2|prop1 Sun Sep 9 04:33:20 2001 (r2)
+@@ -0,0 +1 @@
++propval1
+--- /dev/null 00:00:00 1970 (empty, because property is newly added)
++++ file2|svn:keywords Sun Sep 9 04:33:20 2001 (r2)
+@@ -0,0 +1 @@
++Id
+--- /dev/null 00:00:00 1970 (empty, because property is newly added)
++++ file2|svn:new_svn_prop Sun Sep 9 04:33:20 2001 (r2)
+@@ -0,0 +1 @@
++val
 Group: file
 Subject: r2 - dir1 dir2
 
@@ -233,6 +319,16 @@
    file1 (props changed)
    file2 (contents, props changed)
 
+Property Changes:
+ file1
+ Added:
+ prop1
+ file2
+ Added:
+ prop1
+ svn:keywords
+ svn:new_svn_prop
+
 Modified: file2
 ==============================================================================
 --- file2 Sun Sep 9 01:46:40 2001 (r1)
@@ -240,6 +336,28 @@
 @@ -1 +1,2 @@
  file2
 +change C1
+
+Added property for: file1 (from r1, file1)
+==============================================================================
+--- /dev/null 00:00:00 1970 (empty, because property is newly added)
++++ file1|prop1 Sun Sep 9 04:33:20 2001 (r2)
+@@ -0,0 +1 @@
++propval1
+
+Added properties for: file2 (from r1, file2)
+==============================================================================
+--- /dev/null 00:00:00 1970 (empty, because property is newly added)
++++ file2|prop1 Sun Sep 9 04:33:20 2001 (r2)
+@@ -0,0 +1 @@
++propval1
+--- /dev/null 00:00:00 1970 (empty, because property is newly added)
++++ file2|svn:keywords Sun Sep 9 04:33:20 2001 (r2)
+@@ -0,0 +1 @@
++Id
+--- /dev/null 00:00:00 1970 (empty, because property is newly added)
++++ file2|svn:new_svn_prop Sun Sep 9 04:33:20 2001 (r2)
+@@ -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)
 ==============================================================================
 --- /dev/null 00:00:00 1970 (empty, because file is newly added)
 +++ dir2/file7 Sun Sep 9 07:20:00 2001 (r3, copy of r2, file1)
 @@ -0,0 +1 @@
 +file1
+
+Copied property for: dir2/file7 (from r2, file1)
+==============================================================================
+--- /dev/null 00:00:00 1970 (empty, because property is newly added)
++++ dir2/file7|prop1 Sun Sep 9 07:20:00 2001 (r3, copy of r2, file1)
+@@ -0,0 +1 @@
++propval1
+
+Copied and modified property for: dir3/ (from r2, dir1)
+==============================================================================
+--- dir1|prop3 Sun Sep 9 04:33:20 2001 (r2, copy source)
++++ dir3|prop3 Sun Sep 9 07:20:00 2001 (r3)
+@@ -1 +1 @@
+-propval3
++propval4
 Group: All
 Subject: r4 - dir3
 
@@ -276,6 +417,11 @@
    dir3/file8
       - copied, changed from r2, file1
 
+Property Changes:
+ dir3/file8
+ Copied:
+ prop1
+
 Copied and modified: dir3/file8 (from r2, file1)
 ==============================================================================
 --- file1 Sun Sep 9 04:33:20 2001 (r2, copy source)
@@ -283,6 +429,13 @@
 @@ -1 +1,2 @@
  file1
 +change C3
+
+Copied property for: dir3/file8 (from r2, file1)
+==============================================================================
+--- /dev/null 00:00:00 1970 (empty, because property is newly added)
++++ dir3/file8|prop1 Sun Sep 9 10:06:40 2001 (r4, copy of r2, file1)
+@@ -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)
+==============================================================================
+--- /dev/null 00:00:00 1970 (empty, because property is newly added)
++++ file2|prop2 Sun Sep 9 12:53:20 2001 (r5)
+@@ -0,0 +1 @@
++propval2
+
+Deleted properties for: file2 (from r4, file2)
+==============================================================================
+--- file2|prop1 Sun Sep 9 10:06:40 2001 (r4)
++++ /dev/null 00:00:00 1970 (deleted)
+@@ -1 +0,0 @@
+-propval1
+--- file2|svn:new_svn_prop Sun Sep 9 10:06:40 2001 (r4)
++++ /dev/null 00:00:00 1970 (deleted)
+@@ -1 +0,0 @@
+-val
+
+Copied and modified property for: file2 (from r4, file2)
+==============================================================================
+--- file2|svn:keywords Sun Sep 9 10:06:40 2001 (r4)
++++ file2|svn:keywords Sun Sep 9 12:53:20 2001 (r5)
+@@ -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 Sun Sep 9 10:06:40 2001 (r4)
++++ dir1|prop3 Sun Sep 9 12:53:20 2001 (r5)
+@@ -1 +1 @@
+-propval3
++propval4
+
+Deleted property for: dir3/ (from r4, dir3)
+==============================================================================
+--- dir3|prop3 Sun Sep 9 10:06:40 2001 (r4)
++++ /dev/null 00:00:00 1970 (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 Sun Sep 9 10:06:40 2001 (r4)
++++ dir1|prop3 Sun Sep 9 12:53:20 2001 (r5)
+@@ -1 +1 @@
+-propval3
++propval4
+
+Deleted property for: dir3/ (from r4, dir3)
+==============================================================================
+--- dir3|prop3 Sun Sep 9 10:06:40 2001 (r4)
++++ /dev/null 00:00:00 1970 (deleted)
+@@ -1 +0,0 @@
+-propval4
+
+Added property for: file2 (from r4, file2)
+==============================================================================
+--- /dev/null 00:00:00 1970 (empty, because property is newly added)
++++ file2|prop2 Sun Sep 9 12:53:20 2001 (r5)
+@@ -0,0 +1 @@
++propval2
+
+Deleted properties for: file2 (from r4, file2)
+==============================================================================
+--- file2|prop1 Sun Sep 9 10:06:40 2001 (r4)
++++ /dev/null 00:00:00 1970 (deleted)
+@@ -1 +0,0 @@
+-propval1
+--- file2|svn:new_svn_prop Sun Sep 9 10:06:40 2001 (r4)
++++ /dev/null 00:00:00 1970 (deleted)
+@@ -1 +0,0 @@
+-val
+
+Copied and modified property for: file2 (from r4, file2)
+==============================================================================
+--- file2|svn:keywords Sun Sep 9 10:06:40 2001 (r4)
++++ file2|svn:keywords Sun Sep 9 12:53:20 2001 (r5)
+@@ -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)
+==============================================================================
+--- /dev/null 00:00:00 1970 (empty, because property is newly added)
++++ file2|prop2 Sun Sep 9 12:53:20 2001 (r5)
+@@ -0,0 +1 @@
++propval2
+
+Deleted properties for: file2 (from r4, file2)
+==============================================================================
+--- file2|prop1 Sun Sep 9 10:06:40 2001 (r4)
++++ /dev/null 00:00:00 1970 (deleted)
+@@ -1 +0,0 @@
+-propval1
+--- file2|svn:new_svn_prop Sun Sep 9 10:06:40 2001 (r4)
++++ /dev/null 00:00:00 1970 (deleted)
+@@ -1 +0,0 @@
+-val
+
+Copied and modified property for: file2 (from r4, file2)
+==============================================================================
+--- file2|svn:keywords Sun Sep 9 10:06:40 2001 (r4)
++++ file2|svn:keywords Sun Sep 9 12:53:20 2001 (r5)
+@@ -1 +1 @@
+-Id
++Date
 Group: file plus other areas
 Subject: r6 - dir1 dir4
 
@@ -432,6 +739,12 @@
 Modified:
    dir3/file3
 
+Property Changes:
+ file2
+ Deleted:
+ prop2
+ svn:keywords
+
 Deleted: file2
 ==============================================================================
 --- file2 Sun Sep 9 18:26:40 2001 (r6)
@@ -440,6 +753,17 @@
 -file2
 -change C1
 
+Deleted properties for: file2 (from r6, file2)
+==============================================================================
+--- file2|prop2 Sun Sep 9 15:40:00 2001 (r6)
++++ /dev/null 00:00:00 1970 (deleted)
+@@ -1 +0,0 @@
+-propval2
+--- file2|svn:keywords Sun Sep 9 15:40:00 2001 (r6)
++++ /dev/null 00:00:00 1970 (deleted)
+@@ -1 +0,0 @@
+-Date
+
 Diffs of changes in other areas also in this revision:
 
 Added: dir1/file10
@@ -475,6 +799,12 @@
 Modified:
    dir3/file3
 
+Property Changes:
+ file2
+ Deleted:
+ prop2
+ svn:keywords
+
 Added: dir1/file10
 ==============================================================================
 --- /dev/null 00:00:00 1970 (empty, because file is newly added)
@@ -497,6 +827,17 @@
 @@ -1,2 +0,0 @@
 -file2
 -change C1
+
+Deleted properties for: file2 (from r6, file2)
+==============================================================================
+--- file2|prop2 Sun Sep 9 15:40:00 2001 (r6)
++++ /dev/null 00:00:00 1970 (deleted)
+@@ -1 +0,0 @@
+-propval2
+--- file2|svn:keywords Sun Sep 9 15:40:00 2001 (r6)
++++ /dev/null 00:00:00 1970 (deleted)
+@@ -1 +0,0 @@
+-Date
 Group: file
 Subject: r7 - dir1 dir2 dir3 dir3/dir5
 
@@ -510,6 +851,12 @@
 Deleted:
    file2
 
+Property Changes:
+ file2
+ Deleted:
+ prop2
+ svn:keywords
+
 Deleted: file2
 ==============================================================================
 --- file2 Sun Sep 9 18:26:40 2001 (r6)
@@ -517,6 +864,17 @@
 @@ -1,2 +0,0 @@
 -file2
 -change C1
+
+Deleted properties for: file2 (from r6, file2)
+==============================================================================
+--- file2|prop2 Sun Sep 9 15:40:00 2001 (r6)
++++ /dev/null 00:00:00 1970 (deleted)
+@@ -1 +0,0 @@
+-propval2
+--- file2|svn:keywords Sun Sep 9 15:40:00 2001 (r6)
++++ /dev/null 00:00:00 1970 (deleted)
+@@ -1 +0,0 @@
+-Date
 Group: All
 Subject: r8 - in dir6: . dir5
 
@@ -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
+==============================================================================
+--- /dev/null 00:00:00 1970 (empty, because property is newly added)
++++ file11|svn:mime-type Mon Sep 10 00:00:00 2001 (r9)
+@@ -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
+==============================================================================
+--- /dev/null 00:00:00 1970 (empty, because property is newly added)
++++ file11|svn:mime-type Mon Sep 10 00:00:00 2001 (r9)
+@@ -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
+==============================================================================
+--- /dev/null 00:00:00 1970 (empty, because property is newly added)
++++ file11|svn:mime-type Mon Sep 10 00:00:00 2001 (r9)
+@@ -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 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 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 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 25 10:26:00 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.