@@ -16,10 +16,12 @@
16 16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# # ## ### ##### ######## ############# #####################
17 17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
## Requirements
18 18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
19 19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
package require Tcl 8.4 ; # Required runtime.
20 20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
package require snit ; # OO system.
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ package require vc::tools::misc ; # Text formatting
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ package require vc::tools::trouble ; # Error reporting.
21 23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
package require vc::tools::log ; # User feedback.
22 24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
package require vc::fossil::import::cvs::state ; # State storage.
23 25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24 26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# # ## ### ##### ######## ############# #####################
25 27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
##
@@ -47,158 +49,139 @@
47 49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# such. Otherwise the changeset is split into a set of
48 50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# fragments without internal dependencies, transforming the
49 51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# internal dependencies into external ones. The new changesets
50 52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# are added to the list of all changesets.
51 53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Actually at most one split is performed, resulting in at
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # most one additional fragment. It is the caller's
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # responsibility to spli the resulting fragments further.
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # We perform all necessary splits in one go, instead of only
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # one. The previous algorithm, adapted from cvs2svn, computed
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # a lot of state which was thrown away and then computed again
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # for each of the fragments. It should be easier to update and
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # reuse that state.
55 59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # The code checks only sucessor dependencies, automatically
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # covering the predecessor dependencies as well (A sucessor
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # dependency a -> b is a predecessor dependency b -> a).
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # The code checks only sucessor dependencies, as this
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # automatically covers the predecessor dependencies as well (A
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # successor dependency a -> b is also a predecessor dependency
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # b -> a).
59 64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
60 65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# Array of dependencies (parent -> child). This is pulled from
61 66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# the state, and limited to successors within the changeset.
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
62 68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
array set dependencies {}
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set theset ('[join $myrevisions {','}]')
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- foreach {rid child} [state run "
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SELECT R.rid, R.child
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- FROM revision R
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- WHERE R.rid IN $theset
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- AND R.child IS NOT NULL
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- AND R.child IN $theset
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- UNION
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SELECT R.rid, R.dbchild
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- FROM revision R
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- WHERE R.rid IN $theset
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- AND R.dbchild IS NOT NULL
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- AND R.dbchild IN $theset
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- UNION
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SELECT R.rid, B.brid
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- FROM revision R, revisionbranchchildren B
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- WHERE R.rid IN $theset
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- AND R.rid = B.rid
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- AND B.brid IN $theset
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "] {
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Consider moving this to the integrity module.
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if {$rid == $child} {
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- trouble internal "Revision $rid depends on itself."
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set dependencies($rid) $child
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ PullInternalDependencies dependencies $myrevisions
92 70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if {![array size dependencies]} {return 0} ; # Nothing to break.
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log write 6 csets ...<$myid>.......................................................
93 73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
94 74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# We have internal dependencies to break. We now iterate over
95 75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# all positions in the list (which is chronological, at least
96 76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# as far as the timestamps are correct and unique) and
97 77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# determine the best position for the break, by trying to
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # break as many dependencies as possible in one go.
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # First we create a map of positions to make it easier to
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # determine whether a dependency cross a particular index.
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- array set pos {}
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- array set crossing {}
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set n 0
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- foreach rev $myrevisions {
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set pos($rev) $n
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set crossing($n) 0
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- incr n
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!
- # Secondly we count the crossings per position, by iterating
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # over the recorded internal dependencies.
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- foreach {rid child} [array get dependencies] {
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set start $pos($rid)
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set end $pos($child)
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Note: If the timestamps are badly out of order it is
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # possible to have a backward successor dependency,
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # i.e. with start > end. We may have to swap the
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # indices to ensure that the following loop runs
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # correctly.
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Note 2: start == end is not possible. It indicates a
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # self-dependency due to the uniqueness of
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # positions, and that is something we have ruled
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # out already.
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if {$start > $end} {
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while {$end < $start} { incr crossing($end) ; incr end }
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # break as many dependencies as possible in one go. When a
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # break was found this is redone for the fragments coming and
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # after, after upding the crossing information.
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Data structures:
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Map: POS revision id -> position in list.
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # CROSS position in list -> number of dependencies crossing it
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # DEPC dependency -> positions it crosses
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # List: RANGE Of the positions itself.
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # A dependency is a single-element map parent -> child
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ InitializeBreakState $myrevisions
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set fragments {}
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set pending [list $range]
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set at 0
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ array set breaks {}
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while {$at < [llength $pending]} {
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set current [lindex $pending $at]
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log write 6 csets ". . .. ... ..... ........ ............."
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log write 6 csets "Scheduled [join [PRs [lrange $pending $at end]] { }]"
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log write 6 csets "Considering [PR $current] \[$at/[llength $pending]\]"
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set best [FindBestBreak $current]
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {$best < 0} {
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # The inspected range has no internal
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # dependencies. This is a complete fragment.
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lappend fragments $current
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log write 6 csets "No breaks, final"
132 111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} else {
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while {$start < $end} { incr crossing($start) ; incr start }
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Now we can determine the best break location. First we look
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # for the locations with the maximal number of crossings. If
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # there are several we look for the shortest time interval
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # among them. If we still have multiple possibilities after
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # that we select the smallest index among these.
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set max -1
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set best {}
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- foreach key [array names crossing] {
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set now $crossing($key)
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if {$now > $max} {
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set max $now
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set best $key
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- continue
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- } elseif {$now == $max} {
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- lappend best $key
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if {[llength $best] > 1} {
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set min -1
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set newbest {}
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- foreach at $best {
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set rat [lindex $myrevisions $at] ; incr at
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set rnext [lindex $myrevisions $at] ; incr at -1
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set tat [lindex [state run {SELECT R.date FROM revision R WHERE R.rid = $rat }] 0]
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set tnext [lindex [state run {SELECT R.date FROM revision R WHERE R.rid = $rnext}] 0]
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set delta [expr {$tnext - $tat}]
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if {($min < 0) || ($delta < $min)} {
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set min $delta
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set newbest $at
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- } elseif {$delta == $min} {
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- lappend newbest $at
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set best $newbest
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if {[llength $best] > 1} {
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set best [lindex [lsort -integer -increasing $best] 0]
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Now we can split off a fragment.
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set bnext $best ; incr bnext
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set revbefore [lrange $myrevisions 0 $best]
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set revafter [lrange $myrevisions $bnext end]
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if {![llength $revbefore]} {
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- trouble internal "Tried to split off a zero-length fragment at the beginning"
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if {![llength $revafter]} {
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- trouble internal "Tried to split off a zero-length fragment at the end"
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- lappend csets [set new [$type %AUTO% $myproject $mytype $mysrcid $revafter]]
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set myrevisions $revbefore
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- log write 4 csets "Breaking <$myid> @$best, making <[$new id]>, cutting $crossing($best)"
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #puts "\tKeeping <$revbefore>"
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #puts "\tSplit off <$revafter>"
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Split the range and schedule the resulting fragments
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # for further inspection. Remember the number of
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # dependencies cut before we remove them from
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # consideration, for documentation later.
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set breaks($best) $cross($best)
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log write 6 csets "Best break @ $best, cuts [nsp $cross($best) dependency dependencies]"
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Note: The value of best is an abolute location in
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # myrevisions. Use the start of current to make it an
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # index absolute to current.
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set brel [expr {$best - [lindex $current 0]}]
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set bnext $brel ; incr bnext
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set fragbefore [lrange $current 0 $brel]
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set fragafter [lrange $current $bnext end]
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log write 6 csets "New pieces [PR $fragbefore] [PR $fragafter]"
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {![llength $fragbefore]} {
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ trouble internal "Tried to split off a zero-length fragment at the beginning"
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {![llength $fragafter]} {
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ trouble internal "Tried to split off a zero-length fragment at the end"
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lappend pending $fragbefore $fragafter
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CutAt $best
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ incr at
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log write 6 csets ". . .. ... ..... ........ ............."
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Create changesets for the fragments, reusing the current one
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # for the first fragment. We sort them in order to allow
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # checking for gaps and nice messages.
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set fragments [lsort -index 0 -integer $fragments]
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #puts \t.[join [PRs $fragments] .\n\t.].
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Border [lindex $fragments 0] firsts firste
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {$firsts != 0} {
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ trouble internal "Bad fragment start @ $firsts, gap, or before beginning of the range"
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set laste $firste
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach fragment [lrange $fragments 1 end] {
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Border $fragment s e
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {$laste != ($s - 1)} {
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ trouble internal "Bad fragment border <$laste | $s>, gap or overlap"
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
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 new [$type %AUTO% $myproject $mytype $mysrcid [lrange $myrevisions $s $e]]
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lappend csets $new
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log write 4 csets "Breaking <$myid> @ $laste, new <[$new id]>, cutting $breaks($laste)"
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set laste $e
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {$laste != ([llength $myrevisions]-1)} {
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ trouble internal "Bad fragment end @ $laste, gap, or beyond end of the range"
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Put the first fragment into the current changeset.
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set myrevisions [lrange $myrevisions 0 $firste]
200 183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
201 184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 1
202 185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
203 186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
204 187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
method persist {} {
@@ -242,10 +225,251 @@
242 225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
foreach {tid name} [state run {
243 226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SELECT tid, name FROM cstype;
244 227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}] { set mycstype($name) $tid }
245 228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return
246 229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc PullInternalDependencies {dv revisions} {
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ upvar 1 $dv dependencies
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set theset ('[join $revisions {','}]')
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach {rid child} [state run "
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ -- Primary children
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SELECT R.rid, R.child
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FROM revision R
239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERE R.rid IN $theset
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND R.child IS NOT NULL
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND R.child IN $theset
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ UNION
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ -- Transition NTDB to trunk
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SELECT R.rid, R.dbchild
245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FROM revision R
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERE R.rid IN $theset
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND R.dbchild IS NOT NULL
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND R.dbchild IN $theset
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ UNION
250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ -- Secondary (branch) children
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SELECT R.rid, B.brid
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FROM revision R, revisionbranchchildren B
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERE R.rid IN $theset
254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND R.rid = B.rid
255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND B.brid IN $theset
256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "] {
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Consider moving this to the integrity module.
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {$rid == $child} {
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ trouble internal "Revision $rid depends on itself."
260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set dependencies($rid) $child
262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc InitializeBreakState {revisions} {
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ upvar 1 pos pos cross cross range range depc depc delta delta \
267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dependencies dependencies
268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # First we create a map of positions to make it easier to
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # determine whether a dependency crosses a particular index.
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ array set pos {}
273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ array set cross {}
274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ array set depc {}
275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set range {}
276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set n 0
277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach rev $revisions {
278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lappend range $n
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set pos($rev) $n
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set cross($n) 0
281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ incr n
282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Secondly we count the crossings per position, by iterating
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # over the recorded internal dependencies.
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Note: If the timestamps are badly out of order it is
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # possible to have a backward successor dependency,
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # i.e. with start > end. We may have to swap the indices
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # to ensure that the following loop runs correctly.
291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Note 2: start == end is not possible. It indicates a
293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # self-dependency due to the uniqueness of positions,
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # and that is something we have ruled out already, see
295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # PullInternalDependencies.
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach {rid child} [array get dependencies] {
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set dkey [list $rid $child]
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set start $pos($rid)
300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set end $pos($child)
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set crosses {}
302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {$start > $end} {
304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while {$end < $start} {
305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lappend crosses $end
306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ incr cross($end)
307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ incr end
308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } else {
310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while {$start < $end} {
311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lappend crosses $start
312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ incr cross($start)
313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ incr start
314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set depc($dkey) $crosses
317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ InitializeDeltas $revisions
320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc InitializeDeltas {revisions} {
324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ upvar 1 delta delta
325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Pull the timestamps for all revisions in the changesets and
327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # compute their deltas for use by the break finder.
328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ array set delta {}
330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ array set stamp {}
331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set theset ('[join $revisions {','}]')
333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach {rid time} [state run "
334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SELECT R.rid, R.date
335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FROM revision R
336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERE R.rid IN $theset
337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "] {
338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set stamp($rid) $time
339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set n 0
342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach rid [lrange $revisions 0 end-1] rnext [lrange $revisions 1 end] {
343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set delta($n) [expr {$stamp($rnext) - $stamp($rid)}]
344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ incr n
345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc FindBestBreak {range} {
350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ upvar 1 cross cross delta delta
351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Determine the best break location in the given range of
353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # positions. First we look for the locations with the maximal
354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # number of crossings. If there are several we look for the
355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # shortest time interval among them. If we still have multiple
356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # possibilities after that we select the earliest location
357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # among these.
358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Note: If the maximal number of crossings is 0 then the range
360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # has no internal dependencies, and no break location at
361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # all. This possibility is signaled via result -1.
362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Note: A range of length 1 or less cannot have internal
364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # dependencies, as that needs at least two revisions in
365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # the range.
366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {[llength $range] < 2} { return -1 }
368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set max -1
370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set best {}
371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach location $range {
373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set crossings $cross($location)
374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {$crossings > $max} {
375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set max $crossings
376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set best [list $location]
377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ continue
378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } elseif {$crossings == $max} {
379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lappend best $location
380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {$max == 0} { return -1 }
384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {[llength $best] == 1} { return [lindex $best 0] }
385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set locations $best
387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set best {}
388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set min -1
389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach location $locations {
391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set interval $delta($location)
392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {($min < 0) || ($interval < $min)} {
393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set min $interval
394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set best [list $location]
395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } elseif {$interval == $min} {
396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lappend best $location
397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {[llength $best] == 1} { return [lindex $best 0] }
401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return [lindex [lsort -integer -increasing $best] 0]
403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc CutAt {location} {
406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ upvar 1 cross cross depc depc
407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # It was decided to split the changeset at the given
409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # location. This cuts a number of dependencies. Here we update
410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # the cross information so that the break finder has accurate
411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # data when we look at the generated fragments.
412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set six [log visible? 6]
414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach {dep range} [array get depc] {
416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Check all dependencies still known, take their range and
417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # see if the break location falls within.
418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Border $range s e
420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {$location < $s} continue ; # break before range, ignore
421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {$location > $e} continue ; # break after range, ignore.
422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # This dependency crosses the break location. We remove it
424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # from the crossings counters, and then also from the set
425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # of known dependencies, as we are done with it.
426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach loc $depc($dep) { incr cross($loc) -1 }
428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unset depc($dep)
429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {!$six} continue
431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct::list assign $dep parent child
433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log write 6 csets "Broke dependency [PD $parent] --> [PD $child]"
434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Print identifying data for a revision (project, file, dotted rev
440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # number), for high verbosity log output.
441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc PD {id} {
443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach {p f r} [state run {
444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SELECT P.name , F.name, R.rev
445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FROM revision R, file F, project P
446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERE R.rid = $id
447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND R.fid = F.fid
448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND F.pid = P.pid
449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }] break
450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return "'$p : $f/$r'"
451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Printing one or more ranges, formatted, and only their border to
454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # keep the strings short.
455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc PRs {ranges} {
457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return [struct::list map $ranges [myproc PR]]
458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc PR {range} {
461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Border $range s e
462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return <${s}...${e}>
463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc Border {range sv ev} {
466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ upvar 1 $sv s $ev e
467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set s [lindex $range 0]
468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set e [lindex $range end]
469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
247 471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
248 472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# # ## ### ##### ######## #############
249 473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
## Configuration
250 474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
251 475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pragma -hastypeinfo no ; # no type introspection
@@ -257,10 +481,12 @@
257 481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
258 482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
namespace eval ::vc::fossil::import::cvs::project {
259 483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
namespace export rev
260 484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
namespace eval rev {
261 485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
namespace import ::vc::fossil::import::cvs::state
486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ namespace import ::vc::tools::misc::*
487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ namespace import ::vc::tools::trouble
262 488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
namespace import ::vc::tools::log
263 489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
log register csets
264 490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
265 491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
266 492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
267 493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!