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 |
|
|
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