def generate_changelist_diffs()

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,
        )