mercurial/revset.py
changeset 29363 2d18c61173f1
parent 29362 ec75d77df9d7
child 29364 76a1a703e23d
equal deleted inserted replaced
29362:ec75d77df9d7 29363:2d18c61173f1
  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