# # # patch "tracvc/mtn/automate.py" # from [ff90f76807e316befda3c69019d7a17820d738d0] # to [f1c452df7e687d3abbc86b0cba3ec34dd597a92f] # # patch "tracvc/mtn/util.py" # from [c72b93f825a2809e226f99ff1fa8e653a165316d] # to [187516de557db811e1dcb949643d1deec8041671] # ============================================================ --- tracvc/mtn/automate.py ff90f76807e316befda3c69019d7a17820d738d0 +++ tracvc/mtn/automate.py f1c452df7e687d3abbc86b0cba3ec34dd597a92f @@ -318,7 +318,7 @@ class MTN: branches = self.certs(leave)['branch'] for branch in branches: leaves.append((branch, leave)) - leaves.sort(lambda x, y: cmp(x[0], y[0])) + leaves.sort(key=lambda i: i[0]) return leaves def tags(self): @@ -330,7 +330,7 @@ class MTN: entry = basic_io.get_hash_from_stanza(stanza) if 'tag' in entry: tags.append((entry['tag'], entry['revision'])) - tags.sort(lambda x, y: cmp(x[0], y[0])) + tags.sort(key=lambda i: util.natsort_key(i[0])) return tags def content_changed(self, rev, file): ============================================================ --- tracvc/mtn/util.py c72b93f825a2809e226f99ff1fa8e653a165316d +++ tracvc/mtn/util.py 187516de557db811e1dcb949643d1deec8041671 @@ -22,6 +22,9 @@ USA """ +import re + + def add_slash(path): """Prepend a slash. Throughout the this plugin, all paths including the root dir, start with a slash.""" @@ -54,3 +57,21 @@ def get_oldpath(path, renames): return oldpath parent = get_parent(parent) return path + + +def try_int(s): + """Try to convert the string s into an integer. Return that + integer, or return the string if the conversion fails.""" + + try: + return int(s) + except ValueError: + return s + + +NATSORT_BIT = re.compile(r'(\d+|\D+)') + +def natsort_key(s): + """Generate the key for sorting strings naturally.""" + + return [try_int(w) for w in re.findall(NATSORT_BIT, s)]