Fossil SCM

Cycle breaker, API change. Routing the core cycle breaking through a callback so that users can choose their own algorithms. Updated passes 6 and 7. Moven changesets selection in pass 7 to separate command.

aku 2007-11-21 04:05 trunk
Commit 2cf0462b82ba2ecec92877f810562af2b7a8284d
--- tools/cvs2fossil/lib/c2f_cyclebreaker.tcl
+++ tools/cvs2fossil/lib/c2f_cyclebreaker.tcl
@@ -20,10 +20,11 @@
2020
package require snit ; # OO system.
2121
package require struct::graph ; # Graph handling.
2222
package require struct::list ; # Higher order list operations.
2323
package require vc::tools::dot ; # User feedback. DOT export.
2424
package require vc::tools::log ; # User feedback.
25
+package require vc::tools::trouble ; # Error reporting.
2526
package require vc::tools::misc ; # Text formatting.
2627
package require vc::fossil::import::cvs::project::rev ; # Project level changesets
2728
package require vc::fossil::import::cvs::project::revlink ; # Cycle links.
2829
2930
# # ## ### ##### ######## ############# #####################
@@ -35,10 +36,17 @@
3536
3637
typemethod savecmd {cmd} {
3738
::variable mysavecmd $cmd
3839
return
3940
}
41
+
42
+ typemethod breakcmd {cmd} {
43
+ ::variable mybreakcmd $cmd
44
+ return
45
+ }
46
+
47
+ # # ## ### ##### ######## #############
4048
4149
typemethod dotsto {path} {
4250
::variable mydotdestination $path
4351
return
4452
}
@@ -50,10 +58,12 @@
5058
set dg [Setup $changesets 0]
5159
Mark $dg
5260
$dg destroy
5361
return
5462
}
63
+
64
+ # # ## ### ##### ######## #############
5565
5666
typemethod run {label changesets} {
5767
::variable myat 0
5868
::variable mydotprefix $label
5969
::variable mydotid 0
@@ -77,24 +87,34 @@
7787
log write 3 cyclebreaker {Now sorting the changesets, breaking cycles}
7888
7989
InitializeCandidates $dg
8090
while {1} {
8191
while {[WithoutPredecessor $dg n]} {
82
- SaveAndRemove $dg $n
92
+ ProcessedHook $n $myat
93
+ $dg node delete $n
94
+ incr myat
8395
}
96
+
8497
if {![llength [dg nodes]]} break
85
- BreakCycle $dg [FindCycle $dg]
98
+
99
+ BreakCycleHook $dg
86100
InitializeCandidates $dg
87101
}
88102
89103
dg destroy
90104
91105
log write 3 cyclebreaker Done.
92
-
93106
ClearHooks
94107
return
95108
}
109
+
110
+ # # ## ### ##### ######## #############
111
+
112
+ typemethod break {graph} {
113
+ BreakCycle $graph [FindCycle $graph]
114
+ return
115
+ }
96116
97117
# # ## ### ##### ######## #############
98118
## Internal methods
99119
100120
proc Setup {changesets {log 1}} {
@@ -175,18 +195,10 @@
175195
# procedure to save the dependencies as well (encoded in the
176196
# arcs).
177197
return 1
178198
}
179199
180
- proc SaveAndRemove {dg n} {
181
- ::variable myat
182
- ProcessedHook $n $myat
183
- $dg node delete $n
184
- incr myat
185
- return
186
- }
187
-
188200
proc FindCycle {dg} {
189201
# This procedure is run if and only the graph is not empty and
190202
# all nodes have predecessors. This means that each node is
191203
# either part of a cycle or (indirectly) depending on a node
192204
# in a cycle. We can start at an arbitrary node, follow its
@@ -338,13 +350,28 @@
338350
if {![llength $mysavecmd]} return
339351
340352
uplevel #0 [linsert $mysavecmd end $pos $cset]
341353
return
342354
}
355
+
356
+ proc BreakCycleHook {graph} {
357
+ # Call out to the chosen algorithm for cycle breaking. Finding
358
+ # a cycle if no breaker was chosen is an error.
359
+
360
+ ::variable mybreakcmd
361
+ if {![llength $mybreakcmd]} {
362
+ trouble fatal "Found a cycle, expecting none."
363
+ exit 1
364
+ }
365
+
366
+ uplevel #0 [linsert $mybreakcmd end $graph]
367
+ return
368
+ }
343369
344370
proc ClearHooks {} {
345
- ::variable mysavecmd {}
371
+ ::variable mysavecmd {}
372
+ ::variable mybreakcmd {}
346373
return
347374
}
348375
349376
# # ## ### ##### ######## #############
350377
@@ -352,10 +379,11 @@
352379
# changesets.
353380
typevariable mybottom {} ; # List of the candidate nodes for
354381
# committing.
355382
356383
typevariable mysavecmd {} ; # Callback, for each processed node.
384
+ typevariable mybreakcmd {} ; # Callback, for each found cycle.
357385
358386
typevariable mydotdestination {} ; # Destination directory for the
359387
# generated .dot files.
360388
typevariable mydotprefix {} ; # Prefix for dot files when
361389
# exporting the graphs.
@@ -379,10 +407,11 @@
379407
namespace import ::vc::fossil::import::cvs::project::rev
380408
namespace import ::vc::fossil::import::cvs::project::revlink
381409
}
382410
namespace import ::vc::tools::misc::*
383411
namespace import ::vc::tools::log
412
+ namespace import ::vc::tools::trouble
384413
namespace import ::vc::tools::dot
385414
log register cyclebreaker
386415
}
387416
}
388417
389418
--- tools/cvs2fossil/lib/c2f_cyclebreaker.tcl
+++ tools/cvs2fossil/lib/c2f_cyclebreaker.tcl
@@ -20,10 +20,11 @@
20 package require snit ; # OO system.
21 package require struct::graph ; # Graph handling.
22 package require struct::list ; # Higher order list operations.
23 package require vc::tools::dot ; # User feedback. DOT export.
24 package require vc::tools::log ; # User feedback.
 
25 package require vc::tools::misc ; # Text formatting.
26 package require vc::fossil::import::cvs::project::rev ; # Project level changesets
27 package require vc::fossil::import::cvs::project::revlink ; # Cycle links.
28
29 # # ## ### ##### ######## ############# #####################
@@ -35,10 +36,17 @@
35
36 typemethod savecmd {cmd} {
37 ::variable mysavecmd $cmd
38 return
39 }
 
 
 
 
 
 
 
40
41 typemethod dotsto {path} {
42 ::variable mydotdestination $path
43 return
44 }
@@ -50,10 +58,12 @@
50 set dg [Setup $changesets 0]
51 Mark $dg
52 $dg destroy
53 return
54 }
 
 
55
56 typemethod run {label changesets} {
57 ::variable myat 0
58 ::variable mydotprefix $label
59 ::variable mydotid 0
@@ -77,24 +87,34 @@
77 log write 3 cyclebreaker {Now sorting the changesets, breaking cycles}
78
79 InitializeCandidates $dg
80 while {1} {
81 while {[WithoutPredecessor $dg n]} {
82 SaveAndRemove $dg $n
 
 
83 }
 
84 if {![llength [dg nodes]]} break
85 BreakCycle $dg [FindCycle $dg]
 
86 InitializeCandidates $dg
87 }
88
89 dg destroy
90
91 log write 3 cyclebreaker Done.
92
93 ClearHooks
94 return
95 }
 
 
 
 
 
 
 
96
97 # # ## ### ##### ######## #############
98 ## Internal methods
99
100 proc Setup {changesets {log 1}} {
@@ -175,18 +195,10 @@
175 # procedure to save the dependencies as well (encoded in the
176 # arcs).
177 return 1
178 }
179
180 proc SaveAndRemove {dg n} {
181 ::variable myat
182 ProcessedHook $n $myat
183 $dg node delete $n
184 incr myat
185 return
186 }
187
188 proc FindCycle {dg} {
189 # This procedure is run if and only the graph is not empty and
190 # all nodes have predecessors. This means that each node is
191 # either part of a cycle or (indirectly) depending on a node
192 # in a cycle. We can start at an arbitrary node, follow its
@@ -338,13 +350,28 @@
338 if {![llength $mysavecmd]} return
339
340 uplevel #0 [linsert $mysavecmd end $pos $cset]
341 return
342 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
343
344 proc ClearHooks {} {
345 ::variable mysavecmd {}
 
346 return
347 }
348
349 # # ## ### ##### ######## #############
350
@@ -352,10 +379,11 @@
352 # changesets.
353 typevariable mybottom {} ; # List of the candidate nodes for
354 # committing.
355
356 typevariable mysavecmd {} ; # Callback, for each processed node.
 
357
358 typevariable mydotdestination {} ; # Destination directory for the
359 # generated .dot files.
360 typevariable mydotprefix {} ; # Prefix for dot files when
361 # exporting the graphs.
@@ -379,10 +407,11 @@
379 namespace import ::vc::fossil::import::cvs::project::rev
380 namespace import ::vc::fossil::import::cvs::project::revlink
381 }
382 namespace import ::vc::tools::misc::*
383 namespace import ::vc::tools::log
 
384 namespace import ::vc::tools::dot
385 log register cyclebreaker
386 }
387 }
388
389
--- tools/cvs2fossil/lib/c2f_cyclebreaker.tcl
+++ tools/cvs2fossil/lib/c2f_cyclebreaker.tcl
@@ -20,10 +20,11 @@
20 package require snit ; # OO system.
21 package require struct::graph ; # Graph handling.
22 package require struct::list ; # Higher order list operations.
23 package require vc::tools::dot ; # User feedback. DOT export.
24 package require vc::tools::log ; # User feedback.
25 package require vc::tools::trouble ; # Error reporting.
26 package require vc::tools::misc ; # Text formatting.
27 package require vc::fossil::import::cvs::project::rev ; # Project level changesets
28 package require vc::fossil::import::cvs::project::revlink ; # Cycle links.
29
30 # # ## ### ##### ######## ############# #####################
@@ -35,10 +36,17 @@
36
37 typemethod savecmd {cmd} {
38 ::variable mysavecmd $cmd
39 return
40 }
41
42 typemethod breakcmd {cmd} {
43 ::variable mybreakcmd $cmd
44 return
45 }
46
47 # # ## ### ##### ######## #############
48
49 typemethod dotsto {path} {
50 ::variable mydotdestination $path
51 return
52 }
@@ -50,10 +58,12 @@
58 set dg [Setup $changesets 0]
59 Mark $dg
60 $dg destroy
61 return
62 }
63
64 # # ## ### ##### ######## #############
65
66 typemethod run {label changesets} {
67 ::variable myat 0
68 ::variable mydotprefix $label
69 ::variable mydotid 0
@@ -77,24 +87,34 @@
87 log write 3 cyclebreaker {Now sorting the changesets, breaking cycles}
88
89 InitializeCandidates $dg
90 while {1} {
91 while {[WithoutPredecessor $dg n]} {
92 ProcessedHook $n $myat
93 $dg node delete $n
94 incr myat
95 }
96
97 if {![llength [dg nodes]]} break
98
99 BreakCycleHook $dg
100 InitializeCandidates $dg
101 }
102
103 dg destroy
104
105 log write 3 cyclebreaker Done.
 
106 ClearHooks
107 return
108 }
109
110 # # ## ### ##### ######## #############
111
112 typemethod break {graph} {
113 BreakCycle $graph [FindCycle $graph]
114 return
115 }
116
117 # # ## ### ##### ######## #############
118 ## Internal methods
119
120 proc Setup {changesets {log 1}} {
@@ -175,18 +195,10 @@
195 # procedure to save the dependencies as well (encoded in the
196 # arcs).
197 return 1
198 }
199
 
 
 
 
 
 
 
 
200 proc FindCycle {dg} {
201 # This procedure is run if and only the graph is not empty and
202 # all nodes have predecessors. This means that each node is
203 # either part of a cycle or (indirectly) depending on a node
204 # in a cycle. We can start at an arbitrary node, follow its
@@ -338,13 +350,28 @@
350 if {![llength $mysavecmd]} return
351
352 uplevel #0 [linsert $mysavecmd end $pos $cset]
353 return
354 }
355
356 proc BreakCycleHook {graph} {
357 # Call out to the chosen algorithm for cycle breaking. Finding
358 # a cycle if no breaker was chosen is an error.
359
360 ::variable mybreakcmd
361 if {![llength $mybreakcmd]} {
362 trouble fatal "Found a cycle, expecting none."
363 exit 1
364 }
365
366 uplevel #0 [linsert $mybreakcmd end $graph]
367 return
368 }
369
370 proc ClearHooks {} {
371 ::variable mysavecmd {}
372 ::variable mybreakcmd {}
373 return
374 }
375
376 # # ## ### ##### ######## #############
377
@@ -352,10 +379,11 @@
379 # changesets.
380 typevariable mybottom {} ; # List of the candidate nodes for
381 # committing.
382
383 typevariable mysavecmd {} ; # Callback, for each processed node.
384 typevariable mybreakcmd {} ; # Callback, for each found cycle.
385
386 typevariable mydotdestination {} ; # Destination directory for the
387 # generated .dot files.
388 typevariable mydotprefix {} ; # Prefix for dot files when
389 # exporting the graphs.
@@ -379,10 +407,11 @@
407 namespace import ::vc::fossil::import::cvs::project::rev
408 namespace import ::vc::fossil::import::cvs::project::revlink
409 }
410 namespace import ::vc::tools::misc::*
411 namespace import ::vc::tools::log
412 namespace import ::vc::tools::trouble
413 namespace import ::vc::tools::dot
414 log register cyclebreaker
415 }
416 }
417
418
--- tools/cvs2fossil/lib/c2f_pbreakrcycle.tcl
+++ tools/cvs2fossil/lib/c2f_pbreakrcycle.tcl
@@ -75,11 +75,12 @@
7575
# functionality of the pass.
7676
7777
set changesets [Changesets]
7878
cyclebreaker dot break-rev-start $changesets
7979
80
- cyclebreaker savecmd [myproc SaveOrder]
80
+ cyclebreaker savecmd [myproc SaveOrder]
81
+ cyclebreaker breakcmd {::vc::fossil::import::cvs::cyclebreaker break}
8182
8283
state transaction {
8384
cyclebreaker run break-rev $changesets
8485
}
8586
8687
--- tools/cvs2fossil/lib/c2f_pbreakrcycle.tcl
+++ tools/cvs2fossil/lib/c2f_pbreakrcycle.tcl
@@ -75,11 +75,12 @@
75 # functionality of the pass.
76
77 set changesets [Changesets]
78 cyclebreaker dot break-rev-start $changesets
79
80 cyclebreaker savecmd [myproc SaveOrder]
 
81
82 state transaction {
83 cyclebreaker run break-rev $changesets
84 }
85
86
--- tools/cvs2fossil/lib/c2f_pbreakrcycle.tcl
+++ tools/cvs2fossil/lib/c2f_pbreakrcycle.tcl
@@ -75,11 +75,12 @@
75 # functionality of the pass.
76
77 set changesets [Changesets]
78 cyclebreaker dot break-rev-start $changesets
79
80 cyclebreaker savecmd [myproc SaveOrder]
81 cyclebreaker breakcmd {::vc::fossil::import::cvs::cyclebreaker break}
82
83 state transaction {
84 cyclebreaker run break-rev $changesets
85 }
86
87
--- tools/cvs2fossil/lib/c2f_pbreakscycle.tcl
+++ tools/cvs2fossil/lib/c2f_pbreakscycle.tcl
@@ -60,19 +60,20 @@
6060
6161
typemethod run {} {
6262
# Pass manager interface. Executed to perform the
6363
# functionality of the pass.
6464
65
- set changesets [struct::list filter [project::rev all] [myproc IsBySymbol]]
65
+ set changesets [Changesets]
6666
cyclebreaker dot break-sym-start $changesets
67
+
68
+ cyclebreaker breakcmd {::vc::fossil::import::cvs::cyclebreaker break}
6769
6870
state transaction {
6971
cyclebreaker run break-sym $changesets
7072
}
7173
72
- set changesets [struct::list filter [project::rev all] [myproc IsBySymbol]]
73
- cyclebreaker dot break-sym-done $changesets
74
+ cyclebreaker dot break-sym-done [Changesets]
7475
7576
repository printcsetstatistics
7677
return
7778
}
7879
@@ -83,10 +84,14 @@
8384
return
8485
}
8586
8687
# # ## ### ##### ######## #############
8788
## Internal methods
89
+
90
+ proc Changesets {} {
91
+ return [struct::list filter [project::rev all] [myproc IsBySymbol]]
92
+ }
8893
8994
proc IsBySymbol {cset} { $cset bysymbol }
9095
9196
# # ## ### ##### ######## #############
9297
## Configuration
9398
--- tools/cvs2fossil/lib/c2f_pbreakscycle.tcl
+++ tools/cvs2fossil/lib/c2f_pbreakscycle.tcl
@@ -60,19 +60,20 @@
60
61 typemethod run {} {
62 # Pass manager interface. Executed to perform the
63 # functionality of the pass.
64
65 set changesets [struct::list filter [project::rev all] [myproc IsBySymbol]]
66 cyclebreaker dot break-sym-start $changesets
 
 
67
68 state transaction {
69 cyclebreaker run break-sym $changesets
70 }
71
72 set changesets [struct::list filter [project::rev all] [myproc IsBySymbol]]
73 cyclebreaker dot break-sym-done $changesets
74
75 repository printcsetstatistics
76 return
77 }
78
@@ -83,10 +84,14 @@
83 return
84 }
85
86 # # ## ### ##### ######## #############
87 ## Internal methods
 
 
 
 
88
89 proc IsBySymbol {cset} { $cset bysymbol }
90
91 # # ## ### ##### ######## #############
92 ## Configuration
93
--- tools/cvs2fossil/lib/c2f_pbreakscycle.tcl
+++ tools/cvs2fossil/lib/c2f_pbreakscycle.tcl
@@ -60,19 +60,20 @@
60
61 typemethod run {} {
62 # Pass manager interface. Executed to perform the
63 # functionality of the pass.
64
65 set changesets [Changesets]
66 cyclebreaker dot break-sym-start $changesets
67
68 cyclebreaker breakcmd {::vc::fossil::import::cvs::cyclebreaker break}
69
70 state transaction {
71 cyclebreaker run break-sym $changesets
72 }
73
74 cyclebreaker dot break-sym-done [Changesets]
 
75
76 repository printcsetstatistics
77 return
78 }
79
@@ -83,10 +84,14 @@
84 return
85 }
86
87 # # ## ### ##### ######## #############
88 ## Internal methods
89
90 proc Changesets {} {
91 return [struct::list filter [project::rev all] [myproc IsBySymbol]]
92 }
93
94 proc IsBySymbol {cset} { $cset bysymbol }
95
96 # # ## ### ##### ######## #############
97 ## Configuration
98

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button