##// END OF EJS Templates
revset: build list of (key, reverse) pairs before sorting...
Yuya Nishihara -
r29363:2d18c611 default
parent child Browse files
Show More
@@ -1871,18 +1871,27 b' def sort(repo, subset, x):'
1871 # i18n: "sort" is a keyword
1871 # i18n: "sort" is a keyword
1872 keys = getstring(args['keys'], _("sort spec must be a string"))
1872 keys = getstring(args['keys'], _("sort spec must be a string"))
1873
1873
1874 keyflags = []
1875 for k in keys.split():
1876 fk = k
1877 reverse = (k[0] == '-')
1878 if reverse:
1879 k = k[1:]
1880 if k not in _sortkeyfuncs and k != 'topo':
1881 raise error.ParseError(_("unknown sort key %r") % fk)
1882 keyflags.append((k, reverse))
1883
1874 s = args['set']
1884 s = args['set']
1875 keys = keys.split()
1876 revs = getset(repo, subset, s)
1885 revs = getset(repo, subset, s)
1877
1886
1878 if len(keys) > 1 and any(k.lstrip('-') == 'topo' for k in keys):
1887 if len(keyflags) > 1 and any(k == 'topo' for k, reverse in keyflags):
1879 # i18n: "topo" is a keyword
1888 # i18n: "topo" is a keyword
1880 raise error.ParseError(_(
1889 raise error.ParseError(_(
1881 'topo sort order cannot be combined with other sort keys'))
1890 'topo sort order cannot be combined with other sort keys'))
1882
1891
1883 firstbranch = ()
1892 firstbranch = ()
1884 if 'topo.firstbranch' in args:
1893 if 'topo.firstbranch' in args:
1885 if any(k.lstrip('-') == 'topo' for k in keys):
1894 if any(k == 'topo' for k, reverse in keyflags):
1886 firstbranch = getset(repo, subset, args['topo.firstbranch'])
1895 firstbranch = getset(repo, subset, args['topo.firstbranch'])
1887 else:
1896 else:
1888 # i18n: "topo" and "topo.firstbranch" are keywords
1897 # i18n: "topo" and "topo.firstbranch" are keywords
@@ -1890,32 +1899,22 b' def sort(repo, subset, x):'
1890 'topo.firstbranch can only be used when using the topo sort '
1899 'topo.firstbranch can only be used when using the topo sort '
1891 'key'))
1900 'key'))
1892
1901
1893 if not keys:
1902 if not keyflags:
1894 return revs
1895 if keys == ["rev"]:
1896 revs.sort()
1897 return revs
1903 return revs
1898 elif keys == ["-rev"]:
1904 if len(keyflags) == 1 and keyflags[0][0] == "rev":
1899 revs.sort(reverse=True)
1905 revs.sort(reverse=keyflags[0][1])
1900 return revs
1906 return revs
1901 elif keys[0] in ("topo", "-topo"):
1907 elif keyflags[0][0] == "topo":
1902 revs = baseset(_toposort(revs, repo.changelog.parentrevs, firstbranch),
1908 revs = baseset(_toposort(revs, repo.changelog.parentrevs, firstbranch),
1903 istopo=True)
1909 istopo=True)
1904 if keys[0][0] == '-':
1910 if keyflags[0][1]:
1905 revs.reverse()
1911 revs.reverse()
1906 return revs
1912 return revs
1907
1913
1908 # sort() is guaranteed to be stable
1914 # sort() is guaranteed to be stable
1909 ctxs = [repo[r] for r in revs]
1915 ctxs = [repo[r] for r in revs]
1910 for k in reversed(keys):
1916 for k, reverse in reversed(keyflags):
1911 fk = k
1917 ctxs.sort(key=_sortkeyfuncs[k], reverse=reverse)
1912 reverse = (k[0] == '-')
1913 if reverse:
1914 k = k[1:]
1915 try:
1916 ctxs.sort(key=_sortkeyfuncs[k], reverse=reverse)
1917 except KeyError:
1918 raise error.ParseError(_("unknown sort key %r") % fk)
1919 return baseset([c.rev() for c in ctxs])
1918 return baseset([c.rev() for c in ctxs])
1920
1919
1921 def _toposort(revs, parentsfunc, firstbranch=()):
1920 def _toposort(revs, parentsfunc, firstbranch=()):
General Comments 0
You need to be logged in to leave comments. Login now