in tools/hook-scripts/mailer/mailer.py [0:0]
def generate_changelist_diffs(cfg, repos, changelist,
no_diff_content, in_paths,
group, params, paths, date, pool):
"This is a generator returning diffs for each change."
diffsels = DiffSelections(cfg, group, params)
diffurls = DiffURLSelections(cfg, group, params)
for path, change in changelist:
diff = diff_url = None
kind = None
label1 = None
label2 = None
src_fname = None
dst_fname = None
binary = None
singular = None
content = None
# just skip directories. they have no diffs.
if change.item_kind == svn.core.svn_node_dir:
continue
# is this change in (or out of) the set of matched paths?
if (path in paths) != in_paths:
continue
if change.base_rev != -1:
svndate = repos.get_rev_prop(svn.core.SVN_PROP_REVISION_DATE,
pool, change.base_rev)
### pick a different date format?
base_date = time.ctime(svn.core.secs_from_timestr(svndate, pool))
else:
base_date = ''
# figure out if/how to generate a diff
base_path_bytes = remove_leading_slashes(change.base_path)
base_path = (to_str(base_path_bytes)
if base_path_bytes is not None else None)
if change.action == svn.repos.CHANGE_ACTION_DELETE:
# it was delete.
kind = 'D'
# get the diff url, if any is specified
diff_url = diffurls.get_delete_url(repos.rev, change)
# show the diff?
if diffsels.delete:
diff = svn.fs.FileDiff(repos.get_root(change.base_rev),
base_path_bytes, None, None, pool)
label1 = '%s\t%s\t(r%s)' % (base_path, date, change.base_rev)
label2 = '/dev/null\t00:00:00 1970\t(deleted)'
singular = True
elif change.action == svn.repos.CHANGE_ACTION_ADD \
or change.action == svn.repos.CHANGE_ACTION_REPLACE:
if base_path and (change.base_rev != -1):
# any diff of interest?
if change.text_changed:
# this file was copied and modified.
kind = 'W'
# get the diff url, if any is specified
diff_url = diffurls.get_copy_url(repos.rev, change)
# show the diff?
if diffsels.modify:
diff = svn.fs.FileDiff(repos.get_root(change.base_rev),
base_path_bytes,
repos.root_this, change.path,
pool)
label1 = ('%s\t%s\t(r%s, copy source)'
% (base_path, base_date, change.base_rev))
label2 = ('%s\t%s\t(r%s)'
% (to_str(change.path), date, repos.rev))
singular = False
else:
# this file was copied.
kind = 'C'
if diffsels.copy:
diff = svn.fs.FileDiff(None, None, repos.root_this,
change.path, pool)
label1 = ('/dev/null\t00:00:00 1970\t'
'(empty, because file is newly added)')
label2 = ('%s\t%s\t(r%s, copy of r%s, %s)'
% (to_str(change.path),
date, repos.rev, change.base_rev,
base_path))
singular = False
else:
# the file was added.
kind = 'A'
# get the diff url, if any is specified
diff_url = diffurls.get_add_url(repos.rev, change)
# show the diff?
if diffsels.add:
diff = svn.fs.FileDiff(None, None, repos.root_this,
change.path, pool)
label1 = '/dev/null\t00:00:00 1970\t' \
'(empty, because file is newly added)'
label2 = '%s\t%s\t(r%s)' \
% (to_str(change.path), date, repos.rev)
singular = True
elif not change.text_changed:
# the text didn't change, so nothing to show.
continue
else:
# a simple modification.
kind = 'M'
# get the diff url, if any is specified
diff_url = diffurls.get_modify_url(repos.rev, change)
# show the diff?
if diffsels.modify:
diff = svn.fs.FileDiff(repos.get_root(change.base_rev),
base_path,
repos.root_this, change.path,
pool)
label1 = '%s\t%s\t(r%s)' \
% (base_path, base_date, change.base_rev)
label2 = '%s\t%s\t(r%s)' \
% (to_str(change.path), date, repos.rev)
singular = False
if diff:
binary = diff.either_binary()
if binary or no_diff_content:
content = src_fname = dst_fname = None
else:
src_fname, dst_fname = diff.get_files()
content = generate_diff(cfg.get_diff_cmd(group, {
'label_from' : label1,
'label_to' : label2,
'from' : src_fname,
'to' : dst_fname,
}))
# return a data item for this diff
yield _data(
path=change.path,
base_path=base_path_bytes,
base_rev=change.base_rev,
diff=diff,
diff_url=diff_url,
kind=kind,
label_from=label1,
label_to=label2,
from_fname=src_fname,
to_fname=dst_fname,
binary=binary,
singular=singular,
content=content,
)