Show More
@@ -92,3 +92,48 b' def scratch(repo, subset, x):' | |||||
92 | heads.add(p2) |
|
92 | heads.add(p2) | |
93 |
|
93 | |||
94 | return smartset.baseset(selected) & subset |
|
94 | return smartset.baseset(selected) & subset | |
|
95 | ||||
|
96 | ||||
|
97 | @revsetpredicate(b'randomantichain(REVS, [seed])') | |||
|
98 | def antichain(repo, subset, x): | |||
|
99 | """Pick a random anti-chain in the repository | |||
|
100 | ||||
|
101 | A antichain is a set of changeset where there isn't any element that is | |||
|
102 | either a descendant or ancestors of any other element in the set. In other | |||
|
103 | word, all the elements are independant. It can be summarized with the | |||
|
104 | following algorithm:: | |||
|
105 | ||||
|
106 | selected = set() | |||
|
107 | unselected = repo.revs('all()') | |||
|
108 | while unselected: | |||
|
109 | pick = random.choice(unselected) | |||
|
110 | selected.add(pick) | |||
|
111 | unselected -= repo.revs('::<pick> + <pick>::') | |||
|
112 | """ | |||
|
113 | ||||
|
114 | args = revsetlang.getargs( | |||
|
115 | x, 1, 2, _(b"randomantichain expects revisions and an optional seed") | |||
|
116 | ) | |||
|
117 | if len(args) == 1: | |||
|
118 | (x,) = args | |||
|
119 | rand = random | |||
|
120 | elif len(args) == 2: | |||
|
121 | x, seed = args | |||
|
122 | seed = revsetlang.getinteger(seed, _(b"seed should be a number")) | |||
|
123 | rand = random.Random(seed) | |||
|
124 | else: | |||
|
125 | assert False | |||
|
126 | ||||
|
127 | selected = set() | |||
|
128 | ||||
|
129 | baseset = revset.getset(repo, smartset.fullreposet(repo), x) | |||
|
130 | undecided = baseset | |||
|
131 | ||||
|
132 | while undecided: | |||
|
133 | pick = rand.choice(list(undecided)) | |||
|
134 | selected.add(pick) | |||
|
135 | undecided = repo.revs( | |||
|
136 | '%ld and not (::%ld or %ld::head())', baseset, selected, selected | |||
|
137 | ) | |||
|
138 | ||||
|
139 | return smartset.baseset(selected) & subset |
General Comments 0
You need to be logged in to leave comments.
Login now