Fossil SCM

Reworked the in-memory storage of changesets in pass 5 and supporting classes, and added loading of changesets from the persistent state for when the pass is skipped.

aku 2007-11-13 05:09 trunk
Commit 24c0b662de879bea0436cbba3eb449a639891bab
--- tools/cvs2fossil/lib/c2f_pinitcsets.tcl
+++ tools/cvs2fossil/lib/c2f_pinitcsets.tcl
@@ -98,26 +98,42 @@
9898
9999
typemethod load {} {
100100
# Pass manager interface. Executed to load data computed by
101101
# this pass into memory when this pass is skipped instead of
102102
# executed.
103
- # /TODO/load changesets
103
+
104
+ state reading changeset
105
+ state reading csrevision
106
+ state reading cstype
107
+
108
+ foreach {id pid cstype srcid} [state run {
109
+ SELECT C.cid, C.pid, C.type, C.src
110
+ FROM changeset C
111
+ ORDER BY C.cid
112
+ }] {
113
+ set r [project::rev %AUTO% [repository projectof $pid] $cstype $srcid [state run {
114
+ SELECT C.rid
115
+ FROM csrevision C
116
+ WHERE C.cid = $id
117
+ ORDER BY C.pos
118
+ }]]
119
+ $r setid $id
120
+ }
104121
105122
project::rev getcstypes
106123
return
107124
}
108125
109126
typemethod run {} {
110127
# Pass manager interface. Executed to perform the
111128
# functionality of the pass.
112129
113
- set csets {}
114130
state transaction {
115
- CreateRevisionChangesets csets ; # Group file revisions into csets.
116
- BreakInternalDependencies csets ; # Split the csets based on internal conflicts.
117
- CreateSymbolChangesets csets ; # Create csets for tags and branches.
118
- PersistTheChangesets $csets
131
+ CreateRevisionChangesets ; # Group file revisions into csets.
132
+ BreakInternalDependencies ; # Split the csets based on internal conflicts.
133
+ CreateSymbolChangesets ; # Create csets for tags and branches.
134
+ PersistTheChangesets
119135
}
120136
return
121137
}
122138
123139
typemethod discard {} {
@@ -132,13 +148,11 @@
132148
}
133149
134150
# # ## ### ##### ######## #############
135151
## Internal methods
136152
137
- proc CreateRevisionChangesets {cv} {
138
- upvar 1 $cv csets
139
-
153
+ proc CreateRevisionChangesets {} {
140154
log write 3 initcsets {Create changesets based on revisions}
141155
142156
# To get the initial of changesets we first group all file
143157
# level revisions using the same meta data entry together. As
144158
# the meta data encodes not only author and log message, but
@@ -174,11 +188,11 @@
174188
}] {
175189
if {$lastmeta != $mid} {
176190
if {[llength $revisions]} {
177191
incr n
178192
set p [repository projectof $lastproject]
179
- lappend csets [project::rev %AUTO% $p rev $lastmeta $revisions]
193
+ project::rev %AUTO% $p rev $lastmeta $revisions
180194
set revisions {}
181195
}
182196
set lastmeta $mid
183197
set lastproject $pid
184198
}
@@ -186,20 +200,18 @@
186200
}
187201
188202
if {[llength $revisions]} {
189203
incr n
190204
set p [repository projectof $lastproject]
191
- lappend csets [project::rev %AUTO% $p rev $lastmeta $revisions]
205
+ project::rev %AUTO% $p rev $lastmeta $revisions
192206
}
193207
194208
log write 4 initcsets "Created [nsp $n {revision changeset}]"
195209
return
196210
}
197211
198
- proc CreateSymbolChangesets {cv} {
199
- upvar 1 $cv csets
200
-
212
+ proc CreateSymbolChangesets {} {
201213
log write 3 initcsets {Create changesets based on symbols}
202214
203215
# Tags and branches induce changesets as well, containing the
204216
# revisions they are attached to (tags), or spawned from
205217
# (branches).
@@ -222,11 +234,11 @@
222234
}] {
223235
if {$lastsymbol != $sid} {
224236
if {[llength $revisions]} {
225237
incr n
226238
set p [repository projectof $lastproject]
227
- lappend csets [project::rev %AUTO% $p sym $lastsymbol $revisions]
239
+ project::rev %AUTO% $p sym $lastsymbol $revisions
228240
set revisions {}
229241
}
230242
set lastsymbol $sid
231243
set lastproject $pid
232244
}
@@ -234,11 +246,11 @@
234246
}
235247
236248
if {[llength $revisions]} {
237249
incr n
238250
set p [repository projectof $lastproject]
239
- lappend csets [project::rev %AUTO% $p sym $lastsymbol $revisions]
251
+ project::rev %AUTO% $p sym $lastsymbol $revisions
240252
}
241253
242254
set lastsymbol {}
243255
set lasproject {}
244256
set revisions {}
@@ -252,11 +264,11 @@
252264
}] {
253265
if {$lastsymbol != $sid} {
254266
if {[llength $revisions]} {
255267
incr n
256268
set p [repository projectof $lastproject]
257
- lappend csets [project::rev %AUTO% $p sym $lastsymbol $revisions]
269
+ project::rev %AUTO% $p sym $lastsymbol $revisions
258270
set revisions {}
259271
}
260272
set lastsymbol $sid
261273
set lastproject $pid
262274
}
@@ -264,45 +276,43 @@
264276
}
265277
266278
if {[llength $revisions]} {
267279
incr n
268280
set p [repository projectof $lastproject]
269
- lappend csets [project::rev %AUTO% $p sym $lastsymbol $revisions]
281
+ project::rev %AUTO% $p sym $lastsymbol $revisions
270282
}
271283
272284
log write 4 initcsets "Created [nsp $n {symbol changeset}]"
273285
return
274286
}
275287
276
- proc BreakInternalDependencies {cv} {
277
- upvar 1 $cv csets
278
-
288
+ proc BreakInternalDependencies {} {
279289
# This code operates on the revision changesets created by
280290
# 'CreateRevisionChangesets'. As such it has to follow after
281291
# it, before the symbol changesets are made. The changesets
282292
# are inspected for internal conflicts and any such are broken
283293
# by splitting the problematic changeset into multiple
284294
# fragments. The results are changesets which have no internal
285295
# dependencies, only external ones.
286296
287297
log write 3 initcsets {Break internal dependencies}
288
- set old [llength $csets]
298
+ set old [llength [project::rev all]]
289299
290
- foreach cset $csets {
291
- $cset breakinternaldependencies csets
300
+ foreach cset [project::rev all] {
301
+ $cset breakinternaldependencies
292302
}
293303
294
- set n [expr {[llength $csets] - $old}]
304
+ set n [expr {[llength [project::rev all]] - $old}]
295305
log write 4 initcsets "Created [nsp $n {additional revision changeset}]"
296306
log write 4 initcsets Ok.
297307
return
298308
}
299309
300
- proc PersistTheChangesets {csets} {
301
- log write 3 initcsets "Saving [nsp [llength $csets] {initial changeset}] to the persistent state"
310
+ proc PersistTheChangesets {} {
311
+ log write 3 initcsets "Saving [nsp [llength [project::rev all]] {initial changeset}] to the persistent state"
302312
303
- foreach cset $csets {
313
+ foreach cset [project::rev all] {
304314
$cset persist
305315
}
306316
307317
log write 4 initcsets Ok.
308318
return
309319
--- tools/cvs2fossil/lib/c2f_pinitcsets.tcl
+++ tools/cvs2fossil/lib/c2f_pinitcsets.tcl
@@ -98,26 +98,42 @@
98
99 typemethod load {} {
100 # Pass manager interface. Executed to load data computed by
101 # this pass into memory when this pass is skipped instead of
102 # executed.
103 # /TODO/load changesets
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
105 project::rev getcstypes
106 return
107 }
108
109 typemethod run {} {
110 # Pass manager interface. Executed to perform the
111 # functionality of the pass.
112
113 set csets {}
114 state transaction {
115 CreateRevisionChangesets csets ; # Group file revisions into csets.
116 BreakInternalDependencies csets ; # Split the csets based on internal conflicts.
117 CreateSymbolChangesets csets ; # Create csets for tags and branches.
118 PersistTheChangesets $csets
119 }
120 return
121 }
122
123 typemethod discard {} {
@@ -132,13 +148,11 @@
132 }
133
134 # # ## ### ##### ######## #############
135 ## Internal methods
136
137 proc CreateRevisionChangesets {cv} {
138 upvar 1 $cv csets
139
140 log write 3 initcsets {Create changesets based on revisions}
141
142 # To get the initial of changesets we first group all file
143 # level revisions using the same meta data entry together. As
144 # the meta data encodes not only author and log message, but
@@ -174,11 +188,11 @@
174 }] {
175 if {$lastmeta != $mid} {
176 if {[llength $revisions]} {
177 incr n
178 set p [repository projectof $lastproject]
179 lappend csets [project::rev %AUTO% $p rev $lastmeta $revisions]
180 set revisions {}
181 }
182 set lastmeta $mid
183 set lastproject $pid
184 }
@@ -186,20 +200,18 @@
186 }
187
188 if {[llength $revisions]} {
189 incr n
190 set p [repository projectof $lastproject]
191 lappend csets [project::rev %AUTO% $p rev $lastmeta $revisions]
192 }
193
194 log write 4 initcsets "Created [nsp $n {revision changeset}]"
195 return
196 }
197
198 proc CreateSymbolChangesets {cv} {
199 upvar 1 $cv csets
200
201 log write 3 initcsets {Create changesets based on symbols}
202
203 # Tags and branches induce changesets as well, containing the
204 # revisions they are attached to (tags), or spawned from
205 # (branches).
@@ -222,11 +234,11 @@
222 }] {
223 if {$lastsymbol != $sid} {
224 if {[llength $revisions]} {
225 incr n
226 set p [repository projectof $lastproject]
227 lappend csets [project::rev %AUTO% $p sym $lastsymbol $revisions]
228 set revisions {}
229 }
230 set lastsymbol $sid
231 set lastproject $pid
232 }
@@ -234,11 +246,11 @@
234 }
235
236 if {[llength $revisions]} {
237 incr n
238 set p [repository projectof $lastproject]
239 lappend csets [project::rev %AUTO% $p sym $lastsymbol $revisions]
240 }
241
242 set lastsymbol {}
243 set lasproject {}
244 set revisions {}
@@ -252,11 +264,11 @@
252 }] {
253 if {$lastsymbol != $sid} {
254 if {[llength $revisions]} {
255 incr n
256 set p [repository projectof $lastproject]
257 lappend csets [project::rev %AUTO% $p sym $lastsymbol $revisions]
258 set revisions {}
259 }
260 set lastsymbol $sid
261 set lastproject $pid
262 }
@@ -264,45 +276,43 @@
264 }
265
266 if {[llength $revisions]} {
267 incr n
268 set p [repository projectof $lastproject]
269 lappend csets [project::rev %AUTO% $p sym $lastsymbol $revisions]
270 }
271
272 log write 4 initcsets "Created [nsp $n {symbol changeset}]"
273 return
274 }
275
276 proc BreakInternalDependencies {cv} {
277 upvar 1 $cv csets
278
279 # This code operates on the revision changesets created by
280 # 'CreateRevisionChangesets'. As such it has to follow after
281 # it, before the symbol changesets are made. The changesets
282 # are inspected for internal conflicts and any such are broken
283 # by splitting the problematic changeset into multiple
284 # fragments. The results are changesets which have no internal
285 # dependencies, only external ones.
286
287 log write 3 initcsets {Break internal dependencies}
288 set old [llength $csets]
289
290 foreach cset $csets {
291 $cset breakinternaldependencies csets
292 }
293
294 set n [expr {[llength $csets] - $old}]
295 log write 4 initcsets "Created [nsp $n {additional revision changeset}]"
296 log write 4 initcsets Ok.
297 return
298 }
299
300 proc PersistTheChangesets {csets} {
301 log write 3 initcsets "Saving [nsp [llength $csets] {initial changeset}] to the persistent state"
302
303 foreach cset $csets {
304 $cset persist
305 }
306
307 log write 4 initcsets Ok.
308 return
309
--- tools/cvs2fossil/lib/c2f_pinitcsets.tcl
+++ tools/cvs2fossil/lib/c2f_pinitcsets.tcl
@@ -98,26 +98,42 @@
98
99 typemethod load {} {
100 # Pass manager interface. Executed to load data computed by
101 # this pass into memory when this pass is skipped instead of
102 # executed.
103
104 state reading changeset
105 state reading csrevision
106 state reading cstype
107
108 foreach {id pid cstype srcid} [state run {
109 SELECT C.cid, C.pid, C.type, C.src
110 FROM changeset C
111 ORDER BY C.cid
112 }] {
113 set r [project::rev %AUTO% [repository projectof $pid] $cstype $srcid [state run {
114 SELECT C.rid
115 FROM csrevision C
116 WHERE C.cid = $id
117 ORDER BY C.pos
118 }]]
119 $r setid $id
120 }
121
122 project::rev getcstypes
123 return
124 }
125
126 typemethod run {} {
127 # Pass manager interface. Executed to perform the
128 # functionality of the pass.
129
 
130 state transaction {
131 CreateRevisionChangesets ; # Group file revisions into csets.
132 BreakInternalDependencies ; # Split the csets based on internal conflicts.
133 CreateSymbolChangesets ; # Create csets for tags and branches.
134 PersistTheChangesets
135 }
136 return
137 }
138
139 typemethod discard {} {
@@ -132,13 +148,11 @@
148 }
149
150 # # ## ### ##### ######## #############
151 ## Internal methods
152
153 proc CreateRevisionChangesets {} {
 
 
154 log write 3 initcsets {Create changesets based on revisions}
155
156 # To get the initial of changesets we first group all file
157 # level revisions using the same meta data entry together. As
158 # the meta data encodes not only author and log message, but
@@ -174,11 +188,11 @@
188 }] {
189 if {$lastmeta != $mid} {
190 if {[llength $revisions]} {
191 incr n
192 set p [repository projectof $lastproject]
193 project::rev %AUTO% $p rev $lastmeta $revisions
194 set revisions {}
195 }
196 set lastmeta $mid
197 set lastproject $pid
198 }
@@ -186,20 +200,18 @@
200 }
201
202 if {[llength $revisions]} {
203 incr n
204 set p [repository projectof $lastproject]
205 project::rev %AUTO% $p rev $lastmeta $revisions
206 }
207
208 log write 4 initcsets "Created [nsp $n {revision changeset}]"
209 return
210 }
211
212 proc CreateSymbolChangesets {} {
 
 
213 log write 3 initcsets {Create changesets based on symbols}
214
215 # Tags and branches induce changesets as well, containing the
216 # revisions they are attached to (tags), or spawned from
217 # (branches).
@@ -222,11 +234,11 @@
234 }] {
235 if {$lastsymbol != $sid} {
236 if {[llength $revisions]} {
237 incr n
238 set p [repository projectof $lastproject]
239 project::rev %AUTO% $p sym $lastsymbol $revisions
240 set revisions {}
241 }
242 set lastsymbol $sid
243 set lastproject $pid
244 }
@@ -234,11 +246,11 @@
246 }
247
248 if {[llength $revisions]} {
249 incr n
250 set p [repository projectof $lastproject]
251 project::rev %AUTO% $p sym $lastsymbol $revisions
252 }
253
254 set lastsymbol {}
255 set lasproject {}
256 set revisions {}
@@ -252,11 +264,11 @@
264 }] {
265 if {$lastsymbol != $sid} {
266 if {[llength $revisions]} {
267 incr n
268 set p [repository projectof $lastproject]
269 project::rev %AUTO% $p sym $lastsymbol $revisions
270 set revisions {}
271 }
272 set lastsymbol $sid
273 set lastproject $pid
274 }
@@ -264,45 +276,43 @@
276 }
277
278 if {[llength $revisions]} {
279 incr n
280 set p [repository projectof $lastproject]
281 project::rev %AUTO% $p sym $lastsymbol $revisions
282 }
283
284 log write 4 initcsets "Created [nsp $n {symbol changeset}]"
285 return
286 }
287
288 proc BreakInternalDependencies {} {
 
 
289 # This code operates on the revision changesets created by
290 # 'CreateRevisionChangesets'. As such it has to follow after
291 # it, before the symbol changesets are made. The changesets
292 # are inspected for internal conflicts and any such are broken
293 # by splitting the problematic changeset into multiple
294 # fragments. The results are changesets which have no internal
295 # dependencies, only external ones.
296
297 log write 3 initcsets {Break internal dependencies}
298 set old [llength [project::rev all]]
299
300 foreach cset [project::rev all] {
301 $cset breakinternaldependencies
302 }
303
304 set n [expr {[llength [project::rev all]] - $old}]
305 log write 4 initcsets "Created [nsp $n {additional revision changeset}]"
306 log write 4 initcsets Ok.
307 return
308 }
309
310 proc PersistTheChangesets {} {
311 log write 3 initcsets "Saving [nsp [llength [project::rev all]] {initial changeset}] to the persistent state"
312
313 foreach cset [project::rev all] {
314 $cset persist
315 }
316
317 log write 4 initcsets Ok.
318 return
319
--- tools/cvs2fossil/lib/c2f_prev.tcl
+++ tools/cvs2fossil/lib/c2f_prev.tcl
@@ -34,18 +34,20 @@
3434
set myid [incr mycounter]
3535
set myproject $project
3636
set mytype $cstype
3737
set mysrcid $srcid
3838
set myrevisions $revisions
39
+
40
+ # Keep track of the generated changesets.
41
+ lappend mychangesets $self
3942
return
4043
}
4144
4245
method id {} { return $myid }
46
+ method setid {id} { set myid $id ; return }
4347
44
- method breakinternaldependencies {cv} {
45
- upvar 2 $cv csets ; # simple-dispatch!
46
-
48
+ method breakinternaldependencies {} {
4749
# This method inspects the changesets for internal
4850
# dependencies. Nothing is done if there are no
4951
# such. Otherwise the changeset is split into a set of
5052
# fragments without internal dependencies, transforming the
5153
# internal dependencies into external ones. The new changesets
@@ -165,11 +167,10 @@
165167
if {$laste != ($s - 1)} {
166168
trouble internal "Bad fragment border <$laste | $s>, gap or overlap"
167169
}
168170
169171
set new [$type %AUTO% $myproject $mytype $mysrcid [lrange $myrevisions $s $e]]
170
- lappend csets $new
171172
172173
log write 4 csets "Breaking <$myid> @ $laste, new <[$new id]>, cutting $breaks($laste)"
173174
174175
set laste $e
175176
}
@@ -466,10 +467,18 @@
466467
upvar 1 $sv s $ev e
467468
set s [lindex $range 0]
468469
set e [lindex $range end]
469470
return
470471
}
472
+
473
+ # # ## ### ##### ######## #############
474
+
475
+ typevariable mychangesets {} ; # List of all known changesets.
476
+
477
+ typemethod all {} {
478
+ return $mychangesets
479
+ }
471480
472481
# # ## ### ##### ######## #############
473482
## Configuration
474483
475484
pragma -hastypeinfo no ; # no type introspection
476485
--- tools/cvs2fossil/lib/c2f_prev.tcl
+++ tools/cvs2fossil/lib/c2f_prev.tcl
@@ -34,18 +34,20 @@
34 set myid [incr mycounter]
35 set myproject $project
36 set mytype $cstype
37 set mysrcid $srcid
38 set myrevisions $revisions
 
 
 
39 return
40 }
41
42 method id {} { return $myid }
 
43
44 method breakinternaldependencies {cv} {
45 upvar 2 $cv csets ; # simple-dispatch!
46
47 # This method inspects the changesets for internal
48 # dependencies. Nothing is done if there are no
49 # such. Otherwise the changeset is split into a set of
50 # fragments without internal dependencies, transforming the
51 # internal dependencies into external ones. The new changesets
@@ -165,11 +167,10 @@
165 if {$laste != ($s - 1)} {
166 trouble internal "Bad fragment border <$laste | $s>, gap or overlap"
167 }
168
169 set new [$type %AUTO% $myproject $mytype $mysrcid [lrange $myrevisions $s $e]]
170 lappend csets $new
171
172 log write 4 csets "Breaking <$myid> @ $laste, new <[$new id]>, cutting $breaks($laste)"
173
174 set laste $e
175 }
@@ -466,10 +467,18 @@
466 upvar 1 $sv s $ev e
467 set s [lindex $range 0]
468 set e [lindex $range end]
469 return
470 }
 
 
 
 
 
 
 
 
471
472 # # ## ### ##### ######## #############
473 ## Configuration
474
475 pragma -hastypeinfo no ; # no type introspection
476
--- tools/cvs2fossil/lib/c2f_prev.tcl
+++ tools/cvs2fossil/lib/c2f_prev.tcl
@@ -34,18 +34,20 @@
34 set myid [incr mycounter]
35 set myproject $project
36 set mytype $cstype
37 set mysrcid $srcid
38 set myrevisions $revisions
39
40 # Keep track of the generated changesets.
41 lappend mychangesets $self
42 return
43 }
44
45 method id {} { return $myid }
46 method setid {id} { set myid $id ; return }
47
48 method breakinternaldependencies {} {
 
 
49 # This method inspects the changesets for internal
50 # dependencies. Nothing is done if there are no
51 # such. Otherwise the changeset is split into a set of
52 # fragments without internal dependencies, transforming the
53 # internal dependencies into external ones. The new changesets
@@ -165,11 +167,10 @@
167 if {$laste != ($s - 1)} {
168 trouble internal "Bad fragment border <$laste | $s>, gap or overlap"
169 }
170
171 set new [$type %AUTO% $myproject $mytype $mysrcid [lrange $myrevisions $s $e]]
 
172
173 log write 4 csets "Breaking <$myid> @ $laste, new <[$new id]>, cutting $breaks($laste)"
174
175 set laste $e
176 }
@@ -466,10 +467,18 @@
467 upvar 1 $sv s $ev e
468 set s [lindex $range 0]
469 set e [lindex $range end]
470 return
471 }
472
473 # # ## ### ##### ######## #############
474
475 typevariable mychangesets {} ; # List of all known changesets.
476
477 typemethod all {} {
478 return $mychangesets
479 }
480
481 # # ## ### ##### ######## #############
482 ## Configuration
483
484 pragma -hastypeinfo no ; # no type introspection
485

Keyboard Shortcuts

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