Ticket #1038: milestone_sort_dsu.2.diff
| File milestone_sort_dsu.2.diff, 3.8 KB (added by cboos, 3 years ago) |
|---|
-
trac/ticket/model.py
22 22 23 23 from trac.core import TracError 24 24 from trac.ticket import TicketSystem 25 from trac.util import natural_order25 from trac.util import sorted, embedded_numbers 26 26 27 27 __all__ = ['Ticket', 'Type', 'Status', 'Resolution', 'Priority', 'Severity', 28 28 'Component', 'Milestone', 'Version'] … … 628 628 milestone.completed = completed and int(completed) or 0 629 629 milestone.description = description or '' 630 630 milestones.append(milestone) 631 milestones.sort(lambda a, b: 632 cmp(a.completed or sys.maxint, 633 b.completed or sys.maxint) or \ 634 cmp(a.due or sys.maxint, 635 b.due or sys.maxint) or \ 636 natural_order(a.name, b.name)) 637 return milestones 631 def milestone_order(m): 632 return (m.completed or sys.maxint, 633 m.due or sys.maxint, 634 embedded_numbers(m.name)) 635 return sorted(milestones, key=milestone_order) 636 638 637 select = classmethod(select) 639 638 640 639 -
trac/versioncontrol/web_ui/browser.py
142 142 elif order == 'size': 143 143 return neg * cmp(a['content_length'], b['content_length']) 144 144 else: 145 return neg * util.natural_order(a['name'].lower(),146 b['name'].lower())145 return neg * cmp(util.embedded_numbers(a['name'].lower()), 146 util.embedded_numbers(b['name'].lower())) 147 147 info.sort(cmp_func) 148 148 149 149 req.hdf['browser.items'] = info -
trac/util.py
3 3 # Copyright (C) 2003-2006 Edgewall Software 4 4 # Copyright (C) 2003-2004 Jonas Borgstr�jonas@edgewall.com> 5 5 # Copyright (C) 2005-2006 Christian Boos <cboos@neuf.fr> 6 # Copyright (C) 2006 Matthew Good <trac@matt-good.net> 6 7 # All rights reserved. 7 8 # 8 9 # This software is licensed as described in the file COPYING, which … … 14 15 # history and logs, available at http://projects.edgewall.com/trac/. 15 16 # 16 17 # Author: Jonas Borgstr�jonas@edgewall.com> 18 # Matthew Good <trac@matt-good.net> 17 19 18 20 import cgi 19 21 import md5 … … 261 263 shortline = text[:i]+' ...' 262 264 return shortline 263 265 264 DIGITS = re.compile(r'[0-9]+') 265 def natural_order(x, y): 266 267 try: 268 sorted = sorted 269 except NameError: 270 def sorted(iterable, key): 271 """Partial implementation of the "sorted" function from Python 2.4""" 272 lst = [(key(i), i) for i in iterable] 273 lst.sort() 274 return [i for __, i in lst] 275 276 DIGITS = re.compile(r'(\d+)') 277 def embedded_numbers(s): 266 278 """Comparison function for natural order sorting based on 267 279 http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/214202.""" 268 nx = ny = 0 269 while True: 270 a = DIGITS.search(x, nx) 271 b = DIGITS.search(y, ny) 272 if None in (a, b): 273 return cmp(x[nx:], y[ny:]) 274 r = (cmp(x[nx:a.start()], y[ny:b.start()]) or 275 cmp(int(x[a.start():a.end()]), int(y[b.start():b.end()]))) 276 if r: 277 return r 278 nx, ny = a.end(), b.end() 280 pieces = DIGITS.split(s) 281 pieces[1::2] = map(int, pieces[1::2]) 282 return pieces 279 283 280 284 def hex_entropy(bytes=32): 281 285 import md5
