@@ -20,10 +20,11 @@
20 20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
package require snit ; # OO system.
21 21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
package require struct::graph ; # Graph handling.
22 22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
package require struct::list ; # Higher order list operations.
23 23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
package require vc::tools::dot ; # User feedback. DOT export.
24 24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
package require vc::tools::log ; # User feedback.
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ package require vc::tools::trouble ; # Error reporting.
25 26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
package require vc::tools::misc ; # Text formatting.
26 27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
package require vc::fossil::import::cvs::project::rev ; # Project level changesets
27 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
package require vc::fossil::import::cvs::project::revlink ; # Cycle links.
28 29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
29 30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# # ## ### ##### ######## ############# #####################
@@ -35,10 +36,17 @@
35 36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
36 37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typemethod savecmd {cmd} {
37 38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
::variable mysavecmd $cmd
38 39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return
39 40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typemethod breakcmd {cmd} {
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ::variable mybreakcmd $cmd
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # # ## ### ##### ######## #############
40 48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
41 49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typemethod dotsto {path} {
42 50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
::variable mydotdestination $path
43 51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return
44 52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -50,10 +58,12 @@
50 58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
set dg [Setup $changesets 0]
51 59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Mark $dg
52 60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
$dg destroy
53 61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return
54 62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # # ## ### ##### ######## #############
55 65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
56 66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typemethod run {label changesets} {
57 67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
::variable myat 0
58 68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
::variable mydotprefix $label
59 69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
::variable mydotid 0
@@ -77,24 +87,34 @@
77 87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
log write 3 cyclebreaker {Now sorting the changesets, breaking cycles}
78 88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
79 89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
InitializeCandidates $dg
80 90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while {1} {
81 91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while {[WithoutPredecessor $dg n]} {
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SaveAndRemove $dg $n
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ProcessedHook $n $myat
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ $dg node delete $n
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ incr myat
83 95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
84 97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if {![llength [dg nodes]]} break
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- BreakCycle $dg [FindCycle $dg]
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ BreakCycleHook $dg
86 100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
InitializeCandidates $dg
87 101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
88 102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
89 103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
dg destroy
90 104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
91 105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
log write 3 cyclebreaker Done.
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
93 106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ClearHooks
94 107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return
95 108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # # ## ### ##### ######## #############
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typemethod break {graph} {
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ BreakCycle $graph [FindCycle $graph]
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
96 116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
97 117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# # ## ### ##### ######## #############
98 118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
## Internal methods
99 119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
100 120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proc Setup {changesets {log 1}} {
@@ -175,18 +195,10 @@
175 195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# procedure to save the dependencies as well (encoded in the
176 196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# arcs).
177 197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 1
178 198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
179 199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- proc SaveAndRemove {dg n} {
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ::variable myat
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ProcessedHook $n $myat
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- $dg node delete $n
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- incr myat
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
188 200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proc FindCycle {dg} {
189 201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# This procedure is run if and only the graph is not empty and
190 202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# all nodes have predecessors. This means that each node is
191 203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# either part of a cycle or (indirectly) depending on a node
192 204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# in a cycle. We can start at an arbitrary node, follow its
@@ -338,13 +350,28 @@
338 350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if {![llength $mysavecmd]} return
339 351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
340 352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
uplevel #0 [linsert $mysavecmd end $pos $cset]
341 353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return
342 354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc BreakCycleHook {graph} {
357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Call out to the chosen algorithm for cycle breaking. Finding
358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # a cycle if no breaker was chosen is an error.
359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ::variable mybreakcmd
361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {![llength $mybreakcmd]} {
362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ trouble fatal "Found a cycle, expecting none."
363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ exit 1
364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ uplevel #0 [linsert $mybreakcmd end $graph]
367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
343 369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
344 370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proc ClearHooks {} {
345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ::variable mysavecmd {}
371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ::variable mysavecmd {}
372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ::variable mybreakcmd {}
346 373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return
347 374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
348 375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
349 376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# # ## ### ##### ######## #############
350 377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -352,10 +379,11 @@
352 379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# changesets.
353 380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typevariable mybottom {} ; # List of the candidate nodes for
354 381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# committing.
355 382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
356 383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typevariable mysavecmd {} ; # Callback, for each processed node.
384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typevariable mybreakcmd {} ; # Callback, for each found cycle.
357 385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
358 386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typevariable mydotdestination {} ; # Destination directory for the
359 387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# generated .dot files.
360 388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typevariable mydotprefix {} ; # Prefix for dot files when
361 389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# exporting the graphs.
@@ -379,10 +407,11 @@
379 407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
namespace import ::vc::fossil::import::cvs::project::rev
380 408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
namespace import ::vc::fossil::import::cvs::project::revlink
381 409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
382 410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
namespace import ::vc::tools::misc::*
383 411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
namespace import ::vc::tools::log
412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ namespace import ::vc::tools::trouble
384 413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
namespace import ::vc::tools::dot
385 414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
log register cyclebreaker
386 415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
387 416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
388 417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
389 418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!