##// END OF EJS Templates
revset: add new topographical sort...
Martijn Pieters -
r29348:2188f170 default
parent child Browse files
Show More
@@ -52,16 +52,6 b' def dagwalker(repo, revs):'
52 52
53 53 gpcache = {}
54 54
55 if repo.ui.configbool('experimental', 'graph-group-branches', False):
56 firstbranch = ()
57 firstbranchrevset = repo.ui.config(
58 'experimental', 'graph-group-branches.firstbranch', '')
59 if firstbranchrevset:
60 firstbranch = repo.revs(firstbranchrevset)
61 parentrevs = repo.changelog.parentrevs
62 revs = revset.groupbranchiter(revs, parentrevs, firstbranch)
63 revs = revset.baseset(revs)
64
65 55 for rev in revs:
66 56 ctx = repo[rev]
67 57 # partition into parents in the rev set and missing parents, then
@@ -1843,7 +1843,7 b' def roots(repo, subset, x):'
1843 1843 'date': lambda c: c.date()[0],
1844 1844 }
1845 1845
1846 @predicate('sort(set[, [-]key...])', safe=True)
1846 @predicate('sort(set[, [-]key... [, ...]])', safe=True)
1847 1847 def sort(repo, subset, x):
1848 1848 """Sort set by keys. The default sort order is ascending, specify a key
1849 1849 as ``-key`` to sort in descending order.
@@ -1855,8 +1855,14 b' def sort(repo, subset, x):'
1855 1855 - ``desc`` for the commit message (description),
1856 1856 - ``user`` for user name (``author`` can be used as an alias),
1857 1857 - ``date`` for the commit date
1858 - ``topo`` for a reverse topographical sort
1859
1860 The ``topo`` sort order cannot be combined with other sort keys. This sort
1861 takes one optional argument, ``topo.firstbranch``, which takes a revset that
1862 specifies what topographical branches to prioritize in the sort.
1863
1858 1864 """
1859 args = getargsdict(x, 'sort', 'set keys')
1865 args = getargsdict(x, 'sort', 'set keys topo.firstbranch')
1860 1866 if 'set' not in args:
1861 1867 # i18n: "sort" is a keyword
1862 1868 raise error.ParseError(_('sort requires one or two arguments'))
@@ -1868,12 +1874,35 b' def sort(repo, subset, x):'
1868 1874 s = args['set']
1869 1875 keys = keys.split()
1870 1876 revs = getset(repo, subset, s)
1877
1878 if len(keys) > 1 and any(k.lstrip('-') == 'topo' for k in keys):
1879 # i18n: "topo" is a keyword
1880 raise error.ParseError(_(
1881 'topo sort order cannot be combined with other sort keys'))
1882
1883 firstbranch = ()
1884 if 'topo.firstbranch' in args:
1885 if any(k.lstrip('-') == 'topo' for k in keys):
1886 firstbranch = getset(repo, subset, args['topo.firstbranch'])
1887 else:
1888 # i18n: "topo" and "topo.firstbranch" are keywords
1889 raise error.ParseError(_(
1890 'topo.firstbranch can only be used when using the topo sort '
1891 'key'))
1892
1871 1893 if keys == ["rev"]:
1872 1894 revs.sort()
1873 1895 return revs
1874 1896 elif keys == ["-rev"]:
1875 1897 revs.sort(reverse=True)
1876 1898 return revs
1899 elif keys[0] in ("topo", "-topo"):
1900 revs = baseset(_toposort(revs, repo.changelog.parentrevs, firstbranch),
1901 istopo=True)
1902 if keys[0][0] == '-':
1903 revs.reverse()
1904 return revs
1905
1877 1906 # sort() is guaranteed to be stable
1878 1907 ctxs = [repo[r] for r in revs]
1879 1908 for k in reversed(keys):
@@ -1887,7 +1916,7 b' def sort(repo, subset, x):'
1887 1916 raise error.ParseError(_("unknown sort key %r") % fk)
1888 1917 return baseset([c.rev() for c in ctxs])
1889 1918
1890 def groupbranchiter(revs, parentsfunc, firstbranch=()):
1919 def _toposort(revs, parentsfunc, firstbranch=()):
1891 1920 """Yield revisions from heads to roots one (topo) branch at a time.
1892 1921
1893 1922 This function aims to be used by a graph generator that wishes to minimize
@@ -40,7 +40,7 b' later.'
40 40
41 41 (display all nodes)
42 42
43 $ hg --config experimental.graph-group-branches=1 log -G
43 $ hg log -G -r 'sort(all(), topo)'
44 44 o 8
45 45 |
46 46 o 3
@@ -62,7 +62,7 b' later.'
62 62
63 63 (revset skipping nodes)
64 64
65 $ hg --config experimental.graph-group-branches=1 log -G --rev 'not (2+6)'
65 $ hg log -G --rev 'sort(not (2+6), topo)'
66 66 o 8
67 67 |
68 68 o 3
@@ -80,7 +80,7 b' later.'
80 80
81 81 (begin) from the other branch
82 82
83 $ hg --config experimental.graph-group-branches=1 --config experimental.graph-group-branches.firstbranch=5 log -G
83 $ hg log -G -r 'sort(all(), topo, topo.firstbranch=5)'
84 84 o 7
85 85 |
86 86 o 6
@@ -1106,6 +1106,67 b' test sorting by multiple keys including '
1106 1106 0 b12 m111 u112 111 10800
1107 1107 2 b111 m11 u12 111 3600
1108 1108
1109 toposort prioritises graph branches
1110
1111 $ hg up 2
1112 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1113 $ touch a
1114 $ hg addremove
1115 adding a
1116 $ hg ci -m 't1' -u 'tu' -d '130 0'
1117 created new head
1118 $ echo 'a' >> a
1119 $ hg ci -m 't2' -u 'tu' -d '130 0'
1120 $ hg book book1
1121 $ hg up 4
1122 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1123 (leaving bookmark book1)
1124 $ touch a
1125 $ hg addremove
1126 adding a
1127 $ hg ci -m 't3' -u 'tu' -d '130 0'
1128
1129 $ hg log -r 'sort(all(), topo)'
1130 7 b111 t3 tu 130 0
1131 4 b111 m112 u111 110 14400
1132 3 b112 m111 u11 120 0
1133 6 b111 t2 tu 130 0
1134 5 b111 t1 tu 130 0
1135 2 b111 m11 u12 111 3600
1136 1 b11 m12 u111 112 7200
1137 0 b12 m111 u112 111 10800
1138
1139 $ hg log -r 'sort(all(), -topo)'
1140 0 b12 m111 u112 111 10800
1141 1 b11 m12 u111 112 7200
1142 2 b111 m11 u12 111 3600
1143 5 b111 t1 tu 130 0
1144 6 b111 t2 tu 130 0
1145 3 b112 m111 u11 120 0
1146 4 b111 m112 u111 110 14400
1147 7 b111 t3 tu 130 0
1148
1149 $ hg log -r 'sort(all(), topo, topo.firstbranch=book1)'
1150 6 b111 t2 tu 130 0
1151 5 b111 t1 tu 130 0
1152 7 b111 t3 tu 130 0
1153 4 b111 m112 u111 110 14400
1154 3 b112 m111 u11 120 0
1155 2 b111 m11 u12 111 3600
1156 1 b11 m12 u111 112 7200
1157 0 b12 m111 u112 111 10800
1158
1159 topographical sorting can't be combined with other sort keys, and you can't
1160 use the topo.firstbranch option when topo sort is not active:
1161
1162 $ hg log -r 'sort(all(), "topo user")'
1163 hg: parse error: topo sort order cannot be combined with other sort keys
1164 [255]
1165
1166 $ hg log -r 'sort(all(), user, topo.firstbranch=book1)'
1167 hg: parse error: topo.firstbranch can only be used when using the topo sort key
1168 [255]
1169
1109 1170 $ cd ..
1110 1171 $ cd repo
1111 1172
General Comments 0
You need to be logged in to leave comments. Login now