@@ -10,23 +10,23 @@
10 10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# history and logs, available at http://fossil-scm.hwaci.com/fossil
11 11 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# # ## ### ##### ######## ############# #####################
12 12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
13 13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
## Pass VI. This pass goes over the set of revision based changesets
14 14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
## and breaks all dependency cycles they may be in. We need a
15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ## dependency tree.
15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## dependency tree. Identical to pass VII, except for the selection of
16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## the changesets.
16 17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
17 18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# # ## ### ##### ######## ############# #####################
18 19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
## Requirements
19 20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
20 21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
package require Tcl 8.4 ; # Required runtime.
21 22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
package require snit ; # OO system.
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- package require struct::graph ; # Graph handling.
23 23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
package require struct::list ; # Higher order list operations.
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::fossil::import::cvs::cyclebreaker ; # Breaking dependency cycles.
25 26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
package require vc::fossil::import::cvs::state ; # State storage.
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 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- package require vc::fossil::import::cvs::project::revlink ; # Cycle links.
28 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
29 29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# # ## ### ##### ######## ############# #####################
30 30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
## Register the pass with the management
31 31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
32 32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
vc::fossil::import::cvs::pass define \
@@ -50,18 +50,20 @@
50 50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cid INTEGER NOT NULL REFERENCES changeset,
51 51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pos INTEGER NOT NULL,
52 52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNIQUE (cid),
53 53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNIQUE (pos)
54 54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
56 55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return
57 56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
58 57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
59 58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typemethod load {} {
60 59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# Pass manager interface. Executed to load data computed by
61 60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# this pass into memory when this pass is skipped instead of
62 61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# executed.
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ state reading changeset
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ project::rev loadcounter
63 65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return
64 66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
65 67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
66 68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typemethod run {} {
67 69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# Pass manager interface. Executed to perform the
@@ -69,68 +71,15 @@
69 71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
70 72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
state reading revision
71 73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
state reading changeset
72 74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
state reading csrevision
73 75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # We create a graph of the revision changesets, using the file
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # level dependencies to construct a first approximation of
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # them at the project level. Then look for cycles in that
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # graph and break them.
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # 1. Create nodes for all relevant changesets and a mapping
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # from the revisions to their changesets/nodes.
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- log write 3 breakrcycle {Creating changeset graph, filling with nodes}
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set dg [struct::graph dg]
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- state transaction {
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- foreach cset [project::rev all] {
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if {[$cset bysymbol]} continue
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- dg node insert $cset
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- dg node set $cset timerange [$cset timerange]
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # 2. Find for all relevant changeset their revisions and their
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # dependencies. Map the latter back to changesets and
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # construct the corresponding arcs.
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- log write 3 breakrcycle {Setting up node dependencies}
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- state transaction {
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- foreach cset [project::rev all] {
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if {[$cset bysymbol]} continue
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- foreach succ [$cset successors] {
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Changesets may have dependencies outside of the
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # chosen set. These are ignored
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if {![dg node exists $succ]} continue
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- dg arc insert $cset $succ
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!
- # 3. Lastly we iterate the graph topologically. We mark off
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # the nodes which have no predecessors, in order from
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # oldest to youngest, saving and removing dependencies. If
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # we find no nodes without predecessors we have a cycle,
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # and work on breaking it.
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- log write 3 breakrcycle {Computing changeset order, breaking cycles}
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- InitializeCandidates $dg
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- state transaction {
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while {1} {
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while {[WithoutPredecessor $dg n]} {
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SaveAndRemove $dg $n
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if {![llength [dg nodes]]} break
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- BreakCycle $dg [FindCycle $dg]
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- InitializeCandidates $dg
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ state transaction {
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cyclebreaker run [struct::list filter [project::rev all] \
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [myproc IsByRevision]] \
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [myproc SaveOrder]
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
132 81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return
133 82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
134 83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
135 84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typemethod discard {} {
136 85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# Pass manager interface. Executed for all passes after the
@@ -142,172 +91,23 @@
142 91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
143 92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
144 93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# # ## ### ##### ######## #############
145 94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
## Internal methods
146 95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Instead of searching the whole graph for the degree-0 nodes in
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # each iteration we compute the list once to start, and then only
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # update it incrementally based on the outgoing neighbours of the
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # node chosen for commit.
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- proc InitializeCandidates {dg} {
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # bottom = list (list (node, range min, range max))
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ::variable bottom
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- foreach n [$dg nodes] {
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if {[$dg node degree -in $n]} continue
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- lappend bottom [linsert [$dg node get $n timerange] 0 $n]
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set bottom [lsort -index 1 -integer [lsort -index 2 -integer $bottom]]
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- proc WithoutPredecessor {dg nv} {
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ::variable bottom
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- upvar 1 $nv n
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if {![llength $bottom]} { return 0 }
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set n [lindex [lindex $bottom 0] 0]
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set bottom [lrange $bottom 1 end]
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set changed 0
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Update list of nodes without predecessor, based on the
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # outgoing neighbours of the chosen node. This should be
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # faster than iterating of the whole set of nodes, finding all
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # without predecessors, sorting them by time, etc. pp.
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- foreach out [$dg nodes -out $n] {
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if {[$dg node degree -in $out] > 1} continue
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Degree-1 neighbour, will have no predecessors after the
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # removal of n. Put on the list.
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- lappend bottom [linsert [$dg node get $out timerange] 0 $out]
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set changed 1
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if {$changed} {
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set bottom [lsort -index 1 -integer [lsort -index 2 -integer $bottom]]
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 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # We do not delete the node immediately, to allow the Save
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # procedure to save the dependencies as well (encoded in the
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # arcs).
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return 1
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- proc SaveAndRemove {dg n} {
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ::variable at
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set cid [$n id]
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc IsByRevision {cset} { $cset byrevision }
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc SaveOrder {at cset} {
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set cid [$cset id]
197 100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
198 101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
log write 4 breakrcycle "Comitting @ $at: <$cid>"
199 102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
state run {
200 103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
INSERT INTO csorder (cid, pos)
201 104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
VALUES ($cid, $at)
202 105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
203 106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# TODO: Write the project level changeset dependencies as well.
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- incr at
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- $dg node delete $n
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- proc FindCycle {dg} {
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # This procedure is run if and only the graph is not empty and
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # all nodes have predecessors. This means that each node is
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # either part of a cycle or (indirectly) depending on a node
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # in a cycle. We can start at an arbitrary node, follow its
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # incoming edges to its predecessors until we see a node a
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # second time. That node closes the cycle and the beginning is
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # its first occurence. Note that we can choose an arbitrary
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # predecessor of each node as well, we do not have to search.
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # We record for each node the index of the first appearance in
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # the path, making it easy at the end to cut the cycle from
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # it.
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Choose arbitrary node to start our search at.
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set start [lindex [$dg nodes] 0]
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Initialize state, path of seen nodes, and when seen.
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set path {}
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- array set seen {}
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while {1} {
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Stop searching when we have seen the current node
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # already, the circle has been closed.
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if {[info exists seen($start)]} break
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- lappend path $start
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set seen($start) [expr {[llength $path]-1}]
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Choose arbitrary predecessor
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set start [lindex [$dg nodes -in $start] 0]
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return [struct::list reverse [lrange $path $seen($start) end]]
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- proc ID {cset} { return "<[$cset id]>" }
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- proc BreakCycle {dg cycle} {
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # The cycle we have gotten is broken by breaking apart one or
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # more of the changesets in the cycle. This causes us to
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # create one or more changesets which are to be committed,
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # added to the graph, etc. pp.
250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set cprint [join [struct::list map $cycle [myproc ID]] { }]
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- lappend cycle [lindex $cycle 0] [lindex $cycle 1]
254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set bestlink {}
255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set bestnode {}
256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- foreach \
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- prev [lrange $cycle 0 end-2] \
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cset [lrange $cycle 1 end-1] \
260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- next [lrange $cycle 2 end] {
261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Each triple PREV -> CSET -> NEXT of changesets, a
263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # 'link' in the cycle, is analysed and the best
264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # location where to at least weaken the cycle is
265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # chosen for further processing.
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set link [project::revlink %AUTO% $prev $cset $next]
268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if {$bestlink eq ""} {
269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set bestlink $link
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set bestnode $cset
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- } elseif {[$link betterthan $bestlink]} {
272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- $bestlink destroy
273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set bestlink $link
274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set bestnode $cset
275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- } else {
276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- $link destroy
277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- log write 5 breakrcycle "Breaking cycle ($cprint) by splitting changeset <[$bestnode id]>"
281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set newcsets [$bestlink break]
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- $bestlink destroy
284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # At this point the old changeset (BESTNODE) is gone
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # already. We remove it from the graph as well and then enter
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # the fragments generated for it.
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- $dg node delete $bestnode
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- foreach cset $newcsets {
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- $dg node insert $cset
293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- $dg node set $cset timerange [$cset timerange]
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- foreach cset $newcsets {
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- foreach succ [$cset successors] {
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Changesets may have dependencies outside of the
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # chosen set. These are ignored
300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if {![dg node exists $succ]} continue
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- $dg arc insert $cset $succ
302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return
305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- typevariable at 0 ; # Counter for commit ids for the changesets.
308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- typevariable bottom {} ; # List of candidate nodes for committing.
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
309 109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
310 110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# # ## ### ##### ######## #############
311 111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
## Configuration
312 112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
313 113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pragma -hasinstances no ; # singleton
@@ -318,14 +118,14 @@
318 118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
319 119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
320 120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
namespace eval ::vc::fossil::import::cvs::pass {
321 121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
namespace export breakrcycle
322 122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
namespace eval breakrcycle {
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ namespace import ::vc::fossil::import::cvs::cyclebreaker
323 124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
namespace import ::vc::fossil::import::cvs::state
324 125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
namespace eval project {
325 126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
namespace import ::vc::fossil::import::cvs::project::rev
326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- namespace import ::vc::fossil::import::cvs::project::revlink
327 127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
328 128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
namespace import ::vc::tools::log
329 129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
log register breakrcycle
330 130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
331 131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
332 132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!