@@ -107,16 +107,21 @@
107 107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
108 108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proc LoadCommitOrder {} {
109 109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
::variable mycset
110 110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
::variable myrevisionchangesets
111 111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log write 2 breakacycle {Loading revision commit order}
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set n 0
112 115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
state transaction {
113 116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
foreach {cid pos} [state run { SELECT cid, pos FROM csorder }] {
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log progress 2 breakacycle $n
114 118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
set cset [project::rev of $cid]
115 119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
$cset setpos $pos
116 120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
set mycset($pos) $cset
117 121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lappend myrevisionchangesets $cset
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ incr n
118 123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119 124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120 125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return
121 126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
122 127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -149,35 +154,33 @@
149 154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# overlap. This allows us to split them into two sets, one
150 155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# of non-overlapping branches, and of overlapping
151 156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# ones. Each set induces a new changeset, and the second
152 157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# one may still be backward and in need of further
153 158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# splitting. Hence the looping.
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
155 160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# The border used for the split is the minimal commit
156 161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# position among the minimal sucessor commit positions for
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # the branches in the changeset.
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Note that individual branches may not have changesets
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # which are their predecessors and/or successors, leaving
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # the limits partially or completely undefined.
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # the branches in the changeset. We sort the file level
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # items based on there they sit relative to the border
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # into before and after the border. As the branches cannot
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # be backward at file level thos before the border cannot
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # generate a backward symbol changeset, however the
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # branches after may constitute another backward branch
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # with a new border.
162 169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
163 170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# limits : dict (revision -> list (max predecessor commit, min sucessor commit))
164 171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
165 172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ComputeLimits $cset limits border
166 173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- log write 5 breakacycle "Breaking backward changeset [$cset str] with commit position $border as border"
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Secondly we sort the file level items based on there
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # they sit relative to the border into before and after
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # the border.
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log write 5 breakacycle "Breaking backward changeset [$cset str] using commit position $border as border"
172 175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
173 176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SplitItems $limits $border normalitems backwarditems
174 177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
175 178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
set replacements [project::rev split $cset $normalitems $backwarditems]
176 179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cyclebreaker replace $graph $cset $replacements
177 180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # At last check that the normal frament is indeed not
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # At last we check that the normal frament is indeed not
179 182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# backward, and iterate over the possibly still backward
180 183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# second fragment.
181 184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
182 185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct::list assign $replacements normal backward
183 186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
integrity assert {
@@ -233,84 +236,85 @@
233 236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proc ValidPosition {pos} { expr {$pos ne ""} }
234 237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
235 238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proc ComputeLimits {cset lv bv} {
236 239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
upvar 1 $lv thelimits $bv border
237 240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Initialize the boundaries for all items.
239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- array set limits {}
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- foreach revision [$cset items] {
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set limits($revision) {0 {}}
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Compute and store the maximal predecessors per item (branch)
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- foreach {item csets} [$cset predecessormap] {
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set s [Positions $csets]
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if {![llength $s]} continue
250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set limits($item) [lreplace $limits($item) 0 0 [max $s]]
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Compute and store the minimal successors per item (branch)
254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- foreach {item csets} [$cset successormap] {
256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set s [Positions $csets]
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if {![llength $s]} continue
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set limits($item) [lreplace $limits($item) 1 1 [min $s]]
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Individual branches may not have revision changesets which
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # are their predecessors and/or successors, leaving the limits
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # partially or completely undefined. To overcome this
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # initialize boundaries for all items with proper defaults (-1
245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # for max, {} for min, representing +infinity).
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ array set maxpa {}
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ array set minsa {}
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach item [$cset items] {
250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set maxpa($item) -1
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set minsa($item) {}
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Get the limits from the database, for the items which
255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # actually have such, and merge the information with the
256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # defaults.
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct::list assign [$cset limits] maxpdict minsdict
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ array set maxpa $maxpdict
261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ array set minsa $minsdict
260 262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
261 263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# Check that the ordering at the file level is correct. We
262 264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# cannot have backward ordering per branch, or something is
263 265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# wrong.
264 266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
265 267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
foreach item [array names limits] {
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct::list assign $limits($item) maxp mins
267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Handle min successor position "" as representing infinity
268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set mins $minsa($item)
269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set maxp $maxp($item)
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Note that for the min successor position "" represents
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # +infinity
268 272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
integrity assert {
269 273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
($mins eq "") || ($maxp < $mins)
270 274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} {Item <$item> is backward at file level ($maxp >= $mins)}
271 275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
272 276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
273 277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# Save the limits for the splitter, and compute the border at
274 278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# which to split as the minimum of all minimal successor
275 279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# positions.
276 280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set thelimits [array get limits]
278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set border [min [struct::list filter [struct::list map [Values $thelimits] \
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- [myproc MinSuccessorPosition]] \
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- [myproc ValidPosition]]]
281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Compute the border at which to split as the minimum of all
282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # minimal successor positions. By using the database info we
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # automatically/implicitly filter out anything without a min
284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # successor. Further the data going into the comparison with
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # the border is put together.
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set border [min [Values $minsdict]]
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set thelimits [array get maxpa]
281 289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return
282 290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
283 291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
284 292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proc Values {dict} {
285 293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
set res {}
286 294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
foreach {k v} $dict { lappend res $v }
287 295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return $res
288 296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
289 297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- proc MinSuccessorPosition {item} { lindex $item 1 }
291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
292 298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proc SplitItems {limits border nv bv} {
293 299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
upvar 1 $nv normalitems $bv backwarditems
294 300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
295 301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
set normalitems {}
296 302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
set backwarditems {}
297 303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- foreach {rev v} $limits {
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct::list assign $v maxp mins
304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach {item maxp} $limits {
300 305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if {$maxp >= $border} {
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- lappend backwarditems $rev
306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lappend backwarditems $item
302 307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} else {
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- lappend normalitems $rev
308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lappend normalitems $item
304 309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
305 310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
306 311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
307 312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
integrity assert {[llength $normalitems]} {Set of normal items is empty}
308 313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
integrity assert {[llength $backwarditems]} {Set of backward items is empty}
309 314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return
310 315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
312 316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
313 317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# # ## ### ##### ######## #############
314 318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
315 319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proc KeepOrder {graph at cset} {
316 320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
::variable myatfmt
317 321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!