1869 keys = "rev" |
1869 keys = "rev" |
1870 if 'keys' in args: |
1870 if 'keys' in args: |
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 |
1889 raise error.ParseError(_( |
1898 raise error.ParseError(_( |
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 |
1903 return revs |
1895 if keys == ["rev"]: |
1904 if len(keyflags) == 1 and keyflags[0][0] == "rev": |
1896 revs.sort() |
1905 revs.sort(reverse=keyflags[0][1]) |
1897 return revs |
1906 return revs |
1898 elif keys == ["-rev"]: |
1907 elif keyflags[0][0] == "topo": |
1899 revs.sort(reverse=True) |
|
1900 return revs |
|
1901 elif keys[0] in ("topo", "-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=()): |
1922 """Yield revisions from heads to roots one (topo) branch at a time. |
1921 """Yield revisions from heads to roots one (topo) branch at a time. |
1923 |
1922 |