Attachment 'patch-RecentChanges-improved-diff-links-1.8-revised-again.diff'

Download

   1 # HG changeset patch
   2 # User Paul Boddie <paul@boddie.org.uk>
   3 # Date 1375199606 -7200
   4 # Node ID ede5548adf80d20217aa6f23abf55fbca6daa5a1
   5 # Parent  98b529f91eec74e0888699f3698849f422964646
   6 Provide links from RecentChanges to individual changes and spans of changes.
   7 
   8 diff -r 98b529f91eec -r ede5548adf80 MoinMoin/macro/RecentChanges.py
   9 --- a/MoinMoin/macro/RecentChanges.py	Mon Nov 28 21:40:29 2011 +0100
  10 +++ b/MoinMoin/macro/RecentChanges.py	Tue Jul 30 17:53:26 2013 +0200
  11 @@ -107,22 +107,109 @@
  12  
  13      # print editor name or IP
  14      d['editors'] = None
  15 +    d['editors_detailed'] = None
  16      if request.cfg.show_names:
  17 +
  18 +        # one line means only one revision
  19          if len(lines) > 1:
  20              counters = {}
  21 -            for idx in range(len(lines)):
  22 -                name = lines[idx].getEditor(request)
  23 -                if not name in counters:
  24 -                    counters[name] = []
  25 -                counters[name].append(idx+1)
  26 -            poslist = [(v, k) for k, v in counters.items()]
  27 -            poslist.sort()
  28 +
  29 +            # track the editor name and build suitable ranges
  30 +            current_name = None
  31 +            current_edit_rev = None
  32 +            current_idx = None
  33 +
  34 +            # visit each line, recording the editor name, change number range
  35 +            # and revision number range
  36 +            for idx, edit_line in enumerate(lines):
  37 +
  38 +                # get the edit details for the log line
  39 +                name = edit_line.getEditor(request)
  40 +                edit_rev = int(edit_line.rev)
  41 +                attachment = edit_line.action.startswith("ATT")
  42 +                must_start_range = current_edit_rev is None
  43 +
  44 +                # record the editor and details
  45 +                if current_name != name or attachment or must_start_range:
  46 +
  47 +                    # already have a range of revisions to describe
  48 +                    if not must_start_range:
  49 +                        if not counters.has_key(current_name):
  50 +                            counters[current_name] = []
  51 +
  52 +                        # do not include an attachment in the range
  53 +                        # instead find the preceding page revision
  54 +                        if attachment:
  55 +                            start_edit_rev = max(1, last_edit_rev - 1)
  56 +                        else:
  57 +                            start_edit_rev = edit_rev
  58 +
  59 +                        # change numbers are 1-based
  60 +                        counters[current_name].append((range(current_idx + 1, idx + 1), (start_edit_rev, current_edit_rev)))
  61 +
  62 +                    # add any attachment
  63 +                    if attachment:
  64 +                        if not counters.has_key(name):
  65 +                            counters[name] = []
  66 +
  67 +                        # change numbers are 1-based
  68 +                        counters[name].append((range(idx + 1, idx + 2), None))
  69 +
  70 +                    # start a new range only for genuine page revisions
  71 +                    if attachment:
  72 +                        current_edit_rev = None
  73 +                    else:
  74 +                        current_edit_rev = edit_rev
  75 +
  76 +                    current_name = name
  77 +                    current_idx = idx
  78 +
  79 +                # remember revisions to close ranges before attachments
  80 +                last_edit_rev = edit_rev
  81 +
  82 +            # for the final change, get a diff to the revision before
  83 +            else:
  84 +                attachment = edit_line.action.startswith("ATT")
  85 +
  86 +                # have a range of revisions to describe
  87 +                if not attachment:
  88 +                    if not counters.has_key(current_name):
  89 +                        counters[current_name] = []
  90 +
  91 +                    edit_rev = int(edit_line.rev)
  92 +                    start_edit_rev = max(1, edit_rev - 1)
  93 +
  94 +                    # change numbers are 1-based
  95 +                    # include the final number in the range
  96 +                    counters[current_name].append((range(current_idx + 1, idx + 2), (start_edit_rev, current_edit_rev)))
  97 +
  98 +            # get the editors in order
  99 +            editors = [(v, k) for k, v in counters.items()]
 100 +            editors.sort()
 101 +
 102 +            # prepare a dictionary of editor details for display
 103              d['editors'] = []
 104 -            for positions, name in poslist:
 105 +            d['editors_detailed'] = []
 106 +
 107 +            for details, name in editors:
 108 +
 109 +                # get the combined index list
 110 +                all_idx_list = []
 111 +                for idx_list, rev_range in details:
 112 +                    all_idx_list += idx_list
 113 +
 114 +                # make the editor summary
 115                  d['editors'].append("%s&nbsp;[%s]" % (
 116 -                    name, util.rangelist(positions)))
 117 +                    name, util.rangelist(all_idx_list)))
 118 +
 119 +                # make the editor details for display
 120 +                d['editors_detailed'].append((
 121 +                    name, page, details))
 122 +
 123          else:
 124 -            d['editors'] = [line.getEditor(request)]
 125 +            name = line.getEditor(request)
 126 +            d['editors'] = [name]
 127 +            d['editors_detailed'] = [(name, page, None)]
 128  
 129      comments = []
 130      for idx in range(len(lines)):
 131 diff -r 98b529f91eec -r ede5548adf80 MoinMoin/theme/__init__.py
 132 --- a/MoinMoin/theme/__init__.py	Mon Nov 28 21:40:29 2011 +0100
 133 +++ b/MoinMoin/theme/__init__.py	Tue Jul 30 17:53:26 2013 +0200
 134 @@ -8,7 +8,7 @@
 135  
 136  from MoinMoin import i18n, wikiutil, config, version, caching
 137  from MoinMoin.Page import Page
 138 -from MoinMoin.util import pysupport
 139 +from MoinMoin.util import pysupport, rangelist
 140  
 141  modules = pysupport.getPackageModules(__file__)
 142  
 143 @@ -1404,8 +1404,43 @@
 144          html.append('<td class="rcicon2">%(info_html)s</td>\n' % d)
 145  
 146          html.append('<td class="rceditor">')
 147 -        if d['editors']:
 148 -            html.append('<br>'.join(d['editors']))
 149 +        if d['editors_detailed']:
 150 +            notfirst = 0
 151 +            for name, page, details in d['editors_detailed']:
 152 +                if notfirst:
 153 +                    html.append('<br>')
 154 +
 155 +                html.append(name)
 156 +
 157 +                if details is not None:
 158 +                    html.append("&nbsp;[")
 159 +                    notfirstlink = 0
 160 +
 161 +                    for idx_list, rev_range in details:
 162 +                        if notfirstlink:
 163 +                            html.append(',')
 164 +
 165 +                        # handle attachments
 166 +                        if rev_range is None:
 167 +                            html.append("%s" % rangelist(idx_list))
 168 +                        else:
 169 +                            start_rev, end_rev = rev_range
 170 +                            # handle pages with previous content
 171 +                            if start_rev > 0:
 172 +                                html.append(
 173 +                                    page.link_to_raw(self.request, "%s" % rangelist(idx_list),
 174 +                                        querystr={'action': 'diff', 'rev1': start_rev,
 175 +                                            'rev2': end_rev}, rel='nofollow'))
 176 +
 177 +                            # handle initial edits of pages
 178 +                            else:
 179 +                                html.append(
 180 +                                    page.link_to_raw(self.request, "%s" % rangelist(idx_list),
 181 +                                        rel='nofollow'))
 182 +                        notfirstlink = 1
 183 +                    html.append("]")
 184 +
 185 +                notfirst = 1
 186          html.append('</td>\n')
 187  
 188          html.append('<td class="rccomment">')

Attached Files

To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.
  • [get | view] (2013-07-30 15:58:12, 7.3 KB) [[attachment:patch-RecentChanges-improved-diff-links-1.8-revised-again.diff]]
  • [get | view] (2013-05-13 15:30:52, 5.8 KB) [[attachment:patch-RecentChanges-improved-diff-links-1.8-revised.diff]]
  • [get | view] (2013-07-30 15:58:21, 7.4 KB) [[attachment:patch-RecentChanges-improved-diff-links-revised-again.diff]]
  • [get | view] (2013-05-13 15:31:10, 5.9 KB) [[attachment:patch-RecentChanges-improved-diff-links-revised.diff]]
  • [get | view] (2010-10-03 14:24:56, 5.3 KB) [[attachment:patch-RecentChanges-improved-diff-links.diff]]
  • [get | view] (2010-03-04 00:04:37, 5.3 KB) [[attachment:patch-RecentChanges-with-enhanced-diffs.diff]]
 All files | Selected Files: delete move to page copy to page

You are not allowed to attach a file to this page.