Edgewall Software

Ticket #1038: milestone_sort_dsu.2.diff

File milestone_sort_dsu.2.diff, 3.8 KB (added by cboos, 3 years ago)

Updated mgood's patch so that it applies on top of r2758

  • trac/ticket/model.py

     
    2222 
    2323from trac.core import TracError 
    2424from trac.ticket import TicketSystem 
    25 from trac.util import natural_order 
     25from trac.util import sorted, embedded_numbers 
    2626 
    2727__all__ = ['Ticket', 'Type', 'Status', 'Resolution', 'Priority', 'Severity', 
    2828           'Component', 'Milestone', 'Version'] 
     
    628628            milestone.completed = completed and int(completed) or 0 
    629629            milestone.description = description or '' 
    630630            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                                        
    638637    select = classmethod(select) 
    639638 
    640639 
  • trac/versioncontrol/web_ui/browser.py

     
    142142            elif order == 'size': 
    143143                return neg * cmp(a['content_length'], b['content_length']) 
    144144            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())) 
    147147        info.sort(cmp_func) 
    148148 
    149149        req.hdf['browser.items'] = info 
  • trac/util.py

     
    33# Copyright (C) 2003-2006 Edgewall Software 
    44# Copyright (C) 2003-2004 Jonas Borgstr�jonas@edgewall.com> 
    55# Copyright (C) 2005-2006 Christian Boos <cboos@neuf.fr> 
     6# Copyright (C) 2006 Matthew Good <trac@matt-good.net> 
    67# All rights reserved. 
    78# 
    89# This software is licensed as described in the file COPYING, which 
     
    1415# history and logs, available at http://projects.edgewall.com/trac/. 
    1516# 
    1617# Author: Jonas Borgstr�jonas@edgewall.com> 
     18#         Matthew Good <trac@matt-good.net> 
    1719 
    1820import cgi 
    1921import md5 
     
    261263            shortline = text[:i]+' ...' 
    262264    return shortline 
    263265 
    264 DIGITS = re.compile(r'[0-9]+') 
    265 def natural_order(x, y): 
     266 
     267try: 
     268    sorted = sorted 
     269except 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 
     276DIGITS = re.compile(r'(\d+)') 
     277def embedded_numbers(s): 
    266278    """Comparison function for natural order sorting based on 
    267279    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 
    279283 
    280284def hex_entropy(bytes=32): 
    281285    import md5