Fossil SCM

Merge aku's CVS import changes into the main line. Fix a small bug in diff.c.

drh 2007-11-17 00:29 trunk merge
Commit 38b967dcf5613a918fcddcde269df452ce378752
60 files changed +793 +576 +18 +590 +1 -1 +1 -1 +32 +19 +7 +180 +22 +57 +362 +115 +56 +2 +1 +81 +1 +8 +4 +17 +174 +112 +3 +124 +56 +196 +180 +100 +3 +20 +1 +4 +32 +64 +112 +97 +2 +393 +52 -112 -449 -49 -159 -113 -87 -231 -49 -50 -116 -49 -153 -14 -228 -57
~ art/CollRev1.dia ~ art/CollRev2.dia ~ art/CollRev3.dia ~ art/CollRev4.dia ~ src/diff.c ~ src/diff.c ~ tools/cvs2fossil/cvs2fossil ~ tools/cvs2fossil/doc/LICENSE ~ tools/cvs2fossil/doc/README ~ tools/cvs2fossil/lib/c2f_cyclebreaker.tcl ~ tools/cvs2fossil/lib/c2f_file.tcl ~ tools/cvs2fossil/lib/c2f_flodmgr.tcl ~ tools/cvs2fossil/lib/c2f_frev.tcl ~ tools/cvs2fossil/lib/c2f_fsym.tcl ~ tools/cvs2fossil/lib/c2f_ftrunk.tcl ~ tools/cvs2fossil/lib/c2f_integrity.tcl ~ tools/cvs2fossil/lib/c2f_option.tcl ~ tools/cvs2fossil/lib/c2f_pass.tcl ~ tools/cvs2fossil/lib/c2f_pbreakacycle.tcl ~ tools/cvs2fossil/lib/c2f_pbreakrcycle.tcl ~ tools/cvs2fossil/lib/c2f_pbreakscycle.tcl ~ tools/cvs2fossil/lib/c2f_pcollar.tcl ~ tools/cvs2fossil/lib/c2f_pcollrev.tcl ~ tools/cvs2fossil/lib/c2f_pcollsym.tcl ~ tools/cvs2fossil/lib/c2f_pfiltersym.tcl ~ tools/cvs2fossil/lib/c2f_pinitcsets.tcl ~ tools/cvs2fossil/lib/c2f_plodmgr.tcl ~ tools/cvs2fossil/lib/c2f_prev.tcl ~ tools/cvs2fossil/lib/c2f_prevlink.tcl ~ tools/cvs2fossil/lib/c2f_project.tcl ~ tools/cvs2fossil/lib/c2f_psym.tcl ~ tools/cvs2fossil/lib/c2f_ptrunk.tcl ~ tools/cvs2fossil/lib/c2f_repository.tcl ~ tools/cvs2fossil/lib/c2f_state.tcl ~ tools/cvs2fossil/lib/cvs2fossil.tcl ~ tools/cvs2fossil/lib/id.tcl ~ tools/cvs2fossil/lib/log.tcl ~ tools/cvs2fossil/lib/misc.tcl ~ tools/cvs2fossil/lib/pkgIndex.tcl ~ tools/cvs2fossil/lib/rcsparser.tcl ~ tools/cvs2fossil/lib/trouble.tcl - tools/import-cvs.tcl - tools/lib/cvs.tcl - tools/lib/cvs_cmd.tcl - tools/lib/cvs_csets.tcl - tools/lib/cvs_files.tcl - tools/lib/cvs_timeline.tcl - tools/lib/fossil.tcl - tools/lib/fossil_cmd.tcl - tools/lib/import_map.tcl - tools/lib/import_statistics.tcl - tools/lib/importcvs.tcl - tools/lib/log.tcl - tools/lib/pkgIndex.tcl - tools/lib/rcsparser.tcl - tools/lib/trouble.tcl ~ www/CollRev1.gif ~ www/CollRev2.gif ~ www/CollRev3.gif ~ www/CollRev4.gif
--- a/art/CollRev1.dia
+++ b/art/CollRev1.dia
@@ -0,0 +1,793 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
3
+ <dia:diagramdata>
4
+ <dia:attribute name="background">
5
+ <dia:color val="#ffffff"/>
6
+ </dia:attribute>
7
+ <dia:attribute name="pagebreak">
8
+ <dia:color val="#000099"/>
9
+ </dia:attribute>
10
+ <dia:attribute name="paper">
11
+ <dia:composite type="paper">
12
+ <dia:attribute name="name">
13
+ <dia:string>#Letter#</dia:string>
14
+ </dia:attribute>
15
+ <dia:attribute name="tmargin">
16
+ <dia:real val="2.5399999618530273"/>
17
+ </dia:attribute>
18
+ <dia:attribute name="bmargin">
19
+ <dia:real val="2.5399999618530273"/>
20
+ </dia:attribute>
21
+ <dia:attribute name="lmargin">
22
+ <dia:real val="2.5399999618530273"/>
23
+ </dia:attribute>
24
+ <dia:attribute name="rmargin">
25
+ <dia:real val="2.5399999618530273"/>
26
+ </dia:attribute>
27
+ <dia:attribute name="is_portrait">
28
+ <dia:boolean val="true"/>
29
+ </dia:attribute>
30
+ <dia:attribute name="scaling">
31
+ <dia:real val="1"/>
32
+ </dia:attribute>
33
+ <dia:attribute name="fitto">
34
+ <dia:boolean val="false"/>
35
+ </dia:attribute>
36
+ </dia:composite>
37
+ </dia:attribute>
38
+ <dia:attribute name="grid">
39
+ <dia:composite type="grid">
40
+ <dia:attribute name="width_x">
41
+ <dia:real val="1"/>
42
+ </dia:attribute>
43
+ <dia:attribute name="width_y">
44
+ <dia:real val="1"/>
45
+ </dia:attribute>
46
+ <dia:attribute name="visible_x">
47
+ <dia:int val="1"/>
48
+ </dia:attribute>
49
+ <dia:attribute name="visible_y">
50
+ <dia:int val="1"/>
51
+ </dia:attribute>
52
+ <dia:composite type="color"/>
53
+ </dia:composite>
54
+ </dia:attribute>
55
+ <dia:attribute name="color">
56
+ <dia:color val="#d8e5e5"/>
57
+ </dia:attribute>
58
+ <dia:attribute name="guides">
59
+ <dia:composite type="guides">
60
+ <dia:attribute name="hguides"/>
61
+ <dia:attribute name="vguides"/>
62
+ </dia:composite>
63
+ </dia:attribute>
64
+ </dia:diagramdata>
65
+ <dia:layer name="Background" visible="true">
66
+ <dia:group>
67
+ <dia:group>
68
+ <dia:object type="Standard - Box" version="0" id="O0">
69
+ <dia:attribute name="obj_pos">
70
+ <dia:point val="15,13"/>
71
+ </dia:attribute>
72
+ <dia:attribute name="obj_bb">
73
+ <dia:rectangle val="14.95,12.95;20.05,15.05"/>
74
+ </dia:attribute>
75
+ <dia:attribute name="elem_corner">
76
+ <dia:point val="15,13"/>
77
+ </dia:attribute>
78
+ <dia:attribute name="elem_width">
79
+ <dia:real val="5"/>
80
+ </dia:attribute>
81
+ <dia:attribute name="elem_height">
82
+ <dia:real val="2"/>
83
+ </dia:attribute>
84
+ <dia:attribute name="show_background">
85
+ <dia:boolean val="true"/>
86
+ </dia:attribute>
87
+ </dia:object>
88
+ <dia:object type="Standard - Text" version="1" id="O1">
89
+ <dia:attribute name="obj_pos">
90
+ <dia:point val="16.2733,14.064"/>
91
+ </dia:attribute>
92
+ <dia:attribute name="obj_bb">
93
+ <dia:rectangle val="16.2733,13.5215;18.7096,14.4615"/>
94
+ </dia:attribute>
95
+ <dia:attribute name="text">
96
+ <dia:composite type="text">
97
+ <dia:attribute name="string">
98
+ <dia:string>#Revision#</dia:string>
99
+ </dia:attribute>
100
+ <dia:attribute name="font">
101
+ <dia:font family="sans" style="0" name="Helvetica"/>
102
+ </dia:attribute>
103
+ <dia:attribute name="height">
104
+ <dia:real val="0.80000000000000004"/>
105
+ </dia:attribute>
106
+ <dia:attribute name="pos">
107
+ <dia:point val="16.2733,14.064"/>
108
+ </dia:attribute>
109
+ <dia:attribute name="color">
110
+ <dia:color val="#000000"/>
111
+ </dia:attribute>
112
+ <dia:attribute name="alignment">
113
+ <dia:enum val="0"/>
114
+ </dia:attribute>
115
+ </dia:composite>
116
+ </dia:attribute>
117
+ <dia:attribute name="valign">
118
+ <dia:enum val="3"/>
119
+ </dia:attribute>
120
+ </dia:object>
121
+ </dia:group>
122
+ <dia:group>
123
+ <dia:object type="Standard - Box" version="0" id="O2">
124
+ <dia:attribute name="obj_pos">
125
+ <dia:point val="15,7"/>
126
+ </dia:attribute>
127
+ <dia:attribute name="obj_bb">
128
+ <dia:rectangle val="14.95,6.95;20.05,9.05"/>
129
+ </dia:attribute>
130
+ <dia:attribute name="elem_corner">
131
+ <dia:point val="15,7"/>
132
+ </dia:attribute>
133
+ <dia:attribute name="elem_width">
134
+ <dia:real val="5"/>
135
+ </dia:attribute>
136
+ <dia:attribute name="elem_height">
137
+ <dia:real val="2"/>
138
+ </dia:attribute>
139
+ <dia:attribute name="show_background">
140
+ <dia:boolean val="true"/>
141
+ </dia:attribute>
142
+ </dia:object>
143
+ <dia:object type="Standard - Text" version="1" id="O3">
144
+ <dia:attribute name="obj_pos">
145
+ <dia:point val="17.0039,8.06397"/>
146
+ </dia:attribute>
147
+ <dia:attribute name="obj_bb">
148
+ <dia:rectangle val="17.0039,7.52147;17.979,8.46147"/>
149
+ </dia:attribute>
150
+ <dia:attribute name="text">
151
+ <dia:composite type="text">
152
+ <dia:attribute name="string">
153
+ <dia:string>#File#</dia:string>
154
+ </dia:attribute>
155
+ <dia:attribute name="font">
156
+ <dia:font family="sans" style="0" name="Helvetica"/>
157
+ </dia:attribute>
158
+ <dia:attribute name="height">
159
+ <dia:real val="0.80000000000000004"/>
160
+ </dia:attribute>
161
+ <dia:attribute name="pos">
162
+ <dia:point val="17.0039,8.06397"/>
163
+ </dia:attribute>
164
+ <dia:attribute name="color">
165
+ <dia:color val="#000000"/>
166
+ </dia:attribute>
167
+ <dia:attribute name="alignment">
168
+ <dia:enum val="0"/>
169
+ </dia:attribute>
170
+ </dia:composite>
171
+ </dia:attribute>
172
+ <dia:attribute name="valign">
173
+ <dia:enum val="3"/>
174
+ </dia:attribute>
175
+ </dia:object>
176
+ </dia:group>
177
+ <dia:group>
178
+ <dia:object type="Standard - Box" version="0" id="O4">
179
+ <dia:attribute name="obj_pos">
180
+ <dia:point val="15,1"/>
181
+ </dia:attribute>
182
+ <dia:attribute name="obj_bb">
183
+ <dia:rectangle val="14.95,0.95;20.05,3.05"/>
184
+ </dia:attribute>
185
+ <dia:attribute name="elem_corner">
186
+ <dia:point val="15,1"/>
187
+ </dia:attribute>
188
+ <dia:attribute name="elem_width">
189
+ <dia:real val="5"/>
190
+ </dia:attribute>
191
+ <dia:attribute name="elem_height">
192
+ <dia:real val="2"/>
193
+ </dia:attribute>
194
+ <dia:attribute name="show_background">
195
+ <dia:boolean val="true"/>
196
+ </dia:attribute>
197
+ </dia:object>
198
+ <dia:object type="Standard - Text" version="1" id="O5">
199
+ <dia:attribute name="obj_pos">
200
+ <dia:point val="16.4942,2.06397"/>
201
+ </dia:attribute>
202
+ <dia:attribute name="obj_bb">
203
+ <dia:rectangle val="16.4942,1.52147;18.4887,2.46147"/>
204
+ </dia:attribute>
205
+ <dia:attribute name="text">
206
+ <dia:composite type="text">
207
+ <dia:attribute name="string">
208
+ <dia:string>#Project#</dia:string>
209
+ </dia:attribute>
210
+ <dia:attribute name="font">
211
+ <dia:font family="sans" style="0" name="Helvetica"/>
212
+ </dia:attribute>
213
+ <dia:attribute name="height">
214
+ <dia:real val="0.80000000000000004"/>
215
+ </dia:attribute>
216
+ <dia:attribute name="pos">
217
+ <dia:point val="16.4942,2.06397"/>
218
+ </dia:attribute>
219
+ <dia:attribute name="color">
220
+ <dia:color val="#000000"/>
221
+ </dia:attribute>
222
+ <dia:attribute name="alignment">
223
+ <dia:enum val="0"/>
224
+ </dia:attribute>
225
+ </dia:composite>
226
+ </dia:attribute>
227
+ <dia:attribute name="valign">
228
+ <dia:enum val="3"/>
229
+ </dia:attribute>
230
+ </dia:object>
231
+ </dia:group>
232
+ <dia:object type="Standard - ZigZagLine" version="1" id="O6">
233
+ <dia:attribute name="obj_pos">
234
+ <dia:point val="17.5,13"/>
235
+ </dia:attribute>
236
+ <dia:attribute name="obj_bb">
237
+ <dia:rectangle val="17.45,8.92929;17.55,13"/>
238
+ </dia:attribute>
239
+ <dia:attribute name="orth_points">
240
+ <dia:point val="17.5,13"/>
241
+ <dia:point val="17.5,13"/>
242
+ <dia:point val="17.5,9"/>
243
+ <dia:point val="17.5,9"/>
244
+ </dia:attribute>
245
+ <dia:attribute name="orth_orient">
246
+ <dia:enum val="0"/>
247
+ <dia:enum val="1"/>
248
+ <dia:enum val="0"/>
249
+ </dia:attribute>
250
+ <dia:attribute name="autorouting">
251
+ <dia:boolean val="true"/>
252
+ </dia:attribute>
253
+ <dia:attribute name="end_arrow">
254
+ <dia:enum val="22"/>
255
+ </dia:attribute>
256
+ <dia:attribute name="end_arrow_length">
257
+ <dia:real val="0.5"/>
258
+ </dia:attribute>
259
+ <dia:attribute name="end_arrow_width">
260
+ <dia:real val="0.5"/>
261
+ </dia:attribute>
262
+ </dia:object>
263
+ <dia:object type="Standard - ZigZagLine" version="1" id="O7">
264
+ <dia:attribute name="obj_pos">
265
+ <dia:point val="17.5,7"/>
266
+ </dia:attribute>
267
+ <dia:attribute name="obj_bb">
268
+ <dia:rectangle val="17.45,2.92929;17.55,7"/>
269
+ </dia:attribute>
270
+ <dia:attribute name="orth_points">
271
+ <dia:point val="17.5,7"/>
272
+ <dia:point val="17.5,7"/>
273
+ <dia:point val="17.5,3"/>
274
+ <dia:point val="17.5,3"/>
275
+ </dia:attribute>
276
+ <dia:attribute name="orth_orient">
277
+ <dia:enum val="0"/>
278
+ <dia:enum val="1"/>
279
+ <dia:enum val="0"/>
280
+ </dia:attribute>
281
+ <dia:attribute name="autorouting">
282
+ <dia:boolean val="true"/>
283
+ </dia:attribute>
284
+ <dia:attribute name="end_arrow">
285
+ <dia:enum val="22"/>
286
+ </dia:attribute>
287
+ <dia:attribute name="end_arrow_length">
288
+ <dia:real val="0.5"/>
289
+ </dia:attribute>
290
+ <dia:attribute name="end_arrow_width">
291
+ <dia:real val="0.5"/>
292
+ </dia:attribute>
293
+ </dia:object>
294
+ <dia:group>
295
+ <dia:object type="Standard - Box" version="0" id="O8">
296
+ <dia:attribute name="obj_pos">
297
+ <dia:point val="15,19"/>
298
+ </dia:attribute>
299
+ <dia:attribute name="obj_bb">
300
+ <dia:rectangle val="14.95,18.95;20.05,21.05"/>
301
+ </dia:attribute>
302
+ <dia:attribute name="elem_corner">
303
+ <dia:point val="15,19"/>
304
+ </dia:attribute>
305
+ <dia:attribute name="elem_width">
306
+ <dia:real val="5"/>
307
+ </dia:attribute>
308
+ <dia:attribute name="elem_height">
309
+ <dia:real val="2"/>
310
+ </dia:attribute>
311
+ <dia:attribute name="show_background">
312
+ <dia:boolean val="true"/>
313
+ </dia:attribute>
314
+ </dia:object>
315
+ <dia:object type="Standard - Text" version="1" id="O9">
316
+ <dia:attribute name="obj_pos">
317
+ <dia:point val="16.7775,20.064"/>
318
+ </dia:attribute>
319
+ <dia:attribute name="obj_bb">
320
+ <dia:rectangle val="16.7775,19.5215;18.2225,20.4615"/>
321
+ </dia:attribute>
322
+ <dia:attribute name="text">
323
+ <dia:composite type="text">
324
+ <dia:attribute name="string">
325
+ <dia:string>#Meta#</dia:string>
326
+ </dia:attribute>
327
+ <dia:attribute name="font">
328
+ <dia:font family="sans" style="0" name="Helvetica"/>
329
+ </dia:attribute>
330
+ <dia:attribute name="height">
331
+ <dia:real val="0.80000000000000004"/>
332
+ </dia:attribute>
333
+ <dia:attribute name="pos">
334
+ <dia:point val="16.7775,20.064"/>
335
+ </dia:attribute>
336
+ <dia:attribute name="color">
337
+ <dia:color val="#000000"/>
338
+ </dia:attribute>
339
+ <dia:attribute name="alignment">
340
+ <dia:enum val="0"/>
341
+ </dia:attribute>
342
+ </dia:composite>
343
+ </dia:attribute>
344
+ <dia:attribute name="valign">
345
+ <dia:enum val="3"/>
346
+ </dia:attribute>
347
+ </dia:object>
348
+ </dia:group>
349
+ <dia:object type="Standard - PolyLine" version="0" id="O10">
350
+ <dia:attribute name="obj_pos">
351
+ <dia:point val="15,20"/>
352
+ </dia:attribute>
353
+ <dia:attribute name="obj_bb">
354
+ <dia:rectangle val="7.5,14.95;15.05,20.05"/>
355
+ </dia:attribute>
356
+ <dia:attribute name="poly_points">
357
+ <dia:point val="15,20"/>
358
+ <dia:point val="8,20"/>
359
+ <dia:point val="8,15"/>
360
+ </dia:attribute>
361
+ <dia:attribute name="end_arrow">
362
+ <dia:enum val="22"/>
363
+ </dia:attribute>
364
+ <dia:attribute name="end_arrow_length">
365
+ <dia:real val="0.5"/>
366
+ </dia:attribute>
367
+ <dia:attribute name="end_arrow_width">
368
+ <dia:real val="0.5"/>
369
+ </dia:attribute>
370
+ </dia:object>
371
+ <dia:object type="Standard - Line" version="0" id="O11">
372
+ <dia:attribute name="obj_pos">
373
+ <dia:point val="15,14"/>
374
+ </dia:attribute>
375
+ <dia:attribute name="obj_bb">
376
+ <dia:rectangle val="10.95,13.5;15.05,14.5"/>
377
+ </dia:attribute>
378
+ <dia:attribute name="conn_endpoints">
379
+ <dia:point val="15,14"/>
380
+ <dia:point val="11,14"/>
381
+ </dia:attribute>
382
+ <dia:attribute name="numcp">
383
+ <dia:int val="1"/>
384
+ </dia:attribute>
385
+ <dia:attribute name="end_arrow">
386
+ <dia:enum val="22"/>
387
+ </dia:attribute>
388
+ <dia:attribute name="end_arrow_length">
389
+ <dia:real val="0.5"/>
390
+ </dia:attribute>
391
+ <dia:attribute name="end_arrow_width">
392
+ <dia:real val="0.5"/>
393
+ </dia:attribute>
394
+ </dia:object>
395
+ <dia:object type="Standard - ZigZagLine" version="1" id="O12">
396
+ <dia:attribute name="obj_pos">
397
+ <dia:point val="20,20"/>
398
+ </dia:attribute>
399
+ <dia:attribute name="obj_bb">
400
+ <dia:rectangle val="19.95,1.5;27.05,20.05"/>
401
+ </dia:attribute>
402
+ <dia:attribute name="orth_points">
403
+ <dia:point val="20,20"/>
404
+ <dia:point val="27,20"/>
405
+ <dia:point val="27,2"/>
406
+ <dia:point val="20,2"/>
407
+ </dia:attribute>
408
+ <dia:attribute name="orth_orient">
409
+ <dia:enum val="0"/>
410
+ <dia:enum val="1"/>
411
+ <dia:enum val="0"/>
412
+ </dia:attribute>
413
+ <dia:attribute name="autorouting">
414
+ <dia:boolean val="false"/>
415
+ </dia:attribute>
416
+ <dia:attribute name="end_arrow">
417
+ <dia:enum val="22"/>
418
+ </dia:attribute>
419
+ <dia:attribute name="end_arrow_length">
420
+ <dia:real val="0.5"/>
421
+ </dia:attribute>
422
+ <dia:attribute name="end_arrow_width">
423
+ <dia:real val="0.5"/>
424
+ </dia:attribute>
425
+ </dia:object>
426
+ <dia:object type="Standard - Line" version="0" id="O13">
427
+ <dia:attribute name="obj_pos">
428
+ <dia:point val="17.5,15"/>
429
+ </dia:attribute>
430
+ <dia:attribute name="obj_bb">
431
+ <dia:rectangle val="17,14.95;18,19.05"/>
432
+ </dia:attribute>
433
+ <dia:attribute name="conn_endpoints">
434
+ <dia:point val="17.5,15"/>
435
+ <dia:point val="17.5,19"/>
436
+ </dia:attribute>
437
+ <dia:attribute name="numcp">
438
+ <dia:int val="1"/>
439
+ </dia:attribute>
440
+ <dia:attribute name="end_arrow">
441
+ <dia:enum val="22"/>
442
+ </dia:attribute>
443
+ <dia:attribute name="end_arrow_length">
444
+ <dia:real val="0.5"/>
445
+ </dia:attribute>
446
+ <dia:attribute name="end_arrow_width">
447
+ <dia:real val="0.5"/>
448
+ </dia:attribute>
449
+ </dia:object>
450
+ <dia:object type="Standard - PolyLine" version="0" id="O14">
451
+ <dia:attribute name="obj_pos">
452
+ <dia:point val="8,13"/>
453
+ </dia:attribute>
454
+ <dia:attribute name="obj_bb">
455
+ <dia:rectangle val="7.95,1.5;15.05,13.05"/>
456
+ </dia:attribute>
457
+ <dia:attribute name="poly_points">
458
+ <dia:point val="8,13"/>
459
+ <dia:point val="8,2"/>
460
+ <dia:point val="15,2"/>
461
+ </dia:attribute>
462
+ <dia:attribute name="end_arrow">
463
+ <dia:enum val="22"/>
464
+ </dia:attribute>
465
+ <dia:attribute name="end_arrow_length">
466
+ <dia:real val="0.5"/>
467
+ </dia:attribute>
468
+ <dia:attribute name="end_arrow_width">
469
+ <dia:real val="0.5"/>
470
+ </dia:attribute>
471
+ </dia:object>
472
+ <dia:group>
473
+ <dia:object type="Standard - Box" version="0" id="O15">
474
+ <dia:attribute name="obj_pos">
475
+ <dia:point val="5,13"/>
476
+ </dia:attribute>
477
+ <dia:attribute name="obj_bb">
478
+ <dia:rectangle val="4.95,12.95;11.05,15.05"/>
479
+ </dia:attribute>
480
+ <dia:attribute name="elem_corner">
481
+ <dia:point val="5,13"/>
482
+ </dia:attribute>
483
+ <dia:attribute name="elem_width">
484
+ <dia:real val="6"/>
485
+ </dia:attribute>
486
+ <dia:attribute name="elem_height">
487
+ <dia:real val="2"/>
488
+ </dia:attribute>
489
+ <dia:attribute name="show_background">
490
+ <dia:boolean val="true"/>
491
+ </dia:attribute>
492
+ </dia:object>
493
+ <dia:object type="Standard - Text" version="1" id="O16">
494
+ <dia:attribute name="obj_pos">
495
+ <dia:point val="6.91375,14.0725"/>
496
+ </dia:attribute>
497
+ <dia:attribute name="obj_bb">
498
+ <dia:rectangle val="6.91375,13.53;9.08625,14.47"/>
499
+ </dia:attribute>
500
+ <dia:attribute name="text">
501
+ <dia:composite type="text">
502
+ <dia:attribute name="string">
503
+ <dia:string>#Symbol#</dia:string>
504
+ </dia:attribute>
505
+ <dia:attribute name="font">
506
+ <dia:font family="sans" style="0" name="Helvetica"/>
507
+ </dia:attribute>
508
+ <dia:attribute name="height">
509
+ <dia:real val="0.80000000000000004"/>
510
+ </dia:attribute>
511
+ <dia:attribute name="pos">
512
+ <dia:point val="6.91375,14.0725"/>
513
+ </dia:attribute>
514
+ <dia:attribute name="color">
515
+ <dia:color val="#000000"/>
516
+ </dia:attribute>
517
+ <dia:attribute name="alignment">
518
+ <dia:enum val="0"/>
519
+ </dia:attribute>
520
+ </dia:composite>
521
+ </dia:attribute>
522
+ <dia:attribute name="valign">
523
+ <dia:enum val="3"/>
524
+ </dia:attribute>
525
+ </dia:object>
526
+ </dia:group>
527
+ <dia:object type="Standard - Text" version="1" id="O17">
528
+ <dia:attribute name="obj_pos">
529
+ <dia:point val="18,12"/>
530
+ </dia:attribute>
531
+ <dia:attribute name="obj_bb">
532
+ <dia:rectangle val="18,11.4575;21.06,12.3975"/>
533
+ </dia:attribute>
534
+ <dia:attribute name="text">
535
+ <dia:composite type="text">
536
+ <dia:attribute name="string">
537
+ <dia:string>#belongs to#</dia:string>
538
+ </dia:attribute>
539
+ <dia:attribute name="font">
540
+ <dia:font family="sans" style="0" name="Helvetica"/>
541
+ </dia:attribute>
542
+ <dia:attribute name="height">
543
+ <dia:real val="0.80000000000000004"/>
544
+ </dia:attribute>
545
+ <dia:attribute name="pos">
546
+ <dia:point val="18,12"/>
547
+ </dia:attribute>
548
+ <dia:attribute name="color">
549
+ <dia:color val="#000000"/>
550
+ </dia:attribute>
551
+ <dia:attribute name="alignment">
552
+ <dia:enum val="0"/>
553
+ </dia:attribute>
554
+ </dia:composite>
555
+ </dia:attribute>
556
+ <dia:attribute name="valign">
557
+ <dia:enum val="3"/>
558
+ </dia:attribute>
559
+ </dia:object>
560
+ <dia:object type="Standard - Text" version="1" id="O18">
561
+ <dia:attribute name="obj_pos">
562
+ <dia:point val="18,6"/>
563
+ </dia:attribute>
564
+ <dia:attribute name="obj_bb">
565
+ <dia:rectangle val="18,5.4575;21.06,6.3975"/>
566
+ </dia:attribute>
567
+ <dia:attribute name="text">
568
+ <dia:composite type="text">
569
+ <dia:attribute name="string">
570
+ <dia:string>#belongs to#</dia:string>
571
+ </dia:attribute>
572
+ <dia:attribute name="font">
573
+ <dia:font family="sans" style="0" name="Helvetica"/>
574
+ </dia:attribute>
575
+ <dia:attribute name="height">
576
+ <dia:real val="0.80000000000000004"/>
577
+ </dia:attribute>
578
+ <dia:attribute name="pos">
579
+ <dia:point val="18,6"/>
580
+ </dia:attribute>
581
+ <dia:attribute name="color">
582
+ <dia:color val="#000000"/>
583
+ </dia:attribute>
584
+ <dia:attribute name="alignment">
585
+ <dia:enum val="0"/>
586
+ </dia:attribute>
587
+ </dia:composite>
588
+ </dia:attribute>
589
+ <dia:attribute name="valign">
590
+ <dia:enum val="3"/>
591
+ </dia:attribute>
592
+ </dia:object>
593
+ <dia:object type="Standard - Text" version="1" id="O19">
594
+ <dia:attribute name="obj_pos">
595
+ <dia:point val="18,16"/>
596
+ </dia:attribute>
597
+ <dia:attribute name="obj_bb">
598
+ <dia:rectangle val="18,15.4575;19.03,16.3975"/>
599
+ </dia:attribute>
600
+ <dia:attribute name="text">
601
+ <dia:composite type="text">
602
+ <dia:attribute name="string">
603
+ <dia:string>#has#</dia:string>
604
+ </dia:attribute>
605
+ <dia:attribute name="font">
606
+ <dia:font family="sans" style="0" name="Helvetica"/>
607
+ </dia:attribute>
608
+ <dia:attribute name="height">
609
+ <dia:real val="0.80000000000000004"/>
610
+ </dia:attribute>
611
+ <dia:attribute name="pos">
612
+ <dia:point val="18,16"/>
613
+ </dia:attribute>
614
+ <dia:attribute name="color">
615
+ <dia:color val="#000000"/>
616
+ </dia:attribute>
617
+ <dia:attribute name="alignment">
618
+ <dia:enum val="0"/>
619
+ </dia:attribute>
620
+ </dia:composite>
621
+ </dia:attribute>
622
+ <dia:attribute name="valign">
623
+ <dia:enum val="3"/>
624
+ </dia:attribute>
625
+ </dia:object>
626
+ <dia:object type="Standard - Text" version="1" id="O20">
627
+ <dia:attribute name="obj_pos">
628
+ <dia:point val="21,20"/>
629
+ </dia:attribute>
630
+ <dia:attribute name="obj_bb">
631
+ <dia:rectangle val="21,19.4575;24.06,20.3975"/>
632
+ </dia:attribute>
633
+ <dia:attribute name="text">
634
+ <dia:composite type="text">
635
+ <dia:attribute name="string">
636
+ <dia:string>#belongs to#</dia:string>
637
+ </dia:attribute>
638
+ <dia:attribute name="font">
639
+ <dia:font family="sans" style="0" name="Helvetica"/>
640
+ </dia:attribute>
641
+ <dia:attribute name="height">
642
+ <dia:real val="0.80000000000000004"/>
643
+ </dia:attribute>
644
+ <dia:attribute name="pos">
645
+ <dia:point val="21,20"/>
646
+ </dia:attribute>
647
+ <dia:attribute name="color">
648
+ <dia:color val="#000000"/>
649
+ </dia:attribute>
650
+ <dia:attribute name="alignment">
651
+ <dia:enum val="0"/>
652
+ </dia:attribute>
653
+ </dia:composite>
654
+ </dia:attribute>
655
+ <dia:attribute name="valign">
656
+ <dia:enum val="3"/>
657
+ </dia:attribute>
658
+ </dia:object>
659
+ <dia:object type="Standard - Text" version="1" id="O21">
660
+ <dia:attribute name="obj_pos">
661
+ <dia:point val="11,20"/>
662
+ </dia:attribute>
663
+ <dia:attribute name="obj_bb">
664
+ <dia:rectangle val="11,19.4575;14.06,20.3975"/>
665
+ </dia:attribute>
666
+ <dia:attribute name="text">
667
+ <dia:composite type="text">
668
+ <dia:attribute name="string">
669
+ <dia:string>#belongs to#</dia:string>
670
+ </dia:attribute>
671
+ <dia:attribute name="font">
672
+ <dia:font family="sans" style="0" name="Helvetica"/>
673
+ </dia:attribute>
674
+ <dia:attribute name="height">
675
+ <dia:real val="0.80000000000000004"/>
676
+ </dia:attribute>
677
+ <dia:attribute name="pos">
678
+ <dia:point val="11,20"/>
679
+ </dia:attribute>
680
+ <dia:attribute name="color">
681
+ <dia:color val="#000000"/>
682
+ </dia:attribute>
683
+ <dia:attribute name="alignment">
684
+ <dia:enum val="0"/>
685
+ </dia:attribute>
686
+ </dia:composite>
687
+ </dia:attribute>
688
+ <dia:attribute name="valign">
689
+ <dia:enum val="3"/>
690
+ </dia:attribute>
691
+ </dia:object>
692
+ <dia:object type="Standard - Text" version="1" id="O22">
693
+ <dia:attribute name="obj_pos">
694
+ <dia:point val="12,15"/>
695
+ </dia:attribute>
696
+ <dia:attribute name="obj_bb">
697
+ <dia:rectangle val="12,14.4575;15.06,15.3975"/>
698
+ </dia:attribute>
699
+ <dia:attribute name="text">
700
+ <dia:composite type="text">
701
+ <dia:attribute name="string">
702
+ <dia:string>#belongs to#</dia:string>
703
+ </dia:attribute>
704
+ <dia:attribute name="font">
705
+ <dia:font family="sans" style="0" name="Helvetica"/>
706
+ </dia:attribute>
707
+ <dia:attribute name="height">
708
+ <dia:real val="0.80000000000000004"/>
709
+ </dia:attribute>
710
+ <dia:attribute name="pos">
711
+ <dia:point val="12,15"/>
712
+ </dia:attribute>
713
+ <dia:attribute name="color">
714
+ <dia:color val="#000000"/>
715
+ </dia:attribute>
716
+ <dia:attribute name="alignment">
717
+ <dia:enum val="0"/>
718
+ </dia:attribute>
719
+ </dia:composite>
720
+ </dia:attribute>
721
+ <dia:attribute name="valign">
722
+ <dia:enum val="3"/>
723
+ </dia:attribute>
724
+ </dia:object>
725
+ <dia:object type="Standard - Text" version="1" id="O23">
726
+ <dia:attribute name="obj_pos">
727
+ <dia:point val="9,12"/>
728
+ </dia:attribute>
729
+ <dia:attribute name="obj_bb">
730
+ <dia:rectangle val="9,11.4575;12.06,12.3975"/>
731
+ </dia:attribute>
732
+ <dia:attribute name="text">
733
+ <dia:composite type="text">
734
+ <dia:attribute name="string">
735
+ <dia:string>#belongs to#</dia:string>
736
+ </dia:attribute>
737
+ <dia:attribute name="font">
738
+ <dia:font family="sans" style="0" name="Helvetica"/>
739
+ </dia:attribute>
740
+ <dia:attribute name="height">
741
+ <dia:real val="0.80000000000000004"/>
742
+ </dia:attribute>
743
+ <dia:attribute name="pos">
744
+ <dia:point val="9,12"/>
745
+ </dia:attribute>
746
+ <dia:attribute name="color">
747
+ <dia:color val="#000000"/>
748
+ </dia:attribute>
749
+ <dia:attribute name="alignment">
750
+ <dia:enum val="0"/>
751
+ </dia:attribute>
752
+ </dia:composite>
753
+ </dia:attribute>
754
+ <dia:attribute name="valign">
755
+ <dia:enum val="3"/>
756
+ </dia:attribute>
757
+ </dia:object>
758
+ <dia:object type="Standard - Text" version="1" id="O24">
759
+ <dia:attribute name="obj_pos">
760
+ <dia:point val="1,13"/>
761
+ </dia:attribute>
762
+ <dia:attribute name="obj_bb">
763
+ <dia:rectangle val="1,12.4575;10.5175,13.3975"/>
764
+ </dia:attribute>
765
+ <dia:attribute name="text">
766
+ <dia:composite type="text">
767
+ <dia:attribute name="string">
768
+ <dia:string>#(Line of Development / Branch)#</dia:string>
769
+ </dia:attribute>
770
+ <dia:attribute name="font">
771
+ <dia:font family="sans" style="0" name="Helvetica"/>
772
+ </dia:attribute>
773
+ <dia:attribute name="height">
774
+ <dia:real val="0.80000000000000004"/>
775
+ </dia:attribute>
776
+ <dia:attribute name="pos">
777
+ <dia:point val="1,13"/>
778
+ </dia:attribute>
779
+ <dia:attribute name="color">
780
+ <dia:color val="#000000"/>
781
+ </dia:attribute>
782
+ <dia:attribute name="alignment">
783
+ <dia:enum val="0"/>
784
+ </dia:attribute>
785
+ </dia:composite>
786
+ </dia:attribute>
787
+ <dia:attribute name="valign">
788
+ <dia:enum val="3"/>
789
+ </dia:attribute>
790
+ </dia:object>
791
+ </dia:group>
792
+ </dia:layer>
793
+</dia:diagram>
--- a/art/CollRev1.dia
+++ b/art/CollRev1.dia
@@ -0,0 +1,793 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/art/CollRev1.dia
+++ b/art/CollRev1.dia
@@ -0,0 +1,793 @@
1 <?xml version="1.0" encoding="UTF-8"?>
2 <dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
3 <dia:diagramdata>
4 <dia:attribute name="background">
5 <dia:color val="#ffffff"/>
6 </dia:attribute>
7 <dia:attribute name="pagebreak">
8 <dia:color val="#000099"/>
9 </dia:attribute>
10 <dia:attribute name="paper">
11 <dia:composite type="paper">
12 <dia:attribute name="name">
13 <dia:string>#Letter#</dia:string>
14 </dia:attribute>
15 <dia:attribute name="tmargin">
16 <dia:real val="2.5399999618530273"/>
17 </dia:attribute>
18 <dia:attribute name="bmargin">
19 <dia:real val="2.5399999618530273"/>
20 </dia:attribute>
21 <dia:attribute name="lmargin">
22 <dia:real val="2.5399999618530273"/>
23 </dia:attribute>
24 <dia:attribute name="rmargin">
25 <dia:real val="2.5399999618530273"/>
26 </dia:attribute>
27 <dia:attribute name="is_portrait">
28 <dia:boolean val="true"/>
29 </dia:attribute>
30 <dia:attribute name="scaling">
31 <dia:real val="1"/>
32 </dia:attribute>
33 <dia:attribute name="fitto">
34 <dia:boolean val="false"/>
35 </dia:attribute>
36 </dia:composite>
37 </dia:attribute>
38 <dia:attribute name="grid">
39 <dia:composite type="grid">
40 <dia:attribute name="width_x">
41 <dia:real val="1"/>
42 </dia:attribute>
43 <dia:attribute name="width_y">
44 <dia:real val="1"/>
45 </dia:attribute>
46 <dia:attribute name="visible_x">
47 <dia:int val="1"/>
48 </dia:attribute>
49 <dia:attribute name="visible_y">
50 <dia:int val="1"/>
51 </dia:attribute>
52 <dia:composite type="color"/>
53 </dia:composite>
54 </dia:attribute>
55 <dia:attribute name="color">
56 <dia:color val="#d8e5e5"/>
57 </dia:attribute>
58 <dia:attribute name="guides">
59 <dia:composite type="guides">
60 <dia:attribute name="hguides"/>
61 <dia:attribute name="vguides"/>
62 </dia:composite>
63 </dia:attribute>
64 </dia:diagramdata>
65 <dia:layer name="Background" visible="true">
66 <dia:group>
67 <dia:group>
68 <dia:object type="Standard - Box" version="0" id="O0">
69 <dia:attribute name="obj_pos">
70 <dia:point val="15,13"/>
71 </dia:attribute>
72 <dia:attribute name="obj_bb">
73 <dia:rectangle val="14.95,12.95;20.05,15.05"/>
74 </dia:attribute>
75 <dia:attribute name="elem_corner">
76 <dia:point val="15,13"/>
77 </dia:attribute>
78 <dia:attribute name="elem_width">
79 <dia:real val="5"/>
80 </dia:attribute>
81 <dia:attribute name="elem_height">
82 <dia:real val="2"/>
83 </dia:attribute>
84 <dia:attribute name="show_background">
85 <dia:boolean val="true"/>
86 </dia:attribute>
87 </dia:object>
88 <dia:object type="Standard - Text" version="1" id="O1">
89 <dia:attribute name="obj_pos">
90 <dia:point val="16.2733,14.064"/>
91 </dia:attribute>
92 <dia:attribute name="obj_bb">
93 <dia:rectangle val="16.2733,13.5215;18.7096,14.4615"/>
94 </dia:attribute>
95 <dia:attribute name="text">
96 <dia:composite type="text">
97 <dia:attribute name="string">
98 <dia:string>#Revision#</dia:string>
99 </dia:attribute>
100 <dia:attribute name="font">
101 <dia:font family="sans" style="0" name="Helvetica"/>
102 </dia:attribute>
103 <dia:attribute name="height">
104 <dia:real val="0.80000000000000004"/>
105 </dia:attribute>
106 <dia:attribute name="pos">
107 <dia:point val="16.2733,14.064"/>
108 </dia:attribute>
109 <dia:attribute name="color">
110 <dia:color val="#000000"/>
111 </dia:attribute>
112 <dia:attribute name="alignment">
113 <dia:enum val="0"/>
114 </dia:attribute>
115 </dia:composite>
116 </dia:attribute>
117 <dia:attribute name="valign">
118 <dia:enum val="3"/>
119 </dia:attribute>
120 </dia:object>
121 </dia:group>
122 <dia:group>
123 <dia:object type="Standard - Box" version="0" id="O2">
124 <dia:attribute name="obj_pos">
125 <dia:point val="15,7"/>
126 </dia:attribute>
127 <dia:attribute name="obj_bb">
128 <dia:rectangle val="14.95,6.95;20.05,9.05"/>
129 </dia:attribute>
130 <dia:attribute name="elem_corner">
131 <dia:point val="15,7"/>
132 </dia:attribute>
133 <dia:attribute name="elem_width">
134 <dia:real val="5"/>
135 </dia:attribute>
136 <dia:attribute name="elem_height">
137 <dia:real val="2"/>
138 </dia:attribute>
139 <dia:attribute name="show_background">
140 <dia:boolean val="true"/>
141 </dia:attribute>
142 </dia:object>
143 <dia:object type="Standard - Text" version="1" id="O3">
144 <dia:attribute name="obj_pos">
145 <dia:point val="17.0039,8.06397"/>
146 </dia:attribute>
147 <dia:attribute name="obj_bb">
148 <dia:rectangle val="17.0039,7.52147;17.979,8.46147"/>
149 </dia:attribute>
150 <dia:attribute name="text">
151 <dia:composite type="text">
152 <dia:attribute name="string">
153 <dia:string>#File#</dia:string>
154 </dia:attribute>
155 <dia:attribute name="font">
156 <dia:font family="sans" style="0" name="Helvetica"/>
157 </dia:attribute>
158 <dia:attribute name="height">
159 <dia:real val="0.80000000000000004"/>
160 </dia:attribute>
161 <dia:attribute name="pos">
162 <dia:point val="17.0039,8.06397"/>
163 </dia:attribute>
164 <dia:attribute name="color">
165 <dia:color val="#000000"/>
166 </dia:attribute>
167 <dia:attribute name="alignment">
168 <dia:enum val="0"/>
169 </dia:attribute>
170 </dia:composite>
171 </dia:attribute>
172 <dia:attribute name="valign">
173 <dia:enum val="3"/>
174 </dia:attribute>
175 </dia:object>
176 </dia:group>
177 <dia:group>
178 <dia:object type="Standard - Box" version="0" id="O4">
179 <dia:attribute name="obj_pos">
180 <dia:point val="15,1"/>
181 </dia:attribute>
182 <dia:attribute name="obj_bb">
183 <dia:rectangle val="14.95,0.95;20.05,3.05"/>
184 </dia:attribute>
185 <dia:attribute name="elem_corner">
186 <dia:point val="15,1"/>
187 </dia:attribute>
188 <dia:attribute name="elem_width">
189 <dia:real val="5"/>
190 </dia:attribute>
191 <dia:attribute name="elem_height">
192 <dia:real val="2"/>
193 </dia:attribute>
194 <dia:attribute name="show_background">
195 <dia:boolean val="true"/>
196 </dia:attribute>
197 </dia:object>
198 <dia:object type="Standard - Text" version="1" id="O5">
199 <dia:attribute name="obj_pos">
200 <dia:point val="16.4942,2.06397"/>
201 </dia:attribute>
202 <dia:attribute name="obj_bb">
203 <dia:rectangle val="16.4942,1.52147;18.4887,2.46147"/>
204 </dia:attribute>
205 <dia:attribute name="text">
206 <dia:composite type="text">
207 <dia:attribute name="string">
208 <dia:string>#Project#</dia:string>
209 </dia:attribute>
210 <dia:attribute name="font">
211 <dia:font family="sans" style="0" name="Helvetica"/>
212 </dia:attribute>
213 <dia:attribute name="height">
214 <dia:real val="0.80000000000000004"/>
215 </dia:attribute>
216 <dia:attribute name="pos">
217 <dia:point val="16.4942,2.06397"/>
218 </dia:attribute>
219 <dia:attribute name="color">
220 <dia:color val="#000000"/>
221 </dia:attribute>
222 <dia:attribute name="alignment">
223 <dia:enum val="0"/>
224 </dia:attribute>
225 </dia:composite>
226 </dia:attribute>
227 <dia:attribute name="valign">
228 <dia:enum val="3"/>
229 </dia:attribute>
230 </dia:object>
231 </dia:group>
232 <dia:object type="Standard - ZigZagLine" version="1" id="O6">
233 <dia:attribute name="obj_pos">
234 <dia:point val="17.5,13"/>
235 </dia:attribute>
236 <dia:attribute name="obj_bb">
237 <dia:rectangle val="17.45,8.92929;17.55,13"/>
238 </dia:attribute>
239 <dia:attribute name="orth_points">
240 <dia:point val="17.5,13"/>
241 <dia:point val="17.5,13"/>
242 <dia:point val="17.5,9"/>
243 <dia:point val="17.5,9"/>
244 </dia:attribute>
245 <dia:attribute name="orth_orient">
246 <dia:enum val="0"/>
247 <dia:enum val="1"/>
248 <dia:enum val="0"/>
249 </dia:attribute>
250 <dia:attribute name="autorouting">
251 <dia:boolean val="true"/>
252 </dia:attribute>
253 <dia:attribute name="end_arrow">
254 <dia:enum val="22"/>
255 </dia:attribute>
256 <dia:attribute name="end_arrow_length">
257 <dia:real val="0.5"/>
258 </dia:attribute>
259 <dia:attribute name="end_arrow_width">
260 <dia:real val="0.5"/>
261 </dia:attribute>
262 </dia:object>
263 <dia:object type="Standard - ZigZagLine" version="1" id="O7">
264 <dia:attribute name="obj_pos">
265 <dia:point val="17.5,7"/>
266 </dia:attribute>
267 <dia:attribute name="obj_bb">
268 <dia:rectangle val="17.45,2.92929;17.55,7"/>
269 </dia:attribute>
270 <dia:attribute name="orth_points">
271 <dia:point val="17.5,7"/>
272 <dia:point val="17.5,7"/>
273 <dia:point val="17.5,3"/>
274 <dia:point val="17.5,3"/>
275 </dia:attribute>
276 <dia:attribute name="orth_orient">
277 <dia:enum val="0"/>
278 <dia:enum val="1"/>
279 <dia:enum val="0"/>
280 </dia:attribute>
281 <dia:attribute name="autorouting">
282 <dia:boolean val="true"/>
283 </dia:attribute>
284 <dia:attribute name="end_arrow">
285 <dia:enum val="22"/>
286 </dia:attribute>
287 <dia:attribute name="end_arrow_length">
288 <dia:real val="0.5"/>
289 </dia:attribute>
290 <dia:attribute name="end_arrow_width">
291 <dia:real val="0.5"/>
292 </dia:attribute>
293 </dia:object>
294 <dia:group>
295 <dia:object type="Standard - Box" version="0" id="O8">
296 <dia:attribute name="obj_pos">
297 <dia:point val="15,19"/>
298 </dia:attribute>
299 <dia:attribute name="obj_bb">
300 <dia:rectangle val="14.95,18.95;20.05,21.05"/>
301 </dia:attribute>
302 <dia:attribute name="elem_corner">
303 <dia:point val="15,19"/>
304 </dia:attribute>
305 <dia:attribute name="elem_width">
306 <dia:real val="5"/>
307 </dia:attribute>
308 <dia:attribute name="elem_height">
309 <dia:real val="2"/>
310 </dia:attribute>
311 <dia:attribute name="show_background">
312 <dia:boolean val="true"/>
313 </dia:attribute>
314 </dia:object>
315 <dia:object type="Standard - Text" version="1" id="O9">
316 <dia:attribute name="obj_pos">
317 <dia:point val="16.7775,20.064"/>
318 </dia:attribute>
319 <dia:attribute name="obj_bb">
320 <dia:rectangle val="16.7775,19.5215;18.2225,20.4615"/>
321 </dia:attribute>
322 <dia:attribute name="text">
323 <dia:composite type="text">
324 <dia:attribute name="string">
325 <dia:string>#Meta#</dia:string>
326 </dia:attribute>
327 <dia:attribute name="font">
328 <dia:font family="sans" style="0" name="Helvetica"/>
329 </dia:attribute>
330 <dia:attribute name="height">
331 <dia:real val="0.80000000000000004"/>
332 </dia:attribute>
333 <dia:attribute name="pos">
334 <dia:point val="16.7775,20.064"/>
335 </dia:attribute>
336 <dia:attribute name="color">
337 <dia:color val="#000000"/>
338 </dia:attribute>
339 <dia:attribute name="alignment">
340 <dia:enum val="0"/>
341 </dia:attribute>
342 </dia:composite>
343 </dia:attribute>
344 <dia:attribute name="valign">
345 <dia:enum val="3"/>
346 </dia:attribute>
347 </dia:object>
348 </dia:group>
349 <dia:object type="Standard - PolyLine" version="0" id="O10">
350 <dia:attribute name="obj_pos">
351 <dia:point val="15,20"/>
352 </dia:attribute>
353 <dia:attribute name="obj_bb">
354 <dia:rectangle val="7.5,14.95;15.05,20.05"/>
355 </dia:attribute>
356 <dia:attribute name="poly_points">
357 <dia:point val="15,20"/>
358 <dia:point val="8,20"/>
359 <dia:point val="8,15"/>
360 </dia:attribute>
361 <dia:attribute name="end_arrow">
362 <dia:enum val="22"/>
363 </dia:attribute>
364 <dia:attribute name="end_arrow_length">
365 <dia:real val="0.5"/>
366 </dia:attribute>
367 <dia:attribute name="end_arrow_width">
368 <dia:real val="0.5"/>
369 </dia:attribute>
370 </dia:object>
371 <dia:object type="Standard - Line" version="0" id="O11">
372 <dia:attribute name="obj_pos">
373 <dia:point val="15,14"/>
374 </dia:attribute>
375 <dia:attribute name="obj_bb">
376 <dia:rectangle val="10.95,13.5;15.05,14.5"/>
377 </dia:attribute>
378 <dia:attribute name="conn_endpoints">
379 <dia:point val="15,14"/>
380 <dia:point val="11,14"/>
381 </dia:attribute>
382 <dia:attribute name="numcp">
383 <dia:int val="1"/>
384 </dia:attribute>
385 <dia:attribute name="end_arrow">
386 <dia:enum val="22"/>
387 </dia:attribute>
388 <dia:attribute name="end_arrow_length">
389 <dia:real val="0.5"/>
390 </dia:attribute>
391 <dia:attribute name="end_arrow_width">
392 <dia:real val="0.5"/>
393 </dia:attribute>
394 </dia:object>
395 <dia:object type="Standard - ZigZagLine" version="1" id="O12">
396 <dia:attribute name="obj_pos">
397 <dia:point val="20,20"/>
398 </dia:attribute>
399 <dia:attribute name="obj_bb">
400 <dia:rectangle val="19.95,1.5;27.05,20.05"/>
401 </dia:attribute>
402 <dia:attribute name="orth_points">
403 <dia:point val="20,20"/>
404 <dia:point val="27,20"/>
405 <dia:point val="27,2"/>
406 <dia:point val="20,2"/>
407 </dia:attribute>
408 <dia:attribute name="orth_orient">
409 <dia:enum val="0"/>
410 <dia:enum val="1"/>
411 <dia:enum val="0"/>
412 </dia:attribute>
413 <dia:attribute name="autorouting">
414 <dia:boolean val="false"/>
415 </dia:attribute>
416 <dia:attribute name="end_arrow">
417 <dia:enum val="22"/>
418 </dia:attribute>
419 <dia:attribute name="end_arrow_length">
420 <dia:real val="0.5"/>
421 </dia:attribute>
422 <dia:attribute name="end_arrow_width">
423 <dia:real val="0.5"/>
424 </dia:attribute>
425 </dia:object>
426 <dia:object type="Standard - Line" version="0" id="O13">
427 <dia:attribute name="obj_pos">
428 <dia:point val="17.5,15"/>
429 </dia:attribute>
430 <dia:attribute name="obj_bb">
431 <dia:rectangle val="17,14.95;18,19.05"/>
432 </dia:attribute>
433 <dia:attribute name="conn_endpoints">
434 <dia:point val="17.5,15"/>
435 <dia:point val="17.5,19"/>
436 </dia:attribute>
437 <dia:attribute name="numcp">
438 <dia:int val="1"/>
439 </dia:attribute>
440 <dia:attribute name="end_arrow">
441 <dia:enum val="22"/>
442 </dia:attribute>
443 <dia:attribute name="end_arrow_length">
444 <dia:real val="0.5"/>
445 </dia:attribute>
446 <dia:attribute name="end_arrow_width">
447 <dia:real val="0.5"/>
448 </dia:attribute>
449 </dia:object>
450 <dia:object type="Standard - PolyLine" version="0" id="O14">
451 <dia:attribute name="obj_pos">
452 <dia:point val="8,13"/>
453 </dia:attribute>
454 <dia:attribute name="obj_bb">
455 <dia:rectangle val="7.95,1.5;15.05,13.05"/>
456 </dia:attribute>
457 <dia:attribute name="poly_points">
458 <dia:point val="8,13"/>
459 <dia:point val="8,2"/>
460 <dia:point val="15,2"/>
461 </dia:attribute>
462 <dia:attribute name="end_arrow">
463 <dia:enum val="22"/>
464 </dia:attribute>
465 <dia:attribute name="end_arrow_length">
466 <dia:real val="0.5"/>
467 </dia:attribute>
468 <dia:attribute name="end_arrow_width">
469 <dia:real val="0.5"/>
470 </dia:attribute>
471 </dia:object>
472 <dia:group>
473 <dia:object type="Standard - Box" version="0" id="O15">
474 <dia:attribute name="obj_pos">
475 <dia:point val="5,13"/>
476 </dia:attribute>
477 <dia:attribute name="obj_bb">
478 <dia:rectangle val="4.95,12.95;11.05,15.05"/>
479 </dia:attribute>
480 <dia:attribute name="elem_corner">
481 <dia:point val="5,13"/>
482 </dia:attribute>
483 <dia:attribute name="elem_width">
484 <dia:real val="6"/>
485 </dia:attribute>
486 <dia:attribute name="elem_height">
487 <dia:real val="2"/>
488 </dia:attribute>
489 <dia:attribute name="show_background">
490 <dia:boolean val="true"/>
491 </dia:attribute>
492 </dia:object>
493 <dia:object type="Standard - Text" version="1" id="O16">
494 <dia:attribute name="obj_pos">
495 <dia:point val="6.91375,14.0725"/>
496 </dia:attribute>
497 <dia:attribute name="obj_bb">
498 <dia:rectangle val="6.91375,13.53;9.08625,14.47"/>
499 </dia:attribute>
500 <dia:attribute name="text">
501 <dia:composite type="text">
502 <dia:attribute name="string">
503 <dia:string>#Symbol#</dia:string>
504 </dia:attribute>
505 <dia:attribute name="font">
506 <dia:font family="sans" style="0" name="Helvetica"/>
507 </dia:attribute>
508 <dia:attribute name="height">
509 <dia:real val="0.80000000000000004"/>
510 </dia:attribute>
511 <dia:attribute name="pos">
512 <dia:point val="6.91375,14.0725"/>
513 </dia:attribute>
514 <dia:attribute name="color">
515 <dia:color val="#000000"/>
516 </dia:attribute>
517 <dia:attribute name="alignment">
518 <dia:enum val="0"/>
519 </dia:attribute>
520 </dia:composite>
521 </dia:attribute>
522 <dia:attribute name="valign">
523 <dia:enum val="3"/>
524 </dia:attribute>
525 </dia:object>
526 </dia:group>
527 <dia:object type="Standard - Text" version="1" id="O17">
528 <dia:attribute name="obj_pos">
529 <dia:point val="18,12"/>
530 </dia:attribute>
531 <dia:attribute name="obj_bb">
532 <dia:rectangle val="18,11.4575;21.06,12.3975"/>
533 </dia:attribute>
534 <dia:attribute name="text">
535 <dia:composite type="text">
536 <dia:attribute name="string">
537 <dia:string>#belongs to#</dia:string>
538 </dia:attribute>
539 <dia:attribute name="font">
540 <dia:font family="sans" style="0" name="Helvetica"/>
541 </dia:attribute>
542 <dia:attribute name="height">
543 <dia:real val="0.80000000000000004"/>
544 </dia:attribute>
545 <dia:attribute name="pos">
546 <dia:point val="18,12"/>
547 </dia:attribute>
548 <dia:attribute name="color">
549 <dia:color val="#000000"/>
550 </dia:attribute>
551 <dia:attribute name="alignment">
552 <dia:enum val="0"/>
553 </dia:attribute>
554 </dia:composite>
555 </dia:attribute>
556 <dia:attribute name="valign">
557 <dia:enum val="3"/>
558 </dia:attribute>
559 </dia:object>
560 <dia:object type="Standard - Text" version="1" id="O18">
561 <dia:attribute name="obj_pos">
562 <dia:point val="18,6"/>
563 </dia:attribute>
564 <dia:attribute name="obj_bb">
565 <dia:rectangle val="18,5.4575;21.06,6.3975"/>
566 </dia:attribute>
567 <dia:attribute name="text">
568 <dia:composite type="text">
569 <dia:attribute name="string">
570 <dia:string>#belongs to#</dia:string>
571 </dia:attribute>
572 <dia:attribute name="font">
573 <dia:font family="sans" style="0" name="Helvetica"/>
574 </dia:attribute>
575 <dia:attribute name="height">
576 <dia:real val="0.80000000000000004"/>
577 </dia:attribute>
578 <dia:attribute name="pos">
579 <dia:point val="18,6"/>
580 </dia:attribute>
581 <dia:attribute name="color">
582 <dia:color val="#000000"/>
583 </dia:attribute>
584 <dia:attribute name="alignment">
585 <dia:enum val="0"/>
586 </dia:attribute>
587 </dia:composite>
588 </dia:attribute>
589 <dia:attribute name="valign">
590 <dia:enum val="3"/>
591 </dia:attribute>
592 </dia:object>
593 <dia:object type="Standard - Text" version="1" id="O19">
594 <dia:attribute name="obj_pos">
595 <dia:point val="18,16"/>
596 </dia:attribute>
597 <dia:attribute name="obj_bb">
598 <dia:rectangle val="18,15.4575;19.03,16.3975"/>
599 </dia:attribute>
600 <dia:attribute name="text">
601 <dia:composite type="text">
602 <dia:attribute name="string">
603 <dia:string>#has#</dia:string>
604 </dia:attribute>
605 <dia:attribute name="font">
606 <dia:font family="sans" style="0" name="Helvetica"/>
607 </dia:attribute>
608 <dia:attribute name="height">
609 <dia:real val="0.80000000000000004"/>
610 </dia:attribute>
611 <dia:attribute name="pos">
612 <dia:point val="18,16"/>
613 </dia:attribute>
614 <dia:attribute name="color">
615 <dia:color val="#000000"/>
616 </dia:attribute>
617 <dia:attribute name="alignment">
618 <dia:enum val="0"/>
619 </dia:attribute>
620 </dia:composite>
621 </dia:attribute>
622 <dia:attribute name="valign">
623 <dia:enum val="3"/>
624 </dia:attribute>
625 </dia:object>
626 <dia:object type="Standard - Text" version="1" id="O20">
627 <dia:attribute name="obj_pos">
628 <dia:point val="21,20"/>
629 </dia:attribute>
630 <dia:attribute name="obj_bb">
631 <dia:rectangle val="21,19.4575;24.06,20.3975"/>
632 </dia:attribute>
633 <dia:attribute name="text">
634 <dia:composite type="text">
635 <dia:attribute name="string">
636 <dia:string>#belongs to#</dia:string>
637 </dia:attribute>
638 <dia:attribute name="font">
639 <dia:font family="sans" style="0" name="Helvetica"/>
640 </dia:attribute>
641 <dia:attribute name="height">
642 <dia:real val="0.80000000000000004"/>
643 </dia:attribute>
644 <dia:attribute name="pos">
645 <dia:point val="21,20"/>
646 </dia:attribute>
647 <dia:attribute name="color">
648 <dia:color val="#000000"/>
649 </dia:attribute>
650 <dia:attribute name="alignment">
651 <dia:enum val="0"/>
652 </dia:attribute>
653 </dia:composite>
654 </dia:attribute>
655 <dia:attribute name="valign">
656 <dia:enum val="3"/>
657 </dia:attribute>
658 </dia:object>
659 <dia:object type="Standard - Text" version="1" id="O21">
660 <dia:attribute name="obj_pos">
661 <dia:point val="11,20"/>
662 </dia:attribute>
663 <dia:attribute name="obj_bb">
664 <dia:rectangle val="11,19.4575;14.06,20.3975"/>
665 </dia:attribute>
666 <dia:attribute name="text">
667 <dia:composite type="text">
668 <dia:attribute name="string">
669 <dia:string>#belongs to#</dia:string>
670 </dia:attribute>
671 <dia:attribute name="font">
672 <dia:font family="sans" style="0" name="Helvetica"/>
673 </dia:attribute>
674 <dia:attribute name="height">
675 <dia:real val="0.80000000000000004"/>
676 </dia:attribute>
677 <dia:attribute name="pos">
678 <dia:point val="11,20"/>
679 </dia:attribute>
680 <dia:attribute name="color">
681 <dia:color val="#000000"/>
682 </dia:attribute>
683 <dia:attribute name="alignment">
684 <dia:enum val="0"/>
685 </dia:attribute>
686 </dia:composite>
687 </dia:attribute>
688 <dia:attribute name="valign">
689 <dia:enum val="3"/>
690 </dia:attribute>
691 </dia:object>
692 <dia:object type="Standard - Text" version="1" id="O22">
693 <dia:attribute name="obj_pos">
694 <dia:point val="12,15"/>
695 </dia:attribute>
696 <dia:attribute name="obj_bb">
697 <dia:rectangle val="12,14.4575;15.06,15.3975"/>
698 </dia:attribute>
699 <dia:attribute name="text">
700 <dia:composite type="text">
701 <dia:attribute name="string">
702 <dia:string>#belongs to#</dia:string>
703 </dia:attribute>
704 <dia:attribute name="font">
705 <dia:font family="sans" style="0" name="Helvetica"/>
706 </dia:attribute>
707 <dia:attribute name="height">
708 <dia:real val="0.80000000000000004"/>
709 </dia:attribute>
710 <dia:attribute name="pos">
711 <dia:point val="12,15"/>
712 </dia:attribute>
713 <dia:attribute name="color">
714 <dia:color val="#000000"/>
715 </dia:attribute>
716 <dia:attribute name="alignment">
717 <dia:enum val="0"/>
718 </dia:attribute>
719 </dia:composite>
720 </dia:attribute>
721 <dia:attribute name="valign">
722 <dia:enum val="3"/>
723 </dia:attribute>
724 </dia:object>
725 <dia:object type="Standard - Text" version="1" id="O23">
726 <dia:attribute name="obj_pos">
727 <dia:point val="9,12"/>
728 </dia:attribute>
729 <dia:attribute name="obj_bb">
730 <dia:rectangle val="9,11.4575;12.06,12.3975"/>
731 </dia:attribute>
732 <dia:attribute name="text">
733 <dia:composite type="text">
734 <dia:attribute name="string">
735 <dia:string>#belongs to#</dia:string>
736 </dia:attribute>
737 <dia:attribute name="font">
738 <dia:font family="sans" style="0" name="Helvetica"/>
739 </dia:attribute>
740 <dia:attribute name="height">
741 <dia:real val="0.80000000000000004"/>
742 </dia:attribute>
743 <dia:attribute name="pos">
744 <dia:point val="9,12"/>
745 </dia:attribute>
746 <dia:attribute name="color">
747 <dia:color val="#000000"/>
748 </dia:attribute>
749 <dia:attribute name="alignment">
750 <dia:enum val="0"/>
751 </dia:attribute>
752 </dia:composite>
753 </dia:attribute>
754 <dia:attribute name="valign">
755 <dia:enum val="3"/>
756 </dia:attribute>
757 </dia:object>
758 <dia:object type="Standard - Text" version="1" id="O24">
759 <dia:attribute name="obj_pos">
760 <dia:point val="1,13"/>
761 </dia:attribute>
762 <dia:attribute name="obj_bb">
763 <dia:rectangle val="1,12.4575;10.5175,13.3975"/>
764 </dia:attribute>
765 <dia:attribute name="text">
766 <dia:composite type="text">
767 <dia:attribute name="string">
768 <dia:string>#(Line of Development / Branch)#</dia:string>
769 </dia:attribute>
770 <dia:attribute name="font">
771 <dia:font family="sans" style="0" name="Helvetica"/>
772 </dia:attribute>
773 <dia:attribute name="height">
774 <dia:real val="0.80000000000000004"/>
775 </dia:attribute>
776 <dia:attribute name="pos">
777 <dia:point val="1,13"/>
778 </dia:attribute>
779 <dia:attribute name="color">
780 <dia:color val="#000000"/>
781 </dia:attribute>
782 <dia:attribute name="alignment">
783 <dia:enum val="0"/>
784 </dia:attribute>
785 </dia:composite>
786 </dia:attribute>
787 <dia:attribute name="valign">
788 <dia:enum val="3"/>
789 </dia:attribute>
790 </dia:object>
791 </dia:group>
792 </dia:layer>
793 </dia:diagram>
--- a/art/CollRev2.dia
+++ b/art/CollRev2.dia
@@ -0,0 +1,576 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
3
+ <dia:diagramdata>
4
+ <dia:attribute name="background">
5
+ <dia:color val="#ffffff"/>
6
+ </dia:attribute>
7
+ <dia:attribute name="pagebreak">
8
+ <dia:color val="#000099"/>
9
+ </dia:attribute>
10
+ <dia:attribute name="paper">
11
+ <dia:composite type="paper">
12
+ <dia:attribute name="name">
13
+ <dia:string>#Letter#</dia:string>
14
+ </dia:attribute>
15
+ <dia:attribute name="tmargin">
16
+ <dia:real val="2.5399999618530273"/>
17
+ </dia:attribute>
18
+ <dia:attribute name="bmargin">
19
+ <dia:real val="2.5399999618530273"/>
20
+ </dia:attribute>
21
+ <dia:attribute name="lmargin">
22
+ <dia:real val="2.5399999618530273"/>
23
+ </dia:attribute>
24
+ <dia:attribute name="rmargin">
25
+ <dia:real val="2.5399999618530273"/>
26
+ </dia:attribute>
27
+ <dia:attribute name="is_portrait">
28
+ <dia:boolean val="true"/>
29
+ </dia:attribute>
30
+ <dia:attribute name="scaling">
31
+ <dia:real val="1"/>
32
+ </dia:attribute>
33
+ <dia:attribute name="fitto">
34
+ <dia:boolean val="false"/>
35
+ </dia:attribute>
36
+ </dia:composite>
37
+ </dia:attribute>
38
+ <dia:attribute name="grid">
39
+ <dia:composite type="grid">
40
+ <dia:attribute name="width_x">
41
+ <dia:real val="1"/>
42
+ </dia:attribute>
43
+ <dia:attribute name="width_y">
44
+ <dia:real val="1"/>
45
+ </dia:attribute>
46
+ <dia:attribute name="visible_x">
47
+ <dia:int val="1"/>
48
+ </dia:attribute>
49
+ <dia:attribute name="visible_y">
50
+ <dia:int val="1"/>
51
+ </dia:attribute>
52
+ <dia:composite type="color"/>
53
+ </dia:composite>
54
+ </dia:attribute>
55
+ <dia:attribute name="color">
56
+ <dia:color val="#d8e5e5"/>
57
+ </dia:attribute>
58
+ <dia:attribute name="guides">
59
+ <dia:composite type="guides">
60
+ <dia:attribute name="hguides"/>
61
+ <dia:attribute name="vguides"/>
62
+ </dia:composite>
63
+ </dia:attribute>
64
+ </dia:diagramdata>
65
+ <dia:layer name="Background" visible="true">
66
+ <dia:group>
67
+ <dia:group>
68
+ <dia:object type="Standard - Box" version="0" id="O0">
69
+ <dia:attribute name="obj_pos">
70
+ <dia:point val="13,1"/>
71
+ </dia:attribute>
72
+ <dia:attribute name="obj_bb">
73
+ <dia:rectangle val="12.95,0.95;20.05,3.05"/>
74
+ </dia:attribute>
75
+ <dia:attribute name="elem_corner">
76
+ <dia:point val="13,1"/>
77
+ </dia:attribute>
78
+ <dia:attribute name="elem_width">
79
+ <dia:real val="7"/>
80
+ </dia:attribute>
81
+ <dia:attribute name="elem_height">
82
+ <dia:real val="2"/>
83
+ </dia:attribute>
84
+ <dia:attribute name="show_background">
85
+ <dia:boolean val="true"/>
86
+ </dia:attribute>
87
+ </dia:object>
88
+ <dia:object type="Standard - Text" version="1" id="O1">
89
+ <dia:attribute name="obj_pos">
90
+ <dia:point val="15.2818,2.06397"/>
91
+ </dia:attribute>
92
+ <dia:attribute name="obj_bb">
93
+ <dia:rectangle val="15.2818,1.52147;17.7182,2.46147"/>
94
+ </dia:attribute>
95
+ <dia:attribute name="text">
96
+ <dia:composite type="text">
97
+ <dia:attribute name="string">
98
+ <dia:string>#Revision#</dia:string>
99
+ </dia:attribute>
100
+ <dia:attribute name="font">
101
+ <dia:font family="sans" style="0" name="Helvetica"/>
102
+ </dia:attribute>
103
+ <dia:attribute name="height">
104
+ <dia:real val="0.80000000000000004"/>
105
+ </dia:attribute>
106
+ <dia:attribute name="pos">
107
+ <dia:point val="15.2818,2.06397"/>
108
+ </dia:attribute>
109
+ <dia:attribute name="color">
110
+ <dia:color val="#000000"/>
111
+ </dia:attribute>
112
+ <dia:attribute name="alignment">
113
+ <dia:enum val="0"/>
114
+ </dia:attribute>
115
+ </dia:composite>
116
+ </dia:attribute>
117
+ <dia:attribute name="valign">
118
+ <dia:enum val="3"/>
119
+ </dia:attribute>
120
+ </dia:object>
121
+ </dia:group>
122
+ <dia:group>
123
+ <dia:object type="Standard - Box" version="0" id="O2">
124
+ <dia:attribute name="obj_pos">
125
+ <dia:point val="13,7"/>
126
+ </dia:attribute>
127
+ <dia:attribute name="obj_bb">
128
+ <dia:rectangle val="12.95,6.95;20.05,9.05"/>
129
+ </dia:attribute>
130
+ <dia:attribute name="elem_corner">
131
+ <dia:point val="13,7"/>
132
+ </dia:attribute>
133
+ <dia:attribute name="elem_width">
134
+ <dia:real val="7"/>
135
+ </dia:attribute>
136
+ <dia:attribute name="elem_height">
137
+ <dia:real val="2"/>
138
+ </dia:attribute>
139
+ <dia:attribute name="show_background">
140
+ <dia:boolean val="true"/>
141
+ </dia:attribute>
142
+ </dia:object>
143
+ <dia:object type="Standard - Text" version="1" id="O3">
144
+ <dia:attribute name="obj_pos">
145
+ <dia:point val="14.1456,8.06397"/>
146
+ </dia:attribute>
147
+ <dia:attribute name="obj_bb">
148
+ <dia:rectangle val="14.1456,7.52147;18.8544,8.46147"/>
149
+ </dia:attribute>
150
+ <dia:attribute name="text">
151
+ <dia:composite type="text">
152
+ <dia:attribute name="string">
153
+ <dia:string>#Revision' (Child)#</dia:string>
154
+ </dia:attribute>
155
+ <dia:attribute name="font">
156
+ <dia:font family="sans" style="0" name="Helvetica"/>
157
+ </dia:attribute>
158
+ <dia:attribute name="height">
159
+ <dia:real val="0.80000000000000004"/>
160
+ </dia:attribute>
161
+ <dia:attribute name="pos">
162
+ <dia:point val="14.1456,8.06397"/>
163
+ </dia:attribute>
164
+ <dia:attribute name="color">
165
+ <dia:color val="#000000"/>
166
+ </dia:attribute>
167
+ <dia:attribute name="alignment">
168
+ <dia:enum val="0"/>
169
+ </dia:attribute>
170
+ </dia:composite>
171
+ </dia:attribute>
172
+ <dia:attribute name="valign">
173
+ <dia:enum val="3"/>
174
+ </dia:attribute>
175
+ </dia:object>
176
+ </dia:group>
177
+ <dia:group>
178
+ <dia:object type="Standard - Box" version="0" id="O4">
179
+ <dia:attribute name="obj_pos">
180
+ <dia:point val="2,2"/>
181
+ </dia:attribute>
182
+ <dia:attribute name="obj_bb">
183
+ <dia:rectangle val="1.95,1.95;9.05,4.05"/>
184
+ </dia:attribute>
185
+ <dia:attribute name="elem_corner">
186
+ <dia:point val="2,2"/>
187
+ </dia:attribute>
188
+ <dia:attribute name="elem_width">
189
+ <dia:real val="7"/>
190
+ </dia:attribute>
191
+ <dia:attribute name="elem_height">
192
+ <dia:real val="2"/>
193
+ </dia:attribute>
194
+ <dia:attribute name="show_background">
195
+ <dia:boolean val="true"/>
196
+ </dia:attribute>
197
+ </dia:object>
198
+ <dia:object type="Standard - Text" version="1" id="O5">
199
+ <dia:attribute name="obj_pos">
200
+ <dia:point val="5.00393,3.06397"/>
201
+ </dia:attribute>
202
+ <dia:attribute name="obj_bb">
203
+ <dia:rectangle val="5.00393,2.52147;5.97901,3.46147"/>
204
+ </dia:attribute>
205
+ <dia:attribute name="text">
206
+ <dia:composite type="text">
207
+ <dia:attribute name="string">
208
+ <dia:string>#File#</dia:string>
209
+ </dia:attribute>
210
+ <dia:attribute name="font">
211
+ <dia:font family="sans" style="0" name="Helvetica"/>
212
+ </dia:attribute>
213
+ <dia:attribute name="height">
214
+ <dia:real val="0.80000000000000004"/>
215
+ </dia:attribute>
216
+ <dia:attribute name="pos">
217
+ <dia:point val="5.00393,3.06397"/>
218
+ </dia:attribute>
219
+ <dia:attribute name="color">
220
+ <dia:color val="#000000"/>
221
+ </dia:attribute>
222
+ <dia:attribute name="alignment">
223
+ <dia:enum val="0"/>
224
+ </dia:attribute>
225
+ </dia:composite>
226
+ </dia:attribute>
227
+ <dia:attribute name="valign">
228
+ <dia:enum val="3"/>
229
+ </dia:attribute>
230
+ </dia:object>
231
+ </dia:group>
232
+ <dia:object type="Standard - Line" version="0" id="O6">
233
+ <dia:attribute name="obj_pos">
234
+ <dia:point val="13,8"/>
235
+ </dia:attribute>
236
+ <dia:attribute name="obj_bb">
237
+ <dia:rectangle val="8.83023,6.5028;13.0606,8.06063"/>
238
+ </dia:attribute>
239
+ <dia:attribute name="conn_endpoints">
240
+ <dia:point val="13,8"/>
241
+ <dia:point val="9,7"/>
242
+ </dia:attribute>
243
+ <dia:attribute name="numcp">
244
+ <dia:int val="1"/>
245
+ </dia:attribute>
246
+ <dia:attribute name="end_arrow">
247
+ <dia:enum val="22"/>
248
+ </dia:attribute>
249
+ <dia:attribute name="end_arrow_length">
250
+ <dia:real val="0.5"/>
251
+ </dia:attribute>
252
+ <dia:attribute name="end_arrow_width">
253
+ <dia:real val="0.5"/>
254
+ </dia:attribute>
255
+ </dia:object>
256
+ <dia:object type="Standard - Line" version="0" id="O7">
257
+ <dia:attribute name="obj_pos">
258
+ <dia:point val="13,2"/>
259
+ </dia:attribute>
260
+ <dia:attribute name="obj_bb">
261
+ <dia:rectangle val="8.83023,1.93937;13.0606,3.4972"/>
262
+ </dia:attribute>
263
+ <dia:attribute name="conn_endpoints">
264
+ <dia:point val="13,2"/>
265
+ <dia:point val="9,3"/>
266
+ </dia:attribute>
267
+ <dia:attribute name="numcp">
268
+ <dia:int val="1"/>
269
+ </dia:attribute>
270
+ <dia:attribute name="end_arrow">
271
+ <dia:enum val="22"/>
272
+ </dia:attribute>
273
+ <dia:attribute name="end_arrow_length">
274
+ <dia:real val="0.5"/>
275
+ </dia:attribute>
276
+ <dia:attribute name="end_arrow_width">
277
+ <dia:real val="0.5"/>
278
+ </dia:attribute>
279
+ </dia:object>
280
+ <dia:object type="Standard - Line" version="0" id="O8">
281
+ <dia:attribute name="obj_pos">
282
+ <dia:point val="13,2"/>
283
+ </dia:attribute>
284
+ <dia:attribute name="obj_bb">
285
+ <dia:rectangle val="8.57833,1.92972;13.0703,7.35139"/>
286
+ </dia:attribute>
287
+ <dia:attribute name="conn_endpoints">
288
+ <dia:point val="13,2"/>
289
+ <dia:point val="9,7"/>
290
+ </dia:attribute>
291
+ <dia:attribute name="numcp">
292
+ <dia:int val="1"/>
293
+ </dia:attribute>
294
+ <dia:attribute name="end_arrow">
295
+ <dia:enum val="22"/>
296
+ </dia:attribute>
297
+ <dia:attribute name="end_arrow_length">
298
+ <dia:real val="0.5"/>
299
+ </dia:attribute>
300
+ <dia:attribute name="end_arrow_width">
301
+ <dia:real val="0.5"/>
302
+ </dia:attribute>
303
+ </dia:object>
304
+ <dia:object type="Standard - Line" version="0" id="O9">
305
+ <dia:attribute name="obj_pos">
306
+ <dia:point val="13,8"/>
307
+ </dia:attribute>
308
+ <dia:attribute name="obj_bb">
309
+ <dia:rectangle val="8.57833,2.64861;13.0703,8.07028"/>
310
+ </dia:attribute>
311
+ <dia:attribute name="conn_endpoints">
312
+ <dia:point val="13,8"/>
313
+ <dia:point val="9,3"/>
314
+ </dia:attribute>
315
+ <dia:attribute name="numcp">
316
+ <dia:int val="1"/>
317
+ </dia:attribute>
318
+ <dia:attribute name="end_arrow">
319
+ <dia:enum val="22"/>
320
+ </dia:attribute>
321
+ <dia:attribute name="end_arrow_length">
322
+ <dia:real val="0.5"/>
323
+ </dia:attribute>
324
+ <dia:attribute name="end_arrow_width">
325
+ <dia:real val="0.5"/>
326
+ </dia:attribute>
327
+ </dia:object>
328
+ <dia:group>
329
+ <dia:object type="Standard - Box" version="0" id="O10">
330
+ <dia:attribute name="obj_pos">
331
+ <dia:point val="2,6"/>
332
+ </dia:attribute>
333
+ <dia:attribute name="obj_bb">
334
+ <dia:rectangle val="1.95,5.95;9.05,8.05"/>
335
+ </dia:attribute>
336
+ <dia:attribute name="elem_corner">
337
+ <dia:point val="2,6"/>
338
+ </dia:attribute>
339
+ <dia:attribute name="elem_width">
340
+ <dia:real val="7"/>
341
+ </dia:attribute>
342
+ <dia:attribute name="elem_height">
343
+ <dia:real val="2"/>
344
+ </dia:attribute>
345
+ <dia:attribute name="show_background">
346
+ <dia:boolean val="true"/>
347
+ </dia:attribute>
348
+ </dia:object>
349
+ <dia:object type="Standard - Text" version="1" id="O11">
350
+ <dia:attribute name="obj_pos">
351
+ <dia:point val="3.53147,6.6725"/>
352
+ </dia:attribute>
353
+ <dia:attribute name="obj_bb">
354
+ <dia:rectangle val="3.53147,6.13;7.45147,7.87"/>
355
+ </dia:attribute>
356
+ <dia:attribute name="text">
357
+ <dia:composite type="text">
358
+ <dia:attribute name="string">
359
+ <dia:string>#Line of
360
+Development#</dia:string>
361
+ </dia:attribute>
362
+ <dia:attribute name="font">
363
+ <dia:font family="sans" style="0" name="Helvetica"/>
364
+ </dia:attribute>
365
+ <dia:attribute name="height">
366
+ <dia:real val="0.80000000000000004"/>
367
+ </dia:attribute>
368
+ <dia:attribute name="pos">
369
+ <dia:point val="3.53147,6.6725"/>
370
+ </dia:attribute>
371
+ <dia:attribute name="color">
372
+ <dia:color val="#000000"/>
373
+ </dia:attribute>
374
+ <dia:attribute name="alignment">
375
+ <dia:enum val="0"/>
376
+ </dia:attribute>
377
+ </dia:composite>
378
+ </dia:attribute>
379
+ <dia:attribute name="valign">
380
+ <dia:enum val="3"/>
381
+ </dia:attribute>
382
+ </dia:object>
383
+ </dia:group>
384
+ <dia:object type="Standard - Text" version="1" id="O12">
385
+ <dia:attribute name="obj_pos">
386
+ <dia:point val="18,6"/>
387
+ </dia:attribute>
388
+ <dia:attribute name="obj_bb">
389
+ <dia:rectangle val="18,5.4575;20.0947,6.3975"/>
390
+ </dia:attribute>
391
+ <dia:attribute name="text">
392
+ <dia:composite type="text">
393
+ <dia:attribute name="string">
394
+ <dia:string># parent#</dia:string>
395
+ </dia:attribute>
396
+ <dia:attribute name="font">
397
+ <dia:font family="sans" style="0" name="Helvetica"/>
398
+ </dia:attribute>
399
+ <dia:attribute name="height">
400
+ <dia:real val="0.80000000000000004"/>
401
+ </dia:attribute>
402
+ <dia:attribute name="pos">
403
+ <dia:point val="18,6"/>
404
+ </dia:attribute>
405
+ <dia:attribute name="color">
406
+ <dia:color val="#000000"/>
407
+ </dia:attribute>
408
+ <dia:attribute name="alignment">
409
+ <dia:enum val="0"/>
410
+ </dia:attribute>
411
+ </dia:composite>
412
+ </dia:attribute>
413
+ <dia:attribute name="valign">
414
+ <dia:enum val="3"/>
415
+ </dia:attribute>
416
+ </dia:object>
417
+ <dia:object type="Standard - Line" version="0" id="O13">
418
+ <dia:attribute name="obj_pos">
419
+ <dia:point val="18,7"/>
420
+ </dia:attribute>
421
+ <dia:attribute name="obj_bb">
422
+ <dia:rectangle val="17.5,2.95;18.5,7.05"/>
423
+ </dia:attribute>
424
+ <dia:attribute name="conn_endpoints">
425
+ <dia:point val="18,7"/>
426
+ <dia:point val="18,3"/>
427
+ </dia:attribute>
428
+ <dia:attribute name="numcp">
429
+ <dia:int val="1"/>
430
+ </dia:attribute>
431
+ <dia:attribute name="end_arrow">
432
+ <dia:enum val="22"/>
433
+ </dia:attribute>
434
+ <dia:attribute name="end_arrow_length">
435
+ <dia:real val="0.5"/>
436
+ </dia:attribute>
437
+ <dia:attribute name="end_arrow_width">
438
+ <dia:real val="0.5"/>
439
+ </dia:attribute>
440
+ </dia:object>
441
+ <dia:group>
442
+ <dia:object type="Standard - Text" version="1" id="O14">
443
+ <dia:attribute name="obj_pos">
444
+ <dia:point val="22,7"/>
445
+ </dia:attribute>
446
+ <dia:attribute name="obj_bb">
447
+ <dia:rectangle val="22,6.4575;28.4122,8.1975"/>
448
+ </dia:attribute>
449
+ <dia:attribute name="text">
450
+ <dia:composite type="text">
451
+ <dia:attribute name="string">
452
+ <dia:string>#branch parent symbol
453
+ (NULL)#</dia:string>
454
+ </dia:attribute>
455
+ <dia:attribute name="font">
456
+ <dia:font family="sans" style="0" name="Helvetica"/>
457
+ </dia:attribute>
458
+ <dia:attribute name="height">
459
+ <dia:real val="0.80000000000000004"/>
460
+ </dia:attribute>
461
+ <dia:attribute name="pos">
462
+ <dia:point val="22,7"/>
463
+ </dia:attribute>
464
+ <dia:attribute name="color">
465
+ <dia:color val="#000000"/>
466
+ </dia:attribute>
467
+ <dia:attribute name="alignment">
468
+ <dia:enum val="0"/>
469
+ </dia:attribute>
470
+ </dia:composite>
471
+ </dia:attribute>
472
+ <dia:attribute name="valign">
473
+ <dia:enum val="3"/>
474
+ </dia:attribute>
475
+ </dia:object>
476
+ <dia:object type="Standard - Line" version="0" id="O15">
477
+ <dia:attribute name="obj_pos">
478
+ <dia:point val="20,8"/>
479
+ </dia:attribute>
480
+ <dia:attribute name="obj_bb">
481
+ <dia:rectangle val="19.95,7.5;22.05,8.5"/>
482
+ </dia:attribute>
483
+ <dia:attribute name="conn_endpoints">
484
+ <dia:point val="20,8"/>
485
+ <dia:point val="22,8"/>
486
+ </dia:attribute>
487
+ <dia:attribute name="numcp">
488
+ <dia:int val="1"/>
489
+ </dia:attribute>
490
+ <dia:attribute name="end_arrow">
491
+ <dia:enum val="22"/>
492
+ </dia:attribute>
493
+ <dia:attribute name="end_arrow_length">
494
+ <dia:real val="0.5"/>
495
+ </dia:attribute>
496
+ <dia:attribute name="end_arrow_width">
497
+ <dia:real val="0.5"/>
498
+ </dia:attribute>
499
+ </dia:object>
500
+ <dia:object type="Standard - Polygon" version="0" id="O16">
501
+ <dia:attribute name="obj_pos">
502
+ <dia:point val="23,7"/>
503
+ </dia:attribute>
504
+ <dia:attribute name="obj_bb">
505
+ <dia:rectangle val="21.9293,6.87929;23.05,9.12071"/>
506
+ </dia:attribute>
507
+ <dia:attribute name="poly_points">
508
+ <dia:point val="23,7"/>
509
+ <dia:point val="22,8"/>
510
+ <dia:point val="23,9"/>
511
+ </dia:attribute>
512
+ <dia:attribute name="show_background">
513
+ <dia:boolean val="true"/>
514
+ </dia:attribute>
515
+ </dia:object>
516
+ </dia:group>
517
+ <dia:object type="Standard - Text" version="1" id="O17">
518
+ <dia:attribute name="obj_pos">
519
+ <dia:point val="15,4"/>
520
+ </dia:attribute>
521
+ <dia:attribute name="obj_bb">
522
+ <dia:rectangle val="15,3.4575;16.57,4.3975"/>
523
+ </dia:attribute>
524
+ <dia:attribute name="text">
525
+ <dia:composite type="text">
526
+ <dia:attribute name="string">
527
+ <dia:string># child#</dia:string>
528
+ </dia:attribute>
529
+ <dia:attribute name="font">
530
+ <dia:font family="sans" style="0" name="Helvetica"/>
531
+ </dia:attribute>
532
+ <dia:attribute name="height">
533
+ <dia:real val="0.80000000000000004"/>
534
+ </dia:attribute>
535
+ <dia:attribute name="pos">
536
+ <dia:point val="15,4"/>
537
+ </dia:attribute>
538
+ <dia:attribute name="color">
539
+ <dia:color val="#000000"/>
540
+ </dia:attribute>
541
+ <dia:attribute name="alignment">
542
+ <dia:enum val="0"/>
543
+ </dia:attribute>
544
+ </dia:composite>
545
+ </dia:attribute>
546
+ <dia:attribute name="valign">
547
+ <dia:enum val="3"/>
548
+ </dia:attribute>
549
+ </dia:object>
550
+ <dia:object type="Standard - Line" version="0" id="O18">
551
+ <dia:attribute name="obj_pos">
552
+ <dia:point val="15,3"/>
553
+ </dia:attribute>
554
+ <dia:attribute name="obj_bb">
555
+ <dia:rectangle val="14.5,2.95;15.5,7.05"/>
556
+ </dia:attribute>
557
+ <dia:attribute name="conn_endpoints">
558
+ <dia:point val="15,3"/>
559
+ <dia:point val="15,7"/>
560
+ </dia:attribute>
561
+ <dia:attribute name="numcp">
562
+ <dia:int val="1"/>
563
+ </dia:attribute>
564
+ <dia:attribute name="end_arrow">
565
+ <dia:enum val="22"/>
566
+ </dia:attribute>
567
+ <dia:attribute name="end_arrow_length">
568
+ <dia:real val="0.5"/>
569
+ </dia:attribute>
570
+ <dia:attribute name="end_arrow_width">
571
+ <dia:real val="0.5"/>
572
+ </dia:attribute>
573
+ </dia:object>
574
+ </dia:group>
575
+ </dia:layer>
576
+</dia:diagram>
--- a/art/CollRev2.dia
+++ b/art/CollRev2.dia
@@ -0,0 +1,576 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/art/CollRev2.dia
+++ b/art/CollRev2.dia
@@ -0,0 +1,576 @@
1 <?xml version="1.0" encoding="UTF-8"?>
2 <dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
3 <dia:diagramdata>
4 <dia:attribute name="background">
5 <dia:color val="#ffffff"/>
6 </dia:attribute>
7 <dia:attribute name="pagebreak">
8 <dia:color val="#000099"/>
9 </dia:attribute>
10 <dia:attribute name="paper">
11 <dia:composite type="paper">
12 <dia:attribute name="name">
13 <dia:string>#Letter#</dia:string>
14 </dia:attribute>
15 <dia:attribute name="tmargin">
16 <dia:real val="2.5399999618530273"/>
17 </dia:attribute>
18 <dia:attribute name="bmargin">
19 <dia:real val="2.5399999618530273"/>
20 </dia:attribute>
21 <dia:attribute name="lmargin">
22 <dia:real val="2.5399999618530273"/>
23 </dia:attribute>
24 <dia:attribute name="rmargin">
25 <dia:real val="2.5399999618530273"/>
26 </dia:attribute>
27 <dia:attribute name="is_portrait">
28 <dia:boolean val="true"/>
29 </dia:attribute>
30 <dia:attribute name="scaling">
31 <dia:real val="1"/>
32 </dia:attribute>
33 <dia:attribute name="fitto">
34 <dia:boolean val="false"/>
35 </dia:attribute>
36 </dia:composite>
37 </dia:attribute>
38 <dia:attribute name="grid">
39 <dia:composite type="grid">
40 <dia:attribute name="width_x">
41 <dia:real val="1"/>
42 </dia:attribute>
43 <dia:attribute name="width_y">
44 <dia:real val="1"/>
45 </dia:attribute>
46 <dia:attribute name="visible_x">
47 <dia:int val="1"/>
48 </dia:attribute>
49 <dia:attribute name="visible_y">
50 <dia:int val="1"/>
51 </dia:attribute>
52 <dia:composite type="color"/>
53 </dia:composite>
54 </dia:attribute>
55 <dia:attribute name="color">
56 <dia:color val="#d8e5e5"/>
57 </dia:attribute>
58 <dia:attribute name="guides">
59 <dia:composite type="guides">
60 <dia:attribute name="hguides"/>
61 <dia:attribute name="vguides"/>
62 </dia:composite>
63 </dia:attribute>
64 </dia:diagramdata>
65 <dia:layer name="Background" visible="true">
66 <dia:group>
67 <dia:group>
68 <dia:object type="Standard - Box" version="0" id="O0">
69 <dia:attribute name="obj_pos">
70 <dia:point val="13,1"/>
71 </dia:attribute>
72 <dia:attribute name="obj_bb">
73 <dia:rectangle val="12.95,0.95;20.05,3.05"/>
74 </dia:attribute>
75 <dia:attribute name="elem_corner">
76 <dia:point val="13,1"/>
77 </dia:attribute>
78 <dia:attribute name="elem_width">
79 <dia:real val="7"/>
80 </dia:attribute>
81 <dia:attribute name="elem_height">
82 <dia:real val="2"/>
83 </dia:attribute>
84 <dia:attribute name="show_background">
85 <dia:boolean val="true"/>
86 </dia:attribute>
87 </dia:object>
88 <dia:object type="Standard - Text" version="1" id="O1">
89 <dia:attribute name="obj_pos">
90 <dia:point val="15.2818,2.06397"/>
91 </dia:attribute>
92 <dia:attribute name="obj_bb">
93 <dia:rectangle val="15.2818,1.52147;17.7182,2.46147"/>
94 </dia:attribute>
95 <dia:attribute name="text">
96 <dia:composite type="text">
97 <dia:attribute name="string">
98 <dia:string>#Revision#</dia:string>
99 </dia:attribute>
100 <dia:attribute name="font">
101 <dia:font family="sans" style="0" name="Helvetica"/>
102 </dia:attribute>
103 <dia:attribute name="height">
104 <dia:real val="0.80000000000000004"/>
105 </dia:attribute>
106 <dia:attribute name="pos">
107 <dia:point val="15.2818,2.06397"/>
108 </dia:attribute>
109 <dia:attribute name="color">
110 <dia:color val="#000000"/>
111 </dia:attribute>
112 <dia:attribute name="alignment">
113 <dia:enum val="0"/>
114 </dia:attribute>
115 </dia:composite>
116 </dia:attribute>
117 <dia:attribute name="valign">
118 <dia:enum val="3"/>
119 </dia:attribute>
120 </dia:object>
121 </dia:group>
122 <dia:group>
123 <dia:object type="Standard - Box" version="0" id="O2">
124 <dia:attribute name="obj_pos">
125 <dia:point val="13,7"/>
126 </dia:attribute>
127 <dia:attribute name="obj_bb">
128 <dia:rectangle val="12.95,6.95;20.05,9.05"/>
129 </dia:attribute>
130 <dia:attribute name="elem_corner">
131 <dia:point val="13,7"/>
132 </dia:attribute>
133 <dia:attribute name="elem_width">
134 <dia:real val="7"/>
135 </dia:attribute>
136 <dia:attribute name="elem_height">
137 <dia:real val="2"/>
138 </dia:attribute>
139 <dia:attribute name="show_background">
140 <dia:boolean val="true"/>
141 </dia:attribute>
142 </dia:object>
143 <dia:object type="Standard - Text" version="1" id="O3">
144 <dia:attribute name="obj_pos">
145 <dia:point val="14.1456,8.06397"/>
146 </dia:attribute>
147 <dia:attribute name="obj_bb">
148 <dia:rectangle val="14.1456,7.52147;18.8544,8.46147"/>
149 </dia:attribute>
150 <dia:attribute name="text">
151 <dia:composite type="text">
152 <dia:attribute name="string">
153 <dia:string>#Revision' (Child)#</dia:string>
154 </dia:attribute>
155 <dia:attribute name="font">
156 <dia:font family="sans" style="0" name="Helvetica"/>
157 </dia:attribute>
158 <dia:attribute name="height">
159 <dia:real val="0.80000000000000004"/>
160 </dia:attribute>
161 <dia:attribute name="pos">
162 <dia:point val="14.1456,8.06397"/>
163 </dia:attribute>
164 <dia:attribute name="color">
165 <dia:color val="#000000"/>
166 </dia:attribute>
167 <dia:attribute name="alignment">
168 <dia:enum val="0"/>
169 </dia:attribute>
170 </dia:composite>
171 </dia:attribute>
172 <dia:attribute name="valign">
173 <dia:enum val="3"/>
174 </dia:attribute>
175 </dia:object>
176 </dia:group>
177 <dia:group>
178 <dia:object type="Standard - Box" version="0" id="O4">
179 <dia:attribute name="obj_pos">
180 <dia:point val="2,2"/>
181 </dia:attribute>
182 <dia:attribute name="obj_bb">
183 <dia:rectangle val="1.95,1.95;9.05,4.05"/>
184 </dia:attribute>
185 <dia:attribute name="elem_corner">
186 <dia:point val="2,2"/>
187 </dia:attribute>
188 <dia:attribute name="elem_width">
189 <dia:real val="7"/>
190 </dia:attribute>
191 <dia:attribute name="elem_height">
192 <dia:real val="2"/>
193 </dia:attribute>
194 <dia:attribute name="show_background">
195 <dia:boolean val="true"/>
196 </dia:attribute>
197 </dia:object>
198 <dia:object type="Standard - Text" version="1" id="O5">
199 <dia:attribute name="obj_pos">
200 <dia:point val="5.00393,3.06397"/>
201 </dia:attribute>
202 <dia:attribute name="obj_bb">
203 <dia:rectangle val="5.00393,2.52147;5.97901,3.46147"/>
204 </dia:attribute>
205 <dia:attribute name="text">
206 <dia:composite type="text">
207 <dia:attribute name="string">
208 <dia:string>#File#</dia:string>
209 </dia:attribute>
210 <dia:attribute name="font">
211 <dia:font family="sans" style="0" name="Helvetica"/>
212 </dia:attribute>
213 <dia:attribute name="height">
214 <dia:real val="0.80000000000000004"/>
215 </dia:attribute>
216 <dia:attribute name="pos">
217 <dia:point val="5.00393,3.06397"/>
218 </dia:attribute>
219 <dia:attribute name="color">
220 <dia:color val="#000000"/>
221 </dia:attribute>
222 <dia:attribute name="alignment">
223 <dia:enum val="0"/>
224 </dia:attribute>
225 </dia:composite>
226 </dia:attribute>
227 <dia:attribute name="valign">
228 <dia:enum val="3"/>
229 </dia:attribute>
230 </dia:object>
231 </dia:group>
232 <dia:object type="Standard - Line" version="0" id="O6">
233 <dia:attribute name="obj_pos">
234 <dia:point val="13,8"/>
235 </dia:attribute>
236 <dia:attribute name="obj_bb">
237 <dia:rectangle val="8.83023,6.5028;13.0606,8.06063"/>
238 </dia:attribute>
239 <dia:attribute name="conn_endpoints">
240 <dia:point val="13,8"/>
241 <dia:point val="9,7"/>
242 </dia:attribute>
243 <dia:attribute name="numcp">
244 <dia:int val="1"/>
245 </dia:attribute>
246 <dia:attribute name="end_arrow">
247 <dia:enum val="22"/>
248 </dia:attribute>
249 <dia:attribute name="end_arrow_length">
250 <dia:real val="0.5"/>
251 </dia:attribute>
252 <dia:attribute name="end_arrow_width">
253 <dia:real val="0.5"/>
254 </dia:attribute>
255 </dia:object>
256 <dia:object type="Standard - Line" version="0" id="O7">
257 <dia:attribute name="obj_pos">
258 <dia:point val="13,2"/>
259 </dia:attribute>
260 <dia:attribute name="obj_bb">
261 <dia:rectangle val="8.83023,1.93937;13.0606,3.4972"/>
262 </dia:attribute>
263 <dia:attribute name="conn_endpoints">
264 <dia:point val="13,2"/>
265 <dia:point val="9,3"/>
266 </dia:attribute>
267 <dia:attribute name="numcp">
268 <dia:int val="1"/>
269 </dia:attribute>
270 <dia:attribute name="end_arrow">
271 <dia:enum val="22"/>
272 </dia:attribute>
273 <dia:attribute name="end_arrow_length">
274 <dia:real val="0.5"/>
275 </dia:attribute>
276 <dia:attribute name="end_arrow_width">
277 <dia:real val="0.5"/>
278 </dia:attribute>
279 </dia:object>
280 <dia:object type="Standard - Line" version="0" id="O8">
281 <dia:attribute name="obj_pos">
282 <dia:point val="13,2"/>
283 </dia:attribute>
284 <dia:attribute name="obj_bb">
285 <dia:rectangle val="8.57833,1.92972;13.0703,7.35139"/>
286 </dia:attribute>
287 <dia:attribute name="conn_endpoints">
288 <dia:point val="13,2"/>
289 <dia:point val="9,7"/>
290 </dia:attribute>
291 <dia:attribute name="numcp">
292 <dia:int val="1"/>
293 </dia:attribute>
294 <dia:attribute name="end_arrow">
295 <dia:enum val="22"/>
296 </dia:attribute>
297 <dia:attribute name="end_arrow_length">
298 <dia:real val="0.5"/>
299 </dia:attribute>
300 <dia:attribute name="end_arrow_width">
301 <dia:real val="0.5"/>
302 </dia:attribute>
303 </dia:object>
304 <dia:object type="Standard - Line" version="0" id="O9">
305 <dia:attribute name="obj_pos">
306 <dia:point val="13,8"/>
307 </dia:attribute>
308 <dia:attribute name="obj_bb">
309 <dia:rectangle val="8.57833,2.64861;13.0703,8.07028"/>
310 </dia:attribute>
311 <dia:attribute name="conn_endpoints">
312 <dia:point val="13,8"/>
313 <dia:point val="9,3"/>
314 </dia:attribute>
315 <dia:attribute name="numcp">
316 <dia:int val="1"/>
317 </dia:attribute>
318 <dia:attribute name="end_arrow">
319 <dia:enum val="22"/>
320 </dia:attribute>
321 <dia:attribute name="end_arrow_length">
322 <dia:real val="0.5"/>
323 </dia:attribute>
324 <dia:attribute name="end_arrow_width">
325 <dia:real val="0.5"/>
326 </dia:attribute>
327 </dia:object>
328 <dia:group>
329 <dia:object type="Standard - Box" version="0" id="O10">
330 <dia:attribute name="obj_pos">
331 <dia:point val="2,6"/>
332 </dia:attribute>
333 <dia:attribute name="obj_bb">
334 <dia:rectangle val="1.95,5.95;9.05,8.05"/>
335 </dia:attribute>
336 <dia:attribute name="elem_corner">
337 <dia:point val="2,6"/>
338 </dia:attribute>
339 <dia:attribute name="elem_width">
340 <dia:real val="7"/>
341 </dia:attribute>
342 <dia:attribute name="elem_height">
343 <dia:real val="2"/>
344 </dia:attribute>
345 <dia:attribute name="show_background">
346 <dia:boolean val="true"/>
347 </dia:attribute>
348 </dia:object>
349 <dia:object type="Standard - Text" version="1" id="O11">
350 <dia:attribute name="obj_pos">
351 <dia:point val="3.53147,6.6725"/>
352 </dia:attribute>
353 <dia:attribute name="obj_bb">
354 <dia:rectangle val="3.53147,6.13;7.45147,7.87"/>
355 </dia:attribute>
356 <dia:attribute name="text">
357 <dia:composite type="text">
358 <dia:attribute name="string">
359 <dia:string>#Line of
360 Development#</dia:string>
361 </dia:attribute>
362 <dia:attribute name="font">
363 <dia:font family="sans" style="0" name="Helvetica"/>
364 </dia:attribute>
365 <dia:attribute name="height">
366 <dia:real val="0.80000000000000004"/>
367 </dia:attribute>
368 <dia:attribute name="pos">
369 <dia:point val="3.53147,6.6725"/>
370 </dia:attribute>
371 <dia:attribute name="color">
372 <dia:color val="#000000"/>
373 </dia:attribute>
374 <dia:attribute name="alignment">
375 <dia:enum val="0"/>
376 </dia:attribute>
377 </dia:composite>
378 </dia:attribute>
379 <dia:attribute name="valign">
380 <dia:enum val="3"/>
381 </dia:attribute>
382 </dia:object>
383 </dia:group>
384 <dia:object type="Standard - Text" version="1" id="O12">
385 <dia:attribute name="obj_pos">
386 <dia:point val="18,6"/>
387 </dia:attribute>
388 <dia:attribute name="obj_bb">
389 <dia:rectangle val="18,5.4575;20.0947,6.3975"/>
390 </dia:attribute>
391 <dia:attribute name="text">
392 <dia:composite type="text">
393 <dia:attribute name="string">
394 <dia:string># parent#</dia:string>
395 </dia:attribute>
396 <dia:attribute name="font">
397 <dia:font family="sans" style="0" name="Helvetica"/>
398 </dia:attribute>
399 <dia:attribute name="height">
400 <dia:real val="0.80000000000000004"/>
401 </dia:attribute>
402 <dia:attribute name="pos">
403 <dia:point val="18,6"/>
404 </dia:attribute>
405 <dia:attribute name="color">
406 <dia:color val="#000000"/>
407 </dia:attribute>
408 <dia:attribute name="alignment">
409 <dia:enum val="0"/>
410 </dia:attribute>
411 </dia:composite>
412 </dia:attribute>
413 <dia:attribute name="valign">
414 <dia:enum val="3"/>
415 </dia:attribute>
416 </dia:object>
417 <dia:object type="Standard - Line" version="0" id="O13">
418 <dia:attribute name="obj_pos">
419 <dia:point val="18,7"/>
420 </dia:attribute>
421 <dia:attribute name="obj_bb">
422 <dia:rectangle val="17.5,2.95;18.5,7.05"/>
423 </dia:attribute>
424 <dia:attribute name="conn_endpoints">
425 <dia:point val="18,7"/>
426 <dia:point val="18,3"/>
427 </dia:attribute>
428 <dia:attribute name="numcp">
429 <dia:int val="1"/>
430 </dia:attribute>
431 <dia:attribute name="end_arrow">
432 <dia:enum val="22"/>
433 </dia:attribute>
434 <dia:attribute name="end_arrow_length">
435 <dia:real val="0.5"/>
436 </dia:attribute>
437 <dia:attribute name="end_arrow_width">
438 <dia:real val="0.5"/>
439 </dia:attribute>
440 </dia:object>
441 <dia:group>
442 <dia:object type="Standard - Text" version="1" id="O14">
443 <dia:attribute name="obj_pos">
444 <dia:point val="22,7"/>
445 </dia:attribute>
446 <dia:attribute name="obj_bb">
447 <dia:rectangle val="22,6.4575;28.4122,8.1975"/>
448 </dia:attribute>
449 <dia:attribute name="text">
450 <dia:composite type="text">
451 <dia:attribute name="string">
452 <dia:string>#branch parent symbol
453 (NULL)#</dia:string>
454 </dia:attribute>
455 <dia:attribute name="font">
456 <dia:font family="sans" style="0" name="Helvetica"/>
457 </dia:attribute>
458 <dia:attribute name="height">
459 <dia:real val="0.80000000000000004"/>
460 </dia:attribute>
461 <dia:attribute name="pos">
462 <dia:point val="22,7"/>
463 </dia:attribute>
464 <dia:attribute name="color">
465 <dia:color val="#000000"/>
466 </dia:attribute>
467 <dia:attribute name="alignment">
468 <dia:enum val="0"/>
469 </dia:attribute>
470 </dia:composite>
471 </dia:attribute>
472 <dia:attribute name="valign">
473 <dia:enum val="3"/>
474 </dia:attribute>
475 </dia:object>
476 <dia:object type="Standard - Line" version="0" id="O15">
477 <dia:attribute name="obj_pos">
478 <dia:point val="20,8"/>
479 </dia:attribute>
480 <dia:attribute name="obj_bb">
481 <dia:rectangle val="19.95,7.5;22.05,8.5"/>
482 </dia:attribute>
483 <dia:attribute name="conn_endpoints">
484 <dia:point val="20,8"/>
485 <dia:point val="22,8"/>
486 </dia:attribute>
487 <dia:attribute name="numcp">
488 <dia:int val="1"/>
489 </dia:attribute>
490 <dia:attribute name="end_arrow">
491 <dia:enum val="22"/>
492 </dia:attribute>
493 <dia:attribute name="end_arrow_length">
494 <dia:real val="0.5"/>
495 </dia:attribute>
496 <dia:attribute name="end_arrow_width">
497 <dia:real val="0.5"/>
498 </dia:attribute>
499 </dia:object>
500 <dia:object type="Standard - Polygon" version="0" id="O16">
501 <dia:attribute name="obj_pos">
502 <dia:point val="23,7"/>
503 </dia:attribute>
504 <dia:attribute name="obj_bb">
505 <dia:rectangle val="21.9293,6.87929;23.05,9.12071"/>
506 </dia:attribute>
507 <dia:attribute name="poly_points">
508 <dia:point val="23,7"/>
509 <dia:point val="22,8"/>
510 <dia:point val="23,9"/>
511 </dia:attribute>
512 <dia:attribute name="show_background">
513 <dia:boolean val="true"/>
514 </dia:attribute>
515 </dia:object>
516 </dia:group>
517 <dia:object type="Standard - Text" version="1" id="O17">
518 <dia:attribute name="obj_pos">
519 <dia:point val="15,4"/>
520 </dia:attribute>
521 <dia:attribute name="obj_bb">
522 <dia:rectangle val="15,3.4575;16.57,4.3975"/>
523 </dia:attribute>
524 <dia:attribute name="text">
525 <dia:composite type="text">
526 <dia:attribute name="string">
527 <dia:string># child#</dia:string>
528 </dia:attribute>
529 <dia:attribute name="font">
530 <dia:font family="sans" style="0" name="Helvetica"/>
531 </dia:attribute>
532 <dia:attribute name="height">
533 <dia:real val="0.80000000000000004"/>
534 </dia:attribute>
535 <dia:attribute name="pos">
536 <dia:point val="15,4"/>
537 </dia:attribute>
538 <dia:attribute name="color">
539 <dia:color val="#000000"/>
540 </dia:attribute>
541 <dia:attribute name="alignment">
542 <dia:enum val="0"/>
543 </dia:attribute>
544 </dia:composite>
545 </dia:attribute>
546 <dia:attribute name="valign">
547 <dia:enum val="3"/>
548 </dia:attribute>
549 </dia:object>
550 <dia:object type="Standard - Line" version="0" id="O18">
551 <dia:attribute name="obj_pos">
552 <dia:point val="15,3"/>
553 </dia:attribute>
554 <dia:attribute name="obj_bb">
555 <dia:rectangle val="14.5,2.95;15.5,7.05"/>
556 </dia:attribute>
557 <dia:attribute name="conn_endpoints">
558 <dia:point val="15,3"/>
559 <dia:point val="15,7"/>
560 </dia:attribute>
561 <dia:attribute name="numcp">
562 <dia:int val="1"/>
563 </dia:attribute>
564 <dia:attribute name="end_arrow">
565 <dia:enum val="22"/>
566 </dia:attribute>
567 <dia:attribute name="end_arrow_length">
568 <dia:real val="0.5"/>
569 </dia:attribute>
570 <dia:attribute name="end_arrow_width">
571 <dia:real val="0.5"/>
572 </dia:attribute>
573 </dia:object>
574 </dia:group>
575 </dia:layer>
576 </dia:diagram>
--- a/art/CollRev3.dia
+++ b/art/CollRev3.dia
@@ -0,0 +1,18 @@
1
+<?xml version="1.0" encoding="UTF
2
+6,15"/>
3
+ </dia:attribute>
4
+ <dia:attribute name="a:object>
5
+ </dia::attribute name="string">
6
+ <dia:string># child#</dia:string>
7
+ </dia:attribute>
8
+ <dia:attribute name="font">
9
+ <dia:font family="sans" style="0" name="Helvetica"/>
10
+ </dia:attribute>
11
+ <dia:attribute name="height">
12
+ <dia:real val="0.80000000000000004"/>
13
+ </dia:attribute>
14
+ <dia:attribute6">
15
+ <dia:attribute name="obj_pos">
16
+ <dia:point val="19 <dia:attribute name="obj_pos">
17
+ <dia:point val="18,9"/>
18
+
--- a/art/CollRev3.dia
+++ b/art/CollRev3.dia
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/art/CollRev3.dia
+++ b/art/CollRev3.dia
@@ -0,0 +1,18 @@
1 <?xml version="1.0" encoding="UTF
2 6,15"/>
3 </dia:attribute>
4 <dia:attribute name="a:object>
5 </dia::attribute name="string">
6 <dia:string># child#</dia:string>
7 </dia:attribute>
8 <dia:attribute name="font">
9 <dia:font family="sans" style="0" name="Helvetica"/>
10 </dia:attribute>
11 <dia:attribute name="height">
12 <dia:real val="0.80000000000000004"/>
13 </dia:attribute>
14 <dia:attribute6">
15 <dia:attribute name="obj_pos">
16 <dia:point val="19 <dia:attribute name="obj_pos">
17 <dia:point val="18,9"/>
18
--- a/art/CollRev4.dia
+++ b/art/CollRev4.dia
@@ -0,0 +1,590 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
3
+ <dia:diagramdata>
4
+ <dia:attribute name="background">
5
+ <dia:color val="#ffffff"/>
6
+ </dia:attribute>
7
+ <dia:attribute name="pagebreak">
8
+ <dia:color val="#000099"/>
9
+ </dia:attribute>
10
+ <dia:attribute name="paper">
11
+ <dia:composite type="paper">
12
+ <dia:attribute name="name">
13
+ <dia:string>#Letter#</dia:string>
14
+ </dia:attribute>
15
+ <dia:attribute name="tmargin">
16
+ <dia:real val="2.5399999618530273"/>
17
+ </dia:attribute>
18
+ <dia:attribute name="bmargin">
19
+ <dia:real val="2.5399999618530273"/>
20
+ </dia:attribute>
21
+ <dia:attribute name="lmargin">
22
+ <dia:real val="2.5399999618530273"/>
23
+ </dia:attribute>
24
+ <dia:attribute name="rmargin">
25
+ <dia:real val="2.5399999618530273"/>
26
+ </dia:attribute>
27
+ <dia:attribute name="is_portrait">
28
+ <dia:boolean val="true"/>
29
+ </dia:attribute>
30
+ <dia:attribute name="scaling">
31
+ <dia:real val="1"/>
32
+ </dia:attribute>
33
+ <dia:attribute name="fitto">
34
+ <dia:boolean val="false"/>
35
+ </dia:attribute>
36
+ </dia:composite>
37
+ </dia:attribute>
38
+ <dia:attribute name="grid">
39
+ <dia:composite type="grid">
40
+ <dia:attribute name="width_x">
41
+ <dia:real val="1"/>
42
+ </dia:attribute>
43
+ <dia:attribute name="width_y">
44
+ <dia:real val="1"/>
45
+ </dia:attribute>
46
+ <dia:attribute name="visible_x">
47
+ <dia:int val="1"/>
48
+ </dia:attribute>
49
+ <dia:attribute name="visible_y">
50
+ <dia:int val="1"/>
51
+ </dia:attribute>
52
+ <dia:composite type="color"/>
53
+ </dia:composite>
54
+ </dia:attribute>
55
+ <dia:attribute name="color">
56
+ <dia:color val="#d8e5e5"/>
57
+ </dia:attribute>
58
+ <dia:attribute name="guides">
59
+ <dia:composite type="guides">
60
+ <dia:attribute name="hguides"/>
61
+ <dia:attribute name="vguides"/>
62
+ </dia:composite>
63
+ </dia:attribute>
64
+ </dia:diagramdata>
65
+ <dia:layer name="Background" visible="true">
66
+ <dia:group>
67
+ <dia:group>
68
+ <dia:object type="Standard - Box" version="0" id="O0">
69
+ <dia:attribute name="obj_pos">
70
+ <dia:point val="3,8"/>
71
+ </dia:attribute>
72
+ <dia:attribute name="obj_bb">
73
+ <dia:rectangle val="2.95,7.95;9.05,10.05"/>
74
+ </dia:attribute>
75
+ <dia:attribute name="elem_corner">
76
+ <dia:point val="3,8"/>
77
+ </dia:attribute>
78
+ <dia:attribute name="elem_width">
79
+ <dia:real val="6"/>
80
+ </dia:attribute>
81
+ <dia:attribute name="elem_height">
82
+ <dia:real val="2"/>
83
+ </dia:attribute>
84
+ <dia:attribute name="show_background">
85
+ <dia:boolean val="true"/>
86
+ </dia:attribute>
87
+ </dia:object>
88
+ <dia:object type="Standard - Text" version="1" id="O1">
89
+ <dia:attribute name="obj_pos">
90
+ <dia:point val="4.11647,8.66397"/>
91
+ </dia:attribute>
92
+ <dia:attribute name="obj_bb">
93
+ <dia:rectangle val="4.11647,8.12147;7.86647,9.86147"/>
94
+ </dia:attribute>
95
+ <dia:attribute name="text">
96
+ <dia:composite type="text">
97
+ <dia:attribute name="string">
98
+ <dia:string>#Revision'
99
+(Child NTDB)#</dia:string>
100
+ </dia:attribute>
101
+ <dia:attribute name="font">
102
+ <dia:font family="sans" style="0" name="Helvetica"/>
103
+ </dia:attribute>
104
+ <dia:attribute name="height">
105
+ <dia:real val="0.80000000000000004"/>
106
+ </dia:attribute>
107
+ <dia:attribute name="pos">
108
+ <dia:point val="4.11647,8.66397"/>
109
+ </dia:attribute>
110
+ <dia:attribute name="color">
111
+ <dia:color val="#000000"/>
112
+ </dia:attribute>
113
+ <dia:attribute name="alignment">
114
+ <dia:enum val="0"/>
115
+ </dia:attribute>
116
+ </dia:composite>
117
+ </dia:attribute>
118
+ <dia:attribute name="valign">
119
+ <dia:enum val="3"/>
120
+ </dia:attribute>
121
+ </dia:object>
122
+ </dia:group>
123
+ <dia:group>
124
+ <dia:object type="Standard - Box" version="0" id="O2">
125
+ <dia:attribute name="obj_pos">
126
+ <dia:point val="5,1"/>
127
+ </dia:attribute>
128
+ <dia:attribute name="obj_bb">
129
+ <dia:rectangle val="4.95,0.95;11.05,3.05"/>
130
+ </dia:attribute>
131
+ <dia:attribute name="elem_corner">
132
+ <dia:point val="5,1"/>
133
+ </dia:attribute>
134
+ <dia:attribute name="elem_width">
135
+ <dia:real val="6"/>
136
+ </dia:attribute>
137
+ <dia:attribute name="elem_height">
138
+ <dia:real val="2"/>
139
+ </dia:attribute>
140
+ <dia:attribute name="show_background">
141
+ <dia:boolean val="true"/>
142
+ </dia:attribute>
143
+ </dia:object>
144
+ <dia:object type="Standard - Text" version="1" id="O3">
145
+ <dia:attribute name="obj_pos">
146
+ <dia:point val="6.78184,1.6725"/>
147
+ </dia:attribute>
148
+ <dia:attribute name="obj_bb">
149
+ <dia:rectangle val="6.78184,1.13;9.21816,2.87"/>
150
+ </dia:attribute>
151
+ <dia:attribute name="text">
152
+ <dia:composite type="text">
153
+ <dia:attribute name="string">
154
+ <dia:string>#Revision
155
+(NTDB)#</dia:string>
156
+ </dia:attribute>
157
+ <dia:attribute name="font">
158
+ <dia:font family="sans" style="0" name="Helvetica"/>
159
+ </dia:attribute>
160
+ <dia:attribute name="height">
161
+ <dia:real val="0.80000000000000004"/>
162
+ </dia:attribute>
163
+ <dia:attribute name="pos">
164
+ <dia:point val="6.78184,1.6725"/>
165
+ </dia:attribute>
166
+ <dia:attribute name="color">
167
+ <dia:color val="#000000"/>
168
+ </dia:attribute>
169
+ <dia:attribute name="alignment">
170
+ <dia:enum val="0"/>
171
+ </dia:attribute>
172
+ </dia:composite>
173
+ </dia:attribute>
174
+ <dia:attribute name="valign">
175
+ <dia:enum val="3"/>
176
+ </dia:attribute>
177
+ </dia:object>
178
+ </dia:group>
179
+ <dia:group>
180
+ <dia:object type="Standard - Box" version="0" id="O4">
181
+ <dia:attribute name="obj_pos">
182
+ <dia:point val="1,15"/>
183
+ </dia:attribute>
184
+ <dia:attribute name="obj_bb">
185
+ <dia:rectangle val="0.95,14.95;7.05,17.05"/>
186
+ </dia:attribute>
187
+ <dia:attribute name="elem_corner">
188
+ <dia:point val="1,15"/>
189
+ </dia:attribute>
190
+ <dia:attribute name="elem_width">
191
+ <dia:real val="6"/>
192
+ </dia:attribute>
193
+ <dia:attribute name="elem_height">
194
+ <dia:real val="2"/>
195
+ </dia:attribute>
196
+ <dia:attribute name="show_background">
197
+ <dia:boolean val="true"/>
198
+ </dia:attribute>
199
+ </dia:object>
200
+ <dia:object type="Standard - Text" version="1" id="O5">
201
+ <dia:attribute name="obj_pos">
202
+ <dia:point val="2.11647,15.664"/>
203
+ </dia:attribute>
204
+ <dia:attribute name="obj_bb">
205
+ <dia:rectangle val="2.11647,15.1215;5.86647,16.8615"/>
206
+ </dia:attribute>
207
+ <dia:attribute name="text">
208
+ <dia:composite type="text">
209
+ <dia:attribute name="string">
210
+ <dia:string>#Revision''
211
+(Child NTDB)#</dia:string>
212
+ </dia:attribute>
213
+ <dia:attribute name="font">
214
+ <dia:font family="sans" style="0" name="Helvetica"/>
215
+ </dia:attribute>
216
+ <dia:attribute name="height">
217
+ <dia:real val="0.80000000000000004"/>
218
+ </dia:attribute>
219
+ <dia:attribute name="pos">
220
+ <dia:point val="2.11647,15.664"/>
221
+ </dia:attribute>
222
+ <dia:attribute name="color">
223
+ <dia:color val="#000000"/>
224
+ </dia:attribute>
225
+ <dia:attribute name="alignment">
226
+ <dia:enum val="0"/>
227
+ </dia:attribute>
228
+ </dia:composite>
229
+ </dia:attribute>
230
+ <dia:attribute name="valign">
231
+ <dia:enum val="3"/>
232
+ </dia:attribute>
233
+ </dia:object>
234
+ </dia:group>
235
+ <dia:group>
236
+ <dia:object type="Standard - Box" version="0" id="O6">
237
+ <dia:attribute name="obj_pos">
238
+ <dia:point val="13,13"/>
239
+ </dia:attribute>
240
+ <dia:attribute name="obj_bb">
241
+ <dia:rectangle val="12.95,12.95;19.05,15.05"/>
242
+ </dia:attribute>
243
+ <dia:attribute name="elem_corner">
244
+ <dia:point val="13,13"/>
245
+ </dia:attribute>
246
+ <dia:attribute name="elem_width">
247
+ <dia:real val="6"/>
248
+ </dia:attribute>
249
+ <dia:attribute name="elem_height">
250
+ <dia:real val="2"/>
251
+ </dia:attribute>
252
+ <dia:attribute name="show_background">
253
+ <dia:boolean val="true"/>
254
+ </dia:attribute>
255
+ </dia:object>
256
+ <dia:object type="Standard - Text" version="1" id="O7">
257
+ <dia:attribute name="obj_pos">
258
+ <dia:point val="14.2915,13.664"/>
259
+ </dia:attribute>
260
+ <dia:attribute name="obj_bb">
261
+ <dia:rectangle val="14.2915,13.1215;17.6915,14.8615"/>
262
+ </dia:attribute>
263
+ <dia:attribute name="text">
264
+ <dia:composite type="text">
265
+ <dia:attribute name="string">
266
+ <dia:string>#Revision""
267
+(non-NTDB)#</dia:string>
268
+ </dia:attribute>
269
+ <dia:attribute name="font">
270
+ <dia:font family="sans" style="0" name="Helvetica"/>
271
+ </dia:attribute>
272
+ <dia:attribute name="height">
273
+ <dia:real val="0.80000000000000004"/>
274
+ </dia:attribute>
275
+ <dia:attribute name="pos">
276
+ <dia:point val="14.2915,13.664"/>
277
+ </dia:attribute>
278
+ <dia:attribute name="color">
279
+ <dia:color val="#000000"/>
280
+ </dia:attribute>
281
+ <dia:attribute name="alignment">
282
+ <dia:enum val="0"/>
283
+ </dia:attribute>
284
+ </dia:composite>
285
+ </dia:attribute>
286
+ <dia:attribute name="valign">
287
+ <dia:enum val="3"/>
288
+ </dia:attribute>
289
+ </dia:object>
290
+ </dia:group>
291
+ <dia:object type="Standard - Line" version="0" id="O8">
292
+ <dia:attribute name="obj_pos">
293
+ <dia:point val="8,8"/>
294
+ </dia:attribute>
295
+ <dia:attribute name="obj_bb">
296
+ <dia:rectangle val="7.93501,2.76788;10.4828,8.06499"/>
297
+ </dia:attribute>
298
+ <dia:attribute name="conn_endpoints">
299
+ <dia:point val="8,8"/>
300
+ <dia:point val="10,3"/>
301
+ </dia:attribute>
302
+ <dia:attribute name="numcp">
303
+ <dia:int val="1"/>
304
+ </dia:attribute>
305
+ <dia:attribute name="end_arrow">
306
+ <dia:enum val="22"/>
307
+ </dia:attribute>
308
+ <dia:attribute name="end_arrow_length">
309
+ <dia:real val="0.5"/>
310
+ </dia:attribute>
311
+ <dia:attribute name="end_arrow_width">
312
+ <dia:real val="0.5"/>
313
+ </dia:attribute>
314
+ </dia:object>
315
+ <dia:object type="Standard - Line" version="0" id="O9">
316
+ <dia:attribute name="obj_pos">
317
+ <dia:point val="6,3"/>
318
+ </dia:attribute>
319
+ <dia:attribute name="obj_bb">
320
+ <dia:rectangle val="3.51719,2.93501;6.06499,8.23212"/>
321
+ </dia:attribute>
322
+ <dia:attribute name="conn_endpoints">
323
+ <dia:point val="6,3"/>
324
+ <dia:point val="4,8"/>
325
+ </dia:attribute>
326
+ <dia:attribute name="numcp">
327
+ <dia:int val="1"/>
328
+ </dia:attribute>
329
+ <dia:attribute name="end_arrow">
330
+ <dia:enum val="22"/>
331
+ </dia:attribute>
332
+ <dia:attribute name="end_arrow_length">
333
+ <dia:real val="0.5"/>
334
+ </dia:attribute>
335
+ <dia:attribute name="end_arrow_width">
336
+ <dia:real val="0.5"/>
337
+ </dia:attribute>
338
+ </dia:object>
339
+ <dia:object type="Standard - Line" version="0" id="O10">
340
+ <dia:attribute name="obj_pos">
341
+ <dia:point val="4,10"/>
342
+ </dia:attribute>
343
+ <dia:attribute name="obj_bb">
344
+ <dia:rectangle val="1.51719,9.93501;4.06499,15.2321"/>
345
+ </dia:attribute>
346
+ <dia:attribute name="conn_endpoints">
347
+ <dia:point val="4,10"/>
348
+ <dia:point val="2,15"/>
349
+ </dia:attribute>
350
+ <dia:attribute name="numcp">
351
+ <dia:int val="1"/>
352
+ </dia:attribute>
353
+ <dia:attribute name="end_arrow">
354
+ <dia:enum val="22"/>
355
+ </dia:attribute>
356
+ <dia:attribute name="end_arrow_length">
357
+ <dia:real val="0.5"/>
358
+ </dia:attribute>
359
+ <dia:attribute name="end_arrow_width">
360
+ <dia:real val="0.5"/>
361
+ </dia:attribute>
362
+ </dia:object>
363
+ <dia:object type="Standard - Line" version="0" id="O11">
364
+ <dia:attribute name="obj_pos">
365
+ <dia:point val="6,15"/>
366
+ </dia:attribute>
367
+ <dia:attribute name="obj_bb">
368
+ <dia:rectangle val="5.93501,9.76788;8.48281,15.065"/>
369
+ </dia:attribute>
370
+ <dia:attribute name="conn_endpoints">
371
+ <dia:point val="6,15"/>
372
+ <dia:point val="8,10"/>
373
+ </dia:attribute>
374
+ <dia:attribute name="numcp">
375
+ <dia:int val="1"/>
376
+ </dia:attribute>
377
+ <dia:attribute name="end_arrow">
378
+ <dia:enum val="22"/>
379
+ </dia:attribute>
380
+ <dia:attribute name="end_arrow_length">
381
+ <dia:real val="0.5"/>
382
+ </dia:attribute>
383
+ <dia:attribute name="end_arrow_width">
384
+ <dia:real val="0.5"/>
385
+ </dia:attribute>
386
+ </dia:object>
387
+ <dia:object type="Standard - Line" version="0" id="O12">
388
+ <dia:attribute name="obj_pos">
389
+ <dia:point val="16,13"/>
390
+ </dia:attribute>
391
+ <dia:attribute name="obj_bb">
392
+ <dia:rectangle val="8.70852,8.54107;16.0682,13.0682"/>
393
+ </dia:attribute>
394
+ <dia:attribute name="conn_endpoints">
395
+ <dia:point val="16,13"/>
396
+ <dia:point val="9,9"/>
397
+ </dia:attribute>
398
+ <dia:attribute name="numcp">
399
+ <dia:int val="1"/>
400
+ </dia:attribute>
401
+ <dia:attribute name="end_arrow">
402
+ <dia:enum val="22"/>
403
+ </dia:attribute>
404
+ <dia:attribute name="end_arrow_length">
405
+ <dia:real val="0.5"/>
406
+ </dia:attribute>
407
+ <dia:attribute name="end_arrow_width">
408
+ <dia:real val="0.5"/>
409
+ </dia:attribute>
410
+ </dia:object>
411
+ <dia:object type="Standard - Line" version="0" id="O13">
412
+ <dia:attribute name="obj_pos">
413
+ <dia:point val="6,10"/>
414
+ </dia:attribute>
415
+ <dia:attribute name="obj_bb">
416
+ <dia:rectangle val="5.93178,9.93178;13.2915,14.4589"/>
417
+ </dia:attribute>
418
+ <dia:attribute name="conn_endpoints">
419
+ <dia:point val="6,10"/>
420
+ <dia:point val="13,14"/>
421
+ </dia:attribute>
422
+ <dia:attribute name="numcp">
423
+ <dia:int val="1"/>
424
+ </dia:attribute>
425
+ <dia:attribute name="end_arrow">
426
+ <dia:enum val="22"/>
427
+ </dia:attribute>
428
+ <dia:attribute name="end_arrow_length">
429
+ <dia:real val="0.5"/>
430
+ </dia:attribute>
431
+ <dia:attribute name="end_arrow_width">
432
+ <dia:real val="0.5"/>
433
+ </dia:attribute>
434
+ </dia:object>
435
+ <dia:object type="Standard - Text" version="1" id="O14">
436
+ <dia:attribute name="obj_pos">
437
+ <dia:point val="6,14"/>
438
+ </dia:attribute>
439
+ <dia:attribute name="obj_bb">
440
+ <dia:rectangle val="6,13.5288;8.27969,15.3987"/>
441
+ </dia:attribute>
442
+ <dia:attribute name="text">
443
+ <dia:composite type="text">
444
+ <dia:attribute name="string">
445
+ <dia:string>#
446
+ parent#</dia:string>
447
+ </dia:attribute>
448
+ <dia:attribute name="font">
449
+ <dia:font family="sans" style="0" name="Helvetica"/>
450
+ </dia:attribute>
451
+ <dia:attribute name="height">
452
+ <dia:real val="0.80000000000000004"/>
453
+ </dia:attribute>
454
+ <dia:attribute name="pos">
455
+ <dia:point val="6,14"/>
456
+ </dia:attribute>
457
+ <dia:attribute name="color">
458
+ <dia:color val="#000000"/>
459
+ </dia:attribute>
460
+ <dia:attribute name="alignment">
461
+ <dia:enum val="0"/>
462
+ </dia:attribute>
463
+ </dia:composite>
464
+ </dia:attribute>
465
+ <dia:attribute name="valign">
466
+ <dia:enum val="3"/>
467
+ </dia:attribute>
468
+ </dia:object>
469
+ <dia:object type="Standard - Text" version="1" id="O15">
470
+ <dia:attribute name="obj_pos">
471
+ <dia:point val="6,3"/>
472
+ </dia:attribute>
473
+ <dia:attribute name="obj_bb">
474
+ <dia:rectangle val="6,2.4575;7.385,4.1975"/>
475
+ </dia:attribute>
476
+ <dia:attribute name="text">
477
+ <dia:composite type="text">
478
+ <dia:attribute name="string">
479
+ <dia:string>#
480
+childe name="valign">
481
+ <dia:enum val="3"/>
482
+ </dia:attribute>
483
+ </dia:object>
484
+ <dia:object type="Standard - Text" version="1" id="O16">
485
+ <dia:attribute name="obj_pos">
486
+ <dia:point val="4,10"/>
487
+ </dia:attribute>
488
+ <dia:attribute name="obj_bb">
489
+ <dia:rectangle val="4,9.4575;5.385,11.1975"/6,3"/>
490
+ </dia:attribute>
491
+ <dia:attribute name="ia:group>
492
+ <dia:g <dia:string>#
493
+child#</dia:string>
494
+ </dia:attribute>
495
+ <dia:attribute name="font">
496
+ <dia:font family="sans" style="0" name="Helvetica"/>
497
+ </dia:attribute>
498
+ <dia:attribute name="height">
499
+ <dia:real val="0.80000000000000004"/>
500
+ </dia:attribute>
501
+ <dia:attribute name="pos">
502
+ <di6="Standard - Line" version="0" id="O11">
503
+ <dia:attribute name
504
+ <dia:point val="4,10"/>
505
+ </dia:attribute>
506
+ <dia:attribute name="obj_bb">
507
+ <dia:rectangle val="4,9.4575;5.385,11.1975"/>
508
+ </dia:attribute>
509
+ <dia:attribute name="text">
510
+ <dia:composite type="text">
511
+ <di
512
+childe name="valign">
513
+ <dia:enum val="3"/>
514
+ </dia:attribute>
515
+ </dia:object>
516
+ <dia:object type="Standard - Text" version="1" id="O16">
517
+ <dia:attribute name="obj_pos">
518
+ <dia:point val="4,10"/>
519
+ </dia:attribute>
520
+ <dia:attribute name="obj_bb">
521
+ <dia:rectangle val="4,9.4575;5.385,11.1975"/
522
+ <dia: </dia:attribute>
523
+ ia:group>
524
+ <dia:g <dia:string>#
525
+child#</dia:string>
526
+ </dia:attribute>
527
+ <dia:attribute name="font">
528
+ <dia:font family="sans" style="0" name="Helvetica"/>
529
+ </dia:attribute>
530
+ <dia:attribute name="height">
531
+ <dia:real val="0.80000000000000004"/>
532
+ </dia:attribute>
533
+ <dia:attribute name="pos">
534
+ <di7="Standard - Line" version="0" id="O11">
535
+ <dia:attribute name15,12"/>
536
+ </dia:attribute>
537
+ <dia:attribute name="obj_bb">
538
+ >
539
+ <dia:attribute name="alignment">
540
+ <dia:enum val="0"/>
541
+ </dia:attribute>
542
+ </dia:composite>
543
+ </dia:attribute>
544
+ <dia:attribute name="valign">
545
+ <dia:enum val="3"/>
546
+ </dia:attribute>
547
+ </dia:object>
548
+ <dia:object type="Standard - Text" version="1" id="O16">
549
+ <dia:attribute name="obj_pos">
550
+ <dia:point val="4,10"/>
551
+ </dia:attribute>
552
+ <dia:attribute name="obj_bb">
553
+ <dia:rectangle val="4,9.4575;5.385,11.1975"/>
554
+ </dia:attribute>
555
+ <dia:attribute name="text">
556
+ <dia:composite type="text">
557
+ <dia:attribute name="string">
558
+ <dia:string>#
559
+child#</dia:string>
560
+ </dia:attribute>
561
+ <dia:attribute name="font">
562
+ <dia:font family="sans" style="0" name="Helvetica"/>
563
+ </dia:attribute>
564
+ <dia:attribute name="height">
565
+ <dia:string>#
566
+ parent#</dia:string>
567
+ </dia:attribute>
568
+ <dia:attribute name="font">
569
+ <dia:font family="sans" style="0" name="Helvetica"/>
570
+ </dia:attribute>
571
+ <dia:attribute name="height">
572
+ <dia:real val="0.80000000000000004"/>
573
+ </dia:attribute>
574
+ <dia:attribute name="pos">
575
+ <dia:point val="8,7"/>
576
+ </dia:attribute>
577
+ <dia:attribute name="color">
578
+ <dia:color val="#000000"/>
579
+ </dia:attribute>
580
+ <dia:attribute name="alignment">
581
+ <dia:enum val="0"/>
582
+ </dia:attribute>
583
+ </dia:composite>
584
+ </dia:attribute>
585
+ <dia:attribute name="valign">
586
+ <dia:enum val="3"/>
587
+ </dia:attribute>
588
+ </dia:object>
589
+ </dia:group>
590
+ <
--- a/art/CollRev4.dia
+++ b/art/CollRev4.dia
@@ -0,0 +1,590 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/art/CollRev4.dia
+++ b/art/CollRev4.dia
@@ -0,0 +1,590 @@
1 <?xml version="1.0" encoding="UTF-8"?>
2 <dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
3 <dia:diagramdata>
4 <dia:attribute name="background">
5 <dia:color val="#ffffff"/>
6 </dia:attribute>
7 <dia:attribute name="pagebreak">
8 <dia:color val="#000099"/>
9 </dia:attribute>
10 <dia:attribute name="paper">
11 <dia:composite type="paper">
12 <dia:attribute name="name">
13 <dia:string>#Letter#</dia:string>
14 </dia:attribute>
15 <dia:attribute name="tmargin">
16 <dia:real val="2.5399999618530273"/>
17 </dia:attribute>
18 <dia:attribute name="bmargin">
19 <dia:real val="2.5399999618530273"/>
20 </dia:attribute>
21 <dia:attribute name="lmargin">
22 <dia:real val="2.5399999618530273"/>
23 </dia:attribute>
24 <dia:attribute name="rmargin">
25 <dia:real val="2.5399999618530273"/>
26 </dia:attribute>
27 <dia:attribute name="is_portrait">
28 <dia:boolean val="true"/>
29 </dia:attribute>
30 <dia:attribute name="scaling">
31 <dia:real val="1"/>
32 </dia:attribute>
33 <dia:attribute name="fitto">
34 <dia:boolean val="false"/>
35 </dia:attribute>
36 </dia:composite>
37 </dia:attribute>
38 <dia:attribute name="grid">
39 <dia:composite type="grid">
40 <dia:attribute name="width_x">
41 <dia:real val="1"/>
42 </dia:attribute>
43 <dia:attribute name="width_y">
44 <dia:real val="1"/>
45 </dia:attribute>
46 <dia:attribute name="visible_x">
47 <dia:int val="1"/>
48 </dia:attribute>
49 <dia:attribute name="visible_y">
50 <dia:int val="1"/>
51 </dia:attribute>
52 <dia:composite type="color"/>
53 </dia:composite>
54 </dia:attribute>
55 <dia:attribute name="color">
56 <dia:color val="#d8e5e5"/>
57 </dia:attribute>
58 <dia:attribute name="guides">
59 <dia:composite type="guides">
60 <dia:attribute name="hguides"/>
61 <dia:attribute name="vguides"/>
62 </dia:composite>
63 </dia:attribute>
64 </dia:diagramdata>
65 <dia:layer name="Background" visible="true">
66 <dia:group>
67 <dia:group>
68 <dia:object type="Standard - Box" version="0" id="O0">
69 <dia:attribute name="obj_pos">
70 <dia:point val="3,8"/>
71 </dia:attribute>
72 <dia:attribute name="obj_bb">
73 <dia:rectangle val="2.95,7.95;9.05,10.05"/>
74 </dia:attribute>
75 <dia:attribute name="elem_corner">
76 <dia:point val="3,8"/>
77 </dia:attribute>
78 <dia:attribute name="elem_width">
79 <dia:real val="6"/>
80 </dia:attribute>
81 <dia:attribute name="elem_height">
82 <dia:real val="2"/>
83 </dia:attribute>
84 <dia:attribute name="show_background">
85 <dia:boolean val="true"/>
86 </dia:attribute>
87 </dia:object>
88 <dia:object type="Standard - Text" version="1" id="O1">
89 <dia:attribute name="obj_pos">
90 <dia:point val="4.11647,8.66397"/>
91 </dia:attribute>
92 <dia:attribute name="obj_bb">
93 <dia:rectangle val="4.11647,8.12147;7.86647,9.86147"/>
94 </dia:attribute>
95 <dia:attribute name="text">
96 <dia:composite type="text">
97 <dia:attribute name="string">
98 <dia:string>#Revision'
99 (Child NTDB)#</dia:string>
100 </dia:attribute>
101 <dia:attribute name="font">
102 <dia:font family="sans" style="0" name="Helvetica"/>
103 </dia:attribute>
104 <dia:attribute name="height">
105 <dia:real val="0.80000000000000004"/>
106 </dia:attribute>
107 <dia:attribute name="pos">
108 <dia:point val="4.11647,8.66397"/>
109 </dia:attribute>
110 <dia:attribute name="color">
111 <dia:color val="#000000"/>
112 </dia:attribute>
113 <dia:attribute name="alignment">
114 <dia:enum val="0"/>
115 </dia:attribute>
116 </dia:composite>
117 </dia:attribute>
118 <dia:attribute name="valign">
119 <dia:enum val="3"/>
120 </dia:attribute>
121 </dia:object>
122 </dia:group>
123 <dia:group>
124 <dia:object type="Standard - Box" version="0" id="O2">
125 <dia:attribute name="obj_pos">
126 <dia:point val="5,1"/>
127 </dia:attribute>
128 <dia:attribute name="obj_bb">
129 <dia:rectangle val="4.95,0.95;11.05,3.05"/>
130 </dia:attribute>
131 <dia:attribute name="elem_corner">
132 <dia:point val="5,1"/>
133 </dia:attribute>
134 <dia:attribute name="elem_width">
135 <dia:real val="6"/>
136 </dia:attribute>
137 <dia:attribute name="elem_height">
138 <dia:real val="2"/>
139 </dia:attribute>
140 <dia:attribute name="show_background">
141 <dia:boolean val="true"/>
142 </dia:attribute>
143 </dia:object>
144 <dia:object type="Standard - Text" version="1" id="O3">
145 <dia:attribute name="obj_pos">
146 <dia:point val="6.78184,1.6725"/>
147 </dia:attribute>
148 <dia:attribute name="obj_bb">
149 <dia:rectangle val="6.78184,1.13;9.21816,2.87"/>
150 </dia:attribute>
151 <dia:attribute name="text">
152 <dia:composite type="text">
153 <dia:attribute name="string">
154 <dia:string>#Revision
155 (NTDB)#</dia:string>
156 </dia:attribute>
157 <dia:attribute name="font">
158 <dia:font family="sans" style="0" name="Helvetica"/>
159 </dia:attribute>
160 <dia:attribute name="height">
161 <dia:real val="0.80000000000000004"/>
162 </dia:attribute>
163 <dia:attribute name="pos">
164 <dia:point val="6.78184,1.6725"/>
165 </dia:attribute>
166 <dia:attribute name="color">
167 <dia:color val="#000000"/>
168 </dia:attribute>
169 <dia:attribute name="alignment">
170 <dia:enum val="0"/>
171 </dia:attribute>
172 </dia:composite>
173 </dia:attribute>
174 <dia:attribute name="valign">
175 <dia:enum val="3"/>
176 </dia:attribute>
177 </dia:object>
178 </dia:group>
179 <dia:group>
180 <dia:object type="Standard - Box" version="0" id="O4">
181 <dia:attribute name="obj_pos">
182 <dia:point val="1,15"/>
183 </dia:attribute>
184 <dia:attribute name="obj_bb">
185 <dia:rectangle val="0.95,14.95;7.05,17.05"/>
186 </dia:attribute>
187 <dia:attribute name="elem_corner">
188 <dia:point val="1,15"/>
189 </dia:attribute>
190 <dia:attribute name="elem_width">
191 <dia:real val="6"/>
192 </dia:attribute>
193 <dia:attribute name="elem_height">
194 <dia:real val="2"/>
195 </dia:attribute>
196 <dia:attribute name="show_background">
197 <dia:boolean val="true"/>
198 </dia:attribute>
199 </dia:object>
200 <dia:object type="Standard - Text" version="1" id="O5">
201 <dia:attribute name="obj_pos">
202 <dia:point val="2.11647,15.664"/>
203 </dia:attribute>
204 <dia:attribute name="obj_bb">
205 <dia:rectangle val="2.11647,15.1215;5.86647,16.8615"/>
206 </dia:attribute>
207 <dia:attribute name="text">
208 <dia:composite type="text">
209 <dia:attribute name="string">
210 <dia:string>#Revision''
211 (Child NTDB)#</dia:string>
212 </dia:attribute>
213 <dia:attribute name="font">
214 <dia:font family="sans" style="0" name="Helvetica"/>
215 </dia:attribute>
216 <dia:attribute name="height">
217 <dia:real val="0.80000000000000004"/>
218 </dia:attribute>
219 <dia:attribute name="pos">
220 <dia:point val="2.11647,15.664"/>
221 </dia:attribute>
222 <dia:attribute name="color">
223 <dia:color val="#000000"/>
224 </dia:attribute>
225 <dia:attribute name="alignment">
226 <dia:enum val="0"/>
227 </dia:attribute>
228 </dia:composite>
229 </dia:attribute>
230 <dia:attribute name="valign">
231 <dia:enum val="3"/>
232 </dia:attribute>
233 </dia:object>
234 </dia:group>
235 <dia:group>
236 <dia:object type="Standard - Box" version="0" id="O6">
237 <dia:attribute name="obj_pos">
238 <dia:point val="13,13"/>
239 </dia:attribute>
240 <dia:attribute name="obj_bb">
241 <dia:rectangle val="12.95,12.95;19.05,15.05"/>
242 </dia:attribute>
243 <dia:attribute name="elem_corner">
244 <dia:point val="13,13"/>
245 </dia:attribute>
246 <dia:attribute name="elem_width">
247 <dia:real val="6"/>
248 </dia:attribute>
249 <dia:attribute name="elem_height">
250 <dia:real val="2"/>
251 </dia:attribute>
252 <dia:attribute name="show_background">
253 <dia:boolean val="true"/>
254 </dia:attribute>
255 </dia:object>
256 <dia:object type="Standard - Text" version="1" id="O7">
257 <dia:attribute name="obj_pos">
258 <dia:point val="14.2915,13.664"/>
259 </dia:attribute>
260 <dia:attribute name="obj_bb">
261 <dia:rectangle val="14.2915,13.1215;17.6915,14.8615"/>
262 </dia:attribute>
263 <dia:attribute name="text">
264 <dia:composite type="text">
265 <dia:attribute name="string">
266 <dia:string>#Revision""
267 (non-NTDB)#</dia:string>
268 </dia:attribute>
269 <dia:attribute name="font">
270 <dia:font family="sans" style="0" name="Helvetica"/>
271 </dia:attribute>
272 <dia:attribute name="height">
273 <dia:real val="0.80000000000000004"/>
274 </dia:attribute>
275 <dia:attribute name="pos">
276 <dia:point val="14.2915,13.664"/>
277 </dia:attribute>
278 <dia:attribute name="color">
279 <dia:color val="#000000"/>
280 </dia:attribute>
281 <dia:attribute name="alignment">
282 <dia:enum val="0"/>
283 </dia:attribute>
284 </dia:composite>
285 </dia:attribute>
286 <dia:attribute name="valign">
287 <dia:enum val="3"/>
288 </dia:attribute>
289 </dia:object>
290 </dia:group>
291 <dia:object type="Standard - Line" version="0" id="O8">
292 <dia:attribute name="obj_pos">
293 <dia:point val="8,8"/>
294 </dia:attribute>
295 <dia:attribute name="obj_bb">
296 <dia:rectangle val="7.93501,2.76788;10.4828,8.06499"/>
297 </dia:attribute>
298 <dia:attribute name="conn_endpoints">
299 <dia:point val="8,8"/>
300 <dia:point val="10,3"/>
301 </dia:attribute>
302 <dia:attribute name="numcp">
303 <dia:int val="1"/>
304 </dia:attribute>
305 <dia:attribute name="end_arrow">
306 <dia:enum val="22"/>
307 </dia:attribute>
308 <dia:attribute name="end_arrow_length">
309 <dia:real val="0.5"/>
310 </dia:attribute>
311 <dia:attribute name="end_arrow_width">
312 <dia:real val="0.5"/>
313 </dia:attribute>
314 </dia:object>
315 <dia:object type="Standard - Line" version="0" id="O9">
316 <dia:attribute name="obj_pos">
317 <dia:point val="6,3"/>
318 </dia:attribute>
319 <dia:attribute name="obj_bb">
320 <dia:rectangle val="3.51719,2.93501;6.06499,8.23212"/>
321 </dia:attribute>
322 <dia:attribute name="conn_endpoints">
323 <dia:point val="6,3"/>
324 <dia:point val="4,8"/>
325 </dia:attribute>
326 <dia:attribute name="numcp">
327 <dia:int val="1"/>
328 </dia:attribute>
329 <dia:attribute name="end_arrow">
330 <dia:enum val="22"/>
331 </dia:attribute>
332 <dia:attribute name="end_arrow_length">
333 <dia:real val="0.5"/>
334 </dia:attribute>
335 <dia:attribute name="end_arrow_width">
336 <dia:real val="0.5"/>
337 </dia:attribute>
338 </dia:object>
339 <dia:object type="Standard - Line" version="0" id="O10">
340 <dia:attribute name="obj_pos">
341 <dia:point val="4,10"/>
342 </dia:attribute>
343 <dia:attribute name="obj_bb">
344 <dia:rectangle val="1.51719,9.93501;4.06499,15.2321"/>
345 </dia:attribute>
346 <dia:attribute name="conn_endpoints">
347 <dia:point val="4,10"/>
348 <dia:point val="2,15"/>
349 </dia:attribute>
350 <dia:attribute name="numcp">
351 <dia:int val="1"/>
352 </dia:attribute>
353 <dia:attribute name="end_arrow">
354 <dia:enum val="22"/>
355 </dia:attribute>
356 <dia:attribute name="end_arrow_length">
357 <dia:real val="0.5"/>
358 </dia:attribute>
359 <dia:attribute name="end_arrow_width">
360 <dia:real val="0.5"/>
361 </dia:attribute>
362 </dia:object>
363 <dia:object type="Standard - Line" version="0" id="O11">
364 <dia:attribute name="obj_pos">
365 <dia:point val="6,15"/>
366 </dia:attribute>
367 <dia:attribute name="obj_bb">
368 <dia:rectangle val="5.93501,9.76788;8.48281,15.065"/>
369 </dia:attribute>
370 <dia:attribute name="conn_endpoints">
371 <dia:point val="6,15"/>
372 <dia:point val="8,10"/>
373 </dia:attribute>
374 <dia:attribute name="numcp">
375 <dia:int val="1"/>
376 </dia:attribute>
377 <dia:attribute name="end_arrow">
378 <dia:enum val="22"/>
379 </dia:attribute>
380 <dia:attribute name="end_arrow_length">
381 <dia:real val="0.5"/>
382 </dia:attribute>
383 <dia:attribute name="end_arrow_width">
384 <dia:real val="0.5"/>
385 </dia:attribute>
386 </dia:object>
387 <dia:object type="Standard - Line" version="0" id="O12">
388 <dia:attribute name="obj_pos">
389 <dia:point val="16,13"/>
390 </dia:attribute>
391 <dia:attribute name="obj_bb">
392 <dia:rectangle val="8.70852,8.54107;16.0682,13.0682"/>
393 </dia:attribute>
394 <dia:attribute name="conn_endpoints">
395 <dia:point val="16,13"/>
396 <dia:point val="9,9"/>
397 </dia:attribute>
398 <dia:attribute name="numcp">
399 <dia:int val="1"/>
400 </dia:attribute>
401 <dia:attribute name="end_arrow">
402 <dia:enum val="22"/>
403 </dia:attribute>
404 <dia:attribute name="end_arrow_length">
405 <dia:real val="0.5"/>
406 </dia:attribute>
407 <dia:attribute name="end_arrow_width">
408 <dia:real val="0.5"/>
409 </dia:attribute>
410 </dia:object>
411 <dia:object type="Standard - Line" version="0" id="O13">
412 <dia:attribute name="obj_pos">
413 <dia:point val="6,10"/>
414 </dia:attribute>
415 <dia:attribute name="obj_bb">
416 <dia:rectangle val="5.93178,9.93178;13.2915,14.4589"/>
417 </dia:attribute>
418 <dia:attribute name="conn_endpoints">
419 <dia:point val="6,10"/>
420 <dia:point val="13,14"/>
421 </dia:attribute>
422 <dia:attribute name="numcp">
423 <dia:int val="1"/>
424 </dia:attribute>
425 <dia:attribute name="end_arrow">
426 <dia:enum val="22"/>
427 </dia:attribute>
428 <dia:attribute name="end_arrow_length">
429 <dia:real val="0.5"/>
430 </dia:attribute>
431 <dia:attribute name="end_arrow_width">
432 <dia:real val="0.5"/>
433 </dia:attribute>
434 </dia:object>
435 <dia:object type="Standard - Text" version="1" id="O14">
436 <dia:attribute name="obj_pos">
437 <dia:point val="6,14"/>
438 </dia:attribute>
439 <dia:attribute name="obj_bb">
440 <dia:rectangle val="6,13.5288;8.27969,15.3987"/>
441 </dia:attribute>
442 <dia:attribute name="text">
443 <dia:composite type="text">
444 <dia:attribute name="string">
445 <dia:string>#
446 parent#</dia:string>
447 </dia:attribute>
448 <dia:attribute name="font">
449 <dia:font family="sans" style="0" name="Helvetica"/>
450 </dia:attribute>
451 <dia:attribute name="height">
452 <dia:real val="0.80000000000000004"/>
453 </dia:attribute>
454 <dia:attribute name="pos">
455 <dia:point val="6,14"/>
456 </dia:attribute>
457 <dia:attribute name="color">
458 <dia:color val="#000000"/>
459 </dia:attribute>
460 <dia:attribute name="alignment">
461 <dia:enum val="0"/>
462 </dia:attribute>
463 </dia:composite>
464 </dia:attribute>
465 <dia:attribute name="valign">
466 <dia:enum val="3"/>
467 </dia:attribute>
468 </dia:object>
469 <dia:object type="Standard - Text" version="1" id="O15">
470 <dia:attribute name="obj_pos">
471 <dia:point val="6,3"/>
472 </dia:attribute>
473 <dia:attribute name="obj_bb">
474 <dia:rectangle val="6,2.4575;7.385,4.1975"/>
475 </dia:attribute>
476 <dia:attribute name="text">
477 <dia:composite type="text">
478 <dia:attribute name="string">
479 <dia:string>#
480 childe name="valign">
481 <dia:enum val="3"/>
482 </dia:attribute>
483 </dia:object>
484 <dia:object type="Standard - Text" version="1" id="O16">
485 <dia:attribute name="obj_pos">
486 <dia:point val="4,10"/>
487 </dia:attribute>
488 <dia:attribute name="obj_bb">
489 <dia:rectangle val="4,9.4575;5.385,11.1975"/6,3"/>
490 </dia:attribute>
491 <dia:attribute name="ia:group>
492 <dia:g <dia:string>#
493 child#</dia:string>
494 </dia:attribute>
495 <dia:attribute name="font">
496 <dia:font family="sans" style="0" name="Helvetica"/>
497 </dia:attribute>
498 <dia:attribute name="height">
499 <dia:real val="0.80000000000000004"/>
500 </dia:attribute>
501 <dia:attribute name="pos">
502 <di6="Standard - Line" version="0" id="O11">
503 <dia:attribute name
504 <dia:point val="4,10"/>
505 </dia:attribute>
506 <dia:attribute name="obj_bb">
507 <dia:rectangle val="4,9.4575;5.385,11.1975"/>
508 </dia:attribute>
509 <dia:attribute name="text">
510 <dia:composite type="text">
511 <di
512 childe name="valign">
513 <dia:enum val="3"/>
514 </dia:attribute>
515 </dia:object>
516 <dia:object type="Standard - Text" version="1" id="O16">
517 <dia:attribute name="obj_pos">
518 <dia:point val="4,10"/>
519 </dia:attribute>
520 <dia:attribute name="obj_bb">
521 <dia:rectangle val="4,9.4575;5.385,11.1975"/
522 <dia: </dia:attribute>
523 ia:group>
524 <dia:g <dia:string>#
525 child#</dia:string>
526 </dia:attribute>
527 <dia:attribute name="font">
528 <dia:font family="sans" style="0" name="Helvetica"/>
529 </dia:attribute>
530 <dia:attribute name="height">
531 <dia:real val="0.80000000000000004"/>
532 </dia:attribute>
533 <dia:attribute name="pos">
534 <di7="Standard - Line" version="0" id="O11">
535 <dia:attribute name15,12"/>
536 </dia:attribute>
537 <dia:attribute name="obj_bb">
538 >
539 <dia:attribute name="alignment">
540 <dia:enum val="0"/>
541 </dia:attribute>
542 </dia:composite>
543 </dia:attribute>
544 <dia:attribute name="valign">
545 <dia:enum val="3"/>
546 </dia:attribute>
547 </dia:object>
548 <dia:object type="Standard - Text" version="1" id="O16">
549 <dia:attribute name="obj_pos">
550 <dia:point val="4,10"/>
551 </dia:attribute>
552 <dia:attribute name="obj_bb">
553 <dia:rectangle val="4,9.4575;5.385,11.1975"/>
554 </dia:attribute>
555 <dia:attribute name="text">
556 <dia:composite type="text">
557 <dia:attribute name="string">
558 <dia:string>#
559 child#</dia:string>
560 </dia:attribute>
561 <dia:attribute name="font">
562 <dia:font family="sans" style="0" name="Helvetica"/>
563 </dia:attribute>
564 <dia:attribute name="height">
565 <dia:string>#
566 parent#</dia:string>
567 </dia:attribute>
568 <dia:attribute name="font">
569 <dia:font family="sans" style="0" name="Helvetica"/>
570 </dia:attribute>
571 <dia:attribute name="height">
572 <dia:real val="0.80000000000000004"/>
573 </dia:attribute>
574 <dia:attribute name="pos">
575 <dia:point val="8,7"/>
576 </dia:attribute>
577 <dia:attribute name="color">
578 <dia:color val="#000000"/>
579 </dia:attribute>
580 <dia:attribute name="alignment">
581 <dia:enum val="0"/>
582 </dia:attribute>
583 </dia:composite>
584 </dia:attribute>
585 <dia:attribute name="valign">
586 <dia:enum val="3"/>
587 </dia:attribute>
588 </dia:object>
589 </dia:group>
590 <
+1 -1
--- src/diff.c
+++ src/diff.c
@@ -23,11 +23,11 @@
2323
**
2424
** This file contains code used to compute a "diff" between two
2525
** text files.
2626
*/
2727
#include "config.h"
28
-#include "diff2.h"
28
+#include "diff.h"
2929
#include <assert.h>
3030
3131
3232
#if 0
3333
#define DEBUG(X) X
3434
3535
ADDED tools/cvs2fossil/cvs2fossil
3636
ADDED tools/cvs2fossil/doc/LICENSE
3737
ADDED tools/cvs2fossil/doc/README
3838
ADDED tools/cvs2fossil/lib/c2f_cyclebreaker.tcl
3939
ADDED tools/cvs2fossil/lib/c2f_file.tcl
4040
ADDED tools/cvs2fossil/lib/c2f_flodmgr.tcl
4141
ADDED tools/cvs2fossil/lib/c2f_frev.tcl
4242
ADDED tools/cvs2fossil/lib/c2f_fsym.tcl
4343
ADDED tools/cvs2fossil/lib/c2f_ftrunk.tcl
4444
ADDED tools/cvs2fossil/lib/c2f_integrity.tcl
4545
ADDED tools/cvs2fossil/lib/c2f_option.tcl
4646
ADDED tools/cvs2fossil/lib/c2f_pass.tcl
4747
ADDED tools/cvs2fossil/lib/c2f_pbreakacycle.tcl
4848
ADDED tools/cvs2fossil/lib/c2f_pbreakrcycle.tcl
4949
ADDED tools/cvs2fossil/lib/c2f_pbreakscycle.tcl
5050
ADDED tools/cvs2fossil/lib/c2f_pcollar.tcl
5151
ADDED tools/cvs2fossil/lib/c2f_pcollrev.tcl
5252
ADDED tools/cvs2fossil/lib/c2f_pcollsym.tcl
5353
ADDED tools/cvs2fossil/lib/c2f_pfiltersym.tcl
5454
ADDED tools/cvs2fossil/lib/c2f_pinitcsets.tcl
5555
ADDED tools/cvs2fossil/lib/c2f_plodmgr.tcl
5656
ADDED tools/cvs2fossil/lib/c2f_prev.tcl
5757
ADDED tools/cvs2fossil/lib/c2f_prevlink.tcl
5858
ADDED tools/cvs2fossil/lib/c2f_project.tcl
5959
ADDED tools/cvs2fossil/lib/c2f_psym.tcl
6060
ADDED tools/cvs2fossil/lib/c2f_ptrunk.tcl
6161
ADDED tools/cvs2fossil/lib/c2f_repository.tcl
6262
ADDED tools/cvs2fossil/lib/c2f_state.tcl
6363
ADDED tools/cvs2fossil/lib/cvs2fossil.tcl
6464
ADDED tools/cvs2fossil/lib/id.tcl
6565
ADDED tools/cvs2fossil/lib/log.tcl
6666
ADDED tools/cvs2fossil/lib/misc.tcl
6767
ADDED tools/cvs2fossil/lib/pkgIndex.tcl
6868
ADDED tools/cvs2fossil/lib/rcsparser.tcl
6969
ADDED tools/cvs2fossil/lib/trouble.tcl
7070
DELETED tools/import-cvs.tcl
7171
DELETED tools/lib/cvs.tcl
7272
DELETED tools/lib/cvs_cmd.tcl
7373
DELETED tools/lib/cvs_csets.tcl
7474
DELETED tools/lib/cvs_files.tcl
7575
DELETED tools/lib/cvs_timeline.tcl
7676
DELETED tools/lib/fossil.tcl
7777
DELETED tools/lib/fossil_cmd.tcl
7878
DELETED tools/lib/import_map.tcl
7979
DELETED tools/lib/import_statistics.tcl
8080
DELETED tools/lib/importcvs.tcl
8181
DELETED tools/lib/log.tcl
8282
DELETED tools/lib/pkgIndex.tcl
8383
DELETED tools/lib/rcsparser.tcl
8484
DELETED tools/lib/trouble.tcl
8585
ADDED www/CollRev1.gif
8686
ADDED www/CollRev2.gif
8787
ADDED www/CollRev3.gif
8888
ADDED www/CollRev4.gif
--- src/diff.c
+++ src/diff.c
@@ -23,11 +23,11 @@
23 **
24 ** This file contains code used to compute a "diff" between two
25 ** text files.
26 */
27 #include "config.h"
28 #include "diff2.h"
29 #include <assert.h>
30
31
32 #if 0
33 #define DEBUG(X) X
34
35 DDED tools/cvs2fossil/cvs2fossil
36 DDED tools/cvs2fossil/doc/LICENSE
37 DDED tools/cvs2fossil/doc/README
38 DDED tools/cvs2fossil/lib/c2f_cyclebreaker.tcl
39 DDED tools/cvs2fossil/lib/c2f_file.tcl
40 DDED tools/cvs2fossil/lib/c2f_flodmgr.tcl
41 DDED tools/cvs2fossil/lib/c2f_frev.tcl
42 DDED tools/cvs2fossil/lib/c2f_fsym.tcl
43 DDED tools/cvs2fossil/lib/c2f_ftrunk.tcl
44 DDED tools/cvs2fossil/lib/c2f_integrity.tcl
45 DDED tools/cvs2fossil/lib/c2f_option.tcl
46 DDED tools/cvs2fossil/lib/c2f_pass.tcl
47 DDED tools/cvs2fossil/lib/c2f_pbreakacycle.tcl
48 DDED tools/cvs2fossil/lib/c2f_pbreakrcycle.tcl
49 DDED tools/cvs2fossil/lib/c2f_pbreakscycle.tcl
50 DDED tools/cvs2fossil/lib/c2f_pcollar.tcl
51 DDED tools/cvs2fossil/lib/c2f_pcollrev.tcl
52 DDED tools/cvs2fossil/lib/c2f_pcollsym.tcl
53 DDED tools/cvs2fossil/lib/c2f_pfiltersym.tcl
54 DDED tools/cvs2fossil/lib/c2f_pinitcsets.tcl
55 DDED tools/cvs2fossil/lib/c2f_plodmgr.tcl
56 DDED tools/cvs2fossil/lib/c2f_prev.tcl
57 DDED tools/cvs2fossil/lib/c2f_prevlink.tcl
58 DDED tools/cvs2fossil/lib/c2f_project.tcl
59 DDED tools/cvs2fossil/lib/c2f_psym.tcl
60 DDED tools/cvs2fossil/lib/c2f_ptrunk.tcl
61 DDED tools/cvs2fossil/lib/c2f_repository.tcl
62 DDED tools/cvs2fossil/lib/c2f_state.tcl
63 DDED tools/cvs2fossil/lib/cvs2fossil.tcl
64 DDED tools/cvs2fossil/lib/id.tcl
65 DDED tools/cvs2fossil/lib/log.tcl
66 DDED tools/cvs2fossil/lib/misc.tcl
67 DDED tools/cvs2fossil/lib/pkgIndex.tcl
68 DDED tools/cvs2fossil/lib/rcsparser.tcl
69 DDED tools/cvs2fossil/lib/trouble.tcl
70 ELETED tools/import-cvs.tcl
71 ELETED tools/lib/cvs.tcl
72 ELETED tools/lib/cvs_cmd.tcl
73 ELETED tools/lib/cvs_csets.tcl
74 ELETED tools/lib/cvs_files.tcl
75 ELETED tools/lib/cvs_timeline.tcl
76 ELETED tools/lib/fossil.tcl
77 ELETED tools/lib/fossil_cmd.tcl
78 ELETED tools/lib/import_map.tcl
79 ELETED tools/lib/import_statistics.tcl
80 ELETED tools/lib/importcvs.tcl
81 ELETED tools/lib/log.tcl
82 ELETED tools/lib/pkgIndex.tcl
83 ELETED tools/lib/rcsparser.tcl
84 ELETED tools/lib/trouble.tcl
85 DDED www/CollRev1.gif
86 DDED www/CollRev2.gif
87 DDED www/CollRev3.gif
88 DDED www/CollRev4.gif
--- src/diff.c
+++ src/diff.c
@@ -23,11 +23,11 @@
23 **
24 ** This file contains code used to compute a "diff" between two
25 ** text files.
26 */
27 #include "config.h"
28 #include "diff.h"
29 #include <assert.h>
30
31
32 #if 0
33 #define DEBUG(X) X
34
35 DDED tools/cvs2fossil/cvs2fossil
36 DDED tools/cvs2fossil/doc/LICENSE
37 DDED tools/cvs2fossil/doc/README
38 DDED tools/cvs2fossil/lib/c2f_cyclebreaker.tcl
39 DDED tools/cvs2fossil/lib/c2f_file.tcl
40 DDED tools/cvs2fossil/lib/c2f_flodmgr.tcl
41 DDED tools/cvs2fossil/lib/c2f_frev.tcl
42 DDED tools/cvs2fossil/lib/c2f_fsym.tcl
43 DDED tools/cvs2fossil/lib/c2f_ftrunk.tcl
44 DDED tools/cvs2fossil/lib/c2f_integrity.tcl
45 DDED tools/cvs2fossil/lib/c2f_option.tcl
46 DDED tools/cvs2fossil/lib/c2f_pass.tcl
47 DDED tools/cvs2fossil/lib/c2f_pbreakacycle.tcl
48 DDED tools/cvs2fossil/lib/c2f_pbreakrcycle.tcl
49 DDED tools/cvs2fossil/lib/c2f_pbreakscycle.tcl
50 DDED tools/cvs2fossil/lib/c2f_pcollar.tcl
51 DDED tools/cvs2fossil/lib/c2f_pcollrev.tcl
52 DDED tools/cvs2fossil/lib/c2f_pcollsym.tcl
53 DDED tools/cvs2fossil/lib/c2f_pfiltersym.tcl
54 DDED tools/cvs2fossil/lib/c2f_pinitcsets.tcl
55 DDED tools/cvs2fossil/lib/c2f_plodmgr.tcl
56 DDED tools/cvs2fossil/lib/c2f_prev.tcl
57 DDED tools/cvs2fossil/lib/c2f_prevlink.tcl
58 DDED tools/cvs2fossil/lib/c2f_project.tcl
59 DDED tools/cvs2fossil/lib/c2f_psym.tcl
60 DDED tools/cvs2fossil/lib/c2f_ptrunk.tcl
61 DDED tools/cvs2fossil/lib/c2f_repository.tcl
62 DDED tools/cvs2fossil/lib/c2f_state.tcl
63 DDED tools/cvs2fossil/lib/cvs2fossil.tcl
64 DDED tools/cvs2fossil/lib/id.tcl
65 DDED tools/cvs2fossil/lib/log.tcl
66 DDED tools/cvs2fossil/lib/misc.tcl
67 DDED tools/cvs2fossil/lib/pkgIndex.tcl
68 DDED tools/cvs2fossil/lib/rcsparser.tcl
69 DDED tools/cvs2fossil/lib/trouble.tcl
70 ELETED tools/import-cvs.tcl
71 ELETED tools/lib/cvs.tcl
72 ELETED tools/lib/cvs_cmd.tcl
73 ELETED tools/lib/cvs_csets.tcl
74 ELETED tools/lib/cvs_files.tcl
75 ELETED tools/lib/cvs_timeline.tcl
76 ELETED tools/lib/fossil.tcl
77 ELETED tools/lib/fossil_cmd.tcl
78 ELETED tools/lib/import_map.tcl
79 ELETED tools/lib/import_statistics.tcl
80 ELETED tools/lib/importcvs.tcl
81 ELETED tools/lib/log.tcl
82 ELETED tools/lib/pkgIndex.tcl
83 ELETED tools/lib/rcsparser.tcl
84 ELETED tools/lib/trouble.tcl
85 DDED www/CollRev1.gif
86 DDED www/CollRev2.gif
87 DDED www/CollRev3.gif
88 DDED www/CollRev4.gif
+1 -1
--- src/diff.c
+++ src/diff.c
@@ -23,11 +23,11 @@
2323
**
2424
** This file contains code used to compute a "diff" between two
2525
** text files.
2626
*/
2727
#include "config.h"
28
-#include "diff2.h"
28
+#include "diff.h"
2929
#include <assert.h>
3030
3131
3232
#if 0
3333
#define DEBUG(X) X
3434
3535
ADDED tools/cvs2fossil/cvs2fossil
3636
ADDED tools/cvs2fossil/doc/LICENSE
3737
ADDED tools/cvs2fossil/doc/README
3838
ADDED tools/cvs2fossil/lib/c2f_cyclebreaker.tcl
3939
ADDED tools/cvs2fossil/lib/c2f_file.tcl
4040
ADDED tools/cvs2fossil/lib/c2f_flodmgr.tcl
4141
ADDED tools/cvs2fossil/lib/c2f_frev.tcl
4242
ADDED tools/cvs2fossil/lib/c2f_fsym.tcl
4343
ADDED tools/cvs2fossil/lib/c2f_ftrunk.tcl
4444
ADDED tools/cvs2fossil/lib/c2f_integrity.tcl
4545
ADDED tools/cvs2fossil/lib/c2f_option.tcl
4646
ADDED tools/cvs2fossil/lib/c2f_pass.tcl
4747
ADDED tools/cvs2fossil/lib/c2f_pbreakacycle.tcl
4848
ADDED tools/cvs2fossil/lib/c2f_pbreakrcycle.tcl
4949
ADDED tools/cvs2fossil/lib/c2f_pbreakscycle.tcl
5050
ADDED tools/cvs2fossil/lib/c2f_pcollar.tcl
5151
ADDED tools/cvs2fossil/lib/c2f_pcollrev.tcl
5252
ADDED tools/cvs2fossil/lib/c2f_pcollsym.tcl
5353
ADDED tools/cvs2fossil/lib/c2f_pfiltersym.tcl
5454
ADDED tools/cvs2fossil/lib/c2f_pinitcsets.tcl
5555
ADDED tools/cvs2fossil/lib/c2f_plodmgr.tcl
5656
ADDED tools/cvs2fossil/lib/c2f_prev.tcl
5757
ADDED tools/cvs2fossil/lib/c2f_prevlink.tcl
5858
ADDED tools/cvs2fossil/lib/c2f_project.tcl
5959
ADDED tools/cvs2fossil/lib/c2f_psym.tcl
6060
ADDED tools/cvs2fossil/lib/c2f_ptrunk.tcl
6161
ADDED tools/cvs2fossil/lib/c2f_repository.tcl
6262
ADDED tools/cvs2fossil/lib/c2f_state.tcl
6363
ADDED tools/cvs2fossil/lib/cvs2fossil.tcl
6464
ADDED tools/cvs2fossil/lib/id.tcl
6565
ADDED tools/cvs2fossil/lib/log.tcl
6666
ADDED tools/cvs2fossil/lib/misc.tcl
6767
ADDED tools/cvs2fossil/lib/pkgIndex.tcl
6868
ADDED tools/cvs2fossil/lib/rcsparser.tcl
6969
ADDED tools/cvs2fossil/lib/trouble.tcl
7070
DELETED tools/import-cvs.tcl
7171
DELETED tools/lib/cvs.tcl
7272
DELETED tools/lib/cvs_cmd.tcl
7373
DELETED tools/lib/cvs_csets.tcl
7474
DELETED tools/lib/cvs_files.tcl
7575
DELETED tools/lib/cvs_timeline.tcl
7676
DELETED tools/lib/fossil.tcl
7777
DELETED tools/lib/fossil_cmd.tcl
7878
DELETED tools/lib/import_map.tcl
7979
DELETED tools/lib/import_statistics.tcl
8080
DELETED tools/lib/importcvs.tcl
8181
DELETED tools/lib/log.tcl
8282
DELETED tools/lib/pkgIndex.tcl
8383
DELETED tools/lib/rcsparser.tcl
8484
DELETED tools/lib/trouble.tcl
8585
ADDED www/CollRev1.gif
8686
ADDED www/CollRev2.gif
8787
ADDED www/CollRev3.gif
8888
ADDED www/CollRev4.gif
--- src/diff.c
+++ src/diff.c
@@ -23,11 +23,11 @@
23 **
24 ** This file contains code used to compute a "diff" between two
25 ** text files.
26 */
27 #include "config.h"
28 #include "diff2.h"
29 #include <assert.h>
30
31
32 #if 0
33 #define DEBUG(X) X
34
35 DDED tools/cvs2fossil/cvs2fossil
36 DDED tools/cvs2fossil/doc/LICENSE
37 DDED tools/cvs2fossil/doc/README
38 DDED tools/cvs2fossil/lib/c2f_cyclebreaker.tcl
39 DDED tools/cvs2fossil/lib/c2f_file.tcl
40 DDED tools/cvs2fossil/lib/c2f_flodmgr.tcl
41 DDED tools/cvs2fossil/lib/c2f_frev.tcl
42 DDED tools/cvs2fossil/lib/c2f_fsym.tcl
43 DDED tools/cvs2fossil/lib/c2f_ftrunk.tcl
44 DDED tools/cvs2fossil/lib/c2f_integrity.tcl
45 DDED tools/cvs2fossil/lib/c2f_option.tcl
46 DDED tools/cvs2fossil/lib/c2f_pass.tcl
47 DDED tools/cvs2fossil/lib/c2f_pbreakacycle.tcl
48 DDED tools/cvs2fossil/lib/c2f_pbreakrcycle.tcl
49 DDED tools/cvs2fossil/lib/c2f_pbreakscycle.tcl
50 DDED tools/cvs2fossil/lib/c2f_pcollar.tcl
51 DDED tools/cvs2fossil/lib/c2f_pcollrev.tcl
52 DDED tools/cvs2fossil/lib/c2f_pcollsym.tcl
53 DDED tools/cvs2fossil/lib/c2f_pfiltersym.tcl
54 DDED tools/cvs2fossil/lib/c2f_pinitcsets.tcl
55 DDED tools/cvs2fossil/lib/c2f_plodmgr.tcl
56 DDED tools/cvs2fossil/lib/c2f_prev.tcl
57 DDED tools/cvs2fossil/lib/c2f_prevlink.tcl
58 DDED tools/cvs2fossil/lib/c2f_project.tcl
59 DDED tools/cvs2fossil/lib/c2f_psym.tcl
60 DDED tools/cvs2fossil/lib/c2f_ptrunk.tcl
61 DDED tools/cvs2fossil/lib/c2f_repository.tcl
62 DDED tools/cvs2fossil/lib/c2f_state.tcl
63 DDED tools/cvs2fossil/lib/cvs2fossil.tcl
64 DDED tools/cvs2fossil/lib/id.tcl
65 DDED tools/cvs2fossil/lib/log.tcl
66 DDED tools/cvs2fossil/lib/misc.tcl
67 DDED tools/cvs2fossil/lib/pkgIndex.tcl
68 DDED tools/cvs2fossil/lib/rcsparser.tcl
69 DDED tools/cvs2fossil/lib/trouble.tcl
70 ELETED tools/import-cvs.tcl
71 ELETED tools/lib/cvs.tcl
72 ELETED tools/lib/cvs_cmd.tcl
73 ELETED tools/lib/cvs_csets.tcl
74 ELETED tools/lib/cvs_files.tcl
75 ELETED tools/lib/cvs_timeline.tcl
76 ELETED tools/lib/fossil.tcl
77 ELETED tools/lib/fossil_cmd.tcl
78 ELETED tools/lib/import_map.tcl
79 ELETED tools/lib/import_statistics.tcl
80 ELETED tools/lib/importcvs.tcl
81 ELETED tools/lib/log.tcl
82 ELETED tools/lib/pkgIndex.tcl
83 ELETED tools/lib/rcsparser.tcl
84 ELETED tools/lib/trouble.tcl
85 DDED www/CollRev1.gif
86 DDED www/CollRev2.gif
87 DDED www/CollRev3.gif
88 DDED www/CollRev4.gif
--- src/diff.c
+++ src/diff.c
@@ -23,11 +23,11 @@
23 **
24 ** This file contains code used to compute a "diff" between two
25 ** text files.
26 */
27 #include "config.h"
28 #include "diff.h"
29 #include <assert.h>
30
31
32 #if 0
33 #define DEBUG(X) X
34
35 DDED tools/cvs2fossil/cvs2fossil
36 DDED tools/cvs2fossil/doc/LICENSE
37 DDED tools/cvs2fossil/doc/README
38 DDED tools/cvs2fossil/lib/c2f_cyclebreaker.tcl
39 DDED tools/cvs2fossil/lib/c2f_file.tcl
40 DDED tools/cvs2fossil/lib/c2f_flodmgr.tcl
41 DDED tools/cvs2fossil/lib/c2f_frev.tcl
42 DDED tools/cvs2fossil/lib/c2f_fsym.tcl
43 DDED tools/cvs2fossil/lib/c2f_ftrunk.tcl
44 DDED tools/cvs2fossil/lib/c2f_integrity.tcl
45 DDED tools/cvs2fossil/lib/c2f_option.tcl
46 DDED tools/cvs2fossil/lib/c2f_pass.tcl
47 DDED tools/cvs2fossil/lib/c2f_pbreakacycle.tcl
48 DDED tools/cvs2fossil/lib/c2f_pbreakrcycle.tcl
49 DDED tools/cvs2fossil/lib/c2f_pbreakscycle.tcl
50 DDED tools/cvs2fossil/lib/c2f_pcollar.tcl
51 DDED tools/cvs2fossil/lib/c2f_pcollrev.tcl
52 DDED tools/cvs2fossil/lib/c2f_pcollsym.tcl
53 DDED tools/cvs2fossil/lib/c2f_pfiltersym.tcl
54 DDED tools/cvs2fossil/lib/c2f_pinitcsets.tcl
55 DDED tools/cvs2fossil/lib/c2f_plodmgr.tcl
56 DDED tools/cvs2fossil/lib/c2f_prev.tcl
57 DDED tools/cvs2fossil/lib/c2f_prevlink.tcl
58 DDED tools/cvs2fossil/lib/c2f_project.tcl
59 DDED tools/cvs2fossil/lib/c2f_psym.tcl
60 DDED tools/cvs2fossil/lib/c2f_ptrunk.tcl
61 DDED tools/cvs2fossil/lib/c2f_repository.tcl
62 DDED tools/cvs2fossil/lib/c2f_state.tcl
63 DDED tools/cvs2fossil/lib/cvs2fossil.tcl
64 DDED tools/cvs2fossil/lib/id.tcl
65 DDED tools/cvs2fossil/lib/log.tcl
66 DDED tools/cvs2fossil/lib/misc.tcl
67 DDED tools/cvs2fossil/lib/pkgIndex.tcl
68 DDED tools/cvs2fossil/lib/rcsparser.tcl
69 DDED tools/cvs2fossil/lib/trouble.tcl
70 ELETED tools/import-cvs.tcl
71 ELETED tools/lib/cvs.tcl
72 ELETED tools/lib/cvs_cmd.tcl
73 ELETED tools/lib/cvs_csets.tcl
74 ELETED tools/lib/cvs_files.tcl
75 ELETED tools/lib/cvs_timeline.tcl
76 ELETED tools/lib/fossil.tcl
77 ELETED tools/lib/fossil_cmd.tcl
78 ELETED tools/lib/import_map.tcl
79 ELETED tools/lib/import_statistics.tcl
80 ELETED tools/lib/importcvs.tcl
81 ELETED tools/lib/log.tcl
82 ELETED tools/lib/pkgIndex.tcl
83 ELETED tools/lib/rcsparser.tcl
84 ELETED tools/lib/trouble.tcl
85 DDED www/CollRev1.gif
86 DDED www/CollRev2.gif
87 DDED www/CollRev3.gif
88 DDED www/CollRev4.gif
--- a/tools/cvs2fossil/cvs2fossil
+++ b/tools/cvs2fossil/cvs2fossil
@@ -0,0 +1,32 @@
1
+#!/bin/sh
2
+## -*- tcl -*- \
3
+exec tclsh "$0" ${1+"$@"}
4
+
5
+# # ## ### ##### ######## ############# #####################
6
+## Copyright (c) 2007 Andreas Kupries.
7
+#
8
+# This software is licensed as described in the file LICENSE, which
9
+# you should have received as part of this distribution.
10
+#
11
+# This software consists of voluntary contributions made by many
12
+# individuals. For exact contribution history, see the revision
13
+# history and logs, available at http://fossil-scm.hwaci.com/fossil
14
+# # ## ### ##### ######## ############# #####################
15
+
16
+## Command line application wrapped around the import packages.
17
+
18
+# # ## ### ##### ######## ############# #####################
19
+## Requirements, extended package management for local packages.
20
+
21
+lappend auto_path [file join [file dirname [info script]] lib]
22
+
23
+package require Tcl 8.4 ; # Required runtime.
24
+package require vc::fossil::import::cvs ; # Main functionality.
25
+
26
+# # ## ### ##### ######## ############# #####################
27
+## Execution
28
+
29
+vc::fossil::import::cvs run $argv
30
+exit 0
31
+
32
+# # ## ### ##### ######## ############# #####################
--- a/tools/cvs2fossil/cvs2fossil
+++ b/tools/cvs2fossil/cvs2fossil
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/cvs2fossil
+++ b/tools/cvs2fossil/cvs2fossil
@@ -0,0 +1,32 @@
1 #!/bin/sh
2 ## -*- tcl -*- \
3 exec tclsh "$0" ${1+"$@"}
4
5 # # ## ### ##### ######## ############# #####################
6 ## Copyright (c) 2007 Andreas Kupries.
7 #
8 # This software is licensed as described in the file LICENSE, which
9 # you should have received as part of this distribution.
10 #
11 # This software consists of voluntary contributions made by many
12 # individuals. For exact contribution history, see the revision
13 # history and logs, available at http://fossil-scm.hwaci.com/fossil
14 # # ## ### ##### ######## ############# #####################
15
16 ## Command line application wrapped around the import packages.
17
18 # # ## ### ##### ######## ############# #####################
19 ## Requirements, extended package management for local packages.
20
21 lappend auto_path [file join [file dirname [info script]] lib]
22
23 package require Tcl 8.4 ; # Required runtime.
24 package require vc::fossil::import::cvs ; # Main functionality.
25
26 # # ## ### ##### ######## ############# #####################
27 ## Execution
28
29 vc::fossil::import::cvs run $argv
30 exit 0
31
32 # # ## ### ##### ######## ############# #####################
--- a/tools/cvs2fossil/doc/LICENSE
+++ b/tools/cvs2fossil/doc/LICENSE
@@ -0,0 +1,19 @@
1
+This code is under the same license as fossil itself.
2
+
3
+- - -- --- ----- ---------
4
+
5
+This program is free software; you can redistribute it and/or
6
+modify it under the terms of the GNU General Public
7
+License version 2 as published by the Free Software Foundation.
8
+
9
+This program is distributed in the hope that it will be useful,
10
+but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+General Public License for more details.
13
+
14
+You should have received a copy of the GNU General Public
15
+License along with this library; if not, write to the
16
+Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17
+Boston, MA 02111-1307, USA.
18
+
19
+- - -- --- ----- ---------
--- a/tools/cvs2fossil/doc/LICENSE
+++ b/tools/cvs2fossil/doc/LICENSE
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/doc/LICENSE
+++ b/tools/cvs2fossil/doc/LICENSE
@@ -0,0 +1,19 @@
1 This code is under the same license as fossil itself.
2
3 - - -- --- ----- ---------
4
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public
7 License version 2 as published by the Free Software Foundation.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 General Public License for more details.
13
14 You should have received a copy of the GNU General Public
15 License along with this library; if not, write to the
16 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 Boston, MA 02111-1307, USA.
18
19 - - -- --- ----- ---------
--- a/tools/cvs2fossil/doc/README
+++ b/tools/cvs2fossil/doc/README
@@ -0,0 +1,7 @@
1
+
2
+[Acknowledge the work done by the creators of and submitters to the
3
+cvs2svn project/application. Needed their documentation, notes, and
4
+code as guide for this implementation.]
5
+
6
+[Determine if their license allows me to copy their notes here for
7
+reference.]
--- a/tools/cvs2fossil/doc/README
+++ b/tools/cvs2fossil/doc/README
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/doc/README
+++ b/tools/cvs2fossil/doc/README
@@ -0,0 +1,7 @@
1
2 [Acknowledge the work done by the creators of and submitters to the
3 cvs2svn project/application. Needed their documentation, notes, and
4 code as guide for this implementation.]
5
6 [Determine if their license allows me to copy their notes here for
7 reference.]
--- a/tools/cvs2fossil/lib/c2f_cyclebreaker.tcl
+++ b/tools/cvs2fossil/lib/c2f_cyclebreaker.tcl
@@ -0,0 +1,180 @@
1
+ }
2
+
3
+ typemethod breakcmd {cmd} {
4
+ ::variable mybreakcmd $cmd
5
+ return
6
+ }
7
+
8
+ # # ## ### ##### ######## #############
9
+
10
+ typemethod dotsto {path} {
11
+ ::variable mydotdestination $path
12
+ return
13
+ }
14
+
15
+ typemethod watch {id} {
16
+ ::variable mywatchids
17
+ lappend mywatchids $id
18
+ }
19
+
20
+ typemethod dot {label changesets} {
21
+ ::variable mydotprefix $label
22
+ ::variable mydotid 0
23
+
24
+ set dg [Setup $changesets 0]
25
+ Mark $dg
26
+ $dg destroy
27
+ return
28
+ }
29
+
30
+ typemethod mark {graph suffix {subgraph {}}} {
31
+ Mark $graph $suffix $subgraph
32
+ return
33
+ }
34
+
35
+ # # ## ### ##### ######## #############
36
+
37
+ typemethod run {label changesetcmd} {
38
+ ::variable myat 0
39
+ ::variable mydotprefix $label
40
+ ::variable mydotid 0
41
+
42
+ # We create a graph of the revision changesets, using the file
43
+ # level dependencies to construct a first approximation of the
44
+ # dependencies at the project level. Then we look for cycles
45
+ # in that graph and break them.
46
+
47
+ # 1. Create nodes for all relevant changesets and a mapping
48
+ # from the revisions to tlogelevant changesets and a mappinggraph topologically. We mark off
49
+ # the nodes which have no predecs. If
50
+ # we find no nodes without predecessors we have a cycle,
51
+ # and work on breaking it.
52
+
53
+ log write 3 cyclebreaker {Traverse changesets}
54
+
55
+ InitializeCanNow sorting the chantivated.
56
+
57
+ ::variable mydowhile {1} }
58
+
59
+ d} {
60
+ ::variable mybreakcmybreakcmd $cmd
61
+ return
62
+ }
63
+
64
+ # # ## ### ##### ######## #############
65
+
66
+ typemethod dotsto {path} {
67
+ ::variable mydotdestination run {# ######## {save We create a graph of at
68
+ # level dependencies to construct a first approximation of the
69
+ # dependencies at the project level. Then we look for cycles
70
+ # in that graph and break them.
71
+
72
+ # 1. Create nodes for all relevant changesets and a mappi }
73
+
74
+ # savecmdSaveAndRemove $dg $n
75
+ }clebreaker { BreakCycle $dg [FindCycle $dg]ivated.
76
+
77
+ ::variable mydowhile {dowhile {1} }
78
+
79
+ d} {
80
+ ::variable mybreakcmybreakcmd $cmd
81
+ return
82
+ }dowhile {1} }
83
+
84
+ d} {
85
+ :# ############ typemethod dotsto {path} {
86
+ ::v ::varian
87
+ }
88
+
89
+ # # ### }
90
+
91
+ tymd $cmd
92
+ return
93
+ }
94
+
95
+ # # ## ### ##### ######## #############
96
+
97
+ typemethod dotsto {path} {
98
+ ::variable 0# # ## ### ##### ######## {savedowhile {1} }
99
+
100
+ d} {
101
+ e mydotid 0
102
+
103
+ # We create aid 0
104
+
105
+ # We create a graph of the revision changesets, using the file
106
+ # level dependencies to construct a first approximation of the
107
+ # dependencies at the p 0
108
+ ::variable mydotprefix $label
109
+ ::variable mydotid 0
110
+
111
+ # We create a graph of the revision changesets, using the file
112
+ # level dependencies to construct a first approximation of the
113
+ # dependencies at the project level. Then we look for cycles
114
+ # in that graph and break them.
115
+
116
+ # 1. Create nodes for all relevant changesets and a mapping
117
+ # from the revisions to their changesets/nodes.
118
+
119
+ set changesets [uplevel #0 $changesetcmd]
120
+ set dg [Setup $changesets]
121
+
122
+ # 3. Lastly we iterate the graph topologically. We mark off
123
+ # the nodes which have no predecs. If
124
+ # we find no nodes without predecessors we have a cycle,
125
+ # and work on breaking it.
126
+
127
+ ll relevant changesets and a mappi }
128
+
129
+ # savecmdSaveAndRemove $dg $n
130
+ }clebreaker { BreakCycle $dg [FindCycle $dg]ivated.
131
+
132
+ ::variable mydowhile {1} }
133
+
134
+ d} {
135
+ ::variable mybreakcmybreakcmd $ceakcmd {cmd} {
136
+ ::variable mybreakcmd $cmd
137
+ return
138
+ }
139
+
140
+ # # ## ### }
141
+
142
+ typemethod breakcmd {cmd} {
143
+ ::variable mybreakurn
144
+ }
145
+
146
+ }
147
+
148
+ typemethobottom [lrange $n
149
+ }
150
+
151
+ # # ## ### ##### ######## #############
152
+
153
+ typemethod dotsto {path} {
154
+ ::variable mydotdestination $path
155
+ return
156
+ }
157
+
158
+ typemethod watch {id} {
159
+ ::variable mywatchids
160
+ lappend mywatchids $id
161
+ }
162
+
163
+ typemethod dot {label changesets} {
164
+ ::variable mydotprefix $label
165
+ ::variable mydotid 0
166
+
167
+ set dg [Setup $changesets 0]
168
+ Mark $dg
169
+ $dg destroy
170
+ return
171
+ }
172
+
173
+ typemethod mark {graph suffix {subgraph {}}} {
174
+ Mark $graph $suffix $subgraph
175
+ }
176
+
177
+ typemethod breakcmd atsave end $at $n]
178
+ }
179
+
180
+ incr # ## ### ##### ######variable atbottomsavemethod break
--- a/tools/cvs2fossil/lib/c2f_cyclebreaker.tcl
+++ b/tools/cvs2fossil/lib/c2f_cyclebreaker.tcl
@@ -0,0 +1,180 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/lib/c2f_cyclebreaker.tcl
+++ b/tools/cvs2fossil/lib/c2f_cyclebreaker.tcl
@@ -0,0 +1,180 @@
1 }
2
3 typemethod breakcmd {cmd} {
4 ::variable mybreakcmd $cmd
5 return
6 }
7
8 # # ## ### ##### ######## #############
9
10 typemethod dotsto {path} {
11 ::variable mydotdestination $path
12 return
13 }
14
15 typemethod watch {id} {
16 ::variable mywatchids
17 lappend mywatchids $id
18 }
19
20 typemethod dot {label changesets} {
21 ::variable mydotprefix $label
22 ::variable mydotid 0
23
24 set dg [Setup $changesets 0]
25 Mark $dg
26 $dg destroy
27 return
28 }
29
30 typemethod mark {graph suffix {subgraph {}}} {
31 Mark $graph $suffix $subgraph
32 return
33 }
34
35 # # ## ### ##### ######## #############
36
37 typemethod run {label changesetcmd} {
38 ::variable myat 0
39 ::variable mydotprefix $label
40 ::variable mydotid 0
41
42 # We create a graph of the revision changesets, using the file
43 # level dependencies to construct a first approximation of the
44 # dependencies at the project level. Then we look for cycles
45 # in that graph and break them.
46
47 # 1. Create nodes for all relevant changesets and a mapping
48 # from the revisions to tlogelevant changesets and a mappinggraph topologically. We mark off
49 # the nodes which have no predecs. If
50 # we find no nodes without predecessors we have a cycle,
51 # and work on breaking it.
52
53 log write 3 cyclebreaker {Traverse changesets}
54
55 InitializeCanNow sorting the chantivated.
56
57 ::variable mydowhile {1} }
58
59 d} {
60 ::variable mybreakcmybreakcmd $cmd
61 return
62 }
63
64 # # ## ### ##### ######## #############
65
66 typemethod dotsto {path} {
67 ::variable mydotdestination run {# ######## {save We create a graph of at
68 # level dependencies to construct a first approximation of the
69 # dependencies at the project level. Then we look for cycles
70 # in that graph and break them.
71
72 # 1. Create nodes for all relevant changesets and a mappi }
73
74 # savecmdSaveAndRemove $dg $n
75 }clebreaker { BreakCycle $dg [FindCycle $dg]ivated.
76
77 ::variable mydowhile {dowhile {1} }
78
79 d} {
80 ::variable mybreakcmybreakcmd $cmd
81 return
82 }dowhile {1} }
83
84 d} {
85 :# ############ typemethod dotsto {path} {
86 ::v ::varian
87 }
88
89 # # ### }
90
91 tymd $cmd
92 return
93 }
94
95 # # ## ### ##### ######## #############
96
97 typemethod dotsto {path} {
98 ::variable 0# # ## ### ##### ######## {savedowhile {1} }
99
100 d} {
101 e mydotid 0
102
103 # We create aid 0
104
105 # We create a graph of the revision changesets, using the file
106 # level dependencies to construct a first approximation of the
107 # dependencies at the p 0
108 ::variable mydotprefix $label
109 ::variable mydotid 0
110
111 # We create a graph of the revision changesets, using the file
112 # level dependencies to construct a first approximation of the
113 # dependencies at the project level. Then we look for cycles
114 # in that graph and break them.
115
116 # 1. Create nodes for all relevant changesets and a mapping
117 # from the revisions to their changesets/nodes.
118
119 set changesets [uplevel #0 $changesetcmd]
120 set dg [Setup $changesets]
121
122 # 3. Lastly we iterate the graph topologically. We mark off
123 # the nodes which have no predecs. If
124 # we find no nodes without predecessors we have a cycle,
125 # and work on breaking it.
126
127 ll relevant changesets and a mappi }
128
129 # savecmdSaveAndRemove $dg $n
130 }clebreaker { BreakCycle $dg [FindCycle $dg]ivated.
131
132 ::variable mydowhile {1} }
133
134 d} {
135 ::variable mybreakcmybreakcmd $ceakcmd {cmd} {
136 ::variable mybreakcmd $cmd
137 return
138 }
139
140 # # ## ### }
141
142 typemethod breakcmd {cmd} {
143 ::variable mybreakurn
144 }
145
146 }
147
148 typemethobottom [lrange $n
149 }
150
151 # # ## ### ##### ######## #############
152
153 typemethod dotsto {path} {
154 ::variable mydotdestination $path
155 return
156 }
157
158 typemethod watch {id} {
159 ::variable mywatchids
160 lappend mywatchids $id
161 }
162
163 typemethod dot {label changesets} {
164 ::variable mydotprefix $label
165 ::variable mydotid 0
166
167 set dg [Setup $changesets 0]
168 Mark $dg
169 $dg destroy
170 return
171 }
172
173 typemethod mark {graph suffix {subgraph {}}} {
174 Mark $graph $suffix $subgraph
175 }
176
177 typemethod breakcmd atsave end $at $n]
178 }
179
180 incr # ## ### ##### ######variable atbottomsavemethod break
--- a/tools/cvs2fossil/lib/c2f_file.tcl
+++ b/tools/cvs2fossil/lib/c2f_file.tcl
@@ -0,0 +1,22 @@
1
+seek $chan $offset start
2
+
3
+ if {!tools::troubleState
4
+ }
5
+}
6
+
7
+seek $chan $!branch
8
+ $first cutfrk $chan $offset start
9
+
10
+ i!tools::troubleStathan $offset start
11
+
12
+ if ools: }seek $chan $offset start
13
+
14
+ if {!tools::troubleState
15
+ }
16
+}
17
+
18
+seek $chan $!" trouble internal "Expected a number"
19
+ f {$myroot " f {$vendor " f {ne $ntdbchild} {
20
+ trouble internal "ntdb - trunk linkage broken"
21
+ trouble internal "" }
22
+ if { trouble internal "spawned branches"
--- a/tools/cvs2fossil/lib/c2f_file.tcl
+++ b/tools/cvs2fossil/lib/c2f_file.tcl
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/lib/c2f_file.tcl
+++ b/tools/cvs2fossil/lib/c2f_file.tcl
@@ -0,0 +1,22 @@
1 seek $chan $offset start
2
3 if {!tools::troubleState
4 }
5 }
6
7 seek $chan $!branch
8 $first cutfrk $chan $offset start
9
10 i!tools::troubleStathan $offset start
11
12 if ools: }seek $chan $offset start
13
14 if {!tools::troubleState
15 }
16 }
17
18 seek $chan $!" trouble internal "Expected a number"
19 f {$myroot " f {$vendor " f {ne $ntdbchild} {
20 trouble internal "ntdb - trunk linkage broken"
21 trouble internal "" }
22 if { trouble internal "spawned branches"
--- a/tools/cvs2fossil/lib/c2f_flodmgr.tcl
+++ b/tools/cvs2fossil/lib/c2f_flodmgr.tcl
@@ -0,0 +1,57 @@
1
+## -*- tcl -*-
2
+# # ## ### ##### ######## ############# #####################
3
+## Copyright (c) 2007 Andreas Kupries.
4
+#
5
+# This software is licensed as described in the file LICENSE, which
6
+# you should have received as part of this distribution.
7
+#
8
+# This software consists of voluntary contributions made by many
9
+# individuals. For exact contribution history, see the revision
10
+# history and logs, available at http://fossil-scm.hwaci.com/fossil
11
+# # ## ### ##### ######## ############# #####################
12
+
13
+## Lines of Development in a file (Symbols, and the trunk).
14
+
15
+# # ## ### ##### ######## ############# #####################
16
+## Requirements
17
+
18
+package require Tcl 8.4 ; # Required runtime.
19
+package require snit ; # OO system.
20
+
21
+# # ## ### ##### ######## ############# #####################
22
+##
23
+
24
+snit::type ::vc::fossil::import::cvs::file::lodmgr {
25
+ # # ## ### ##### ######## #############
26
+ ## Public API
27
+
28
+ constructor {} {
29
+ return
30
+ }
31
+
32
+ # # ## ### ##### ######## #############
33
+ ## State
34
+
35
+ # # ## ### ##### ######## #############
36
+ ## Internal methods
37
+
38
+ # # ## ### ##### ######## #############
39
+ ## Configuration
40
+
41
+ pragma -hastypeinfo no ; # no type introspection
42
+ pragma -hasinfo no ; # no object introspection
43
+ pragma -hastypemethods no ; # type is not relevant.
44
+ pragma -simpledispatch yes ; # simple fast dispatch
45
+
46
+ # # ## ### ##### ######## #############
47
+}
48
+
49
+namespace eval ::vc::fossil::import::cvs::file {
50
+ namespace export lodmgr
51
+}
52
+
53
+# # ## ### ##### ######## ############# #####################
54
+## Ready
55
+
56
+package provide vc::fossil::import::cvs::file::lodmgr 1.0
57
+return
--- a/tools/cvs2fossil/lib/c2f_flodmgr.tcl
+++ b/tools/cvs2fossil/lib/c2f_flodmgr.tcl
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/lib/c2f_flodmgr.tcl
+++ b/tools/cvs2fossil/lib/c2f_flodmgr.tcl
@@ -0,0 +1,57 @@
1 ## -*- tcl -*-
2 # # ## ### ##### ######## ############# #####################
3 ## Copyright (c) 2007 Andreas Kupries.
4 #
5 # This software is licensed as described in the file LICENSE, which
6 # you should have received as part of this distribution.
7 #
8 # This software consists of voluntary contributions made by many
9 # individuals. For exact contribution history, see the revision
10 # history and logs, available at http://fossil-scm.hwaci.com/fossil
11 # # ## ### ##### ######## ############# #####################
12
13 ## Lines of Development in a file (Symbols, and the trunk).
14
15 # # ## ### ##### ######## ############# #####################
16 ## Requirements
17
18 package require Tcl 8.4 ; # Required runtime.
19 package require snit ; # OO system.
20
21 # # ## ### ##### ######## ############# #####################
22 ##
23
24 snit::type ::vc::fossil::import::cvs::file::lodmgr {
25 # # ## ### ##### ######## #############
26 ## Public API
27
28 constructor {} {
29 return
30 }
31
32 # # ## ### ##### ######## #############
33 ## State
34
35 # # ## ### ##### ######## #############
36 ## Internal methods
37
38 # # ## ### ##### ######## #############
39 ## Configuration
40
41 pragma -hastypeinfo no ; # no type introspection
42 pragma -hasinfo no ; # no object introspection
43 pragma -hastypemethods no ; # type is not relevant.
44 pragma -simpledispatch yes ; # simple fast dispatch
45
46 # # ## ### ##### ######## #############
47 }
48
49 namespace eval ::vc::fossil::import::cvs::file {
50 namespace export lodmgr
51 }
52
53 # # ## ### ##### ######## ############# #####################
54 ## Ready
55
56 package provide vc::fossil::import::cvs::file::lodmgr 1.0
57 return
--- a/tools/cvs2fossil/lib/c2f_frev.tcl
+++ b/tools/cvs2fossil/lib/c2f_frev.tcl
@@ -0,0 +1,362 @@
1
+## -*- tcl -*-
2
+# # ## ### ##### ######## ############# #####################
3
+## Copyright (c) 2007
4
+## Copyright (c) 2007-2008 Andreas Kupries.
5
+#
6
+# This software is licensed as described in the file LICENSE, which
7
+# you should have received as part of this distribution.
8
+#
9
+# This software consists of voluntary contributions made by many
10
+# individuals. For exact contribution history, see the revision
11
+# history and logs, available at http://fossil-scm.hwaci.com/fossil
12
+# # ## ### ##### ######## ############# #####################
13
+
14
+## Revisions per file.
15
+
16
+# # ## ### ##### ######## ############# #####################
17
+## Requirements
18
+
19
+package require Tcl 8.4 ; # Required runtime.
20
+package require snit ; # OO system.
21
+package require vc::tools::misc ; # Text formatting
22
+package require v## #####################
23
+##
24
+
25
+snit::type ::vc::fossil::import::cvs ::file::rev {
26
+ # # ## ### ##### ######## #############
27
+ ## Public API
28
+
29
+ constructor {revnr date state thefile} {
30
+ set myrevnr $revnr
31
+ set mydate $date
32
+ set myorigdate $date
33
+ set mystate $state
34
+ set myfile $thefile
35
+ return
36
+ }
37
+
38
+ method defid {} {
39
+ set myid [incr myidcounter]
40
+ r{} { return $myid} { return $myid }
41
+ method file {} { return $myfile }
42
+
43
+ # Basic pieces ________________________
44
+
45
+ method hasmeta {} { retur1 -decreasing $tmp] {branchchildren $rev
46
+expr {$mytextstart <= $mytextend}]
47
+ }
48
+
49
+ method setmeta {meta} { set set mytext $texrent} { set myparent $pad
50
+ return
51
+ }
52
+ method setlod {lod} { set mylod $lod ; return }
53
+
54
+ method revnr {} { return $myrevnr }
55
+ method state {} { return $mystate }
56
+ method lod {} { return $mylod }
57
+ method date {} { return $mydate }
58
+
59
+ method isneeded {} {
60
+ if {$myoperation ne "nothing"} {return 1}
61
+ if {$myrevnr ne "1.1"} {return 1}
62
+ if {![$mylod istrunk]} {return 1}
63
+ if {![llength $mybranches]} {return 1}
64
+ set firstbranch [lindex $mybranches 0]
65
+ if {![$firstbranch haschild]} {return 1}
66
+ if {$myisondefaultbranch} {return 1}
67
+
68
+ # FIX: This message will not match if the RCS file was renamed
69
+ # manually after it was created.
70
+
71
+ set gen "file [file tail [$myfile usrpath]]f {$myparent ne ""} { trouble internal "Parent already defined" parent $parent
72
+ return
73
+ }
74
+
75
+ method cutfromparent {} { set myparent "" ; return }
76
+ method cutfromchild {} { set mychild "" ; return }
77
+
78
+ method setf {$mychild ne ""} { trouble internchild $child
79
+ return
80
+ }
81
+
82
+ method changeparent {parent} { set myparent $parent ; return }
83
+ method changechild {child} { set mychild $child ; return }
84
+
85
+ method parent {} { return $myparent }
86
+ method child {} { return $mychild }
87
+
88
+ # Branch linkage ______________________
89
+
90
+ method setparentbranch {branch} {
91
+ integrity f## Copyright (c) 2007
92
+#### -*- tcl -*-
93
+# # ##rent already defined}
94
+ set my" }
95
+ setend map @P@ [expet myparentbranch $branch
96
+ return
97
+ }
98
+
99
+ method hasparentbranch {} { return [expr {$myparentbranch ne ""}] }
100
+ method hasbranches {} { return [llength $mybranches] }
101
+
102
+ method parentbranch {} { return $myparentbranch }
103
+ method branches {} { return $mybranches }
104
+
105
+ method addbranch {branch} {
106
+ lappend mybranches $branch
107
+ return
108
+ }
109
+
110
+ method addchildonbranch {child} {
111
+ lappend mybranchchildren $child
112
+ return
113
+ }
114
+
115
+ method cutfromparentbranch {} { set myparentbranch "" ; return }
116
+
117
+ method removebranch {branch} {
118
+ ldelete mybranches $branch
119
+ return
120
+ }
121
+
122
+ method removechildonbranch {rev} {
123
+ ldelete mybranchchildren $rev
124
+ return
125
+ }
126
+
127
+ method sortbranches {} {
128
+ # Pass 2: CollectRev
129
+
130
+ if {[llength $mybranches] < 2} return
131
+
132
+ # Sort the branches spawned by this revision in creation
133
+ # order. To help in this our file gave all branches a position
134
+ # id, in order of their definition by the RCS archive.
135
+ #
136
+ # The creation order is (apparently) the reverse of the
137
+ # definition order. (If a branch is created then deleted, a
138
+ # later branch can be assigned the recycled branch number;
139
+ # therefore branch numbers are not an indication of creation
140
+ # order.)
141
+
142
+ set tmp {}
143
+ foreach branch $mybranches {
144
+ lappend tmp [list $branch [$branch position]]
145
+ }
146
+
147
+ set mybranches {}
148
+ foreach item [lsort -index 1 -decreasing $tmp] {
149
+ struct::list assign $item branch position
150
+ lappend mybranches $branch
151
+ }
152
+ return
153
+ }
154
+
155
+ method movebranchesto {rev} {
156
+ set revlod [$rev lod]
157
+ foreach branch $mybranches {
158
+ $rev addbranch $branch
159
+ $branch setparent $rev
160
+ $branch setlod $revlod
161
+ }
162
+ foreach branchrev $mybranchchildren {
163
+ $rev addchildonbranch $branchrev
164
+ $branchrev cutfromparent
165
+ $branchrev setparent $rev
166
+ }
167
+ set mybranches {}
168
+ set mybranchchildren {}
169
+ return
170
+ }
171
+
172
+ method removeallbranches {} {
173
+ set mybranches {}
174
+ set mybranchchildren {}
175
+ return
176
+ }
177
+
178
+ # Tag linkage _________________________
179
+
180
+ method addtag {tag} {
181
+ lappend mytags $tag
182
+ return
183
+ }
184
+
185
+ method tags {} { return $mytags }
186
+
187
+ method removealltags {} {
188
+ set mytags {}
189
+ return
190
+ }
191
+
192
+ method movetagsto {rev} {
193
+ set revlod [$rev lod]
194
+ foreach tag $mytags {
195
+ $rev addtag $tag
196
+ $tag settagrev $rev
197
+ $tag setlod $revlod
198
+ }
199
+ set mytags {}
200
+ return
201
+ }
202
+
203
+ # general symbol operations ___________
204
+
205
+ method movesymbolsto {rev} {
206
+ # Move the tags and branches attached to this revision to the
207
+ # destination and fix all pointers.
208
+
209
+ $self movetagsto $rev
210
+ $self movebranchesto $rev
211
+ return
212
+ }
213
+
214
+ # Derived stuff _______________________
215
+
216
+ method determineoperation {} {
217
+ # Look at the state of both this revision and its parent to
218
+ # determine the type opf operation which was performed (add,
219
+ # modify, delete, none).
220
+ #
221
+ # The important information is dead vs not-dead for both,
222
+ # giving rise to four possible types.
223
+
224
+ set sdead [expr {$mystate eq "dead"}]
225
+ set pdead [expr {$myparent eq "" || [$myparent state] eq "dead"}]
226
+
227
+ set myoperation $myopstate([list $pdead $sdead])
228
+ return
229
+ }
230
+
231
+ method operation {} { return $myoperation }
232
+ method retype {x} { set myoperation $x ; return }
233
+
234
+ method isondefaultbranch {} { return $myisondefaultbranch }
235
+
236
+ method setondefaultbranch {x} { set myisondefaultbranch $x ; return }
237
+
238
+ method setdefaultbranchchild {rev} { set mydbchild $rev ; return }
239
+ method setdefaultbranchparent {rev} {
240
+ set mydbparent $rev
241
+
242
+ # Retype the revision (may change from 'add' to 'change').
243
+
244
+ set sdead [expr {$myoperation ne "change"}]
245
+ set pdead [expr {[$rev operation] ne "change"}]
246
+ set myoperation $myopstate([list $pdead $sdead])
247
+ return
248
+ }
249
+
250
+ method cutdefaultbranchparent {} { set mydbparent "" ; return }
251
+ method cutdefaultbranchchild {} { set mydbchild "" ; return }
252
+
253
+ method defaultbranchchild {} { return $mydbchild }
254
+ method defaultbranchparent {} { return $mydbparent }
255
+
256
+ method hasdefaultbranchchild {} { return [expr {$mydbchild ne ""}] }
257
+ method hasdefaultbranchparent {} { return [expr {$mydbparent ne ""}] }
258
+
259
+ # # ## ### ##### ######## #############
260
+ ## Type API
261
+
262
+ typemethod istrunkrevnr {revnr} {
263
+ return [expr {[llength [split $revnr .]] == 2}]
264
+ }
265
+
266
+ typemethod isbranchrevnr {revnr _ bv} {
267
+ if {[regexp $mybranchpattern $revnr -> head tail]} {
268
+ upvar 1 $bv branchnr
269
+ set branchnr ${head}$tail
270
+ return 1
271
+ }
272
+ return 0
273
+ }
274
+
275
+ typemethod 2branchnr {revnr} {
276
+ # Input is a branch revision number, i.e. a revision number
277
+ # with an even number of components; for example '2.9.2.1'
278
+ # (never '2.9.2' nor '2.9.0.2'). The return value is the
279
+ # branch number (for example, '2.9.2'). For trunk revisions,
280
+ # like '3.4', we return the empty string.
281
+
282
+ if {[$type istrunkrevnr $revnr]} {
283
+ return ""
284
+ }
285
+ return [join [lrange [split $revnr .] 0 end-1] .]
286
+ }
287
+
288
+ typemethod 2branchparentrevnr {branchnr} {
289
+ # Chop the last segment off
290
+ return [join [lrange [split $branchnr .] 0 end-1] .]
291
+ }
292
+
293
+ # # ## ### ##### ######## #############
294
+
295
+ method persist {} {
296
+ set fid [$myfile id]
297
+ set lod [$mylod id]
298
+ set op $myopcode($myoperation)
299
+ se
300
+ 1 -decreasing $tmp] {mytext coff ende set clen [expr {eend - $coffch
301
+
302
+ lappend map @P@ [expr { ($myparent eq "") ? "NULL" : [$myparent id] }]
303
+ lappend map @C@ [expr { ($mychild eq "") ? "NULL" : [$mychild id] }]
304
+ lappend map @DP [expr { ($mydbparent eq "") ? "NULL" : [$mydbparent id] }]
305
+ lappend map @DC [exLICENSE, which
306
+# you## -*- tcl -*-
307
+# # ## ### ##### ######## ############# #####################
308
+## Copyright (c) 2007
309
+## Copyright (c) 2007-2008 Andreas Kupries.
310
+#
311
+# This software is licensed as described in the file LICENSE, which
312
+# you should have received as part of this distribution.
313
+#
314
+# This software consists of voluntary contributions made by many
315
+# individuals. For exact contribution history, see the revision
316
+# history and logs, available at http://fossil-scm.hwaci.com/fossil
317
+# # ## ### ##### ######## ############# #####################
318
+
319
+## Revisions per file.
320
+
321
+# # ## ### ##### ######## ############# #####################
322
+## Requirements
323
+
324
+package require Tcl 8.4 ; # Required runtime.
325
+package require snit ; # OO system.
326
+package require vc::tools::misc ; # Text formatting
327
+package require vc::fossil::import::cvs::state ; # State storage.
328
+package require vc::fossil::import::cvs::integrity ; # State integrity checks.
329
+
330
+# # ## ### ##### ######## ############# #####################
331
+##
332
+
333
+snit::type ::vc::fossil::import::cvs::file::rev {
334
+ # # ## ### ##### ######## #############
335
+ ## Public API
336
+
337
+ constructor {revnr date state thefile} {
338
+ set myrevnr $revnr
339
+ set mydate $date
340
+ set myorigdate $date
341
+ set mystate $state
342
+ set myfile $thefile
343
+ return
344
+ }
345
+
346
+ method defid {} {a project-level object
347
+ urn 1}
348
+ if {$myisondefaultbranch} {return 1}
349
+
350
+ # FIX: This message will not match if the RCS file was renamed
351
+ # manually after it was created.
352
+
353
+ set gen "file [file tail [$myfile usrpath]] was initially added on branch [$firstbranch name]."
354
+ set log [$myfile commitmessageof $mymetaid]
355
+
356
+ return [expr {$log ne $gen}]
357
+ }
358
+
359
+ method isneededbranchdel {} {
360
+ if {$myparentbranch eq "" ; return }
361
+
362
+ meth
--- a/tools/cvs2fossil/lib/c2f_frev.tcl
+++ b/tools/cvs2fossil/lib/c2f_frev.tcl
@@ -0,0 +1,362 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/lib/c2f_frev.tcl
+++ b/tools/cvs2fossil/lib/c2f_frev.tcl
@@ -0,0 +1,362 @@
1 ## -*- tcl -*-
2 # # ## ### ##### ######## ############# #####################
3 ## Copyright (c) 2007
4 ## Copyright (c) 2007-2008 Andreas Kupries.
5 #
6 # This software is licensed as described in the file LICENSE, which
7 # you should have received as part of this distribution.
8 #
9 # This software consists of voluntary contributions made by many
10 # individuals. For exact contribution history, see the revision
11 # history and logs, available at http://fossil-scm.hwaci.com/fossil
12 # # ## ### ##### ######## ############# #####################
13
14 ## Revisions per file.
15
16 # # ## ### ##### ######## ############# #####################
17 ## Requirements
18
19 package require Tcl 8.4 ; # Required runtime.
20 package require snit ; # OO system.
21 package require vc::tools::misc ; # Text formatting
22 package require v## #####################
23 ##
24
25 snit::type ::vc::fossil::import::cvs ::file::rev {
26 # # ## ### ##### ######## #############
27 ## Public API
28
29 constructor {revnr date state thefile} {
30 set myrevnr $revnr
31 set mydate $date
32 set myorigdate $date
33 set mystate $state
34 set myfile $thefile
35 return
36 }
37
38 method defid {} {
39 set myid [incr myidcounter]
40 r{} { return $myid} { return $myid }
41 method file {} { return $myfile }
42
43 # Basic pieces ________________________
44
45 method hasmeta {} { retur1 -decreasing $tmp] {branchchildren $rev
46 expr {$mytextstart <= $mytextend}]
47 }
48
49 method setmeta {meta} { set set mytext $texrent} { set myparent $pad
50 return
51 }
52 method setlod {lod} { set mylod $lod ; return }
53
54 method revnr {} { return $myrevnr }
55 method state {} { return $mystate }
56 method lod {} { return $mylod }
57 method date {} { return $mydate }
58
59 method isneeded {} {
60 if {$myoperation ne "nothing"} {return 1}
61 if {$myrevnr ne "1.1"} {return 1}
62 if {![$mylod istrunk]} {return 1}
63 if {![llength $mybranches]} {return 1}
64 set firstbranch [lindex $mybranches 0]
65 if {![$firstbranch haschild]} {return 1}
66 if {$myisondefaultbranch} {return 1}
67
68 # FIX: This message will not match if the RCS file was renamed
69 # manually after it was created.
70
71 set gen "file [file tail [$myfile usrpath]]f {$myparent ne ""} { trouble internal "Parent already defined" parent $parent
72 return
73 }
74
75 method cutfromparent {} { set myparent "" ; return }
76 method cutfromchild {} { set mychild "" ; return }
77
78 method setf {$mychild ne ""} { trouble internchild $child
79 return
80 }
81
82 method changeparent {parent} { set myparent $parent ; return }
83 method changechild {child} { set mychild $child ; return }
84
85 method parent {} { return $myparent }
86 method child {} { return $mychild }
87
88 # Branch linkage ______________________
89
90 method setparentbranch {branch} {
91 integrity f## Copyright (c) 2007
92 #### -*- tcl -*-
93 # # ##rent already defined}
94 set my" }
95 setend map @P@ [expet myparentbranch $branch
96 return
97 }
98
99 method hasparentbranch {} { return [expr {$myparentbranch ne ""}] }
100 method hasbranches {} { return [llength $mybranches] }
101
102 method parentbranch {} { return $myparentbranch }
103 method branches {} { return $mybranches }
104
105 method addbranch {branch} {
106 lappend mybranches $branch
107 return
108 }
109
110 method addchildonbranch {child} {
111 lappend mybranchchildren $child
112 return
113 }
114
115 method cutfromparentbranch {} { set myparentbranch "" ; return }
116
117 method removebranch {branch} {
118 ldelete mybranches $branch
119 return
120 }
121
122 method removechildonbranch {rev} {
123 ldelete mybranchchildren $rev
124 return
125 }
126
127 method sortbranches {} {
128 # Pass 2: CollectRev
129
130 if {[llength $mybranches] < 2} return
131
132 # Sort the branches spawned by this revision in creation
133 # order. To help in this our file gave all branches a position
134 # id, in order of their definition by the RCS archive.
135 #
136 # The creation order is (apparently) the reverse of the
137 # definition order. (If a branch is created then deleted, a
138 # later branch can be assigned the recycled branch number;
139 # therefore branch numbers are not an indication of creation
140 # order.)
141
142 set tmp {}
143 foreach branch $mybranches {
144 lappend tmp [list $branch [$branch position]]
145 }
146
147 set mybranches {}
148 foreach item [lsort -index 1 -decreasing $tmp] {
149 struct::list assign $item branch position
150 lappend mybranches $branch
151 }
152 return
153 }
154
155 method movebranchesto {rev} {
156 set revlod [$rev lod]
157 foreach branch $mybranches {
158 $rev addbranch $branch
159 $branch setparent $rev
160 $branch setlod $revlod
161 }
162 foreach branchrev $mybranchchildren {
163 $rev addchildonbranch $branchrev
164 $branchrev cutfromparent
165 $branchrev setparent $rev
166 }
167 set mybranches {}
168 set mybranchchildren {}
169 return
170 }
171
172 method removeallbranches {} {
173 set mybranches {}
174 set mybranchchildren {}
175 return
176 }
177
178 # Tag linkage _________________________
179
180 method addtag {tag} {
181 lappend mytags $tag
182 return
183 }
184
185 method tags {} { return $mytags }
186
187 method removealltags {} {
188 set mytags {}
189 return
190 }
191
192 method movetagsto {rev} {
193 set revlod [$rev lod]
194 foreach tag $mytags {
195 $rev addtag $tag
196 $tag settagrev $rev
197 $tag setlod $revlod
198 }
199 set mytags {}
200 return
201 }
202
203 # general symbol operations ___________
204
205 method movesymbolsto {rev} {
206 # Move the tags and branches attached to this revision to the
207 # destination and fix all pointers.
208
209 $self movetagsto $rev
210 $self movebranchesto $rev
211 return
212 }
213
214 # Derived stuff _______________________
215
216 method determineoperation {} {
217 # Look at the state of both this revision and its parent to
218 # determine the type opf operation which was performed (add,
219 # modify, delete, none).
220 #
221 # The important information is dead vs not-dead for both,
222 # giving rise to four possible types.
223
224 set sdead [expr {$mystate eq "dead"}]
225 set pdead [expr {$myparent eq "" || [$myparent state] eq "dead"}]
226
227 set myoperation $myopstate([list $pdead $sdead])
228 return
229 }
230
231 method operation {} { return $myoperation }
232 method retype {x} { set myoperation $x ; return }
233
234 method isondefaultbranch {} { return $myisondefaultbranch }
235
236 method setondefaultbranch {x} { set myisondefaultbranch $x ; return }
237
238 method setdefaultbranchchild {rev} { set mydbchild $rev ; return }
239 method setdefaultbranchparent {rev} {
240 set mydbparent $rev
241
242 # Retype the revision (may change from 'add' to 'change').
243
244 set sdead [expr {$myoperation ne "change"}]
245 set pdead [expr {[$rev operation] ne "change"}]
246 set myoperation $myopstate([list $pdead $sdead])
247 return
248 }
249
250 method cutdefaultbranchparent {} { set mydbparent "" ; return }
251 method cutdefaultbranchchild {} { set mydbchild "" ; return }
252
253 method defaultbranchchild {} { return $mydbchild }
254 method defaultbranchparent {} { return $mydbparent }
255
256 method hasdefaultbranchchild {} { return [expr {$mydbchild ne ""}] }
257 method hasdefaultbranchparent {} { return [expr {$mydbparent ne ""}] }
258
259 # # ## ### ##### ######## #############
260 ## Type API
261
262 typemethod istrunkrevnr {revnr} {
263 return [expr {[llength [split $revnr .]] == 2}]
264 }
265
266 typemethod isbranchrevnr {revnr _ bv} {
267 if {[regexp $mybranchpattern $revnr -> head tail]} {
268 upvar 1 $bv branchnr
269 set branchnr ${head}$tail
270 return 1
271 }
272 return 0
273 }
274
275 typemethod 2branchnr {revnr} {
276 # Input is a branch revision number, i.e. a revision number
277 # with an even number of components; for example '2.9.2.1'
278 # (never '2.9.2' nor '2.9.0.2'). The return value is the
279 # branch number (for example, '2.9.2'). For trunk revisions,
280 # like '3.4', we return the empty string.
281
282 if {[$type istrunkrevnr $revnr]} {
283 return ""
284 }
285 return [join [lrange [split $revnr .] 0 end-1] .]
286 }
287
288 typemethod 2branchparentrevnr {branchnr} {
289 # Chop the last segment off
290 return [join [lrange [split $branchnr .] 0 end-1] .]
291 }
292
293 # # ## ### ##### ######## #############
294
295 method persist {} {
296 set fid [$myfile id]
297 set lod [$mylod id]
298 set op $myopcode($myoperation)
299 se
300 1 -decreasing $tmp] {mytext coff ende set clen [expr {eend - $coffch
301
302 lappend map @P@ [expr { ($myparent eq "") ? "NULL" : [$myparent id] }]
303 lappend map @C@ [expr { ($mychild eq "") ? "NULL" : [$mychild id] }]
304 lappend map @DP [expr { ($mydbparent eq "") ? "NULL" : [$mydbparent id] }]
305 lappend map @DC [exLICENSE, which
306 # you## -*- tcl -*-
307 # # ## ### ##### ######## ############# #####################
308 ## Copyright (c) 2007
309 ## Copyright (c) 2007-2008 Andreas Kupries.
310 #
311 # This software is licensed as described in the file LICENSE, which
312 # you should have received as part of this distribution.
313 #
314 # This software consists of voluntary contributions made by many
315 # individuals. For exact contribution history, see the revision
316 # history and logs, available at http://fossil-scm.hwaci.com/fossil
317 # # ## ### ##### ######## ############# #####################
318
319 ## Revisions per file.
320
321 # # ## ### ##### ######## ############# #####################
322 ## Requirements
323
324 package require Tcl 8.4 ; # Required runtime.
325 package require snit ; # OO system.
326 package require vc::tools::misc ; # Text formatting
327 package require vc::fossil::import::cvs::state ; # State storage.
328 package require vc::fossil::import::cvs::integrity ; # State integrity checks.
329
330 # # ## ### ##### ######## ############# #####################
331 ##
332
333 snit::type ::vc::fossil::import::cvs::file::rev {
334 # # ## ### ##### ######## #############
335 ## Public API
336
337 constructor {revnr date state thefile} {
338 set myrevnr $revnr
339 set mydate $date
340 set myorigdate $date
341 set mystate $state
342 set myfile $thefile
343 return
344 }
345
346 method defid {} {a project-level object
347 urn 1}
348 if {$myisondefaultbranch} {return 1}
349
350 # FIX: This message will not match if the RCS file was renamed
351 # manually after it was created.
352
353 set gen "file [file tail [$myfile usrpath]] was initially added on branch [$firstbranch name]."
354 set log [$myfile commitmessageof $mymetaid]
355
356 return [expr {$log ne $gen}]
357 }
358
359 method isneededbranchdel {} {
360 if {$myparentbranch eq "" ; return }
361
362 meth
--- a/tools/cvs2fossil/lib/c2f_fsym.tcl
+++ b/tools/cvs2fossil/lib/c2f_fsym.tcl
@@ -0,0 +1,115 @@
1
+## -*- tcl -*-
2
+# # ## ### ##### ######## ############# #####################
3
+## Copyright (c) 2007
4
+## Copyright (c) 2007-2008 Andreas Kupries.
5
+#
6
+# This software is licensed as described in the file LICENSE, which
7
+# you should have received as part of this distribution.
8
+#
9
+# This software consists of voluntary contributions made by many
10
+# individuals. For exact contribution history, see the revision
11
+# history and logs, available at http://fossil-scm.hwaci.com/fossil
12
+# # ## ### ##### ######## ############# #####################
13
+
14
+## Symbols (Tags, Branches) per file.
15
+
16
+# # ## ### ##### ######## ############# #####################
17
+## Requirements
18
+
19
+package require Tcl 8.4 ; # Required runtime.
20
+packaem.
21
+package require vc::tools::trouble ; # Error reporting.
22
+package require vc::fossil::import::cvs::file::rev ; # CVS per file revisions.
23
+package require vc::fossil::import::cvs::state ; # State storage.
24
+package require vc::fossil::imp(Tags, Branches) per file.
25
+
26
+# # ## ### ##### ######## ########### it::type ::vc::fossil::import::cvs::file::sym {
27
+ # # ## ### ##### ######## #############
28
+ ## Public API
29
+
30
+ constructor {symtype nr symbol file} {
31
+ set myfile $file
32
+ set mytype $symtype
33
+ set mynr $nr
34
+ set mysymbol $symbol
35
+
36
+ switch -exact -- $mytype {
37
+ ntegrity assert 0}
38
+ default { trouble internal "Bad symbol type '$mytype'" }
39
+ }turn
40
+ }
41
+
42
+ method fid f were committed earlier than { trouble interno mysymbol
43
+
44
+ # Symbol aggregation methods
45
+
46
+ delegate method countsbranch to mysymbol
47
+ delegate method countastag to mysymbol
48
+ delegate method countacommit to mysymbol
49
+
50
+ method blockedby{fsymbol} {
51
+ $mysymbol blockedby [$fsymbol symbol]
52
+ return
53
+ }
54
+
55
+ method possibself TagParents }
56
+ }
57
+ return
58
+ }
59
+
60
+ method BranchParents {} {
61
+ # The "obvious" parent of a branch is the branch holding the
62
+ # revision spawning the branch. Any other branches that are
63
+ # rooted at the same revision and were committed earlier than
64
+ # the branch are also possible parents.
65
+
66
+ # Ignore this if the branch symbol is detached.
67
+ if {$mybranchparent eq ""} return
68
+
69
+ $mysymbol possibleparent [[$mybranchparent lod] symbol]
70
+
71
+ foreach branch [$mybranchparent branches] {
72
+ # A branch cannot be its own parent. Nor can a branch
73
+ # created after this one be its parent. This means that we
74
+ # can abort the loop when we have reached ourselves in the
75
+ # list of branches. Here the order of file::rev.mybranches
76
+ # comes into play, as created by file::rev::sortbranches.
77
+
78
+ if {$branch eq $self} break
79
+ $mysymbol possibleparent [$branch symbol]
80
+ }
81
+ return
82
+ }
83
+
84
+ method TagParents {} {
85
+ # The "obvious" parent of a tag is the branch holding the
86
+ # revision spawning the tag. Branches that are spawned by the
87
+ # same revision are also possible parents.
88
+
89
+ $mysymbol possibleparent [[$mytagrev lod] symbol]
90
+
91
+ foreach branch [$mytagrev branches] {
92
+ $mysymbol possibleparent [$branch symbol]
93
+ }
94
+ return
95
+ }
96
+
97
+ #
98
+
99
+ method istrunk {} { return 0 }
100
+
101
+ # Branch acessor methods.
102
+
103
+ method setchildrevnr {revnr} {
104
+ integrity assert {$mybranchchildrevnr eq ""} {Child already defined}
105
+ set mybranchchildrevnr $revnr
106
+ return
107
+ }
108
+
109
+ method setposition {n} { set mybranchposition $n ; return }
110
+ method setparent {rev} { set mybranchparent $rev ; return }
111
+ method setchild {rev} { set mybranchchild $rev ; return }
112
+ ") ? "NULL" : [$mybranchchilchild id] }]
113
+
114
+ set ridybranchchild id] }]
115
+ranchparent eq "") ? "NULL" :$rid file - tag.fid
--- a/tools/cvs2fossil/lib/c2f_fsym.tcl
+++ b/tools/cvs2fossil/lib/c2f_fsym.tcl
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/lib/c2f_fsym.tcl
+++ b/tools/cvs2fossil/lib/c2f_fsym.tcl
@@ -0,0 +1,115 @@
1 ## -*- tcl -*-
2 # # ## ### ##### ######## ############# #####################
3 ## Copyright (c) 2007
4 ## Copyright (c) 2007-2008 Andreas Kupries.
5 #
6 # This software is licensed as described in the file LICENSE, which
7 # you should have received as part of this distribution.
8 #
9 # This software consists of voluntary contributions made by many
10 # individuals. For exact contribution history, see the revision
11 # history and logs, available at http://fossil-scm.hwaci.com/fossil
12 # # ## ### ##### ######## ############# #####################
13
14 ## Symbols (Tags, Branches) per file.
15
16 # # ## ### ##### ######## ############# #####################
17 ## Requirements
18
19 package require Tcl 8.4 ; # Required runtime.
20 packaem.
21 package require vc::tools::trouble ; # Error reporting.
22 package require vc::fossil::import::cvs::file::rev ; # CVS per file revisions.
23 package require vc::fossil::import::cvs::state ; # State storage.
24 package require vc::fossil::imp(Tags, Branches) per file.
25
26 # # ## ### ##### ######## ########### it::type ::vc::fossil::import::cvs::file::sym {
27 # # ## ### ##### ######## #############
28 ## Public API
29
30 constructor {symtype nr symbol file} {
31 set myfile $file
32 set mytype $symtype
33 set mynr $nr
34 set mysymbol $symbol
35
36 switch -exact -- $mytype {
37 ntegrity assert 0}
38 default { trouble internal "Bad symbol type '$mytype'" }
39 }turn
40 }
41
42 method fid f were committed earlier than { trouble interno mysymbol
43
44 # Symbol aggregation methods
45
46 delegate method countsbranch to mysymbol
47 delegate method countastag to mysymbol
48 delegate method countacommit to mysymbol
49
50 method blockedby{fsymbol} {
51 $mysymbol blockedby [$fsymbol symbol]
52 return
53 }
54
55 method possibself TagParents }
56 }
57 return
58 }
59
60 method BranchParents {} {
61 # The "obvious" parent of a branch is the branch holding the
62 # revision spawning the branch. Any other branches that are
63 # rooted at the same revision and were committed earlier than
64 # the branch are also possible parents.
65
66 # Ignore this if the branch symbol is detached.
67 if {$mybranchparent eq ""} return
68
69 $mysymbol possibleparent [[$mybranchparent lod] symbol]
70
71 foreach branch [$mybranchparent branches] {
72 # A branch cannot be its own parent. Nor can a branch
73 # created after this one be its parent. This means that we
74 # can abort the loop when we have reached ourselves in the
75 # list of branches. Here the order of file::rev.mybranches
76 # comes into play, as created by file::rev::sortbranches.
77
78 if {$branch eq $self} break
79 $mysymbol possibleparent [$branch symbol]
80 }
81 return
82 }
83
84 method TagParents {} {
85 # The "obvious" parent of a tag is the branch holding the
86 # revision spawning the tag. Branches that are spawned by the
87 # same revision are also possible parents.
88
89 $mysymbol possibleparent [[$mytagrev lod] symbol]
90
91 foreach branch [$mytagrev branches] {
92 $mysymbol possibleparent [$branch symbol]
93 }
94 return
95 }
96
97 #
98
99 method istrunk {} { return 0 }
100
101 # Branch acessor methods.
102
103 method setchildrevnr {revnr} {
104 integrity assert {$mybranchchildrevnr eq ""} {Child already defined}
105 set mybranchchildrevnr $revnr
106 return
107 }
108
109 method setposition {n} { set mybranchposition $n ; return }
110 method setparent {rev} { set mybranchparent $rev ; return }
111 method setchild {rev} { set mybranchchild $rev ; return }
112 ") ? "NULL" : [$mybranchchilchild id] }]
113
114 set ridybranchchild id] }]
115 ranchparent eq "") ? "NULL" :$rid file - tag.fid
--- a/tools/cvs2fossil/lib/c2f_ftrunk.tcl
+++ b/tools/cvs2fossil/lib/c2f_ftrunk.tcl
@@ -0,0 +1,56 @@
1
+## -*- tcl -*-
2
+# # ## ### ##### ######## ############# #####################
3
+## Copyright (c) 2007 Andreas Kupries.
4
+#
5
+# This software is licensed as described in the file LICENSE, which
6
+# you should have received as part of this distribution.
7
+#
8
+# This software consists of voluntary contributions made by many
9
+# individuals. For exact contribution history, see the revision
10
+# history and logs, available at http://fossil-scm.hwaci.com/fossil
11
+# # ## ### ##### ######## ############# #####################
12
+
13
+## Trunk, the special main line of development in a file.
14
+
15
+# # ## ### ##### ######## ############# #####################
16
+## Requirements
17
+
18
+package require Tcl 8.4 ; # Required runtime.
19
+package require snit ; # OO system.
20
+
21
+# # ## ### ##### ######## ############# #####################
22
+##
23
+
24
+snit::type ::vc::fossil::import::cvs::file::fossil::import::cvs::file::trunk {
25
+ # # ## ### ##### ######## #############
26
+ ## Public API
27
+
28
+ constructor {} {
29
+ return
30
+ }
31
+
32
+ # # ## ### ##### ######## #############
33
+ ## State
34
+
35
+ # # ## ### ##### ######## #############
36
+ ## Internal methods
37
+
38
+ # # ## ### ##### ######## #############
39
+ ## Configuration
40
+
41
+ pragma -hastypeinfo no ; # no type introspection
42
+ pragma -hasinfo no ; # no object introspection
43
+ pragma -hastypemethods no ; # type is not relevant.
44
+ pragma -simpledispatch yes ; # simple fast dispatch
45
+
46
+ # # ## ### ##### ######## #############
47
+}
48
+
49
+namespace eval ::vc::fossil::import::cvs::file {
50
+ namespace export trunk
51
+}
52
+
53
+# # ## ### ##### ######## ############# #####################
54
+## Ready
55
+
56
+package provide vc::fossil::import::c
--- a/tools/cvs2fossil/lib/c2f_ftrunk.tcl
+++ b/tools/cvs2fossil/lib/c2f_ftrunk.tcl
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/lib/c2f_ftrunk.tcl
+++ b/tools/cvs2fossil/lib/c2f_ftrunk.tcl
@@ -0,0 +1,56 @@
1 ## -*- tcl -*-
2 # # ## ### ##### ######## ############# #####################
3 ## Copyright (c) 2007 Andreas Kupries.
4 #
5 # This software is licensed as described in the file LICENSE, which
6 # you should have received as part of this distribution.
7 #
8 # This software consists of voluntary contributions made by many
9 # individuals. For exact contribution history, see the revision
10 # history and logs, available at http://fossil-scm.hwaci.com/fossil
11 # # ## ### ##### ######## ############# #####################
12
13 ## Trunk, the special main line of development in a file.
14
15 # # ## ### ##### ######## ############# #####################
16 ## Requirements
17
18 package require Tcl 8.4 ; # Required runtime.
19 package require snit ; # OO system.
20
21 # # ## ### ##### ######## ############# #####################
22 ##
23
24 snit::type ::vc::fossil::import::cvs::file::fossil::import::cvs::file::trunk {
25 # # ## ### ##### ######## #############
26 ## Public API
27
28 constructor {} {
29 return
30 }
31
32 # # ## ### ##### ######## #############
33 ## State
34
35 # # ## ### ##### ######## #############
36 ## Internal methods
37
38 # # ## ### ##### ######## #############
39 ## Configuration
40
41 pragma -hastypeinfo no ; # no type introspection
42 pragma -hasinfo no ; # no object introspection
43 pragma -hastypemethods no ; # type is not relevant.
44 pragma -simpledispatch yes ; # simple fast dispatch
45
46 # # ## ### ##### ######## #############
47 }
48
49 namespace eval ::vc::fossil::import::cvs::file {
50 namespace export trunk
51 }
52
53 # # ## ### ##### ######## ############# #####################
54 ## Ready
55
56 package provide vc::fossil::import::c
--- a/tools/cvs2fossil/lib/c2f_integrity.tcl
+++ b/tools/cvs2fossil/lib/c2f_integrity.tcl
@@ -0,0 +1,2 @@
1
+## -AllChangesetsSymboland## -fileand -CS""""""set n 0
2
+ RevisionCSetLinkageRevisionCSetLinkage {} {tsSymboland#
--- a/tools/cvs2fossil/lib/c2f_integrity.tcl
+++ b/tools/cvs2fossil/lib/c2f_integrity.tcl
@@ -0,0 +1,2 @@
 
 
--- a/tools/cvs2fossil/lib/c2f_integrity.tcl
+++ b/tools/cvs2fossil/lib/c2f_integrity.tcl
@@ -0,0 +1,2 @@
1 ## -AllChangesetsSymboland## -fileand -CS""""""set n 0
2 RevisionCSetLinkageRevisionCSetLinkage {} {tsSymboland#
--- a/tools/cvs2fossil/lib/c2f_option.tcl
+++ b/tools/cvs2fossil/lib/c2f_option.tcl
@@ -0,0 +1 @@
1
+##}iscprojectpass # --loopcheck--loopcheck{ integrity loopcheckon--loopcheckActivate the ewith loops, i. ass # --loopcheck--loopcheck{ integrity loopcheckon--loopcheckA
--- a/tools/cvs2fossil/lib/c2f_option.tcl
+++ b/tools/cvs2fossil/lib/c2f_option.tcl
@@ -0,0 +1 @@
 
--- a/tools/cvs2fossil/lib/c2f_option.tcl
+++ b/tools/cvs2fossil/lib/c2f_option.tcl
@@ -0,0 +1 @@
1 ##}iscprojectpass # --loopcheck--loopcheck{ integrity loopcheckon--loopcheckActivate the ewith loops, i. ass # --loopcheck--loopcheck{ integrity loopcheckon--loopcheckA
--- a/tools/cvs2fossil/lib/c2f_pass.tcl
+++ b/tools/cvs2fossil/lib/c2f_pass.tcl
@@ -0,0 +1,81 @@
1
+Time $p [lindeydesc($name) $descriptioDone $p"string length [llength $mypasses]]s
2
+
3
+ foreach code $mypasses {
4
+ trouble info " [format $nfmt $n]: [format $cfmt $code] : $mydesc($code)"
5
+ incr n
6
+ }
7
+ trouble info ""
8
+ return
9
+ }
10
+
11
+ # # ## ### ##### ######## #############
12
+ ## Public API, Methods (Execution)
13
+
14
+ typemethodu(Execution)
15
+
16
+ typemethod su## -*- tcl -*-
17
+# # ## ### ##### ##### ####ar 1 $ov ok
18
+ ::variable mydesc
19
+ if {$emptyok && ($code eq "")} return
20
+ if {[info exists mydesc($code)]} return
21
+ if {$label ne ""} {append label " "}
22
+ trouble fatal "Bad ${label}pass code $code"
23
+ set ok 0
24
+ return
25
+ }
26
+
27
+ proc Convert {code default} {
28
+ ::variable mypasses
29
+ return [expr {($code eq "") ? $default : [Id $code]}]
30
+ }
31
+
32
+ proc Id {code} {
33
+ ::variable mypasses
34
+ return [lsearch -exact $mypasses $code]
35
+ }
36
+
37
+ c Call {code args} {
38
+ ::variable mycmd
39
+ set cmd $mycmd($code)
40
+ foreach##### #####(codes).
41
+ typevariable myes).
42
+ typevariable mydesc -array {} ; enddescriptions (one li.
43
+ typevariable mycmd -array {} ; # Pass callback command.
44
+
45
+ tvariable mystart -1
46
+ typevariable myend -1
47
+ typriable mytime {} ; # Timing data for each executed pass.
48
+ typevariable mycurrentpass {} ; # Pass currently running.
49
+
50
+ # # ## ### ##### # ####### #############
51
+ ## Configuration
52
+
53
+ pragma -hasinstances no ; # singleton
54
+ pragma -hastypeinfo no ; # noname)]} {
55
+ trouble internal "##### #########"
56
+ ####
57
+}
58
+
59
+namespace eval ::vc::fossil::import::cvs {
60
+ namespace export pass
61
+ namespace eval pass {
62
+ namespace import ::vc::fossil::import::cvs::state
63
+ namespace import ::vc::fossil::import::cvs::integrity
64
+ namespace import ::vc::tools::misc::*
65
+ namespace import ::vc::tools::trouble
66
+ namespace import ::vc::tools::log
67
+ log register pass
68
+ }
69
+}
70
+
71
+# # ## ### ##### ######## ############# #### -*- tcl -*-
72
+###########
73
+## Copyright (c) 2007 Andreas Kupries.
74
+#
75
+# This software iTime $p [lindeydesc($name) $descriptioDone $p"string length [llength $mypasses]]s
76
+
77
+ foreach codeydesc($name) $descriptioDoneTime $p [lindeydesc($n$sec sec/$pass"
78
+ }Time $p [lindeydesc(deydesc($names::pass 1.0
79
+return
80
+ShowTimes {## -nfo exists mydesc($code)]} return
81
+ if {$label ne ""}
--- a/tools/cvs2fossil/lib/c2f_pass.tcl
+++ b/tools/cvs2fossil/lib/c2f_pass.tcl
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/lib/c2f_pass.tcl
+++ b/tools/cvs2fossil/lib/c2f_pass.tcl
@@ -0,0 +1,81 @@
1 Time $p [lindeydesc($name) $descriptioDone $p"string length [llength $mypasses]]s
2
3 foreach code $mypasses {
4 trouble info " [format $nfmt $n]: [format $cfmt $code] : $mydesc($code)"
5 incr n
6 }
7 trouble info ""
8 return
9 }
10
11 # # ## ### ##### ######## #############
12 ## Public API, Methods (Execution)
13
14 typemethodu(Execution)
15
16 typemethod su## -*- tcl -*-
17 # # ## ### ##### ##### ####ar 1 $ov ok
18 ::variable mydesc
19 if {$emptyok && ($code eq "")} return
20 if {[info exists mydesc($code)]} return
21 if {$label ne ""} {append label " "}
22 trouble fatal "Bad ${label}pass code $code"
23 set ok 0
24 return
25 }
26
27 proc Convert {code default} {
28 ::variable mypasses
29 return [expr {($code eq "") ? $default : [Id $code]}]
30 }
31
32 proc Id {code} {
33 ::variable mypasses
34 return [lsearch -exact $mypasses $code]
35 }
36
37 c Call {code args} {
38 ::variable mycmd
39 set cmd $mycmd($code)
40 foreach##### #####(codes).
41 typevariable myes).
42 typevariable mydesc -array {} ; enddescriptions (one li.
43 typevariable mycmd -array {} ; # Pass callback command.
44
45 tvariable mystart -1
46 typevariable myend -1
47 typriable mytime {} ; # Timing data for each executed pass.
48 typevariable mycurrentpass {} ; # Pass currently running.
49
50 # # ## ### ##### # ####### #############
51 ## Configuration
52
53 pragma -hasinstances no ; # singleton
54 pragma -hastypeinfo no ; # noname)]} {
55 trouble internal "##### #########"
56 ####
57 }
58
59 namespace eval ::vc::fossil::import::cvs {
60 namespace export pass
61 namespace eval pass {
62 namespace import ::vc::fossil::import::cvs::state
63 namespace import ::vc::fossil::import::cvs::integrity
64 namespace import ::vc::tools::misc::*
65 namespace import ::vc::tools::trouble
66 namespace import ::vc::tools::log
67 log register pass
68 }
69 }
70
71 # # ## ### ##### ######## ############# #### -*- tcl -*-
72 ###########
73 ## Copyright (c) 2007 Andreas Kupries.
74 #
75 # This software iTime $p [lindeydesc($name) $descriptioDone $p"string length [llength $mypasses]]s
76
77 foreach codeydesc($name) $descriptioDoneTime $p [lindeydesc($n$sec sec/$pass"
78 }Time $p [lindeydesc(deydesc($names::pass 1.0
79 return
80 ShowTimes {## -nfo exists mydesc($code)]} return
81 if {$label ne ""}
--- a/tools/cvs2fossil/lib/c2f_pbreakacycle.tcl
+++ b/tools/cvs2fossil/lib/c2f_pbreakacycle.tcl
@@ -0,0 +1 @@
1
+retrogradebreakRetrograde
--- a/tools/cvs2fossil/lib/c2f_pbreakacycle.tcl
+++ b/tools/cvs2fossil/lib/c2f_pbreakacycle.tcl
@@ -0,0 +1 @@
 
--- a/tools/cvs2fossil/lib/c2f_pbreakacycle.tcl
+++ b/tools/cvs2fossil/lib/c2f_pbreakacycle.tcl
@@ -0,0 +1 @@
1 retrogradebreakRetrograde
--- a/tools/cvs2fossil/lib/c2f_pbreakrcycle.tcl
+++ b/tools/cvs2fossil/lib/c2f_pbreakrcycle.tcl
@@ -0,0 +1,8 @@
1
+set changesets [Changesets]
2
+ cyclebreaker dot break-rev-start $changesets$changesets
3
+ }
4
+
5
+ cyclebreaker dot [myproc SaveOrder] [myproc Savdone $changesets\
6
+ \
7
+ [myproc SaveOrder]
8
+ }
--- a/tools/cvs2fossil/lib/c2f_pbreakrcycle.tcl
+++ b/tools/cvs2fossil/lib/c2f_pbreakrcycle.tcl
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/lib/c2f_pbreakrcycle.tcl
+++ b/tools/cvs2fossil/lib/c2f_pbreakrcycle.tcl
@@ -0,0 +1,8 @@
1 set changesets [Changesets]
2 cyclebreaker dot break-rev-start $changesets$changesets
3 }
4
5 cyclebreaker dot [myproc SaveOrder] [myproc Savdone $changesets\
6 \
7 [myproc SaveOrder]
8 }
--- a/tools/cvs2fossil/lib/c2f_pbreakscycle.tcl
+++ b/tools/cvs2fossil/lib/c2f_pbreakscycle.tcl
@@ -0,0 +1,4 @@
1
+## -*- tcl -*-
2
+#s\
3
+ [myproc IsBySymbol]]
4
+ }
--- a/tools/cvs2fossil/lib/c2f_pbreakscycle.tcl
+++ b/tools/cvs2fossil/lib/c2f_pbreakscycle.tcl
@@ -0,0 +1,4 @@
 
 
 
 
--- a/tools/cvs2fossil/lib/c2f_pbreakscycle.tcl
+++ b/tools/cvs2fossil/lib/c2f_pbreakscycle.tcl
@@ -0,0 +1,4 @@
1 ## -*- tcl -*-
2 #s\
3 [myproc IsBySymbol]]
4 }
--- a/tools/cvs2fossil/lib/c2f_pcollar.tcl
+++ b/tools/cvs2fossil/lib/c2f_pcollar.tcl
@@ -0,0 +1,17 @@
1
+#lsearch [glob -nocomplain -tail -types f -directory $base *] $usr] != -1 &&
2
+ [lsearch [glob -nocomplain -tail -types d -directory $base *] $usr] != -1 {return 0}
3
+
4
+ # use glob to account for case insensitive file systems
5
+ if {[lsearch [glob -nocomplain -tail -directory $base *] $usr,v] == -1tailif {
6
+ [file exists $base/$usr] &&
7
+ [file isdirectory $base/$usr] if {![file exists $base/$usr,v]writingwritingreading project
8
+ state reading
9
+
10
+snit::type [glob -nocomplain -tail -ty#lsearch [glob -nocomplain -tail -types f -directory $base *] $usr] != -1 &&
11
+ [lsearch [glob -nocomplain -tail -types d -directory $base *] $usr] != -1 {return 0}
12
+
13
+ # use glob to account for case insensitive file systems
14
+ if {[lsearch [glob -nocomplain -tail -directory $base *] $usr,v] == -1tailif {
15
+ [file exists $base/$usr] &&
16
+ [file isdirectory $base/$usr] if {![file exists $base/$usr,v]writingwritingreading project
17
+ state reading
--- a/tools/cvs2fossil/lib/c2f_pcollar.tcl
+++ b/tools/cvs2fossil/lib/c2f_pcollar.tcl
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/lib/c2f_pcollar.tcl
+++ b/tools/cvs2fossil/lib/c2f_pcollar.tcl
@@ -0,0 +1,17 @@
1 #lsearch [glob -nocomplain -tail -types f -directory $base *] $usr] != -1 &&
2 [lsearch [glob -nocomplain -tail -types d -directory $base *] $usr] != -1 {return 0}
3
4 # use glob to account for case insensitive file systems
5 if {[lsearch [glob -nocomplain -tail -directory $base *] $usr,v] == -1tailif {
6 [file exists $base/$usr] &&
7 [file isdirectory $base/$usr] if {![file exists $base/$usr,v]writingwritingreading project
8 state reading
9
10 snit::type [glob -nocomplain -tail -ty#lsearch [glob -nocomplain -tail -types f -directory $base *] $usr] != -1 &&
11 [lsearch [glob -nocomplain -tail -types d -directory $base *] $usr] != -1 {return 0}
12
13 # use glob to account for case insensitive file systems
14 if {[lsearch [glob -nocomplain -tail -directory $base *] $usr,v] == -1tailif {
15 [file exists $base/$usr] &&
16 [file isdirectory $base/$usr] if {![file exists $base/$usr,v]writingwritingreading project
17 state reading
--- a/tools/cvs2fossil/lib/c2f_pcollrev.tcl
+++ b/tools/cvs2fossil/lib/c2f_pcollrev.tcl
@@ -0,0 +1,174 @@
1
+## -*- tcl -*-
2
+# # ## ### ##### ######## ############# #####################
3
+## Copyright (c) 2007
4
+## Copyright (c) 2007-2008 Andreas Kupries.
5
+#
6
+# This software is licensed as described in the file LICENSE, which
7
+# you should have received as part of this distribution.
8
+#
9
+# This software consists of voluntary contributions made by many
10
+# individuals. For exact contribution history, see the revision
11
+# history and logs, available at http://fossil-scm.hwaci.com/fossil
12
+# # ## ### ##### ######## ############# #####################
13
+
14
+## Pass II. This pass parses the collected rcs archives and extracts
15
+## all the information they contain (revisions, and symbols).
16
+
17
+# # ## ### ##### ######## ############# #####################
18
+## Requirements
19
+
20
+package require Tcl 8.4 ; # Required runtime.
21
+package require snit ; # OO system.
22
+package require vc::tools::trouble ; # Error reporting.
23
+package require vc::tools::log ; # User feedback.
24
+package require vc::fossil::import::cvs::pass ; # Pass management.
25
+package require vc::fossil::import::cvs::repository ; # Repository management.
26
+package require vc::fossil::import::cvs::state ; # State storage.
27
+package require vc::fossil::import::cvs::integrity ; # State integrity checks.
28
+package require vc::fossil::import::cvs::project::sym ; # Project level symbols.
29
+package require vc::fossil::import::cvs::file::rev ; # File level revisions.
30
+package require vc::rcs::parser ; # Rcs archive data extraction.
31
+
32
+# # ## ### ##### ######## ############# #####################
33
+## Register the pass with the management
34
+
35
+vc::fossil::import::cvs::pass define \
36
+ CollectRev \
37
+ {Collect revisions and symbols} \
38
+ ::vc::fossil::import::cvs::pass::collrev
39
+
40
+# # ## ### ##### ######## ########### ## #####################
41
+##
42
+
43
+snit::type ::vc::fossil::import::cvs::pass::collrev {
44
+ # # ## ### ##### ######## #############
45
+ ## Public API
46
+
47
+ typemethod setup {} {
48
+ # Define names and strucreading project
49
+ state readingtate use project
50
+ state use file
51
+
52
+ # We deal with per project and per file data, the first
53
+ # collated from the second.
54
+
55
+ # Per file we have general information, ..., and then
56
+ # revisions and symbols. The latter can be further separated
57
+ # into tags and branches. At project level the per-file
58
+ # symbols information is merged.
59
+
60
+ # File level ...
61
+ # Revisions, Branches, Tags
62
+ #
63
+ # Pseudo class hierarchy
64
+ # Tag <- Symbol <- Event
65
+ # Branch <- Symbol <- Event
66
+ # Revision writing ; # OO system.
67
+package require vc::tools::trouble ; # Error reporting.
68
+package require vc::tools::log ; # User feedback.
69
+package require vc::fossil::import::cvs::pass ; # Pass management.
70
+package require vc::fossil::import::cvs::repository ; # Repository management.
71
+package require vc::fossil::import::cvs::state ; # State storage.
72
+package require vc::fossil::import::cvs::integrity ; # State integrity checks.
73
+package require vc::fossil::import::cvs::project::sym ; # Project level symbols.
74
+package require vc::fossil::import::cvs::file::rev ; # File level revisions.
75
+package require vc::rcs::parser ; # Rcs archive data extraction.
76
+
77
+# # ## ### ##### ######## ############# #####################
78
+## Register the pass with the management
79
+
80
+vc::fossil::import::cvs::pass define \
81
+ CollectRev \
82
+ {Collect revisions and symbols} \
83
+ ::vc::fossil::import::cvs::pass::collrev
84
+
85
+# # ## ### ##### ######## ############# #####################
86
+##
87
+
88
+snit::type ::vc::fossil::import::cvs::pass::collrev {
89
+ # # ## ### ##### ######## #############
90
+ ## Public API
91
+
92
+ typemethod setup {} {
93
+ # Define names and structure of the persistent state of this
94
+ # pass.
95
+
96
+ state use project
97
+ state use file
98
+
99
+ # We deal with per project and per file data, the first
100
+ # collated from the second.
101
+
102
+ # Per file we have general information, ..., and then
103
+ # revisions and symbols. The latter can be further separated
104
+ # into tags and branches. At project level the per-file
105
+ # symbols information is merged.
106
+
107
+ # File lwritingvision,
108
+ dbchild INTEGER REFERENCES revision,
109
+
110
+ -- The main payload of the revision are the date/time it
111
+ -- was entered, its state, operation (= type/class), text
112
+ -- content, and meta data (author, log message, branch,
113
+ -- project). The last is encoded as single id, see table
114
+ -- 'meta'. The date/time is given in seconds since the
115
+ -- The text content writing --## Copyright (c) 2007-2008 And## -*- tcl -*-
116
+# # ## nothing to
117
+ -- sprout from, the dead revision was removed, hence no
118
+ -- root.
119
+ } { root first sid }
120
+ # Indices on: root (revision successors)
121
+ # first (revision predecessors)
122
+ # sid (tag predecessors, branch successors/predecewritingot of
123
+ -- the trunk. The root also has a non-NULL dbparent
124
+ -- refering to X.
125
+
126
+ isdefault INTEGER NOT NULL,
127
+ dbparent INTEGER REFERENCES revision,
128
+ dbchild INTEGER REFERENCES revision,
129
+
130
+ -- The main payload of the revision are the date/time it
131
+ -- was entered, its state, operation (= type/class), text
132
+ -- content, and meta data (author, log message, branch,
133
+ -- project). The last y after it has beecontent is an
134
+ --## Copyright (c) 2007-2008 And## -*- tcl -*-
135
+# # ## nothing to
136
+ -- sprout from, the dead revision was removed, hence no
137
+ -- root.
138
+ } { root first sid }
139
+ # Indices on: root (revision successors)
140
+ # first (revision predecessors)
141
+ # sid (tag predecessors, branch sucarent INTEGER REFER sid (tag predecesES revision,
142
+ dbchild INTEGER REFERENCES revision,
143
+
144
+ -- The main payload of the revision are the date/time it
145
+ -- was entered, its state, operation (= type/class), text
146
+ -- content, and meta data (author, log message, branch,
147
+ -- project). The# -*- tcl -*-
148
+# # ## ### ##### ######## ############# #####################
149
+## Copyright (c) 2007
150
+## Copyright (c) 2007-2008 Andreas Kupries.
151
+#
152
+# This software is licensed as described in the file LICENSE, which
153
+# you should have received as part of this distribution.
154
+#
155
+# This software consists of voluntary contributions made by many
156
+# individuals. For exact contribution history, see the revision
157
+# history and logs, available at http://fossil-scm.hwaci.com/fossil
158
+# # ## ### ##### ######## ############# #####################
159
+
160
+## Pass II. This pass parses the collected rcs archives and extracts
161
+## all the information they contain (revisions, and symbols).
162
+
163
+# # ## ### ##### ######## ############# #####################
164
+## Requirements
165
+
166
+package require Tcl 8.4 ; # Required runtime.
167
+package require snit ; # OO system.
168
+package require vc::tools::trouble ; # Error reporting.
169
+package require vc::tools::
170
+ bmain payload of the revision are User feedback.
171
+package require vc::fossil::import::cvs::pass ; # Pass management.
172
+package require vc::fossil::import::cvs::repository ; # Repository management.
173
+package require vc::fossil::import::cvs::state ; # State storage.
174
+package require vc::fossil::import::cvs::integrity
--- a/tools/cvs2fossil/lib/c2f_pcollrev.tcl
+++ b/tools/cvs2fossil/lib/c2f_pcollrev.tcl
@@ -0,0 +1,174 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/lib/c2f_pcollrev.tcl
+++ b/tools/cvs2fossil/lib/c2f_pcollrev.tcl
@@ -0,0 +1,174 @@
1 ## -*- tcl -*-
2 # # ## ### ##### ######## ############# #####################
3 ## Copyright (c) 2007
4 ## Copyright (c) 2007-2008 Andreas Kupries.
5 #
6 # This software is licensed as described in the file LICENSE, which
7 # you should have received as part of this distribution.
8 #
9 # This software consists of voluntary contributions made by many
10 # individuals. For exact contribution history, see the revision
11 # history and logs, available at http://fossil-scm.hwaci.com/fossil
12 # # ## ### ##### ######## ############# #####################
13
14 ## Pass II. This pass parses the collected rcs archives and extracts
15 ## all the information they contain (revisions, and symbols).
16
17 # # ## ### ##### ######## ############# #####################
18 ## Requirements
19
20 package require Tcl 8.4 ; # Required runtime.
21 package require snit ; # OO system.
22 package require vc::tools::trouble ; # Error reporting.
23 package require vc::tools::log ; # User feedback.
24 package require vc::fossil::import::cvs::pass ; # Pass management.
25 package require vc::fossil::import::cvs::repository ; # Repository management.
26 package require vc::fossil::import::cvs::state ; # State storage.
27 package require vc::fossil::import::cvs::integrity ; # State integrity checks.
28 package require vc::fossil::import::cvs::project::sym ; # Project level symbols.
29 package require vc::fossil::import::cvs::file::rev ; # File level revisions.
30 package require vc::rcs::parser ; # Rcs archive data extraction.
31
32 # # ## ### ##### ######## ############# #####################
33 ## Register the pass with the management
34
35 vc::fossil::import::cvs::pass define \
36 CollectRev \
37 {Collect revisions and symbols} \
38 ::vc::fossil::import::cvs::pass::collrev
39
40 # # ## ### ##### ######## ########### ## #####################
41 ##
42
43 snit::type ::vc::fossil::import::cvs::pass::collrev {
44 # # ## ### ##### ######## #############
45 ## Public API
46
47 typemethod setup {} {
48 # Define names and strucreading project
49 state readingtate use project
50 state use file
51
52 # We deal with per project and per file data, the first
53 # collated from the second.
54
55 # Per file we have general information, ..., and then
56 # revisions and symbols. The latter can be further separated
57 # into tags and branches. At project level the per-file
58 # symbols information is merged.
59
60 # File level ...
61 # Revisions, Branches, Tags
62 #
63 # Pseudo class hierarchy
64 # Tag <- Symbol <- Event
65 # Branch <- Symbol <- Event
66 # Revision writing ; # OO system.
67 package require vc::tools::trouble ; # Error reporting.
68 package require vc::tools::log ; # User feedback.
69 package require vc::fossil::import::cvs::pass ; # Pass management.
70 package require vc::fossil::import::cvs::repository ; # Repository management.
71 package require vc::fossil::import::cvs::state ; # State storage.
72 package require vc::fossil::import::cvs::integrity ; # State integrity checks.
73 package require vc::fossil::import::cvs::project::sym ; # Project level symbols.
74 package require vc::fossil::import::cvs::file::rev ; # File level revisions.
75 package require vc::rcs::parser ; # Rcs archive data extraction.
76
77 # # ## ### ##### ######## ############# #####################
78 ## Register the pass with the management
79
80 vc::fossil::import::cvs::pass define \
81 CollectRev \
82 {Collect revisions and symbols} \
83 ::vc::fossil::import::cvs::pass::collrev
84
85 # # ## ### ##### ######## ############# #####################
86 ##
87
88 snit::type ::vc::fossil::import::cvs::pass::collrev {
89 # # ## ### ##### ######## #############
90 ## Public API
91
92 typemethod setup {} {
93 # Define names and structure of the persistent state of this
94 # pass.
95
96 state use project
97 state use file
98
99 # We deal with per project and per file data, the first
100 # collated from the second.
101
102 # Per file we have general information, ..., and then
103 # revisions and symbols. The latter can be further separated
104 # into tags and branches. At project level the per-file
105 # symbols information is merged.
106
107 # File lwritingvision,
108 dbchild INTEGER REFERENCES revision,
109
110 -- The main payload of the revision are the date/time it
111 -- was entered, its state, operation (= type/class), text
112 -- content, and meta data (author, log message, branch,
113 -- project). The last is encoded as single id, see table
114 -- 'meta'. The date/time is given in seconds since the
115 -- The text content writing --## Copyright (c) 2007-2008 And## -*- tcl -*-
116 # # ## nothing to
117 -- sprout from, the dead revision was removed, hence no
118 -- root.
119 } { root first sid }
120 # Indices on: root (revision successors)
121 # first (revision predecessors)
122 # sid (tag predecessors, branch successors/predecewritingot of
123 -- the trunk. The root also has a non-NULL dbparent
124 -- refering to X.
125
126 isdefault INTEGER NOT NULL,
127 dbparent INTEGER REFERENCES revision,
128 dbchild INTEGER REFERENCES revision,
129
130 -- The main payload of the revision are the date/time it
131 -- was entered, its state, operation (= type/class), text
132 -- content, and meta data (author, log message, branch,
133 -- project). The last y after it has beecontent is an
134 --## Copyright (c) 2007-2008 And## -*- tcl -*-
135 # # ## nothing to
136 -- sprout from, the dead revision was removed, hence no
137 -- root.
138 } { root first sid }
139 # Indices on: root (revision successors)
140 # first (revision predecessors)
141 # sid (tag predecessors, branch sucarent INTEGER REFER sid (tag predecesES revision,
142 dbchild INTEGER REFERENCES revision,
143
144 -- The main payload of the revision are the date/time it
145 -- was entered, its state, operation (= type/class), text
146 -- content, and meta data (author, log message, branch,
147 -- project). The# -*- tcl -*-
148 # # ## ### ##### ######## ############# #####################
149 ## Copyright (c) 2007
150 ## Copyright (c) 2007-2008 Andreas Kupries.
151 #
152 # This software is licensed as described in the file LICENSE, which
153 # you should have received as part of this distribution.
154 #
155 # This software consists of voluntary contributions made by many
156 # individuals. For exact contribution history, see the revision
157 # history and logs, available at http://fossil-scm.hwaci.com/fossil
158 # # ## ### ##### ######## ############# #####################
159
160 ## Pass II. This pass parses the collected rcs archives and extracts
161 ## all the information they contain (revisions, and symbols).
162
163 # # ## ### ##### ######## ############# #####################
164 ## Requirements
165
166 package require Tcl 8.4 ; # Required runtime.
167 package require snit ; # OO system.
168 package require vc::tools::trouble ; # Error reporting.
169 package require vc::tools::
170 bmain payload of the revision are User feedback.
171 package require vc::fossil::import::cvs::pass ; # Pass management.
172 package require vc::fossil::import::cvs::repository ; # Repository management.
173 package require vc::fossil::import::cvs::state ; # State storage.
174 package require vc::fossil::import::cvs::integrity
--- a/tools/cvs2fossil/lib/c2f_pcollsym.tcl
+++ b/tools/cvs2fossil/lib/c2f_pcollsym.tcl
@@ -0,0 +1,112 @@
1
+## -*- tcl -* ######## ##########ted`)) -- Restrict to symeleted by this pass, not only marked. It is the next
2
+## pass however, 'FilterSym', which performs the full deletion.
3
+
4
+# # ## ### ##### ######## ############# #####################
5
+## Requirements
6
+
7
+package require Tcl 8.4 ; # Required runtime.
8
+package require snit ; # OO system.
9
+package require vc::tools::trouble ; # Error reporting.
10
+package require vc::tools::log ; # User feedback.
11
+package require vc::fossil::import::cvs::repository ; # Repository management.
12
+package require vc::fossil::import::cvs::state ; # State storage.
13
+package require vc::fossil::import::cvs::project::sym ; # Project level symbols
14
+
15
+# # ## ### ##### ######## ############# #####################
16
+## Register the pass with the management
17
+
18
+vc::fossil::import::cvs::pass define \
19
+ CollateSymbols \
20
+ {Collate symbols} \
21
+ ::vc::fossil::import::cvs::pass::collsym
22
+
23
+# # ## ### ##### ######## ############# #####################
24
+##
25
+
26
+snit::type ::vc::fossil::import:pass.
27
+
28
+ state use project
29
+ state use symbol
30
+ state use symtype
31
+ state use blocker
32
+ state use parent
33
+
34
+ state extend preferedparent {
35
+ reading symbol
36
+ state reading blocker
37
+ state reading parent
38
+
39
+ state writinghe symbol '$snamminePref= $undefreachrow {
40
+ S one tree per
41
+ -- project.
42
+
43
+ sid INTEGER NOT NULL PRIMARY KEY RE] {
44
+ trouble fatal "$p## -*- tcl -*-
45
+# # ## ### ##### ######## ############# #####################
46
+## Copyright (c) 2007 Andreas Kupries.
47
+#
48
+# This software is licensed as described in the file LICENSE, which
49
+# you should h *-
50
+# # ## ### ##### #### -*- tcl -*-
51
+# ### -*- tcl -*-
52
+# name
53
+ FROM symbol S, project P
54
+ WHERE S.type NOT IN (0,1,2) -- Restrict to symbols with bogus type codes
55
+ AND P.pid = S.pid -- Get project of symbol
56
+ } {
57
+ trouble fatal "$pname : The symbol '$sname' has no proper conversion type"
58
+ }
59
+ return
60
+ }
61
+
62
+ proc BlockedExcludes {} {
63
+ # Paranoia - Have we scheduled symbols for exclusion without
64
+ # also excluding their dependent symbols ?
65
+
66
+ set excl [project::sym excluded]
67
+
68
+ state foreachrow {
69
+ SELECT P.name AS pname, S.name AS sname, SB.name AS bname
70
+ FROM symbol S, blocker B, symbol SB, project P
71
+ WHERE S.type = $excl -- Restrict to excluded symbols
72
+ AND S.sid = B.sid -- Get symbols blocking them
73
+ AND B.bid = SB.sid -- and
74
+ AND SB.type != $excl -- which are not excluded themselves
75
+ AND P.pid = S.pid -- Get project of symbol
76
+ } {
77
+ trouble fatal "$pname : The symbol '$sname' cannot be excluded as the unexcluded symbol '$bname' depends on it."
78
+ }
79
+ return
80
+ }
81
+
82
+ proc InvalidTags {} {
83
+ # Paranoi, we
84
+ # # Paranoia - Have we not
85
+ # # which absolutely cannot be converted as tags due to commits
86
+ # made on them ?
87
+
88
+ # In other words, this checks finds out if the user has asked
89
+ # nonsensical conversions of symbols, which should have been
90
+ # left to the heuristics, most specifically
91
+ # 'project::sym.HasCommits()'.
92
+
93
+ set tag [project::sym tag]
94
+
95
+ state foreachrow {
96
+ SELECT P.name AS pname, S.name AS sname
97
+ FROM project P, symbol S
98
+ WHERE S.type = $tag -- Restrict to tag symbols
99
+ AND S.commit_count > 0 -- which have revisions committed to them
100
+ AND P.pid = S.pid -- Get project of symbol
101
+ } {
102
+ trouble fatal "$pname : The symbol '$sname' cannot be forced to be converted as tag because it has commits."
103
+ }
104
+ return
105
+ }
106
+
107
+ proc DropExcludedSymbolsFromReferences {} {
108
+ # The excluded symbols cann be used as blockers nor as
109
+ # possible parent for other symbols. We now drop the relevant
110
+ # entries to prevent them from causing confusion later on.
111
+
112
+ set excl [project
--- a/tools/cvs2fossil/lib/c2f_pcollsym.tcl
+++ b/tools/cvs2fossil/lib/c2f_pcollsym.tcl
@@ -0,0 +1,112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/lib/c2f_pcollsym.tcl
+++ b/tools/cvs2fossil/lib/c2f_pcollsym.tcl
@@ -0,0 +1,112 @@
1 ## -*- tcl -* ######## ##########ted`)) -- Restrict to symeleted by this pass, not only marked. It is the next
2 ## pass however, 'FilterSym', which performs the full deletion.
3
4 # # ## ### ##### ######## ############# #####################
5 ## Requirements
6
7 package require Tcl 8.4 ; # Required runtime.
8 package require snit ; # OO system.
9 package require vc::tools::trouble ; # Error reporting.
10 package require vc::tools::log ; # User feedback.
11 package require vc::fossil::import::cvs::repository ; # Repository management.
12 package require vc::fossil::import::cvs::state ; # State storage.
13 package require vc::fossil::import::cvs::project::sym ; # Project level symbols
14
15 # # ## ### ##### ######## ############# #####################
16 ## Register the pass with the management
17
18 vc::fossil::import::cvs::pass define \
19 CollateSymbols \
20 {Collate symbols} \
21 ::vc::fossil::import::cvs::pass::collsym
22
23 # # ## ### ##### ######## ############# #####################
24 ##
25
26 snit::type ::vc::fossil::import:pass.
27
28 state use project
29 state use symbol
30 state use symtype
31 state use blocker
32 state use parent
33
34 state extend preferedparent {
35 reading symbol
36 state reading blocker
37 state reading parent
38
39 state writinghe symbol '$snamminePref= $undefreachrow {
40 S one tree per
41 -- project.
42
43 sid INTEGER NOT NULL PRIMARY KEY RE] {
44 trouble fatal "$p## -*- tcl -*-
45 # # ## ### ##### ######## ############# #####################
46 ## Copyright (c) 2007 Andreas Kupries.
47 #
48 # This software is licensed as described in the file LICENSE, which
49 # you should h *-
50 # # ## ### ##### #### -*- tcl -*-
51 # ### -*- tcl -*-
52 # name
53 FROM symbol S, project P
54 WHERE S.type NOT IN (0,1,2) -- Restrict to symbols with bogus type codes
55 AND P.pid = S.pid -- Get project of symbol
56 } {
57 trouble fatal "$pname : The symbol '$sname' has no proper conversion type"
58 }
59 return
60 }
61
62 proc BlockedExcludes {} {
63 # Paranoia - Have we scheduled symbols for exclusion without
64 # also excluding their dependent symbols ?
65
66 set excl [project::sym excluded]
67
68 state foreachrow {
69 SELECT P.name AS pname, S.name AS sname, SB.name AS bname
70 FROM symbol S, blocker B, symbol SB, project P
71 WHERE S.type = $excl -- Restrict to excluded symbols
72 AND S.sid = B.sid -- Get symbols blocking them
73 AND B.bid = SB.sid -- and
74 AND SB.type != $excl -- which are not excluded themselves
75 AND P.pid = S.pid -- Get project of symbol
76 } {
77 trouble fatal "$pname : The symbol '$sname' cannot be excluded as the unexcluded symbol '$bname' depends on it."
78 }
79 return
80 }
81
82 proc InvalidTags {} {
83 # Paranoi, we
84 # # Paranoia - Have we not
85 # # which absolutely cannot be converted as tags due to commits
86 # made on them ?
87
88 # In other words, this checks finds out if the user has asked
89 # nonsensical conversions of symbols, which should have been
90 # left to the heuristics, most specifically
91 # 'project::sym.HasCommits()'.
92
93 set tag [project::sym tag]
94
95 state foreachrow {
96 SELECT P.name AS pname, S.name AS sname
97 FROM project P, symbol S
98 WHERE S.type = $tag -- Restrict to tag symbols
99 AND S.commit_count > 0 -- which have revisions committed to them
100 AND P.pid = S.pid -- Get project of symbol
101 } {
102 trouble fatal "$pname : The symbol '$sname' cannot be forced to be converted as tag because it has commits."
103 }
104 return
105 }
106
107 proc DropExcludedSymbolsFromReferences {} {
108 # The excluded symbols cann be used as blockers nor as
109 # possible parent for other symbols. We now drop the relevant
110 # entries to prevent them from causing confusion later on.
111
112 set excl [project
--- a/tools/cvs2fossil/lib/c2f_pfiltersym.tcl
+++ b/tools/cvs2fossil/lib/c2f_pfiltersym.tcl
@@ -0,0 +1,3 @@
1
+ tag] into branches
2
+#
3
+# This softwar## -*- tcl
--- a/tools/cvs2fossil/lib/c2f_pfiltersym.tcl
+++ b/tools/cvs2fossil/lib/c2f_pfiltersym.tcl
@@ -0,0 +1,3 @@
 
 
 
--- a/tools/cvs2fossil/lib/c2f_pfiltersym.tcl
+++ b/tools/cvs2fossil/lib/c2f_pfiltersym.tcl
@@ -0,0 +1,3 @@
1 tag] into branches
2 #
3 # This softwar## -*- tcl
--- a/tools/cvs2fossil/lib/c2f_pinitcsets.tcl
+++ b/tools/cvs2fossil/lib/c2f_pinitcsets.tcl
@@ -0,0 +1,124 @@
1
+## -*- tcl -*-
2
+# # ## ### ##### ######## ############# #####################
3
+## Copyright (c) 2007
4
+## Copyright (c) 2007-2008 Andreas Kupries.
5
+#
6
+# This software is licensed}set oldin the loop below uses
7
+ #
8
+ # TODO: Move to project::rev
9
+ set n 0
10
+ log write 2 initcsets {Loading the changesets}
11
+# -*- tcl -*-
12
+# # ## ### ##### ######## ############# #####################
13
+## Copyright (c) 2007
14
+## Copyright (c) 2007-2008 Andreas Kupries.
15
+#
16
+# This software is licensed}set old*-
17
+# # ## ### ##### ######## ############# #####################
18
+## Copyright (c) 2007
19
+## Copyright (c) 2007-2008 Andreas Kupries.
20
+#
21
+# Thispid] $cstype $srcid [state run {
22
+ SELECT C.iid
23
+ FROM csitem C
24
+ WHERE C.cid = $id
25
+ ORDER BY C.pos
26
+ }] $id]
27
+ incr n
28
+ }
29
+counter# Copyright (c) 2007## -*- tcl -*-
30
+# # ## ### ##### ######## ############# #####################
31
+## Copyright (c) 2007
32
+## Copyright (c) 2007-2008 Andreas Kupries.
33
+#
34
+# This software is licensed}set oldreading meta
35
+ state readingreadingreading branch
36
+ state readinwriting## -*- tcl -*-
37
+# # ## ### ####ght (c) 2007
38
+## Copyright (c) 2007-2008 Andreas Kupries.
39
+#
40
+# This software ### ##### ######## ############### -*- t# Copyright (c) 2 the revisions
41
+ #are is## -*- tcl -*- changeset.
42
+ an appear
43
+ # in both revision and symbol changesets, and in multiple
44
+ ts {Loading the changesets}
45
+# -*- tcl -*-
46
+# # ## ### ##### ######## ############# #####################
47
+## Copyright (c) 200revision Copyright (c) 2007-2008 Andreas Kupries.
48
+#
49
+# This software is licensed}set old* [projecrid## Copyright (c) 20) 2007
50
+## Copyright (c) 2007-2008 Andreas Kupries.
51
+#
52
+# This software is licensrid)
53
+ }
54
+
55
+ state readinwriting## -*### ######## ############# #####################
56
+## Copyright (c) 2007
57
+## Copyright (c) 2007-2008 Andreas Kupries.
58
+#
59
+# This software is licensed}set old*-
60
+# # ## revision7
61
+## Copyright (c)ries.
62
+#
63
+# This software is licensed}set oldreading meta
64
+ state readingreadingreading branch
65
+ state readinwriting## -*- tcl -*-
66
+# # ## ### ##### ######## ############# #####################
67
+## Copyright (c) 2007
68
+## Copyright (c) 2007-2008 Andreas Kupries.
69
+#
70
+# This software is licensed}set oldin the loop below uses
71
+ #
72
+ # TODO: Move to pr### ###ght (c) 2007
73
+## Copyright (c) 2007-2008 Andreas Kupries.
74
+#
75
+# This softwarerid
76
+ FROM csrevisionsoftware is licensed}set oldwrite rerevisionrevisionsrrevisionrevisionsr
77
+ # unique within the chan Check ifH@K0,F: are possible.
78
+I@eG,1r@uq,1: K@wk,1:,59@xE,5l@13Y,A:getcstypeslo@193,7:lod 9@24~,4:lastR@24t,S: {}
79
+
80
+ foreach {sid rid lod pT@13x,s:S.sid, R.rid, R.lod, S.pid
81
+ FROM tag T, revision R14@1wf,M:rev = R.rid
82
+ AND _@1xg,4:R.loP@1gg,g:($lastlod != $lod) || ($lastsymbol != $sid)20@28u,1K@1~x,B:lod $lo2q@1kR,3:symP@1~x,3:}
83
+
84
+G@20l,I:{}
85
+ set lastlod y@24h,5:lod pT@13x,I:S.sid, R.rid, R.loU@26I,A:revision R11@26j,N:root = R.rid
86
+ AND a@27h,4:R.loP@1g}d*-
87
+# # ## revision7
88
+## Copyrig is licensed}set old* [projecrid## Copyright (c) 20) 2007
89
+## Copyright (c) 2007-2008 Andreas Kupries.
90
+#
91
+# This software is licensrid)
92
+ }
93
+
94
+ state readinwriting## -*### ######## ############# #####################
95
+## Copyright (c) 2007
96
+## Copyright (c) 2007-2008 Andreas Kupries.
97
+#
98
+# This software is licensed}set old*-
99
+# # ## revision7
100
+## Copyright (c)ries.
101
+#
102
+# This software is licensed}set oldreading meta
103
+ state readingreadingreading branch
104
+ state readinwriting## -*- tcl -*-
105
+# # ## ### ##### ######## ############# #####################
106
+## Copyright (c) 2007
107
+## Copyright (c) 2007-2008 Andreas Kupries.
108
+#
109
+# This software is licensed}set oldin the loop below uses
110
+ #
111
+ # TODO: Move to pr### ###ght (c) 2007
112
+## Copyright (c) 2007-2008 Andreas Kupries.
113
+#
114
+# This softwarerid
115
+ FROM csrevisionsoftware is licensed}set oldwrite rerevisionrevisionsrrevisionrevisionsr
116
+ # unique within the chan Check ifH@K0,F: are possible.
117
+I@eG,1r@uq,1: K@wk,1:,59@xE,5l@13Y,A:getcstypeslo@193,7:lod 9@24~,4:lastR@24t,S: {}
118
+
119
+ foreach {sid rid lod pT@13x,s:S.sid, R.rid, R.lod, S.pid
120
+ FROM tag T, revision R14@1wf,M:rev = R.rid
121
+ AND _@1xg,4:R.loP@1gg,g:($lastlod != $lod) || ($lastsymbol != $sid)20@28u,1K@1~x,B:lod ]
122
+ $r setid $ido2q@1kR,3:symP@1~x,3:}
123
+
124
+G@20l,Id, R.rid, R.l
--- a/tools/cvs2fossil/lib/c2f_pinitcsets.tcl
+++ b/tools/cvs2fossil/lib/c2f_pinitcsets.tcl
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/lib/c2f_pinitcsets.tcl
+++ b/tools/cvs2fossil/lib/c2f_pinitcsets.tcl
@@ -0,0 +1,124 @@
1 ## -*- tcl -*-
2 # # ## ### ##### ######## ############# #####################
3 ## Copyright (c) 2007
4 ## Copyright (c) 2007-2008 Andreas Kupries.
5 #
6 # This software is licensed}set oldin the loop below uses
7 #
8 # TODO: Move to project::rev
9 set n 0
10 log write 2 initcsets {Loading the changesets}
11 # -*- tcl -*-
12 # # ## ### ##### ######## ############# #####################
13 ## Copyright (c) 2007
14 ## Copyright (c) 2007-2008 Andreas Kupries.
15 #
16 # This software is licensed}set old*-
17 # # ## ### ##### ######## ############# #####################
18 ## Copyright (c) 2007
19 ## Copyright (c) 2007-2008 Andreas Kupries.
20 #
21 # Thispid] $cstype $srcid [state run {
22 SELECT C.iid
23 FROM csitem C
24 WHERE C.cid = $id
25 ORDER BY C.pos
26 }] $id]
27 incr n
28 }
29 counter# Copyright (c) 2007## -*- tcl -*-
30 # # ## ### ##### ######## ############# #####################
31 ## Copyright (c) 2007
32 ## Copyright (c) 2007-2008 Andreas Kupries.
33 #
34 # This software is licensed}set oldreading meta
35 state readingreadingreading branch
36 state readinwriting## -*- tcl -*-
37 # # ## ### ####ght (c) 2007
38 ## Copyright (c) 2007-2008 Andreas Kupries.
39 #
40 # This software ### ##### ######## ############### -*- t# Copyright (c) 2 the revisions
41 #are is## -*- tcl -*- changeset.
42 an appear
43 # in both revision and symbol changesets, and in multiple
44 ts {Loading the changesets}
45 # -*- tcl -*-
46 # # ## ### ##### ######## ############# #####################
47 ## Copyright (c) 200revision Copyright (c) 2007-2008 Andreas Kupries.
48 #
49 # This software is licensed}set old* [projecrid## Copyright (c) 20) 2007
50 ## Copyright (c) 2007-2008 Andreas Kupries.
51 #
52 # This software is licensrid)
53 }
54
55 state readinwriting## -*### ######## ############# #####################
56 ## Copyright (c) 2007
57 ## Copyright (c) 2007-2008 Andreas Kupries.
58 #
59 # This software is licensed}set old*-
60 # # ## revision7
61 ## Copyright (c)ries.
62 #
63 # This software is licensed}set oldreading meta
64 state readingreadingreading branch
65 state readinwriting## -*- tcl -*-
66 # # ## ### ##### ######## ############# #####################
67 ## Copyright (c) 2007
68 ## Copyright (c) 2007-2008 Andreas Kupries.
69 #
70 # This software is licensed}set oldin the loop below uses
71 #
72 # TODO: Move to pr### ###ght (c) 2007
73 ## Copyright (c) 2007-2008 Andreas Kupries.
74 #
75 # This softwarerid
76 FROM csrevisionsoftware is licensed}set oldwrite rerevisionrevisionsrrevisionrevisionsr
77 # unique within the chan Check ifH@K0,F: are possible.
78 I@eG,1r@uq,1: K@wk,1:,59@xE,5l@13Y,A:getcstypeslo@193,7:lod 9@24~,4:lastR@24t,S: {}
79
80 foreach {sid rid lod pT@13x,s:S.sid, R.rid, R.lod, S.pid
81 FROM tag T, revision R14@1wf,M:rev = R.rid
82 AND _@1xg,4:R.loP@1gg,g:($lastlod != $lod) || ($lastsymbol != $sid)20@28u,1K@1~x,B:lod $lo2q@1kR,3:symP@1~x,3:}
83
84 G@20l,I:{}
85 set lastlod y@24h,5:lod pT@13x,I:S.sid, R.rid, R.loU@26I,A:revision R11@26j,N:root = R.rid
86 AND a@27h,4:R.loP@1g}d*-
87 # # ## revision7
88 ## Copyrig is licensed}set old* [projecrid## Copyright (c) 20) 2007
89 ## Copyright (c) 2007-2008 Andreas Kupries.
90 #
91 # This software is licensrid)
92 }
93
94 state readinwriting## -*### ######## ############# #####################
95 ## Copyright (c) 2007
96 ## Copyright (c) 2007-2008 Andreas Kupries.
97 #
98 # This software is licensed}set old*-
99 # # ## revision7
100 ## Copyright (c)ries.
101 #
102 # This software is licensed}set oldreading meta
103 state readingreadingreading branch
104 state readinwriting## -*- tcl -*-
105 # # ## ### ##### ######## ############# #####################
106 ## Copyright (c) 2007
107 ## Copyright (c) 2007-2008 Andreas Kupries.
108 #
109 # This software is licensed}set oldin the loop below uses
110 #
111 # TODO: Move to pr### ###ght (c) 2007
112 ## Copyright (c) 2007-2008 Andreas Kupries.
113 #
114 # This softwarerid
115 FROM csrevisionsoftware is licensed}set oldwrite rerevisionrevisionsrrevisionrevisionsr
116 # unique within the chan Check ifH@K0,F: are possible.
117 I@eG,1r@uq,1: K@wk,1:,59@xE,5l@13Y,A:getcstypeslo@193,7:lod 9@24~,4:lastR@24t,S: {}
118
119 foreach {sid rid lod pT@13x,s:S.sid, R.rid, R.lod, S.pid
120 FROM tag T, revision R14@1wf,M:rev = R.rid
121 AND _@1xg,4:R.loP@1gg,g:($lastlod != $lod) || ($lastsymbol != $sid)20@28u,1K@1~x,B:lod ]
122 $r setid $ido2q@1kR,3:symP@1~x,3:}
123
124 G@20l,Id, R.rid, R.l
--- a/tools/cvs2fossil/lib/c2f_plodmgr.tcl
+++ b/tools/cvs2fossil/lib/c2f_plodmgr.tcl
@@ -0,0 +1,56 @@
1
+## -*- tcl -*-
2
+# # ## ### ##### ######## ############# #####################
3
+## Copyright (c) 2007 Andreas Kupries.
4
+#
5
+# This software is licensed as described in the file LICENSE, which
6
+# you should have received as part of this distribution.
7
+#
8
+# This software consists of voluntary contributions made by many
9
+# individuals. For exact contribution history, see the revision
10
+# history and logs, available at http://fossil-scm.hwaci.com/fossil
11
+# # ## ### ##### ######## ############# #####################
12
+
13
+## Lines of Development in a project (Symbols, and the trunk).
14
+
15
+# # ## ### ##### ######## ############# #####################
16
+## Requirements
17
+
18
+package require Tcl 8.4 ; # Required runtime.
19
+package require snit ; # OO system.
20
+
21
+# # ## ### ##### ######## ############# #####################
22
+##
23
+
24
+snit::type ::vc::fossil::import::cvs::project::lodmgr {
25
+ # # ## ### ##### ######## #############
26
+ ## Public API
27
+
28
+ constructor {} {
29
+ return
30
+ }
31
+
32
+ # # ## ### ##### ######## #############
33
+ ## State
34
+
35
+ # # ## ### ##### ######## #############
36
+ ## Internal methods
37
+
38
+ # # ## ### ##### ######## #############
39
+ ## Configuration
40
+
41
+ pragma -hastypeinfo no ; # no type introspection
42
+ pragma -hasinfo no ; # no object introspection
43
+ pragma -hastypemethods no ; # type is not relevant.
44
+ pragma -simpledispatch yes ; # simple fast dispatch
45
+
46
+ # # ## ### ##### ######## #############
47
+}
48
+
49
+namespace eval ::vc::fossil::import::cvs::project {
50
+ namespace export lodmgr
51
+}
52
+
53
+# # ## ### ##### ######## ############# #####################
54
+## Ready
55
+
56
+package provide vc::fossil::import::cvs::
--- a/tools/cvs2fossil/lib/c2f_plodmgr.tcl
+++ b/tools/cvs2fossil/lib/c2f_plodmgr.tcl
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/lib/c2f_plodmgr.tcl
+++ b/tools/cvs2fossil/lib/c2f_plodmgr.tcl
@@ -0,0 +1,56 @@
1 ## -*- tcl -*-
2 # # ## ### ##### ######## ############# #####################
3 ## Copyright (c) 2007 Andreas Kupries.
4 #
5 # This software is licensed as described in the file LICENSE, which
6 # you should have received as part of this distribution.
7 #
8 # This software consists of voluntary contributions made by many
9 # individuals. For exact contribution history, see the revision
10 # history and logs, available at http://fossil-scm.hwaci.com/fossil
11 # # ## ### ##### ######## ############# #####################
12
13 ## Lines of Development in a project (Symbols, and the trunk).
14
15 # # ## ### ##### ######## ############# #####################
16 ## Requirements
17
18 package require Tcl 8.4 ; # Required runtime.
19 package require snit ; # OO system.
20
21 # # ## ### ##### ######## ############# #####################
22 ##
23
24 snit::type ::vc::fossil::import::cvs::project::lodmgr {
25 # # ## ### ##### ######## #############
26 ## Public API
27
28 constructor {} {
29 return
30 }
31
32 # # ## ### ##### ######## #############
33 ## State
34
35 # # ## ### ##### ######## #############
36 ## Internal methods
37
38 # # ## ### ##### ######## #############
39 ## Configuration
40
41 pragma -hastypeinfo no ; # no type introspection
42 pragma -hasinfo no ; # no object introspection
43 pragma -hastypemethods no ; # type is not relevant.
44 pragma -simpledispatch yes ; # simple fast dispatch
45
46 # # ## ### ##### ######## #############
47 }
48
49 namespace eval ::vc::fossil::import::cvs::project {
50 namespace export lodmgr
51 }
52
53 # # ## ### ##### ######## ############# #####################
54 ## Ready
55
56 package provide vc::fossil::import::cvs::
--- a/tools/cvs2fossil/lib/c2f_prev.tcl
+++ b/tools/cvs2fossil/lib/c2f_prev.tcl
@@ -0,0 +1,196 @@
1
+suc= dict (item -> list (changeset))
2
+ method successormap {} {
3
+ # NOTE / FUTURE: Definitive bottleneck (can be millions of pairs).
4
+ #
5
+ # Only user is pass 9, computing the limits of backward
6
+ # branches per branch. TODO: Fold that into
7
+ # the SQL query, i.e. move the crunching from Tcl to C.
8
+
9
+ array set tmp {}
10
+ foreach {rev children} [$sangeset))
11
+ method successormap {} {
12
+ # NOTE / FUTURE: Definitive bottleneck (can be misucbranches} {project::sy[expr {$mytype eq "sym"}] }
13
+ {} { return ove the crunching from suc= dict (item -> list my returnrev or sym, where the csetc= dict (item -> list (changeset))
14
+ method successormap {} {
15
+ # NOTE / FUTURE: Definitive bottleneck (can be millions of pairs).
16
+ #
17
+ # Only user is pass 9, computing the limits of backward
18
+ # branches per branch. TODO!
19
+ trouble int"
20
+ }
21
+ if {![llength $fragafter]} {
22
+ trouble internal "Tried to split off aend"
23
+ f {$firsts != 0"
24
+ f {$laste != ($s -"
25
+ f {$laste !} {
26
+ trouble internal ""
27
+ f {!r is pass 9, computing the SQL queryTURE: Definitive bottleneck (can be millions of pairs).
28
+ #
29
+ # Only user is pass 9, computing the limits of backward
30
+ # branches per br
31
+thod successormap {} {
32
+ # NOTE / FUTURE: Definitive bottleneck (can be misucbranches} {project::sy[expr {$mytype eq "sym"}] }
33
+ {} { return ove the crunching from suc= dict (item -> list my returnrev or} {
34
+ set m method successormap {} {
35
+ # NOTE / FUTURE: Definitive bottlenelappend tmp($rev) {!
36
+ trouble ry, i.to C.
37
+
38
+ array set tmp {}
39
+ foreach {rev children} [$sang != 0"
40
+ f {$laste != ($s -"
41
+ f {$> list is pa ss 9, computlappend csets {!
42
+ trouble TODO: Fold that insuc= di} -> list (changeset))
43
+ method successor Definitive bottlenec UTURE: Definitive bottleneck (can be millions of pairs).
44
+ #
45
+ # Only user is pass 9, computlappend tmp($rev) {!
46
+ setid {id} { set myid $id ; return per branch. TODappend tmp($rev) {!
47
+ trouble ry, i.e. move the crunching from Tcl to C.
48
+
49
+ array set tmp {}
50
+ f trouble internal "Tried to split off aend"
51
+ f {$firsts != 0"
52
+ f {$laste != ($s -"
53
+ f {$laste !} {
54
+ trouble internal ""
55
+ f {!r is pass 9, computing the SQL queryTURE: Definitive bottleneck (can be millions of pairs).
56
+ #
57
+ # Only user is pass 9, computing the limits osuc= dict (item -> list (changeset))
58
+ method successormap {} {
59
+ # NOTE / FUTURE: Definitive bottleneck (can be millions of pairs).
60
+ #
61
+ # Only user is pass 9, computing the limits of backward
62
+ # branches per branch. TODO: Fold that into
63
+ # the SQL query, i.e. move the crunching from Tcl to C.
64
+
65
+ array set tmp {}
66
+ foreach {rev children} [$sangeset))
67
+ method successormap {} {
68
+ # NOTE / FUTURE: Definitive bottleneck (can be misucbranches} {project::sy[expr {$mytype eq "sym"}] }
69
+ {} { return ove the crunching from suc= dict (item -> list my returnrev or sym, where the csetc= dict (item -> list (changeset))
70
+ method successormap {} {
71
+ # NOTE / FUTURE: Definitive bottleneck (can be millions of pairs).
72
+ #
73
+ # Only user is pass 9, computing the limits of backward
74
+ # branches per branch. TODO!
75
+ trouble int"
76
+ }
77
+ if {![llength $fragafter]} {
78
+ trouble internal "Tried to split off aend"
79
+ f {$firsts != 0"
80
+ f {$laste != ($s -"
81
+ f {$laste !} {
82
+ trouble internal ""
83
+ f {!r is pass 9, computing the SQL queryTURE: Definitive bottleneck (can be millions of pairs).
84
+ #
85
+ # Only user is pass 9, computing the limits of backward
86
+ # branches per br
87
+thod successormap {} {
88
+ # NOTE / FUTURE: Definitive bottleneck (can be misucbranches} {project::sy[expr {$mytype eq "sym"}] }
89
+ {} { return ove the crunching from suc= dict (item -> list my returnrev or} {
90
+ set m method successormap {} {
91
+ # NOTE / FUTURE: Definitive bottlenelappend tmp($rev) {!
92
+ trouble ry, i.to C.
93
+
94
+ array set tmp {}
95
+ foreach {rev children} [$sang != 0"
96
+ f {$laste != ($s -"
97
+ f {$> list is pa ss 9, computlappend csets {!
98
+ trouble TODO: Fold that insuc= di} -> list (changeset))
99
+ method successor Definitive bottlenec UTURE: Definitive bottleneck (can be millions of pairs).
100
+ #
101
+ # Only user is pass 9, computlappend tmp($rev) {!
102
+ setid {id} { set myid $id ; return per branch. TODappend tmp($rev) {!
103
+ trouble ry, i.e. move the crunching from Tcl to C.
104
+
105
+ array set tmp {}
106
+ f trouble internal "Tried to split off aend"
107
+ f {$firsts != 0"
108
+ f {$laste != ($s -"
109
+ f {$laste !} {
110
+ trouble internal ""
111
+ f {!r is pass 9, computing the SQL queryTURE: Definitive bottleneck (can be millions of pairs).
112
+ #
113
+ # Only user is pass 9, computing the limits of backward
114
+ # branches per branch. TODO: Fold that into
115
+ # the SQL query, i.e. move the crunching from Tcl to C.
116
+
117
+ array set tmp {}
118
+ foreach {rev children} [$sangeset))
119
+ method successormap {} {
120
+ # NOTE / FUTURE: Definitive bottleneck (can be misucbranches} {project::sy[expr {$mytype eq "sym"}] }
121
+ {} { return ove the crunching from suc= dict (item -> list my returnrev or sym, where the csetc= dict (item -> move the crunching from Tcl to C.
122
+
123
+ array set tmp {}
124
+ foreach {rev children} [$sangeset))
125
+ method successormap {} {
126
+ # NOTE / FUTURE: Definitive bottlenelappend tmp($rev) {!
127
+ trouble ry, i.e. move the crunching from Tcl to C.
128
+
129
+ array set tmp {}
130
+ foreach {rev children} [$sang != 0"
131
+ f {$laste != ($s -"
132
+ f {$laste !} {
133
+ trouble internal ""
134
+ f {!r is pass 9, computing the lsuc= dict (item -> list is pa ss 9, computlappend csets {!
135
+ trouble TODO: Fold that insuc= di} -> list (changeset))
136
+ method successor Definitive bottlenec UTURE: Definitive bottleneck (can be millions of pairs).
137
+ #
138
+ # Only user is pass 9, computlappend tmp($rev) {!
139
+ trouble ry, i.e. move the crunching from Tcl to C.
140
+
141
+ array set tmp {}
142
+ foreach {rev children} [$sangeset))
143
+ method successormap {} {
144
+ # NOTE / FUTURE: Dset))
145
+ method successormap {} {
146
+ # NOTE / FUTURE: Definitive bottleneck (can be millions of pairs).
147
+ #
148
+ # Only user is pass 9, computing the limits of backward
149
+ # branches per branch. TODO: Fold that into
150
+ # the SQL query, i.e. move the crunching from Tcl to C.
151
+
152
+ array set tmp {}
153
+ foreach {rev children} [$sangeset))
154
+ method successormap {} {
155
+ # NOTE / FUTURE: Definitive bottleneck (can be misucbranches} {project::sy[expr {$mytype eq "sym"}] }
156
+ {} { return ove the crunching from suc= dict (item -> list my returnrev or sym, where the csetc= dict (item -> list (changeset))
157
+ method successormap {} {
158
+ # NOTE / FUTURE: Definitive bottleneck (can be millions of pairs).
159
+ #
160
+ # Only user is pass 9, computing the limits of backward
161
+ # branches per branch. TODO: Fold that into
162
+ # the SQL query, i.e. move the crunching from Tcl to C.
163
+
164
+ array set tmp {}
165
+ foreach {rev children} [$sangeset))
166
+ method successormap {} {
167
+ # NOTE / FUTURE: Definitive bottleneck (can be misucbranches} {project::sysuc= dict (item """"f {!
168
+ trouble int"
169
+ }
170
+ if {![llength $fragafter]} {
171
+ trouble internal "Tried to split off aend"
172
+ f {$firsts != 0"
173
+ f {$laste != ($s -"
174
+ f {$laste !} {
175
+ trouble internal ""
176
+ f {!r is pass 9, computing the lsuc= dict (item -> list is pa ss 9, computing the limits ofsuc= dif {$rid == $chs per branch. TODO: Fold that insuc= dif {$rid == $chs per branch. TODO: Fold that insuc= di}f {$rid == $pars per branch. TODO: Fold that insuc= diparent
177
+ } rsuc= di branch. TODO: Fold that insuc= dif {$rid == $chs per branch. TODO: Fold that insuc= di}f {$rid == $pars per branch. TODO: Fold that insuc= diparent
178
+ } return "<$mytype ${myid}>"suc= dict (item -> list (changeset))
179
+ method successor Definitive bottlenec UTURE: Definitive bottleneck (can be millions of pairs).
180
+ #
181
+ # Only user is pass 9, computing the limits of backward
182
+ # branches per branch. TODO: Fold that into
183
+ # the SQL query, i.e. move the crunching from Tcl to C.
184
+
185
+ array set tmp {}
186
+ foreach {rev children} [$sangeset))
187
+ method successormap {} {
188
+ # NOTE / FUTURE: Defin (item -> list (changeset))
189
+ method successormap {} {
190
+ # NOTE / FUTURE: Definitive bottleneck (can be millions of pairs).
191
+ #
192
+ # Only user is pass 9, computing the limits of backward
193
+ # branches per branch. TODO: Fold that into
194
+ # the SQL queeset))
195
+ m
196
+ return $mychangesets
--- a/tools/cvs2fossil/lib/c2f_prev.tcl
+++ b/tools/cvs2fossil/lib/c2f_prev.tcl
@@ -0,0 +1,196 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/lib/c2f_prev.tcl
+++ b/tools/cvs2fossil/lib/c2f_prev.tcl
@@ -0,0 +1,196 @@
1 suc= dict (item -> list (changeset))
2 method successormap {} {
3 # NOTE / FUTURE: Definitive bottleneck (can be millions of pairs).
4 #
5 # Only user is pass 9, computing the limits of backward
6 # branches per branch. TODO: Fold that into
7 # the SQL query, i.e. move the crunching from Tcl to C.
8
9 array set tmp {}
10 foreach {rev children} [$sangeset))
11 method successormap {} {
12 # NOTE / FUTURE: Definitive bottleneck (can be misucbranches} {project::sy[expr {$mytype eq "sym"}] }
13 {} { return ove the crunching from suc= dict (item -> list my returnrev or sym, where the csetc= dict (item -> list (changeset))
14 method successormap {} {
15 # NOTE / FUTURE: Definitive bottleneck (can be millions of pairs).
16 #
17 # Only user is pass 9, computing the limits of backward
18 # branches per branch. TODO!
19 trouble int"
20 }
21 if {![llength $fragafter]} {
22 trouble internal "Tried to split off aend"
23 f {$firsts != 0"
24 f {$laste != ($s -"
25 f {$laste !} {
26 trouble internal ""
27 f {!r is pass 9, computing the SQL queryTURE: Definitive bottleneck (can be millions of pairs).
28 #
29 # Only user is pass 9, computing the limits of backward
30 # branches per br
31 thod successormap {} {
32 # NOTE / FUTURE: Definitive bottleneck (can be misucbranches} {project::sy[expr {$mytype eq "sym"}] }
33 {} { return ove the crunching from suc= dict (item -> list my returnrev or} {
34 set m method successormap {} {
35 # NOTE / FUTURE: Definitive bottlenelappend tmp($rev) {!
36 trouble ry, i.to C.
37
38 array set tmp {}
39 foreach {rev children} [$sang != 0"
40 f {$laste != ($s -"
41 f {$> list is pa ss 9, computlappend csets {!
42 trouble TODO: Fold that insuc= di} -> list (changeset))
43 method successor Definitive bottlenec UTURE: Definitive bottleneck (can be millions of pairs).
44 #
45 # Only user is pass 9, computlappend tmp($rev) {!
46 setid {id} { set myid $id ; return per branch. TODappend tmp($rev) {!
47 trouble ry, i.e. move the crunching from Tcl to C.
48
49 array set tmp {}
50 f trouble internal "Tried to split off aend"
51 f {$firsts != 0"
52 f {$laste != ($s -"
53 f {$laste !} {
54 trouble internal ""
55 f {!r is pass 9, computing the SQL queryTURE: Definitive bottleneck (can be millions of pairs).
56 #
57 # Only user is pass 9, computing the limits osuc= dict (item -> list (changeset))
58 method successormap {} {
59 # NOTE / FUTURE: Definitive bottleneck (can be millions of pairs).
60 #
61 # Only user is pass 9, computing the limits of backward
62 # branches per branch. TODO: Fold that into
63 # the SQL query, i.e. move the crunching from Tcl to C.
64
65 array set tmp {}
66 foreach {rev children} [$sangeset))
67 method successormap {} {
68 # NOTE / FUTURE: Definitive bottleneck (can be misucbranches} {project::sy[expr {$mytype eq "sym"}] }
69 {} { return ove the crunching from suc= dict (item -> list my returnrev or sym, where the csetc= dict (item -> list (changeset))
70 method successormap {} {
71 # NOTE / FUTURE: Definitive bottleneck (can be millions of pairs).
72 #
73 # Only user is pass 9, computing the limits of backward
74 # branches per branch. TODO!
75 trouble int"
76 }
77 if {![llength $fragafter]} {
78 trouble internal "Tried to split off aend"
79 f {$firsts != 0"
80 f {$laste != ($s -"
81 f {$laste !} {
82 trouble internal ""
83 f {!r is pass 9, computing the SQL queryTURE: Definitive bottleneck (can be millions of pairs).
84 #
85 # Only user is pass 9, computing the limits of backward
86 # branches per br
87 thod successormap {} {
88 # NOTE / FUTURE: Definitive bottleneck (can be misucbranches} {project::sy[expr {$mytype eq "sym"}] }
89 {} { return ove the crunching from suc= dict (item -> list my returnrev or} {
90 set m method successormap {} {
91 # NOTE / FUTURE: Definitive bottlenelappend tmp($rev) {!
92 trouble ry, i.to C.
93
94 array set tmp {}
95 foreach {rev children} [$sang != 0"
96 f {$laste != ($s -"
97 f {$> list is pa ss 9, computlappend csets {!
98 trouble TODO: Fold that insuc= di} -> list (changeset))
99 method successor Definitive bottlenec UTURE: Definitive bottleneck (can be millions of pairs).
100 #
101 # Only user is pass 9, computlappend tmp($rev) {!
102 setid {id} { set myid $id ; return per branch. TODappend tmp($rev) {!
103 trouble ry, i.e. move the crunching from Tcl to C.
104
105 array set tmp {}
106 f trouble internal "Tried to split off aend"
107 f {$firsts != 0"
108 f {$laste != ($s -"
109 f {$laste !} {
110 trouble internal ""
111 f {!r is pass 9, computing the SQL queryTURE: Definitive bottleneck (can be millions of pairs).
112 #
113 # Only user is pass 9, computing the limits of backward
114 # branches per branch. TODO: Fold that into
115 # the SQL query, i.e. move the crunching from Tcl to C.
116
117 array set tmp {}
118 foreach {rev children} [$sangeset))
119 method successormap {} {
120 # NOTE / FUTURE: Definitive bottleneck (can be misucbranches} {project::sy[expr {$mytype eq "sym"}] }
121 {} { return ove the crunching from suc= dict (item -> list my returnrev or sym, where the csetc= dict (item -> move the crunching from Tcl to C.
122
123 array set tmp {}
124 foreach {rev children} [$sangeset))
125 method successormap {} {
126 # NOTE / FUTURE: Definitive bottlenelappend tmp($rev) {!
127 trouble ry, i.e. move the crunching from Tcl to C.
128
129 array set tmp {}
130 foreach {rev children} [$sang != 0"
131 f {$laste != ($s -"
132 f {$laste !} {
133 trouble internal ""
134 f {!r is pass 9, computing the lsuc= dict (item -> list is pa ss 9, computlappend csets {!
135 trouble TODO: Fold that insuc= di} -> list (changeset))
136 method successor Definitive bottlenec UTURE: Definitive bottleneck (can be millions of pairs).
137 #
138 # Only user is pass 9, computlappend tmp($rev) {!
139 trouble ry, i.e. move the crunching from Tcl to C.
140
141 array set tmp {}
142 foreach {rev children} [$sangeset))
143 method successormap {} {
144 # NOTE / FUTURE: Dset))
145 method successormap {} {
146 # NOTE / FUTURE: Definitive bottleneck (can be millions of pairs).
147 #
148 # Only user is pass 9, computing the limits of backward
149 # branches per branch. TODO: Fold that into
150 # the SQL query, i.e. move the crunching from Tcl to C.
151
152 array set tmp {}
153 foreach {rev children} [$sangeset))
154 method successormap {} {
155 # NOTE / FUTURE: Definitive bottleneck (can be misucbranches} {project::sy[expr {$mytype eq "sym"}] }
156 {} { return ove the crunching from suc= dict (item -> list my returnrev or sym, where the csetc= dict (item -> list (changeset))
157 method successormap {} {
158 # NOTE / FUTURE: Definitive bottleneck (can be millions of pairs).
159 #
160 # Only user is pass 9, computing the limits of backward
161 # branches per branch. TODO: Fold that into
162 # the SQL query, i.e. move the crunching from Tcl to C.
163
164 array set tmp {}
165 foreach {rev children} [$sangeset))
166 method successormap {} {
167 # NOTE / FUTURE: Definitive bottleneck (can be misucbranches} {project::sysuc= dict (item """"f {!
168 trouble int"
169 }
170 if {![llength $fragafter]} {
171 trouble internal "Tried to split off aend"
172 f {$firsts != 0"
173 f {$laste != ($s -"
174 f {$laste !} {
175 trouble internal ""
176 f {!r is pass 9, computing the lsuc= dict (item -> list is pa ss 9, computing the limits ofsuc= dif {$rid == $chs per branch. TODO: Fold that insuc= dif {$rid == $chs per branch. TODO: Fold that insuc= di}f {$rid == $pars per branch. TODO: Fold that insuc= diparent
177 } rsuc= di branch. TODO: Fold that insuc= dif {$rid == $chs per branch. TODO: Fold that insuc= di}f {$rid == $pars per branch. TODO: Fold that insuc= diparent
178 } return "<$mytype ${myid}>"suc= dict (item -> list (changeset))
179 method successor Definitive bottlenec UTURE: Definitive bottleneck (can be millions of pairs).
180 #
181 # Only user is pass 9, computing the limits of backward
182 # branches per branch. TODO: Fold that into
183 # the SQL query, i.e. move the crunching from Tcl to C.
184
185 array set tmp {}
186 foreach {rev children} [$sangeset))
187 method successormap {} {
188 # NOTE / FUTURE: Defin (item -> list (changeset))
189 method successormap {} {
190 # NOTE / FUTURE: Definitive bottleneck (can be millions of pairs).
191 #
192 # Only user is pass 9, computing the limits of backward
193 # branches per branch. TODO: Fold that into
194 # the SQL queeset))
195 m
196 return $mychangesets
--- a/tools/cvs2fossil/lib/c2f_prevlink.tcl
+++ b/tools/cvs2fossil/lib/c2f_prevlink.tcl
@@ -0,0 +1,180 @@
1
+## -*- tcl -*-
2
+# # ## ### ##### ## -*- tcl -*-
3
+# # ## ### ##### ######## ############# #####################
4
+## Copyright (c) 2007 Andreas Kupries.
5
+#
6
+# This software is licensed as described in the file LICENSE, which
7
+# you should have received as part of this distribution.
8
+#
9
+# This software consists of voluntary contributions made by many
10
+# individuals. For exact contribution history, see the revision
11
+# history and logs, available at http://fossil-scm.hwaci.com/fossil
12
+# # ## ### ##### ######## ############# #####################
13
+
14
+## Helper class for the pass 6 cycle breaker. Each instance refers to
15
+## three changesets A, B, and C, with A a predecessor of B, and B
16
+## predecessor of C, and the whole part of a dependency cycle.
17
+
18
+## Instances analyse the file level dependencies which gave rise to
19
+## the changeset dependencies of A, B, and C, with the results used ####### ############# #####################
20
+## Copyright (c) 2007 Andreas Kupries.
21
+#
22
+# This software is licensed as described in the file LICENSE, which
23
+# you should have received as part of this distribution.
24
+#
25
+# This software consists of voluntary contributions made by many
26
+# individuals. For exact contribution history, see the revision
27
+# history and logs, available at http://fossil-scm.hwaci.com/fossil
28
+# # ## ### ##### ######## ############# #####################
29
+
30
+## Helper class for the pass 6 cycle breaker. Each instance refers to
31
+## three changesets A, B, and C, with A a predecessor of B, and B
32
+## predecessort best fully break the cycle.
33
+
34
+# # ## ### ##### ######## ############# #####################
35
+## Requirements
36
+
37
+package require Tcl 8.4 ; # Required runtime.
38
+package require snit ; # OO system.
39
+package require vc::tools::misc ; # Text formatting
40
+package require vc::tools::trouble ; # Error reporting.
41
+package require vc::tools::log ; # User feedback.
42
+package require vc::fossil::import::cvs::state ; # State storage.
43
+package require vc::fossil::import::cvs::integrity ; # State integrity checks.
44
+package require vc::fossil::import::cvs::project::rev ; # Project level changesets
45
+
46
+# # ## ### ##### ######## ############# #####################
47
+##
48
+
49
+snit::type ::vc::fossil::import::cvs::project::revlink {
50
+ # # ## ### ##### ######## #############
51
+ ## Public API
52
+
53
+ constructor {prev cset next} {
54
+ set myprev $prev
55
+ set mycset $cset
56
+ set mynext $next
57
+
58
+ # We perform the bulk of the analysis during construction. The
59
+ # file revisions held by the changeset CSET can be sorted into
60
+ # four categories.
61
+
62
+ # 1. Revisions whose predecessors are not in PREV, nor are
63
+ # their successors found in NEXT. These revisions do not
64
+ # count, as they did not induce any of the two dependencies
65
+ # under consideration. Thf {!(prev) $mycount(next
66
+ trouble internal "than {other} {"
67
+
68
+ set sbreak [$self breakable]
69
+ set obreak [$other breakable]
70
+
71
+ if {$sbreak && !$obreak} { return 1 } ; # self is better.
72
+ if {!$sbreak && $obreak} { return 0 } ; # self is worse.
73
+
74
+ # Equality. Look at the counters.
75
+ # - Whichever has the lesser number of passthrough revisions
76
+ # is better, as more can be split off, weakening the cycle
77
+ # more.
78
+ # - Whichever has less links to move is better.
79
+
80
+ set opass [$other passcount]
81
+ if {$mycount(pass) < $opass} { return 1 } ; # self is better.
82
+ if {$mycount(pass) > $opass} { return 0 } ; # self is worse.
83
+
84
+ set smove [$self linkstomove]
85
+ set omove [$other linkstomove]
86
+
87
+ if {$smove < $omove} { return 1 } ; # self is better.
88
+
89
+ return 0 ; # Self is worse or equal, i.e. not better.
90
+ }
91
+
92
+ method bre<[$mycset id]>split in the mycategory(prev|nehole part of a dependency cycle.
93
+
94
+## Instances analyse the file level dependencies which gave rise to
95
+## the changeset dependencies of A, B, and C, with the results used ####### ############# #####################
96
+## Copyright (c) 2007 Andreas Kupries.
97
+#
98
+# This software is licensed as described in the file LICENSE, which
99
+# you should have received as part of this distribution.
100
+#
101
+# This software consists of voluntary contributions made by many
102
+# individuals. For exact contribution history, see the revision
103
+# history and logs, available at http://fossil-scm.hwaci.com/fossil
104
+# # ## ### ##### ######## ############# #####################
105
+
106
+## Helper class for the pass 6 cycle breaker. Each instance refers to
107
+## three changesets A, B, and C, with A a predecessor of B, and B
108
+## predecessort best fully break the cycle.
109
+
110
+# # ## ### ##### ######## ############# #####################
111
+## Requirements
112
+
113
+package require Tcl 8.4 ; # Required runtime.
114
+package require snit ; # OO system.
115
+package require vc::tools::misc ; # Text formatting
116
+package require vc::tools::trouble ; # Error reporting.
117
+package require vc::tools::log ; # User feedback.
118
+package require vc::fossil::import::cvs::state ; # State storage.
119
+package require vc::fossil::import::cvs::integrity ; # State integrity checks.
120
+package require vc::fossil::import::cvs::project::rev ; # Project level changesets
121
+
122
+# # ## ### ##### ######## ############# #####################
123
+##
124
+
125
+snit::type ::vc::fossil::import::cvs::project::revlink {
126
+ # # ## ### ##### ######## #############
127
+ ## Public API
128
+
129
+ constructor {prev cset next} {
130
+ set myprev $prev
131
+ set mycset $cset
132
+ set mynext $next
133
+
134
+ # We perform the bulk of the analysis during construction. The
135
+ # file revisions held by the changeset CSET can be sorted into
136
+ # four categories.
137
+
138
+ # 1. Revisions whose predecessors are not in PREV, nor are
139
+ # their successors found in NEXT. These revisions do not
140
+ # count, as they did not induce any of the two dependencies
141
+ # under consideration. Thf {!(prev) $mycount(next
142
+ trouble internal "than {other} {"
143
+
144
+ set sbreak [$self breakable]
145
+ set obreak [$other breakable]
146
+
147
+ if {$sbreak && !$obreak} { return 1 } ; # self is better.
148
+ if {!$sbreak && $obreak} { return 0 } ; # self is worse.
149
+
150
+ # Equality. Look at the counters.
151
+ # - Whichever has the lesser number of passthrough revisions
152
+ # is better, as more can be split off, weakening the cycle
153
+ # more.
154
+ # - Whichever has less links to move is better.
155
+
156
+ set opass [$other passcount]
157
+ if {$mycount(pass) < $opass} { return 1 } ; # self is better.
158
+ if {$mycount(pass) > $opass} { return 0 } ; # self is worse.
159
+
160
+ set smove [$self linkstomove]
161
+ set omove [$other linkstomove]
162
+
163
+ if {$smove < $omove} { return 1 } ; # self is better.
164
+
165
+ return 0 ; # Self is worse or equal, i.e. not better.
166
+ }
167
+
168
+ method bre<[$mycset id]>new changesets the
169
+ # old one is dropped from all databases, in and out of memory,
170
+ # and then destroyed.
171
+
172
+ struct::list assign [$mycset data] project cstype cssrc
173
+ $mycset drop
174
+ $mycset destroy
175
+
176
+ set newcsets {}
177
+ lappend newcsets [project::rev %AUTO% $project $cstype $cssrc $mycategory(prev)]
178
+ lappend newcsets [project::rev %AUext)]
179
+
180
+ foreach c $newcsets { $c p
--- a/tools/cvs2fossil/lib/c2f_prevlink.tcl
+++ b/tools/cvs2fossil/lib/c2f_prevlink.tcl
@@ -0,0 +1,180 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/lib/c2f_prevlink.tcl
+++ b/tools/cvs2fossil/lib/c2f_prevlink.tcl
@@ -0,0 +1,180 @@
1 ## -*- tcl -*-
2 # # ## ### ##### ## -*- tcl -*-
3 # # ## ### ##### ######## ############# #####################
4 ## Copyright (c) 2007 Andreas Kupries.
5 #
6 # This software is licensed as described in the file LICENSE, which
7 # you should have received as part of this distribution.
8 #
9 # This software consists of voluntary contributions made by many
10 # individuals. For exact contribution history, see the revision
11 # history and logs, available at http://fossil-scm.hwaci.com/fossil
12 # # ## ### ##### ######## ############# #####################
13
14 ## Helper class for the pass 6 cycle breaker. Each instance refers to
15 ## three changesets A, B, and C, with A a predecessor of B, and B
16 ## predecessor of C, and the whole part of a dependency cycle.
17
18 ## Instances analyse the file level dependencies which gave rise to
19 ## the changeset dependencies of A, B, and C, with the results used ####### ############# #####################
20 ## Copyright (c) 2007 Andreas Kupries.
21 #
22 # This software is licensed as described in the file LICENSE, which
23 # you should have received as part of this distribution.
24 #
25 # This software consists of voluntary contributions made by many
26 # individuals. For exact contribution history, see the revision
27 # history and logs, available at http://fossil-scm.hwaci.com/fossil
28 # # ## ### ##### ######## ############# #####################
29
30 ## Helper class for the pass 6 cycle breaker. Each instance refers to
31 ## three changesets A, B, and C, with A a predecessor of B, and B
32 ## predecessort best fully break the cycle.
33
34 # # ## ### ##### ######## ############# #####################
35 ## Requirements
36
37 package require Tcl 8.4 ; # Required runtime.
38 package require snit ; # OO system.
39 package require vc::tools::misc ; # Text formatting
40 package require vc::tools::trouble ; # Error reporting.
41 package require vc::tools::log ; # User feedback.
42 package require vc::fossil::import::cvs::state ; # State storage.
43 package require vc::fossil::import::cvs::integrity ; # State integrity checks.
44 package require vc::fossil::import::cvs::project::rev ; # Project level changesets
45
46 # # ## ### ##### ######## ############# #####################
47 ##
48
49 snit::type ::vc::fossil::import::cvs::project::revlink {
50 # # ## ### ##### ######## #############
51 ## Public API
52
53 constructor {prev cset next} {
54 set myprev $prev
55 set mycset $cset
56 set mynext $next
57
58 # We perform the bulk of the analysis during construction. The
59 # file revisions held by the changeset CSET can be sorted into
60 # four categories.
61
62 # 1. Revisions whose predecessors are not in PREV, nor are
63 # their successors found in NEXT. These revisions do not
64 # count, as they did not induce any of the two dependencies
65 # under consideration. Thf {!(prev) $mycount(next
66 trouble internal "than {other} {"
67
68 set sbreak [$self breakable]
69 set obreak [$other breakable]
70
71 if {$sbreak && !$obreak} { return 1 } ; # self is better.
72 if {!$sbreak && $obreak} { return 0 } ; # self is worse.
73
74 # Equality. Look at the counters.
75 # - Whichever has the lesser number of passthrough revisions
76 # is better, as more can be split off, weakening the cycle
77 # more.
78 # - Whichever has less links to move is better.
79
80 set opass [$other passcount]
81 if {$mycount(pass) < $opass} { return 1 } ; # self is better.
82 if {$mycount(pass) > $opass} { return 0 } ; # self is worse.
83
84 set smove [$self linkstomove]
85 set omove [$other linkstomove]
86
87 if {$smove < $omove} { return 1 } ; # self is better.
88
89 return 0 ; # Self is worse or equal, i.e. not better.
90 }
91
92 method bre<[$mycset id]>split in the mycategory(prev|nehole part of a dependency cycle.
93
94 ## Instances analyse the file level dependencies which gave rise to
95 ## the changeset dependencies of A, B, and C, with the results used ####### ############# #####################
96 ## Copyright (c) 2007 Andreas Kupries.
97 #
98 # This software is licensed as described in the file LICENSE, which
99 # you should have received as part of this distribution.
100 #
101 # This software consists of voluntary contributions made by many
102 # individuals. For exact contribution history, see the revision
103 # history and logs, available at http://fossil-scm.hwaci.com/fossil
104 # # ## ### ##### ######## ############# #####################
105
106 ## Helper class for the pass 6 cycle breaker. Each instance refers to
107 ## three changesets A, B, and C, with A a predecessor of B, and B
108 ## predecessort best fully break the cycle.
109
110 # # ## ### ##### ######## ############# #####################
111 ## Requirements
112
113 package require Tcl 8.4 ; # Required runtime.
114 package require snit ; # OO system.
115 package require vc::tools::misc ; # Text formatting
116 package require vc::tools::trouble ; # Error reporting.
117 package require vc::tools::log ; # User feedback.
118 package require vc::fossil::import::cvs::state ; # State storage.
119 package require vc::fossil::import::cvs::integrity ; # State integrity checks.
120 package require vc::fossil::import::cvs::project::rev ; # Project level changesets
121
122 # # ## ### ##### ######## ############# #####################
123 ##
124
125 snit::type ::vc::fossil::import::cvs::project::revlink {
126 # # ## ### ##### ######## #############
127 ## Public API
128
129 constructor {prev cset next} {
130 set myprev $prev
131 set mycset $cset
132 set mynext $next
133
134 # We perform the bulk of the analysis during construction. The
135 # file revisions held by the changeset CSET can be sorted into
136 # four categories.
137
138 # 1. Revisions whose predecessors are not in PREV, nor are
139 # their successors found in NEXT. These revisions do not
140 # count, as they did not induce any of the two dependencies
141 # under consideration. Thf {!(prev) $mycount(next
142 trouble internal "than {other} {"
143
144 set sbreak [$self breakable]
145 set obreak [$other breakable]
146
147 if {$sbreak && !$obreak} { return 1 } ; # self is better.
148 if {!$sbreak && $obreak} { return 0 } ; # self is worse.
149
150 # Equality. Look at the counters.
151 # - Whichever has the lesser number of passthrough revisions
152 # is better, as more can be split off, weakening the cycle
153 # more.
154 # - Whichever has less links to move is better.
155
156 set opass [$other passcount]
157 if {$mycount(pass) < $opass} { return 1 } ; # self is better.
158 if {$mycount(pass) > $opass} { return 0 } ; # self is worse.
159
160 set smove [$self linkstomove]
161 set omove [$other linkstomove]
162
163 if {$smove < $omove} { return 1 } ; # self is better.
164
165 return 0 ; # Self is worse or equal, i.e. not better.
166 }
167
168 method bre<[$mycset id]>new changesets the
169 # old one is dropped from all databases, in and out of memory,
170 # and then destroyed.
171
172 struct::list assign [$mycset data] project cstype cssrc
173 $mycset drop
174 $mycset destroy
175
176 set newcsets {}
177 lappend newcsets [project::rev %AUTO% $project $cstype $cssrc $mycategory(prev)]
178 lappend newcsets [project::rev %AUext)]
179
180 foreach c $newcsets { $c p
--- a/tools/cvs2fossil/lib/c2f_project.tcl
+++ b/tools/cvs2fossil/lib/c2f_project.tcl
@@ -0,0 +1,100 @@
1
+## -*- tcl -*-
2
+# # ## ### ##### ######## ############# #####################
3
+## Copyright (c) 2007
4
+## Copyright (c) 2007-2008 Andreas Kupries.
5
+#
6
+# This software is licensed as described in the file LICENSE, which
7
+# you should have received as part of this distribution.
8
+#
9
+# This software consists of voluntary contributions made by many
10
+# individuals. For exact contribution history, see the revision
11
+# history and logs, available at http://fossil-scm.hwaci.com/fossil
12
+# # ## ### ##### ######## ############# #####################
13
+
14
+## Project, part of a CVS repository. Multiple instances are possible.
15
+
16
+# # ## ### ##### ######## ############# #####################
17
+## Requirements
18
+
19
+package require Tcl 8.4 ; # Required runtime.
20
+package require snit ; # OO system.
21
+package require vc::fossil::import::cvs::file ; # CVS archive file.
22
+package require vc::fossil::import::cvs::state ; # State storasym import::cvs::project::sym ; # Per project symbols.
23
+package require vc::fossil::import::cvs::project::trunk ; # Per project trunk, main lod
24
+package require vc::tools::log ; # User feedback
25
+package require struct::list ; # Advanced list operations..
26
+
27
+# # ## ### ##### ######## ############# #####################
28
+##
29
+
30
+snit::type ::vc::fossil::import::cvs::project {
31
+ # # ## ### ##### ######## #############
32
+ ## Public API
33
+
34
+ constructor {path r} {
35
+ set mybase $path
36
+ set myrepository $r
37
+ set mytrunk [trunk %AUTO% $self]
38
+ set mysymbol([$mytrunk name]) $mytrunk
39
+ return
40
+ }
41
+
42
+ method base {} { return $mybase }
43
+ method trunk {} { retse?]/$mybase }
44
+
45
+ method printbase {} {
46
+ if {$mybase eq ""} {return <Repository>}
47
+ return $mybase
48
+ }
49
+
50
+ method id {} { return $myid }
51
+ method setid {id} { set myid $id ; return }
52
+
53
+ method addfile {rcs usr executable {fid {}}} {
54
+ set myfiles($rcs) [list $usr $executable $fid]
55
+ return
56
+ }
57
+
58
+ method filenames {} {
59
+ return [lsort -dict [array names myfiles]]
60
+ }
61
+
62
+ method files {} {
63
+ return [TheFiles]
64
+ }
65
+
66
+ delegate method defauthor to myrepository
67
+ delegate method defcmessage to myrepository
68
+ delegate method trunkonly to myrepository
69
+ delegate method commitmessageof to myrepository
70
+
71
+ method defmeta {bid aid cid} {
72
+ return [$myrepository defmeta $myid $bid $aid $cid]
73
+ }
74
+
75
+ method getsymbol {name} {
76
+ if {![info exists mysymbol($name)]} {
77
+ set mysymbol($name) \
78
+ [sym %AUTO% $name [$myrepository defsymbol $myid $name] $self]
79
+ }
80
+ return $mysymbol($name)
81
+ }
82
+
83
+ method hassymbol {name} {
84
+ return [info exists mysymbol($name)]
85
+ }
86
+
87
+ method purgeghostsymbols {} {
88
+ s for the pro#### ######## #############
89
+ ## State
90
+
91
+ variable mybase {} ; # Project directory.
92
+ variable myid {} ; # Project id in the persistent state.
93
+ variable mytrunk {} ; # Reference to the main line of
94
+ # development for the project.
95
+ variable myfiles -array {} ; # Maps the rcs archive paths to
96
+ # their user- }
97
+}ple instances are possible.
98
+
99
+# # ## ### ##### ######## ############# archive paths to
100
+ # their user-
--- a/tools/cvs2fossil/lib/c2f_project.tcl
+++ b/tools/cvs2fossil/lib/c2f_project.tcl
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/lib/c2f_project.tcl
+++ b/tools/cvs2fossil/lib/c2f_project.tcl
@@ -0,0 +1,100 @@
1 ## -*- tcl -*-
2 # # ## ### ##### ######## ############# #####################
3 ## Copyright (c) 2007
4 ## Copyright (c) 2007-2008 Andreas Kupries.
5 #
6 # This software is licensed as described in the file LICENSE, which
7 # you should have received as part of this distribution.
8 #
9 # This software consists of voluntary contributions made by many
10 # individuals. For exact contribution history, see the revision
11 # history and logs, available at http://fossil-scm.hwaci.com/fossil
12 # # ## ### ##### ######## ############# #####################
13
14 ## Project, part of a CVS repository. Multiple instances are possible.
15
16 # # ## ### ##### ######## ############# #####################
17 ## Requirements
18
19 package require Tcl 8.4 ; # Required runtime.
20 package require snit ; # OO system.
21 package require vc::fossil::import::cvs::file ; # CVS archive file.
22 package require vc::fossil::import::cvs::state ; # State storasym import::cvs::project::sym ; # Per project symbols.
23 package require vc::fossil::import::cvs::project::trunk ; # Per project trunk, main lod
24 package require vc::tools::log ; # User feedback
25 package require struct::list ; # Advanced list operations..
26
27 # # ## ### ##### ######## ############# #####################
28 ##
29
30 snit::type ::vc::fossil::import::cvs::project {
31 # # ## ### ##### ######## #############
32 ## Public API
33
34 constructor {path r} {
35 set mybase $path
36 set myrepository $r
37 set mytrunk [trunk %AUTO% $self]
38 set mysymbol([$mytrunk name]) $mytrunk
39 return
40 }
41
42 method base {} { return $mybase }
43 method trunk {} { retse?]/$mybase }
44
45 method printbase {} {
46 if {$mybase eq ""} {return <Repository>}
47 return $mybase
48 }
49
50 method id {} { return $myid }
51 method setid {id} { set myid $id ; return }
52
53 method addfile {rcs usr executable {fid {}}} {
54 set myfiles($rcs) [list $usr $executable $fid]
55 return
56 }
57
58 method filenames {} {
59 return [lsort -dict [array names myfiles]]
60 }
61
62 method files {} {
63 return [TheFiles]
64 }
65
66 delegate method defauthor to myrepository
67 delegate method defcmessage to myrepository
68 delegate method trunkonly to myrepository
69 delegate method commitmessageof to myrepository
70
71 method defmeta {bid aid cid} {
72 return [$myrepository defmeta $myid $bid $aid $cid]
73 }
74
75 method getsymbol {name} {
76 if {![info exists mysymbol($name)]} {
77 set mysymbol($name) \
78 [sym %AUTO% $name [$myrepository defsymbol $myid $name] $self]
79 }
80 return $mysymbol($name)
81 }
82
83 method hassymbol {name} {
84 return [info exists mysymbol($name)]
85 }
86
87 method purgeghostsymbols {} {
88 s for the pro#### ######## #############
89 ## State
90
91 variable mybase {} ; # Project directory.
92 variable myid {} ; # Project id in the persistent state.
93 variable mytrunk {} ; # Reference to the main line of
94 # development for the project.
95 variable myfiles -array {} ; # Maps the rcs archive paths to
96 # their user- }
97 }ple instances are possible.
98
99 # # ## ### ##### ######## ############# archive paths to
100 # their user-
--- a/tools/cvs2fossil/lib/c2f_psym.tcl
+++ b/tools/cvs2fossil/lib/c2f_psym.tcl
@@ -0,0 +1,3 @@
1
+## -*- tcl -*-
2
+# # #" -*- tcl -*-
3
+# # ## ### ##### ####
--- a/tools/cvs2fossil/lib/c2f_psym.tcl
+++ b/tools/cvs2fossil/lib/c2f_psym.tcl
@@ -0,0 +1,3 @@
 
 
 
--- a/tools/cvs2fossil/lib/c2f_psym.tcl
+++ b/tools/cvs2fossil/lib/c2f_psym.tcl
@@ -0,0 +1,3 @@
1 ## -*- tcl -*-
2 # # #" -*- tcl -*-
3 # # ## ### ##### ####
--- a/tools/cvs2fossil/lib/c2f_ptrunk.tcl
+++ b/tools/cvs2fossil/lib/c2f_ptrunk.tcl
@@ -0,0 +1,20 @@
1
+## -*- tcl -*-
2
+# # ## ### ##### ######## ############# #####################
3
+## Copyright (c) 2007
4
+## Copyright (c) 2007-2008 Andreas Kupries.
5
+#
6
+# This software is licensed as described in the file LICENSE, which
7
+# you should have received as part of this distribution.
8
+#
9
+# This software consists of voluntary contributions made by many
10
+# individuals. For exact contribution history, see the revision
11
+# history and logs, available at http://fossil-scm.hwaci.com/fossil
12
+# # ## ### ##### ######## ############# #####################
13
+
14
+## Trunk, the special main line of development in a project.
15
+
16
+# # ## ### ##### ######## ############# #####################
17
+## Requirements
18
+
19
+package require Tcl 8.4 ; # Required runtime.
20
+package require snit
--- a/tools/cvs2fossil/lib/c2f_ptrunk.tcl
+++ b/tools/cvs2fossil/lib/c2f_ptrunk.tcl
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/lib/c2f_ptrunk.tcl
+++ b/tools/cvs2fossil/lib/c2f_ptrunk.tcl
@@ -0,0 +1,20 @@
1 ## -*- tcl -*-
2 # # ## ### ##### ######## ############# #####################
3 ## Copyright (c) 2007
4 ## Copyright (c) 2007-2008 Andreas Kupries.
5 #
6 # This software is licensed as described in the file LICENSE, which
7 # you should have received as part of this distribution.
8 #
9 # This software consists of voluntary contributions made by many
10 # individuals. For exact contribution history, see the revision
11 # history and logs, available at http://fossil-scm.hwaci.com/fossil
12 # # ## ### ##### ######## ############# #####################
13
14 ## Trunk, the special main line of development in a project.
15
16 # # ## ### ##### ######## ############# #####################
17 ## Requirements
18
19 package require Tcl 8.4 ; # Required runtime.
20 package require snit
--- a/tools/cvs2fossil/lib/c2f_repository.tcl
+++ b/tools/cvs2fossil/lib/c2f_repository.tcl
@@ -0,0 +1 @@
1
+pat
--- a/tools/cvs2fossil/lib/c2f_repository.tcl
+++ b/tools/cvs2fossil/lib/c2f_repository.tcl
@@ -0,0 +1 @@
 
--- a/tools/cvs2fossil/lib/c2f_repository.tcl
+++ b/tools/cvs2fossil/lib/c2f_repository.tcl
@@ -0,0 +1 @@
1 pat
--- a/tools/cvs2fossil/lib/c2f_state.tcl
+++ b/tools/cvs2fossil/lib/c2f_state.tcl
@@ -0,0 +1,4 @@
1
+it, and may fail.
2
+
3
+ if {[::file exists $path]} {
4
+ if {![fileutil::test $path fr
--- a/tools/cvs2fossil/lib/c2f_state.tcl
+++ b/tools/cvs2fossil/lib/c2f_state.tcl
@@ -0,0 +1,4 @@
 
 
 
 
--- a/tools/cvs2fossil/lib/c2f_state.tcl
+++ b/tools/cvs2fossil/lib/c2f_state.tcl
@@ -0,0 +1,4 @@
1 it, and may fail.
2
3 if {[::file exists $path]} {
4 if {![fileutil::test $path fr
--- a/tools/cvs2fossil/lib/cvs2fossil.tcl
+++ b/tools/cvs2fossil/lib/cvs2fossil.tcl
@@ -0,0 +1,32 @@
1
+## -*- tcl -*-
2
+# # ## ## ; # Icontrols their interaction.
3
+
4
+# # ## ### ##### ######## ############# #####################
5
+## Requirements
6
+
7
+package require Tcl 8.4 ; # Required runtime.
8
+package require snit ; # OO system
9
+
10
+# # ## ### ##### ######## ############# #####################
11
+## Passes. The order in which the various passes are loaded is
12
+## important. It is the same order in which they will
13
+## register, and then be run in.
14
+
15
+package require vc::fossil::import::cvs::pass::collar ; # Coll'ect Ar'chives.
16
+package require vc::fossil::import::cvs::pass::collrev ; # Coll'ect Rev'isions.
17
+package require vc::fossil::import::cvs::pass::collsym ; # Coll'ate Sym'bols
18
+package require vc::fossil::import::cvs::pass::f iltersym ; # Filter' Sym'bols
19
+
20
+# Note: cvs2svn's SortRevisionSummaryPass and SortSymbolSummaryPass
21
+# are not implemented by us. They are irrelevant due to our use
22
+# of a relational database proper for the persistent state,
23
+# allowing us to sort the data on the fly as we need it.
24
+
25
+package require vc::fossil::import::cvs::pass::initcsets ; # Init'ialize C'hange'Sets
26
+package require vc::fossil::import::cvs::pass::csetdeps ; # C'hange'Set Dep'endencies
27
+package require vc::fossil::import::cvs::pass::breakrcycle ; # Break' R'evision Cycle's
28
+package require vc::fossil::import::cvs::pass::rtopsort ; # R'evision Top'ological Sort'
29
+package require vc::fossil::import::cvs::pass::breakscycle ; # Break' S'ymbol Cycle's
30
+package require vc::fossil::import::cvs::pass::breakac
31
+# Note: cvs2svn's RevisionTopologicalSortPass is not a separate pass,
32
+#
--- a/tools/cvs2fossil/lib/cvs2fossil.tcl
+++ b/tools/cvs2fossil/lib/cvs2fossil.tcl
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/lib/cvs2fossil.tcl
+++ b/tools/cvs2fossil/lib/cvs2fossil.tcl
@@ -0,0 +1,32 @@
1 ## -*- tcl -*-
2 # # ## ## ; # Icontrols their interaction.
3
4 # # ## ### ##### ######## ############# #####################
5 ## Requirements
6
7 package require Tcl 8.4 ; # Required runtime.
8 package require snit ; # OO system
9
10 # # ## ### ##### ######## ############# #####################
11 ## Passes. The order in which the various passes are loaded is
12 ## important. It is the same order in which they will
13 ## register, and then be run in.
14
15 package require vc::fossil::import::cvs::pass::collar ; # Coll'ect Ar'chives.
16 package require vc::fossil::import::cvs::pass::collrev ; # Coll'ect Rev'isions.
17 package require vc::fossil::import::cvs::pass::collsym ; # Coll'ate Sym'bols
18 package require vc::fossil::import::cvs::pass::f iltersym ; # Filter' Sym'bols
19
20 # Note: cvs2svn's SortRevisionSummaryPass and SortSymbolSummaryPass
21 # are not implemented by us. They are irrelevant due to our use
22 # of a relational database proper for the persistent state,
23 # allowing us to sort the data on the fly as we need it.
24
25 package require vc::fossil::import::cvs::pass::initcsets ; # Init'ialize C'hange'Sets
26 package require vc::fossil::import::cvs::pass::csetdeps ; # C'hange'Set Dep'endencies
27 package require vc::fossil::import::cvs::pass::breakrcycle ; # Break' R'evision Cycle's
28 package require vc::fossil::import::cvs::pass::rtopsort ; # R'evision Top'ological Sort'
29 package require vc::fossil::import::cvs::pass::breakscycle ; # Break' S'ymbol Cycle's
30 package require vc::fossil::import::cvs::pass::breakac
31 # Note: cvs2svn's RevisionTopologicalSortPass is not a separate pass,
32 #
--- a/tools/cvs2fossil/lib/id.tcl
+++ b/tools/cvs2fossil/lib/id.tcl
@@ -0,0 +1,64 @@
1
+# # ## ### ##### ######## #############
2
+
3
+## A simple class for handling an in-memory index mapping from
4
+## arbitrary strings to a small numeric id. Can be queried in reverse
5
+## too, returning the string for the id.
6
+
7
+## Id's are starting from 1.
8
+
9
+# # ## ### ##### ######## #############
10
+## Requirements.
11
+
12
+package require Tcl ; # Runtime.
13
+package require snit ; # OO runtime.
14
+
15
+# # ## ### ##### ######## #############
16
+## Implementation.
17
+
18
+snit::type ::vc::tools::id {
19
+ # # ## ### ##### ######## #############
20
+
21
+ constructor {} {}
22
+
23
+ # # ## ### ##### ######## #############
24
+ ## Public API.
25
+ ## - Put data into the index, incl. query for id of key.
26
+ ## - Lookup data for id.
27
+
28
+ method put {key} {
29
+ if {[info exists mydata($key)]} { return $mydata($key) }
30
+ incr mycounter
31
+
32
+ set mydata($key) $mycounter
33
+ set myinvert($mycounter) $key
34
+
35
+ return $mycounter
36
+ }
37
+
38
+ # Explicitly load the database with a mapping.
39
+ method map {id key} {
40
+ set mydata($key) $id
41
+ set myinvert($id) $key
42
+ }
43
+
44
+ method keyof {id} { return $myinvert($id) }
45
+ method get {} { return [array get mydata] }
46
+
47
+ # # ## ### ##### ######## #############
48
+ ## Internal. State.
49
+
50
+ variable mydata -array {} ; # Map data -> id
51
+ variable myinvert -array {} ; # Map id -> data
52
+ variable mycounter 0 ; # Counter for id generation.
53
+
54
+ # # ## ### ##### ######## #############
55
+}
56
+
57
+namespace eval ::vc::tools {
58
+ namespace export id
59
+}
60
+
61
+# # ## ### ##### ######## #############
62
+## Ready.
63
+
64
+package provide vc::tools::id 1.0
--- a/tools/cvs2fossil/lib/id.tcl
+++ b/tools/cvs2fossil/lib/id.tcl
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/lib/id.tcl
+++ b/tools/cvs2fossil/lib/id.tcl
@@ -0,0 +1,64 @@
1 # # ## ### ##### ######## #############
2
3 ## A simple class for handling an in-memory index mapping from
4 ## arbitrary strings to a small numeric id. Can be queried in reverse
5 ## too, returning the string for the id.
6
7 ## Id's are starting from 1.
8
9 # # ## ### ##### ######## #############
10 ## Requirements.
11
12 package require Tcl ; # Runtime.
13 package require snit ; # OO runtime.
14
15 # # ## ### ##### ######## #############
16 ## Implementation.
17
18 snit::type ::vc::tools::id {
19 # # ## ### ##### ######## #############
20
21 constructor {} {}
22
23 # # ## ### ##### ######## #############
24 ## Public API.
25 ## - Put data into the index, incl. query for id of key.
26 ## - Lookup data for id.
27
28 method put {key} {
29 if {[info exists mydata($key)]} { return $mydata($key) }
30 incr mycounter
31
32 set mydata($key) $mycounter
33 set myinvert($mycounter) $key
34
35 return $mycounter
36 }
37
38 # Explicitly load the database with a mapping.
39 method map {id key} {
40 set mydata($key) $id
41 set myinvert($id) $key
42 }
43
44 method keyof {id} { return $myinvert($id) }
45 method get {} { return [array get mydata] }
46
47 # # ## ### ##### ######## #############
48 ## Internal. State.
49
50 variable mydata -array {} ; # Map data -> id
51 variable myinvert -array {} ; # Map id -> data
52 variable mycounter 0 ; # Counter for id generation.
53
54 # # ## ### ##### ######## #############
55 }
56
57 namespace eval ::vc::tools {
58 namespace export id
59 }
60
61 # # ## ### ##### ######## #############
62 ## Ready.
63
64 package provide vc::tools::id 1.0
--- a/tools/cvs2fossil/lib/log.tcl
+++ b/tools/cvs2fossil/lib/log.tcl
@@ -0,0 +1,112 @@
1
+#$text"## -*- tcl -*-
2
+# # ## ### ##### ######## ############# #####################
3
+## Copyright (c) 2007
4
+## Copyright (c) 2007-2008 Andreas Kupries.
5
+#
6
+# This software is licensed as described in the file LICENSE, which
7
+# you should have received as part of this distribution.
8
+#
9
+# This software consists of voluntary contributions made by many
10
+# individuals. For exact contribution history, see the revision
11
+# history and logs, available at http://fossil-scm.hwaci.com/fossil
12
+# # ## ### ##### ######## ############# #####################
13
+
14
+## Utility package, basic user feedback
15
+
16
+# # ## ### ##### ######## ############# #####################
17
+## Requirements
18
+
19
+package require Tcl 8.4 ; # Required runti; # OO system.
20
+## -*- tcl ####### ############# #####################
21
+## Copyright (c) 2007
22
+## Copyright (c) 2007-2008 Andreas Kupries.
23
+#
24
+# This software is licensed as described in the file LICENSE, which
25
+# you should have received as part of this distribution.
26
+#
27
+# This software consists of voluntary contributions made by many
28
+# individuals. For exact contribution history, see the revision
29
+# history and logs, available at http://fossil-scm.hwaci.com/fossil
30
+# # ## ### ##### ######## ############# #####################
31
+
32
+## Utility package,$text# ### ##### ######## #######################
33
+## Requirements
34
+
35
+package require Tcl 8.4 ; # Required runti; # OO system.
36
+## -*- tcl -*-
37
+# # ## ### ##### ######## ############# #####################
38
+## Copyright (c) 2007-2008 Andreas Kupries.
39
+#
40
+# This software is licensed as described in the file LICENSE, whicis software consists of voluntary contributions made by many
41
+# individuals. For exact contribution history, see the revision
42
+# history and logs, available at http://fossil-scm.hwaci.com/fossil
43
+# # ## ### ##### ######## ############# #####################
44
+
45
+## Utility package, basic user feedback
46
+
47
+# # ## ### ##### ######## ############# #####################
48
+## Requirements
49
+
50
+package require Tcl 8.4 ; # Required runtime
51
+package require snit ; # OO system.
52
+package require vc::tools::mem ; # Memory tracking.
53
+
54
+# # ## ### ##### ######## ############# ##################### # # ## ### ##### ######## #############
55
+ ## Public API, Methods
56
+
57
+ # Write the message 'text' to log, for the named 'system'. The
58
+ # message is written if and only if the message verbosity is less
59
+ # or equal the chosen verbosity. A message of verbosity 0 cannot
60
+ # be blocked.
61
+
62
+ typemethod write {verbosity system text} {
63
+ if {$verbosity > $myloglevel} return
64
+ uplevel #0 [linsert $mylogcmd end write [System $system] \
65
+ [uplevel 1 [list ::subst $text]]]
66
+ return
67
+ }
68
+
69
+ # Similar to write, especially in the handling of the verbosity,
70
+ # to drive progress displays. It signals thaputs "l {[^ ]} $m { } b
71
+ puts "$m$system system "]"## -*- tcl -*-
72
+# # # ### ##### ######## ############# #####################
73
+## Copyright (c) 2007-2008 Andr%s ich
74
+# you should have received as part of this distribution.
75
+#
76
+# This soft0 ## ### ##### ######## ##########$text"## -*- tcl -*-
77
+# # ## ### ##fossil
78
+# # ## ### ##### ######## ############# #####################
79
+
80
+## Utility package, basic user feedback
81
+
82
+# # ## ### ##### ######## ############# #####################
83
+## Requirements
84
+
85
+package require Tcl 8.4 ; # Required runtime
86
+package require snit ; # OO system.
87
+package require vc::tools::mem ; # Memory tracking.
88
+
89
+# # ## ### ##### ######## ############# #####################
90
+##
91
+
92
+snit::type ::vc::tools::log {
93
+ # # ## ### ##### ######## #############
94
+ ## Public API, Methods
95
+
96
+ # Write the message 'text' to log, for the named 'system'. The
97
+ # message is written if and only if the message verbosity is less
98
+ # or equal the chosen verbosity. A message of verbosity 0 cannot
99
+ # be blocked.
100
+
101
+ typemethod write {verbosity system text} {
102
+ if {$verbosity > $myloglevel} return
103
+ uplevel #0 [linsert $mylogcmd end write [System $system] \
104
+ [uplevel 1 [list ::subst $text]]]
105
+ return
106
+ }
107
+
108
+ # Similar to write, especially in the handling of the verbosity,
109
+ # to drive progress displays. It signals thaputs "l {[^ ]} $m { } b
110
+ puts "$m$system system "]"## -*- tcl -*-
111
+# # # ### ##### ######## ############# #####################
112
+## Copyright (c) 2007-2008 Andr
--- a/tools/cvs2fossil/lib/log.tcl
+++ b/tools/cvs2fossil/lib/log.tcl
@@ -0,0 +1,112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/lib/log.tcl
+++ b/tools/cvs2fossil/lib/log.tcl
@@ -0,0 +1,112 @@
1 #$text"## -*- tcl -*-
2 # # ## ### ##### ######## ############# #####################
3 ## Copyright (c) 2007
4 ## Copyright (c) 2007-2008 Andreas Kupries.
5 #
6 # This software is licensed as described in the file LICENSE, which
7 # you should have received as part of this distribution.
8 #
9 # This software consists of voluntary contributions made by many
10 # individuals. For exact contribution history, see the revision
11 # history and logs, available at http://fossil-scm.hwaci.com/fossil
12 # # ## ### ##### ######## ############# #####################
13
14 ## Utility package, basic user feedback
15
16 # # ## ### ##### ######## ############# #####################
17 ## Requirements
18
19 package require Tcl 8.4 ; # Required runti; # OO system.
20 ## -*- tcl ####### ############# #####################
21 ## Copyright (c) 2007
22 ## Copyright (c) 2007-2008 Andreas Kupries.
23 #
24 # This software is licensed as described in the file LICENSE, which
25 # you should have received as part of this distribution.
26 #
27 # This software consists of voluntary contributions made by many
28 # individuals. For exact contribution history, see the revision
29 # history and logs, available at http://fossil-scm.hwaci.com/fossil
30 # # ## ### ##### ######## ############# #####################
31
32 ## Utility package,$text# ### ##### ######## #######################
33 ## Requirements
34
35 package require Tcl 8.4 ; # Required runti; # OO system.
36 ## -*- tcl -*-
37 # # ## ### ##### ######## ############# #####################
38 ## Copyright (c) 2007-2008 Andreas Kupries.
39 #
40 # This software is licensed as described in the file LICENSE, whicis software consists of voluntary contributions made by many
41 # individuals. For exact contribution history, see the revision
42 # history and logs, available at http://fossil-scm.hwaci.com/fossil
43 # # ## ### ##### ######## ############# #####################
44
45 ## Utility package, basic user feedback
46
47 # # ## ### ##### ######## ############# #####################
48 ## Requirements
49
50 package require Tcl 8.4 ; # Required runtime
51 package require snit ; # OO system.
52 package require vc::tools::mem ; # Memory tracking.
53
54 # # ## ### ##### ######## ############# ##################### # # ## ### ##### ######## #############
55 ## Public API, Methods
56
57 # Write the message 'text' to log, for the named 'system'. The
58 # message is written if and only if the message verbosity is less
59 # or equal the chosen verbosity. A message of verbosity 0 cannot
60 # be blocked.
61
62 typemethod write {verbosity system text} {
63 if {$verbosity > $myloglevel} return
64 uplevel #0 [linsert $mylogcmd end write [System $system] \
65 [uplevel 1 [list ::subst $text]]]
66 return
67 }
68
69 # Similar to write, especially in the handling of the verbosity,
70 # to drive progress displays. It signals thaputs "l {[^ ]} $m { } b
71 puts "$m$system system "]"## -*- tcl -*-
72 # # # ### ##### ######## ############# #####################
73 ## Copyright (c) 2007-2008 Andr%s ich
74 # you should have received as part of this distribution.
75 #
76 # This soft0 ## ### ##### ######## ##########$text"## -*- tcl -*-
77 # # ## ### ##fossil
78 # # ## ### ##### ######## ############# #####################
79
80 ## Utility package, basic user feedback
81
82 # # ## ### ##### ######## ############# #####################
83 ## Requirements
84
85 package require Tcl 8.4 ; # Required runtime
86 package require snit ; # OO system.
87 package require vc::tools::mem ; # Memory tracking.
88
89 # # ## ### ##### ######## ############# #####################
90 ##
91
92 snit::type ::vc::tools::log {
93 # # ## ### ##### ######## #############
94 ## Public API, Methods
95
96 # Write the message 'text' to log, for the named 'system'. The
97 # message is written if and only if the message verbosity is less
98 # or equal the chosen verbosity. A message of verbosity 0 cannot
99 # be blocked.
100
101 typemethod write {verbosity system text} {
102 if {$verbosity > $myloglevel} return
103 uplevel #0 [linsert $mylogcmd end write [System $system] \
104 [uplevel 1 [list ::subst $text]]]
105 return
106 }
107
108 # Similar to write, especially in the handling of the verbosity,
109 # to drive progress displays. It signals thaputs "l {[^ ]} $m { } b
110 puts "$m$system system "]"## -*- tcl -*-
111 # # # ### ##### ######## ############# #####################
112 ## Copyright (c) 2007-2008 Andr
--- a/tools/cvs2fossil/lib/misc.tcl
+++ b/tools/cvs2fossil/lib/misc.tcl
@@ -0,0 +1,97 @@
1
+## -*- tcl -*-
2
+# # ## ### ##### ######## ############# #####################
3
+## Copyright (c) 2007
4
+## Copyright (c) 2007-2008 Andreas Kupries.
5
+#
6
+# This software is licensed as described in the file LICENSE, which
7
+# you should have received as part of this distribution.
8
+#
9
+# This software consists of voluntary contributions made by many
10
+# individuals. For exact contribution history, see the revision
11
+# history and logs, available at http://fossil-scm.hwaci.com/fossil
12
+# # ## ### ##### ######## ############# #####################
13
+
14
+## Utilities for various things: text formatting, max, ...
15
+
16
+# # ## ### ##### ######## ############# #####################
17
+## Requirements
18
+
19
+package require Tcl 8.4 ; # Required runtime
20
+
21
+# # ## ### ##### ######## ############# #####################
22
+##
23
+
24
+namespace eval ::vc::tools::misc {
25
+ # # ## ### ##### ######## #############
26
+ ## Public API, Methods
27
+
28
+ # Choose singular vs plural forms of a word based on a number.
29
+
30
+ proc sp {n singular {plural {}}} {
31
+ if {$n == 1} {return $singular}
32
+ if {$plural eq ""} {set pi $n $singular $plural]"
33
+ }
34
+
35
+ # Find maximum/minimum in a list.
36
+
37
+ proc max {list} {
38
+ setset min $e
39
+ }
40
+ return $n [sp $n $singular $plural]"
41
+ i $n $singular $plural]"
42
+ }
43
+
44
+ # Find maximum/minimum in a list.
45
+
46
+ proc max {list} {
47
+ set max -1
48
+ foreach e $list {
49
+ if {$e < $max} continue
50
+ set max $e
51
+ }
52
+ return $max
53
+ }
54
+
55
+ pi $n $singular $plural]"
56
+ }
57
+
58
+ # Find maximum/minimum in a list.
59
+
60
+ proc max {list} {
61
+ s {lv item} {
62
+ upvar 1 $lv lisset min $e
63
+ }
64
+ return $min
65
+ }
66
+
67
+ proc max2 {a b} {
68
+ if {$a > i $n $singular $plural]"
69
+ }
70
+
71
+ # Find maximum/minimum in a list.
72
+
73
+ proc max {list} {
74
+ s {lv item} {
75
+ upvar 1 $lv list
76
+ set pos [lsearch -exact $list $item]
77
+ if {$pos < 0} returi$pos $pos]
78
+ return
79
+ }
80
+
81
+ # Dei
82
+ proc striptrailingslash {path} {
83
+ # split and rejoin gets rid of a traling / character.
84
+ return [eval [linsert [file split $path] 0 ::file join]]
85
+ }
86
+
87
+ # The windows filesystem is sring file-names casei fileisdir_ci
88
+}
89
+
90
+# is a proble ::vc::toolames casei fileisdir_ci
91
+}
92
+
93
+# is a problem as without
94
+ # precaution the two files Attic/ striptrailingslash
95
+}
96
+
97
+#
--- a/tools/cvs2fossil/lib/misc.tcl
+++ b/tools/cvs2fossil/lib/misc.tcl
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/lib/misc.tcl
+++ b/tools/cvs2fossil/lib/misc.tcl
@@ -0,0 +1,97 @@
1 ## -*- tcl -*-
2 # # ## ### ##### ######## ############# #####################
3 ## Copyright (c) 2007
4 ## Copyright (c) 2007-2008 Andreas Kupries.
5 #
6 # This software is licensed as described in the file LICENSE, which
7 # you should have received as part of this distribution.
8 #
9 # This software consists of voluntary contributions made by many
10 # individuals. For exact contribution history, see the revision
11 # history and logs, available at http://fossil-scm.hwaci.com/fossil
12 # # ## ### ##### ######## ############# #####################
13
14 ## Utilities for various things: text formatting, max, ...
15
16 # # ## ### ##### ######## ############# #####################
17 ## Requirements
18
19 package require Tcl 8.4 ; # Required runtime
20
21 # # ## ### ##### ######## ############# #####################
22 ##
23
24 namespace eval ::vc::tools::misc {
25 # # ## ### ##### ######## #############
26 ## Public API, Methods
27
28 # Choose singular vs plural forms of a word based on a number.
29
30 proc sp {n singular {plural {}}} {
31 if {$n == 1} {return $singular}
32 if {$plural eq ""} {set pi $n $singular $plural]"
33 }
34
35 # Find maximum/minimum in a list.
36
37 proc max {list} {
38 setset min $e
39 }
40 return $n [sp $n $singular $plural]"
41 i $n $singular $plural]"
42 }
43
44 # Find maximum/minimum in a list.
45
46 proc max {list} {
47 set max -1
48 foreach e $list {
49 if {$e < $max} continue
50 set max $e
51 }
52 return $max
53 }
54
55 pi $n $singular $plural]"
56 }
57
58 # Find maximum/minimum in a list.
59
60 proc max {list} {
61 s {lv item} {
62 upvar 1 $lv lisset min $e
63 }
64 return $min
65 }
66
67 proc max2 {a b} {
68 if {$a > i $n $singular $plural]"
69 }
70
71 # Find maximum/minimum in a list.
72
73 proc max {list} {
74 s {lv item} {
75 upvar 1 $lv list
76 set pos [lsearch -exact $list $item]
77 if {$pos < 0} returi$pos $pos]
78 return
79 }
80
81 # Dei
82 proc striptrailingslash {path} {
83 # split and rejoin gets rid of a traling / character.
84 return [eval [linsert [file split $path] 0 ::file join]]
85 }
86
87 # The windows filesystem is sring file-names casei fileisdir_ci
88 }
89
90 # is a proble ::vc::toolames casei fileisdir_ci
91 }
92
93 # is a problem as without
94 # precaution the two files Attic/ striptrailingslash
95 }
96
97 #
--- a/tools/cvs2fossil/lib/pkgIndex.tcl
+++ b/tools/cvs2fossil/lib/pkgIndex.tcl
@@ -0,0 +1,2 @@
1
+# # ## ### ##### ######## ############# #####################
2
+## Packagestatec2f_lodmgrc2f_flodmgrlodmgrplodmgrgtcorebreakrrrtopsortlog
--- a/tools/cvs2fossil/lib/pkgIndex.tcl
+++ b/tools/cvs2fossil/lib/pkgIndex.tcl
@@ -0,0 +1,2 @@
 
 
--- a/tools/cvs2fossil/lib/pkgIndex.tcl
+++ b/tools/cvs2fossil/lib/pkgIndex.tcl
@@ -0,0 +1,2 @@
1 # # ## ### ##### ######## ############# #####################
2 ## Packagestatec2f_lodmgrc2f_flodmgrlodmgrplodmgrgtcorebreakrrrtopsortlog
--- a/tools/cvs2fossil/lib/rcsparser.tcl
+++ b/tools/cvs2fossil/lib/rcsparser.tcl
@@ -0,0 +1,393 @@
1
+## -*- tcl -*-
2
+# # ## ### ##### ######## ############# #####################
3
+## Copyright (c) 2007 Andreas Kupries.
4
+#
5
+# This software is licensed as described in the file LICENSE, which
6
+# you should have received as part of this distribution.
7
+#
8
+# This software consists of voluntary contributions made by many
9
+# individuals. For exact contribution history, see the revision
10
+# history and logs, available at http://fossil-scm.hwaci.com/fossil
11
+# # ## ### ##### ######## ############# #####################
12
+
13
+# A tool package, provides a parser for RCS archive files. This parser
14
+# is implemented via recursive descent. It is not only given a file to
15
+# process, but also a 'sink', an object it calls out to at important
16
+# places of the parsing process to either signal an event and/or
17
+# convey gathered information to it. The sink is responsible for the
18
+# actual processing of the data in whatever way it desires.
19
+
20
+# # ## ### ##### ######## ############# #####################
21
+## Requirements
22
+
23
+package require Tcl 8.4 ; # Required runtime.
24
+package require snit ; # OO system.
25
+package require fileutil ; # File utilities.
26
+package require vc::tools::log ; # User feedback.
27
+package require struct::list ; # Advanced list ops.
28
+
29
+# # ## ### ##### ######## ############# #####################
30
+##
31
+
32
+snit::type ::vc::rcs::parser {
33
+ # # ## ### ##### ######## #############
34
+ ## Public API
35
+
36
+ typemethod process {path sink} {
37
+ Initialize $path $sink
38
+ Call begin
39
+ Admin ; Deltas ; Description ; DeltaTexts
40
+ Call done
41
+ return
42
+ }
43
+
44
+ # # ## ### ##### ######## #############
45
+ ## Internal methods, recursive descent, syntactical processing
46
+
47
+ proc Admin {} {
48
+ Head ; PrincipalBranch ; Access ; Symbols
49
+ Locks ; Strictness ; FileComment ; Expand
50
+ Call admindone
51
+ return
52
+ }
53
+
54
+ # # ## ### ##### ######## #############
55
+
56
+ proc Head {} {
57
+ RequiredLiteral head
58
+ RequiredNumber -> head
59
+ Semicolon
60
+ Call sethead $head
61
+ return
62
+ }
63
+
64
+ proc PrincipalBranch {} {
65
+ if {![OptionalLiteral branch]} return
66
+ RequiredNumber -> branch
67
+ Semicolon
68
+ Call setprincipalbranch $branch
69
+ return
70
+ }
71
+
72
+ proc Access {} {
73
+ RequiredLiteral access ;
74
+ Semicolon
75
+ return
76
+ }
77
+
78
+ proc Symbols {} {
79
+ RequiredLiteral symbols
80
+ while {[Ident -> symbol]} {
81
+ if {
82
+ ![regexp {^\d*[^,.:;@$]([^,.:;@$]*\d*)*$} $symbol] ||
83
+ [string match */ $symbol]
84
+ } {
85
+ Rewind
86
+ Bad {symbol name}
87
+ }
88
+ RequiredNumber -> rev
89
+ Call deftag $symbol $rev
90
+ }
91
+ Semicolon
92
+ return
93
+ }
94
+
95
+ proc Locks {} {
96
+ # Not saving locks.
97
+ RequiredLiteral locks
98
+ while {[Ident -> symbol]} {
99
+ RequiredNumber -> l
100
+ }
101
+ Semicolon
102
+ return
103
+ }
104
+
105
+ proc Strictness {} {
106
+ # Not saving strictness
107
+ if {![OptionalLiteral strict]} return
108
+ Semicolon
109
+ return
110
+ }
111
+
112
+ proc FileComment {} {
113
+ if {![OptionalLiteral comment]} return
114
+ if {![OptionalString -> c]} return
115
+ Semicolon
116
+ Call setcomment $c
117
+ return
118
+ }
119
+
120
+ proc Expand {} {
121
+ # Not saving expanded keywords
122
+ if {![OptionalLiteral expand]} return
123
+ if {![OptionalString -> dummy]} return
124
+ Semicolon
125
+ return
126
+ }
127
+
128
+ # # ## ### ##### ######## #############
129
+
130
+ proc Deltas {} {
131
+ set ok [OptionalNumber -> rev]
132
+ while {$ok} {
133
+ Date -> d
134
+ Author -> a
135
+ State -> s
136
+ Branches -> b
137
+ NextRev -> n
138
+ Call def $rev $d $a $s $n $b
139
+
140
+ # Check if this is followed by a revision number or the
141
+ # literal 'desc'. If neither we consume whatever is there
142
+ # until the next semicolon, as it has to be a 'new
143
+ # phrase'. Otherwise, for a revision number we loop back
144
+ # and consume that revision, and lastly for 'desc' we stop
145
+ # completely as this signals the end of the revision tree
146
+ # and the beginning of the deltas.
147
+
148
+ while {1} {
149
+ set ok [OptionalNumber -> rev]
150
+ if {$ok} break
151
+
152
+ if {[LiteralPeek desc]} {
153
+ set ok 0
154
+ break
155
+ }
156
+
157
+ Anything -> dummy
158
+ Semicolon
159
+ }
160
+ }
161
+ Call defdone
162
+ return
163
+ }
164
+
165
+ # # ## ### ##### ######## #############
166
+
167
+ proc Date {_ dv} {
168
+ upvar 1 $dv d
169
+ RequiredLiteral date
170
+ RequiredNumber -> d
171
+ Semicolon
172
+
173
+ struct::list assign [split $d .] year month day hour min sec
174
+ if {$year < 100} {incr year 1900}
175
+ set d [clock scan "${year}-${month}-${day} ${hour}:${min}:${sec}"]
176
+ return
177
+ }
178
+
179
+ proc Author {_ av} {
180
+ upvar 1 $av a
181
+ RequiredLiteral author
182
+ Anything -> a
183
+ Semicolon
184
+ return
185
+ }
186
+
187
+ proc State {_ sv} {
188
+ upvar 1 $sv s
189
+ RequiredLiteral state
190
+ Anything -> s
191
+ Semicolon
192
+ return
193
+ }
194
+
195
+ proc Branches {_ bv} {
196
+ upvar 1 $bv b
197
+ RequiredLiteral branches
198
+ Anything -> b
199
+ Semicolon
200
+ return
201
+ }
202
+
203
+ proc NextRev {_ nv} {
204
+ upvar 1 $nv n
205
+ RequiredLiteral next
206
+ Anything -> n
207
+ Semicolon
208
+ return
209
+ }
210
+
211
+ # # ## ### ##### ######## #############
212
+
213
+ proc Description {} {
214
+ upvar 1 data data res res
215
+ RequiredLiteral desc
216
+ RequiredString -> d
217
+ Call setdesc $d
218
+ return
219
+ }
220
+
221
+ # # ## ### ##### ######## #############
222
+
223
+ proc DeltaTexts {} {
224
+ while {[OptionalNumber -> rev]} {
225
+ RequiredLiteral log
226
+ RequiredString -> cmsg
227
+ if {[regexp {[\000-\010\013\014\016-\037]} $cmsg]} {
228
+ #Rewind
229
+ #Bad "log message for $rev contains at least one control character"
230
+ }
231
+
232
+ RequiredLiteral text
233
+ RequiredStringRange -> delta
234
+ Call extend $rev $cmsg $delta
235
+ }
236
+ return
237
+ }
238
+
239
+ # # ## ### ##### ######## #############
240
+ ## Internal methods, lexiographical processing
241
+
242
+ proc Semicolon {} {
243
+ ::variable mydata
244
+ ::variable mypos
245
+
246
+ set ok [regexp -start $mypos -indices -- {\A\s*;\s*} $mydata match]
247
+ if {!$ok} { Expected ';' }
248
+
249
+ SkipOver match
250
+ return
251
+ }
252
+
253
+ proc RequiredLiteral {name} {
254
+ ::variable mydata
255
+ ::variable mypos
256
+
257
+ set pattern "\\A\\s*$name\\s*"
258
+ set ok [regexp -start $mypos -indices -- $pattern $mydata match]
259
+ if {!$ok} { Expected '$name' }
260
+
261
+ SkipOver match
262
+ return
263
+ }
264
+
265
+ proc OptionalLiteral {name} {
266
+ ::variable mydata
267
+ ::variable mypos
268
+
269
+ set pattern "\\A\\s*$name\\s*"
270
+ set ok [regexp -start $mypos -indices -- $pattern $mydata match]
271
+ if {!$ok} { return 0 }
272
+
273
+ SkipOver match
274
+ return 1
275
+ }
276
+
277
+ proc LiteralPeek {name} {
278
+ ::variable mydata
279
+ ::variable mypos
280
+
281
+ set pattern "\\A\\s*$name\\s*"
282
+ set ok [regexp -start $mypos -indices -- $pattern $mydata match]
283
+ if {!$ok} { return 0 }
284
+
285
+ # NO - SkipOver match - Only looking ahead here.
286
+ return 1
287
+ }
288
+
289
+ proc RequiredNumber {_ v} {
290
+ upvar 1 $v value
291
+ ::variable mydata
292
+ ::variable mypos
293
+
294
+ set pattern {\A\s*((\d|\.)+)\s*}
295
+ set ok [regexp -start $mypos -indices -- $pattern $mydata match v]
296
+ if {!$ok} { Expected id }
297
+
298
+ Extract $v -> value
299
+ SkipOver match
300
+ return
301
+ }
302
+
303
+ proc OptionalNumber {_ v} {
304
+ upvar 1 $v value
305
+ ::variable mydata
306
+ ::variable mypos
307
+
308
+ set pattern {\A\s*((\d|\.)+)\s*}
309
+ set ok [regexp -start $mypos -indices -- $pattern $mydata match v]
310
+ if {!$ok} { return 0 }
311
+
312
+ Extract $v -> value
313
+ SkipOver match
314
+ return 1
315
+ }
316
+
317
+ proc RequiredString {_ v} {
318
+ upvar 1 $v value
319
+ ::variable mydata
320
+ ::variable mypos
321
+
322
+ set ok [regexp -start $mypos -indices -- {\A\s*@(([^@]*(@@)*)*)@\s*} $mydata match v]
323
+ if {!$ok} { Expected string }
324
+
325
+ Extract $v -> value
326
+ set value [string map {@@ @} $value]
327
+ SkipOver match
328
+ return
329
+ }
330
+
331
+ proc RequiredStringRange {_ v} {
332
+ upvar 1 $v value
333
+ ::variable mydata
334
+ ::variable mypos
335
+
336
+ set ok [regexp -start $mypos -indices -- {\A\s*@(([^@]*(@@)*)*)@\s*} $mydata match value]
337
+ if {!$ok} { Expected string }
338
+
339
+ }
340
+
341
+ proc Bad {x} {
342
+ ::variable mydata
343
+ ::variable mypos
344
+ set e $mypos ; incr e 30
345
+ return -code error -errorcoBad $x @ 're is licensed as descr## -*- tcl -*-
346
+
347
+ }
348
+
349
+ # # ## ### ##### ######## #############
350
+ ## Setup, callbacks.
351
+
352
+ proc Initialize {path sink} {
353
+ ::variable mypos 0
354
+ ::variaencoding binary $path]
355
+ ::variable mysize [file size $path]
356
+ ::variable mysink $sink
357
+ return
358
+ }
359
+
360
+ proc Call {args} {
361
+ ::variable mysink
362
+ set cmd $mysink
363
+ foreach a $args { lappend cmd $a }
364
+ eval $cmd
365
+ return
366
+ }
367
+
368
+ # # ## ### ##### ######## #############
369
+ ## Configuration
370
+
371
+ typevariable mydata {} ; # Rcs archive contents to process
372
+ typevariable mysize 0 ; # Length of contents
373
+ typevariable mysink {} ; # Sink to report to
374
+
375
+ pragma -hasinstances no ; # singleton
376
+ pragma -hastypeinfo no ; # no introspection
377
+ pragma -hastypedestroy no ; # immortal
378
+
379
+ # # ## ### ##### ######## #############
380
+}
381
+
382
+namespace eval ::vc::rcs {
383
+ namespace export parser
384
+ namespace eval parser {
385
+ namespace import ::vc::tools::log
386
+ log register rcs
387
+ }
388
+}
389
+
390
+# # ## ### ##### ######## ############# #####################
391
+## Ready
392
+
393
+package provide
--- a/tools/cvs2fossil/lib/rcsparser.tcl
+++ b/tools/cvs2fossil/lib/rcsparser.tcl
@@ -0,0 +1,393 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/lib/rcsparser.tcl
+++ b/tools/cvs2fossil/lib/rcsparser.tcl
@@ -0,0 +1,393 @@
1 ## -*- tcl -*-
2 # # ## ### ##### ######## ############# #####################
3 ## Copyright (c) 2007 Andreas Kupries.
4 #
5 # This software is licensed as described in the file LICENSE, which
6 # you should have received as part of this distribution.
7 #
8 # This software consists of voluntary contributions made by many
9 # individuals. For exact contribution history, see the revision
10 # history and logs, available at http://fossil-scm.hwaci.com/fossil
11 # # ## ### ##### ######## ############# #####################
12
13 # A tool package, provides a parser for RCS archive files. This parser
14 # is implemented via recursive descent. It is not only given a file to
15 # process, but also a 'sink', an object it calls out to at important
16 # places of the parsing process to either signal an event and/or
17 # convey gathered information to it. The sink is responsible for the
18 # actual processing of the data in whatever way it desires.
19
20 # # ## ### ##### ######## ############# #####################
21 ## Requirements
22
23 package require Tcl 8.4 ; # Required runtime.
24 package require snit ; # OO system.
25 package require fileutil ; # File utilities.
26 package require vc::tools::log ; # User feedback.
27 package require struct::list ; # Advanced list ops.
28
29 # # ## ### ##### ######## ############# #####################
30 ##
31
32 snit::type ::vc::rcs::parser {
33 # # ## ### ##### ######## #############
34 ## Public API
35
36 typemethod process {path sink} {
37 Initialize $path $sink
38 Call begin
39 Admin ; Deltas ; Description ; DeltaTexts
40 Call done
41 return
42 }
43
44 # # ## ### ##### ######## #############
45 ## Internal methods, recursive descent, syntactical processing
46
47 proc Admin {} {
48 Head ; PrincipalBranch ; Access ; Symbols
49 Locks ; Strictness ; FileComment ; Expand
50 Call admindone
51 return
52 }
53
54 # # ## ### ##### ######## #############
55
56 proc Head {} {
57 RequiredLiteral head
58 RequiredNumber -> head
59 Semicolon
60 Call sethead $head
61 return
62 }
63
64 proc PrincipalBranch {} {
65 if {![OptionalLiteral branch]} return
66 RequiredNumber -> branch
67 Semicolon
68 Call setprincipalbranch $branch
69 return
70 }
71
72 proc Access {} {
73 RequiredLiteral access ;
74 Semicolon
75 return
76 }
77
78 proc Symbols {} {
79 RequiredLiteral symbols
80 while {[Ident -> symbol]} {
81 if {
82 ![regexp {^\d*[^,.:;@$]([^,.:;@$]*\d*)*$} $symbol] ||
83 [string match */ $symbol]
84 } {
85 Rewind
86 Bad {symbol name}
87 }
88 RequiredNumber -> rev
89 Call deftag $symbol $rev
90 }
91 Semicolon
92 return
93 }
94
95 proc Locks {} {
96 # Not saving locks.
97 RequiredLiteral locks
98 while {[Ident -> symbol]} {
99 RequiredNumber -> l
100 }
101 Semicolon
102 return
103 }
104
105 proc Strictness {} {
106 # Not saving strictness
107 if {![OptionalLiteral strict]} return
108 Semicolon
109 return
110 }
111
112 proc FileComment {} {
113 if {![OptionalLiteral comment]} return
114 if {![OptionalString -> c]} return
115 Semicolon
116 Call setcomment $c
117 return
118 }
119
120 proc Expand {} {
121 # Not saving expanded keywords
122 if {![OptionalLiteral expand]} return
123 if {![OptionalString -> dummy]} return
124 Semicolon
125 return
126 }
127
128 # # ## ### ##### ######## #############
129
130 proc Deltas {} {
131 set ok [OptionalNumber -> rev]
132 while {$ok} {
133 Date -> d
134 Author -> a
135 State -> s
136 Branches -> b
137 NextRev -> n
138 Call def $rev $d $a $s $n $b
139
140 # Check if this is followed by a revision number or the
141 # literal 'desc'. If neither we consume whatever is there
142 # until the next semicolon, as it has to be a 'new
143 # phrase'. Otherwise, for a revision number we loop back
144 # and consume that revision, and lastly for 'desc' we stop
145 # completely as this signals the end of the revision tree
146 # and the beginning of the deltas.
147
148 while {1} {
149 set ok [OptionalNumber -> rev]
150 if {$ok} break
151
152 if {[LiteralPeek desc]} {
153 set ok 0
154 break
155 }
156
157 Anything -> dummy
158 Semicolon
159 }
160 }
161 Call defdone
162 return
163 }
164
165 # # ## ### ##### ######## #############
166
167 proc Date {_ dv} {
168 upvar 1 $dv d
169 RequiredLiteral date
170 RequiredNumber -> d
171 Semicolon
172
173 struct::list assign [split $d .] year month day hour min sec
174 if {$year < 100} {incr year 1900}
175 set d [clock scan "${year}-${month}-${day} ${hour}:${min}:${sec}"]
176 return
177 }
178
179 proc Author {_ av} {
180 upvar 1 $av a
181 RequiredLiteral author
182 Anything -> a
183 Semicolon
184 return
185 }
186
187 proc State {_ sv} {
188 upvar 1 $sv s
189 RequiredLiteral state
190 Anything -> s
191 Semicolon
192 return
193 }
194
195 proc Branches {_ bv} {
196 upvar 1 $bv b
197 RequiredLiteral branches
198 Anything -> b
199 Semicolon
200 return
201 }
202
203 proc NextRev {_ nv} {
204 upvar 1 $nv n
205 RequiredLiteral next
206 Anything -> n
207 Semicolon
208 return
209 }
210
211 # # ## ### ##### ######## #############
212
213 proc Description {} {
214 upvar 1 data data res res
215 RequiredLiteral desc
216 RequiredString -> d
217 Call setdesc $d
218 return
219 }
220
221 # # ## ### ##### ######## #############
222
223 proc DeltaTexts {} {
224 while {[OptionalNumber -> rev]} {
225 RequiredLiteral log
226 RequiredString -> cmsg
227 if {[regexp {[\000-\010\013\014\016-\037]} $cmsg]} {
228 #Rewind
229 #Bad "log message for $rev contains at least one control character"
230 }
231
232 RequiredLiteral text
233 RequiredStringRange -> delta
234 Call extend $rev $cmsg $delta
235 }
236 return
237 }
238
239 # # ## ### ##### ######## #############
240 ## Internal methods, lexiographical processing
241
242 proc Semicolon {} {
243 ::variable mydata
244 ::variable mypos
245
246 set ok [regexp -start $mypos -indices -- {\A\s*;\s*} $mydata match]
247 if {!$ok} { Expected ';' }
248
249 SkipOver match
250 return
251 }
252
253 proc RequiredLiteral {name} {
254 ::variable mydata
255 ::variable mypos
256
257 set pattern "\\A\\s*$name\\s*"
258 set ok [regexp -start $mypos -indices -- $pattern $mydata match]
259 if {!$ok} { Expected '$name' }
260
261 SkipOver match
262 return
263 }
264
265 proc OptionalLiteral {name} {
266 ::variable mydata
267 ::variable mypos
268
269 set pattern "\\A\\s*$name\\s*"
270 set ok [regexp -start $mypos -indices -- $pattern $mydata match]
271 if {!$ok} { return 0 }
272
273 SkipOver match
274 return 1
275 }
276
277 proc LiteralPeek {name} {
278 ::variable mydata
279 ::variable mypos
280
281 set pattern "\\A\\s*$name\\s*"
282 set ok [regexp -start $mypos -indices -- $pattern $mydata match]
283 if {!$ok} { return 0 }
284
285 # NO - SkipOver match - Only looking ahead here.
286 return 1
287 }
288
289 proc RequiredNumber {_ v} {
290 upvar 1 $v value
291 ::variable mydata
292 ::variable mypos
293
294 set pattern {\A\s*((\d|\.)+)\s*}
295 set ok [regexp -start $mypos -indices -- $pattern $mydata match v]
296 if {!$ok} { Expected id }
297
298 Extract $v -> value
299 SkipOver match
300 return
301 }
302
303 proc OptionalNumber {_ v} {
304 upvar 1 $v value
305 ::variable mydata
306 ::variable mypos
307
308 set pattern {\A\s*((\d|\.)+)\s*}
309 set ok [regexp -start $mypos -indices -- $pattern $mydata match v]
310 if {!$ok} { return 0 }
311
312 Extract $v -> value
313 SkipOver match
314 return 1
315 }
316
317 proc RequiredString {_ v} {
318 upvar 1 $v value
319 ::variable mydata
320 ::variable mypos
321
322 set ok [regexp -start $mypos -indices -- {\A\s*@(([^@]*(@@)*)*)@\s*} $mydata match v]
323 if {!$ok} { Expected string }
324
325 Extract $v -> value
326 set value [string map {@@ @} $value]
327 SkipOver match
328 return
329 }
330
331 proc RequiredStringRange {_ v} {
332 upvar 1 $v value
333 ::variable mydata
334 ::variable mypos
335
336 set ok [regexp -start $mypos -indices -- {\A\s*@(([^@]*(@@)*)*)@\s*} $mydata match value]
337 if {!$ok} { Expected string }
338
339 }
340
341 proc Bad {x} {
342 ::variable mydata
343 ::variable mypos
344 set e $mypos ; incr e 30
345 return -code error -errorcoBad $x @ 're is licensed as descr## -*- tcl -*-
346
347 }
348
349 # # ## ### ##### ######## #############
350 ## Setup, callbacks.
351
352 proc Initialize {path sink} {
353 ::variable mypos 0
354 ::variaencoding binary $path]
355 ::variable mysize [file size $path]
356 ::variable mysink $sink
357 return
358 }
359
360 proc Call {args} {
361 ::variable mysink
362 set cmd $mysink
363 foreach a $args { lappend cmd $a }
364 eval $cmd
365 return
366 }
367
368 # # ## ### ##### ######## #############
369 ## Configuration
370
371 typevariable mydata {} ; # Rcs archive contents to process
372 typevariable mysize 0 ; # Length of contents
373 typevariable mysink {} ; # Sink to report to
374
375 pragma -hasinstances no ; # singleton
376 pragma -hastypeinfo no ; # no introspection
377 pragma -hastypedestroy no ; # immortal
378
379 # # ## ### ##### ######## #############
380 }
381
382 namespace eval ::vc::rcs {
383 namespace export parser
384 namespace eval parser {
385 namespace import ::vc::tools::log
386 log register rcs
387 }
388 }
389
390 # # ## ### ##### ######## ############# #####################
391 ## Ready
392
393 package provide
--- a/tools/cvs2fossil/lib/trouble.tcl
+++ b/tools/cvs2fossil/lib/trouble.tcl
@@ -0,0 +1,52 @@
1
+## -*- tcl -*-
2
+# # ## ### ##### ######## ############# #####################
3
+## Copyright (c) 2007 Andreas Kupries.
4
+#
5
+# This software is licensed as described in the file LICENSE, which
6
+# you should have received as part of this distribution.
7
+#
8
+# This software consists of voluntary contributions made by many
9
+# individuals. For exact contribution history, see the revision
10
+# history and logs, available at http://fossil-scm.hwaci.com/fossil
11
+# # ## ### ##### ######## ############# #####################
12
+
13
+## Utility package, error reporting on top of the log package.
14
+
15
+# # ## ### ##### ######## ############# #####################
16
+## Requirements
17
+
18
+package require Tcl 8.4 ; # Required runtime.
19
+package require vc::tools::log ; # Basic log generation.
20
+package require snit ; # OO system.
21
+
22
+# # ## ### ##### ######## ########### ## #####################
23
+##
24
+
25
+snit::type ::vc::tools::trouble {
26
+ # # ## ### ##### ######## #############
27
+ ## Public API, Methods
28
+
29
+ typemethod internal {text} {
30
+ foreach line [split $text \n] { $type fatal "INTERNAL ERROR! $line" }
31
+ exit 1
32
+ }
33
+
34
+ typemethod fatal {text} {
35
+ lappend myfatal $text
36
+ return
37
+ }
38
+
39
+ typemethod warn {text} {
40
+ lappend mywarn $text
41
+ log write 0 trouble $text
42
+ return
43
+ }
44
+
45
+ typemethod info {text} {
46
+ lappend myinfo $text
47
+ return
48
+ }
49
+
50
+ typemethod show {} {
51
+ foreach m $myinfo { log write 0 "" $m }
52
+ foreach m $mywarn { log write 0 warning $m
--- a/tools/cvs2fossil/lib/trouble.tcl
+++ b/tools/cvs2fossil/lib/trouble.tcl
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/cvs2fossil/lib/trouble.tcl
+++ b/tools/cvs2fossil/lib/trouble.tcl
@@ -0,0 +1,52 @@
1 ## -*- tcl -*-
2 # # ## ### ##### ######## ############# #####################
3 ## Copyright (c) 2007 Andreas Kupries.
4 #
5 # This software is licensed as described in the file LICENSE, which
6 # you should have received as part of this distribution.
7 #
8 # This software consists of voluntary contributions made by many
9 # individuals. For exact contribution history, see the revision
10 # history and logs, available at http://fossil-scm.hwaci.com/fossil
11 # # ## ### ##### ######## ############# #####################
12
13 ## Utility package, error reporting on top of the log package.
14
15 # # ## ### ##### ######## ############# #####################
16 ## Requirements
17
18 package require Tcl 8.4 ; # Required runtime.
19 package require vc::tools::log ; # Basic log generation.
20 package require snit ; # OO system.
21
22 # # ## ### ##### ######## ########### ## #####################
23 ##
24
25 snit::type ::vc::tools::trouble {
26 # # ## ### ##### ######## #############
27 ## Public API, Methods
28
29 typemethod internal {text} {
30 foreach line [split $text \n] { $type fatal "INTERNAL ERROR! $line" }
31 exit 1
32 }
33
34 typemethod fatal {text} {
35 lappend myfatal $text
36 return
37 }
38
39 typemethod warn {text} {
40 lappend mywarn $text
41 log write 0 trouble $text
42 return
43 }
44
45 typemethod info {text} {
46 lappend myinfo $text
47 return
48 }
49
50 typemethod show {} {
51 foreach m $myinfo { log write 0 "" $m }
52 foreach m $mywarn { log write 0 warning $m
D tools/import-cvs.tcl
-112
--- a/tools/import-cvs.tcl
+++ b/tools/import-cvs.tcl
@@ -1,112 +0,0 @@
1
-#!/bin/sh
2
-# -*- tcl -*- \
3
-exec tclsh "$0" ${1+"$@"}
4
-
5
-# -----------------------------------------------------------------------------
6
-
7
-# Import the trunk of a CVS repository wholesale into a fossil repository.
8
-
9
-# Limitations implicitly mentioned:
10
-# - No incremental import.
11
-# - No import of branches.
12
-
13
-# WIBNI features (beyond eliminating the limitations):
14
-# - Restrict import to specific directory subtrees (SF projects use
15
-# one repository for several independent modules. Examples: tcllib
16
-# -> tcllib, tklib, tclapps, etc.). The restriction would allow import
17
-# of only a specific module.
18
-# - Related to the previous, strip elements from the base path to keep
19
-# it short.
20
-# - Export to CVS, trunk, possibly branches. could be the master repository.
21
-
22
-# HACKS. I.e. I do not know if the 1 of handling the encountered siurrently I will ignore the
23
-# fot know if the 'fixes'[this,v. Currently I will ignore the
24
-# file in the Attic.
25
-# Examples: sqlite/os_unix.h
26
-#
27
-# - A specific revision of a file F cannot be checked out (reported
28
-# error is 'invalid change text'). This indicates a corrupt RCS
29
-# file, one or more delta are bad. We report but ignore the problem
30
-# in a best-effort attempt at getting as much history as possible.
31
-# Examples: tcllib/tklib/modules/tkpiechart/pie.tcl
32
-
33
-# -----------------------------------------------------------------------------
34
-# Make private packages accessible.
35
-
36
-lappend auto_path [file join [file dirname [info script]] lib]
37
-
38
-# -----------------------------------------------------------------------------
39
-# Requirements
40
-
41
-package require Tcl 8.4
42
-package require vc::tools::log ; # User Feedback
43
-package require vc::fossil::import::cvs ; # Importer Control
44
-package require vc::cvs::ws ; # CVS frontend
45
-
46
-namespace eval ::import {
47
-ssil::import::cvs::*
48
-}
49
-
50
-# ---------------------------------------------------------------------------
51
-
52
-proc main {} {
53
- commandline -> cvs fossilproject:---------------------------------
54
-
55
-proc commandline {__ cv fv} {
56
- global argv
57
- var 1 $cv cvs $fv fossil
58
-
59
- set verbosity 0
60
-
61
- clinit
62
- while {[string#!/bin/sh
63
-# -*- tcl -*- \
64
-exec tclsh "$0" ${1+"$@"}
65
-
66
-# -----------------------------------------------------------------------------
67
-
68
-# Import the trunk of a CVS repository wholesale into a fossil reposi*- tcl -*- \
69
-exec tclsh "$0" ${1+"$@"}
70
-
71
-# -----------------------------------------------------------------------------
72
-
73
-# Import the trunk of a CVS repository wholesale into a fossil repository.
74
-
75
-# Limitations implicitly mentioned:
76
-# - No incremental import.
77
-# - No import of branches.
78
-
79
-# WIBNI features (beyond eliminating the limitations):
80
-# - Restrict import to specific directory subtrees (SF projects use
81
-# one repository for several independent modules. Examples: tcllib
82
-# -> tcllib, tklib, tclapps, etc.). The restriction would allow import
83
-# of only a specific module.
84
-# - Related to the previous, strip elements from the base path to keep
85
-# it short.
86
-# - Export to CVS, trunk, possibly branches. I.e. extend the system to be
87
-# a full bridge. Either Fossil or CVS could be the master repository.
88
-
89
-# HACKS. I.e. I do not know if the 'fixes' I use are the correct way
90
-# of handling the encountered situations.
91
-#
92
-# - File F has archives F,v and Attic/F,v. Currently I will ignore the
93
-# file in the Attic.
94
-# Examples: sqlite/os_unix.h
95
-#
96
-# - A specific revision of a file F cannot be checked out (reported
97
-# error is 'invalid change text'). This indicates a corrupt RCS
98
-# file, one or more delta are bad. We report but ignore the problem
99
-# in a best-effort attempt at getting as much history as possible.
100
-# Examples: tcllib/tklib/modules/tkpiechart/pie.tcl
101
-
102
-# -----------------------------------------------------------------------------
103
-# Make private packages accessible.
104
-
105
-lappend auto_path [file join [file dirname [info script]] lib]
106
-
107
-# -----------------------------------------------------------------------------
108
-# Requirements
109
-
110
-package require Tcl 8.4
111
-package require vc::tools::log ; # User Feedback
112
-package require vc::fossil::impo
--- a/tools/import-cvs.tcl
+++ b/tools/import-cvs.tcl
@@ -1,112 +0,0 @@
1 #!/bin/sh
2 # -*- tcl -*- \
3 exec tclsh "$0" ${1+"$@"}
4
5 # -----------------------------------------------------------------------------
6
7 # Import the trunk of a CVS repository wholesale into a fossil repository.
8
9 # Limitations implicitly mentioned:
10 # - No incremental import.
11 # - No import of branches.
12
13 # WIBNI features (beyond eliminating the limitations):
14 # - Restrict import to specific directory subtrees (SF projects use
15 # one repository for several independent modules. Examples: tcllib
16 # -> tcllib, tklib, tclapps, etc.). The restriction would allow import
17 # of only a specific module.
18 # - Related to the previous, strip elements from the base path to keep
19 # it short.
20 # - Export to CVS, trunk, possibly branches. could be the master repository.
21
22 # HACKS. I.e. I do not know if the 1 of handling the encountered siurrently I will ignore the
23 # fot know if the 'fixes'[this,v. Currently I will ignore the
24 # file in the Attic.
25 # Examples: sqlite/os_unix.h
26 #
27 # - A specific revision of a file F cannot be checked out (reported
28 # error is 'invalid change text'). This indicates a corrupt RCS
29 # file, one or more delta are bad. We report but ignore the problem
30 # in a best-effort attempt at getting as much history as possible.
31 # Examples: tcllib/tklib/modules/tkpiechart/pie.tcl
32
33 # -----------------------------------------------------------------------------
34 # Make private packages accessible.
35
36 lappend auto_path [file join [file dirname [info script]] lib]
37
38 # -----------------------------------------------------------------------------
39 # Requirements
40
41 package require Tcl 8.4
42 package require vc::tools::log ; # User Feedback
43 package require vc::fossil::import::cvs ; # Importer Control
44 package require vc::cvs::ws ; # CVS frontend
45
46 namespace eval ::import {
47 ssil::import::cvs::*
48 }
49
50 # ---------------------------------------------------------------------------
51
52 proc main {} {
53 commandline -> cvs fossilproject:---------------------------------
54
55 proc commandline {__ cv fv} {
56 global argv
57 var 1 $cv cvs $fv fossil
58
59 set verbosity 0
60
61 clinit
62 while {[string#!/bin/sh
63 # -*- tcl -*- \
64 exec tclsh "$0" ${1+"$@"}
65
66 # -----------------------------------------------------------------------------
67
68 # Import the trunk of a CVS repository wholesale into a fossil reposi*- tcl -*- \
69 exec tclsh "$0" ${1+"$@"}
70
71 # -----------------------------------------------------------------------------
72
73 # Import the trunk of a CVS repository wholesale into a fossil repository.
74
75 # Limitations implicitly mentioned:
76 # - No incremental import.
77 # - No import of branches.
78
79 # WIBNI features (beyond eliminating the limitations):
80 # - Restrict import to specific directory subtrees (SF projects use
81 # one repository for several independent modules. Examples: tcllib
82 # -> tcllib, tklib, tclapps, etc.). The restriction would allow import
83 # of only a specific module.
84 # - Related to the previous, strip elements from the base path to keep
85 # it short.
86 # - Export to CVS, trunk, possibly branches. I.e. extend the system to be
87 # a full bridge. Either Fossil or CVS could be the master repository.
88
89 # HACKS. I.e. I do not know if the 'fixes' I use are the correct way
90 # of handling the encountered situations.
91 #
92 # - File F has archives F,v and Attic/F,v. Currently I will ignore the
93 # file in the Attic.
94 # Examples: sqlite/os_unix.h
95 #
96 # - A specific revision of a file F cannot be checked out (reported
97 # error is 'invalid change text'). This indicates a corrupt RCS
98 # file, one or more delta are bad. We report but ignore the problem
99 # in a best-effort attempt at getting as much history as possible.
100 # Examples: tcllib/tklib/modules/tkpiechart/pie.tcl
101
102 # -----------------------------------------------------------------------------
103 # Make private packages accessible.
104
105 lappend auto_path [file join [file dirname [info script]] lib]
106
107 # -----------------------------------------------------------------------------
108 # Requirements
109
110 package require Tcl 8.4
111 package require vc::tools::log ; # User Feedback
112 package require vc::fossil::impo
--- a/tools/import-cvs.tcl
+++ b/tools/import-cvs.tcl
@@ -1,112 +0,0 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
D tools/lib/cvs.tcl
-449
--- a/tools/lib/cvs.tcl
+++ b/tools/lib/cvs.tcl
@@ -1,449 +0,0 @@
1
-# -----------------------------------------------------------------------------
2
-# Repository management (CVS)
3
-
4
-# -----------------------------------------------------------------------------
5
-# Requirements
6
-
7
-package require Tcl 8.4
8
-package require fileutil ; # Tcllib (traverse directory hierarchy)
9
-package require vc::rcs::parser ; # Handling the RCS archive files.
10
-package require vc::tools::log ; # User feedback
11
-package require vc::tools::trouble ; # Error handling
12
-package require vc::cvs::cmd ; # Access to cvs application.
13
-package require vc::cvs::ws::files ; # Scan CVS repository for relevant files.
14
-package require vc::cvs::ws::timeline ; # Manage timeline of all changes.
15
-package require vc::cvs::ws::csets ; # Manage the changengeset file/rev signatures
16
-
17
-namespace eval ::vc::cvs::ws {
18
- vc::tools::log::system cvs
19
- namespace import ::vc::tools::log::write
20
- namespace import ::vc::rcs::parser::process
21
- namespace import ::vc::cvs::cmd::dova
22
-
23
- namespace eval trouble { namespace import ::vc::tools::trouble::* }
24
-}
25
-
26
-# -----------------------------------------------------------------------------
27
-# API
28
-
29
-# vc::cvs::ws::configure key value - Configure the subsystem.
30
-# vc::cvs::ws::check src mv - Check if src is a CVS repository directory.
31
-# vc::cvs::ws::begin src - Start new workspace and return the top-
32
-# most directory co'd files are put into.
33
-# vc::cvs::ws::ncsets - Retrieve total number of csets
34
-# vc::cvs::ws::nimportable - Retrieve number of importable csets
35
-# vc::cvs::ws::foreach csvar script - Run the script for each changeset, the
36
-# id of the current changeset stored in
37
-# the variable named by csvar.
38
-# vc::cvs::ws::done - Close workspace and delete it.
39
-# vc::cvs::ws::isadmin path - Check if path is an admin file of CVS
40
-# vc::cvs::ws::checkout id - Have workspace contain the changeset id.
41
-# vc::cvs::ws::get id - Retrieve data of a changeset.
42
-#
43
-# Configuration keys:
44
-#
45
-# -project path - Sub directory under 'src' to limit the import to.
46
-
47
-# -----------------------------------------------------------------------------
48
-# API Implementation
49
-
50
-proc ::vc::cvs::ws::configure {key value} {
51
- variable project
52
-
53
- switch -exact -- $key {
54
- -project { set project $value }
55
- default {
56
- return -code error "Unknown switch $key, expected \
57
- -project"
58
- }
59
- }
60
- return
61
-}
62
-
63
-proc ::vc::cvs::ws::check {src mv} {
64
- variable project
65
- upvar 1 $mv msg
66
- if {
67
- ![fileutil::test $src erd msg "CVS Repository"] ||
68
- ![fileutil::test $src/CVSROOT erd msg "CVS Admin directory"] ||
69
- (($project ne "") &&
70
- ![fileutil::test $src/$project erd msg "Project directory"])
71
- } {
72
- return 0
73
- }
74
- return 1
75
-}
76
-
77
-proc ::vc::cvs::ws::begin {src} {
78
- if {![check $src msg]} { return -code error $msg }
79
-
80
- DefBase $src
81
- MakeTimeline [ScanArchives [files::find [RootPath]]]
82
- MakeChangesets
83
- ProcessBranches
84
-
85
- return [MakeWorkspace]
86
-}
87
-
88
-proc ::vc::cvs::ws::done {} {
89
- variable workspace
90
- file delete -force $workspace
91
- return
92
-}
93
-
94
-proc ::vc::cvs::ws::foreach {cv script} {
95
- variable importable
96
- upvar 1 $cv c
97
-
98
- ::foreach c [lsort -integer -increasing $importable] {
99
- set code [catch {uplevel 1 $script} res]
100
-
101
- # 0 - ok, 1 - error, 2 - return, 3 - break, 4 - continue
102
- switch -- $code {
103
- 0 {}
104
- 1 { return -errorcode $::errorCode -errorinfo $::errorInfo -code error $res }
105
- 2 {}
106
- 3 { return }
107
- 4 {}
108
- default { return -code $code $result }
109
- }
110
- }
111
- return
112
-}
113
-
114
-proc ::vc::cvs::ws::ncsets {args} {
115
- return [csets::num]
116
-}
117
-
118
-proc ::vc::cvs::ws::nimportable {args} {
119
- variable importable
120
- return [llength $importable]
121
-}
122
-
123
-proc ::vc::cvs::ws::isadmin {path} {
124
- # Check if path is a CVS admin file.
125
- if {[string match CVS/* $path]} {return 1}
126
- if {[string match */CVS/* $path]} {return 1}
127
- return 0
128
-}
129
-
130
-proc ::vc::cvs::ws::parentOf {id} { csets::parentOf $id }
131
-
132
-proc ::vc::cvs::ws::checkout {id} {
133
- variable workspace
134
- cd $workspace
135
-
136
- # TODO: Hide the direct access to the data structures behind
137
- # TODO: accessors for date, cmsg, removed, added, changed, and
138
- # TODO: author
139
- array set cs [csets::get $id]
140
-
141
- write 1 cvs "@ $cs(date)"
142
- ::foreach l [split [string trim $cs(cmsg)] \n] {
143
- write 1 cvs "| $l"
144
- }
145
-
146
- ::foreach {f r} $cs(removed) { write 2 cvs "R $f $r" ; Remove $f $r }
147
- ::foreach {f r} $cs(added) { write 2 cvs "A $f $r" ; Checkout $f $r }
148
- ::foreach {f r} $cs(changed) { write 2 cvs "M $f $r" ; Checkout $f $r }
149
-
150
- # Provide metadata about the changeset the backend may wish to have
151
- return [list $cs(author) $cs(date) $cs(cmsg)]
152
-}
153
-
154
-# -----------------------------------------------------------------------------
155
-# Internals
156
-
157
-proc ::vc::cvs::ws::DefBase {path} {
158
- variable project
159
- variable base
160
-
161
- set base $path
162
-
163
- write 0 cvs "Base: $base"
164
- if {$project eq ""} {
165
- write 0 cvs "Project: <ALL>"
166
- } else {
167
- write 0 cvs "Project: $project"
168
- }
169
- return
170
-}
171
-
172
-proc ::vc::cvs::ws::RootPath {} {
173
- variable project
174
- variable base
175
-
176
- if {$project eq ""} {
177
- return $base
178
- } else {
179
- return $base/$project
180
- }
181
-}
182
-
183
-proc ::vc::cvs::ws::ScanArchives {files} {
184
- write 0 cvs "Scanning archives ..."
185
-
186
- set d [RootPath]
187
- set r {}
188
- set n 0
189
-
190
- ::foreach {rcs f} $files {
191
- write 1 cvs "Archive $rcs"
192
- # Get the meta data we need (revisions, timeline, messages).
193
- lappend r $f [process $d/$rcs]
194
- incr n
195
- }
196
-
197
- write 0 cvs "Processed [NSIPL $n file]"
198
- return $r
199
-}
200
-
201
-proc ::vc::cvs::ws::MakeTimeline {meta} {
202
- write 0 cvs "Generating coalesced timeline ..."
203
-
204
- set n 0
205
- ::foreach {f meta} $meta {
206
- array set md $meta
207
- array set date $md(date)
208
- array set auth $md(author)
209
- array set cmsg $md(commit)
210
- array set stat $md(state)
211
-
212
- ::foreach rev [lsort -dict [array names date]] {
213
- set operation [Operation $rev $stat($rev)]
214
- NoteDeadRoots $f $rev $operation
215
- timeline::add $date($rev) $f $rev $operation $auth($rev) #B Extend branch managementve $f $r }
216
- ::foreach {f r} $cs(added) { write 2 cvs "A $f $r" ; Checkout $f $r }
217
- ::foreach {f r} $cs(changed) { write 2 cvs "M $f $r" ; Checkout $f $r }
218
-
219
- # Provide metadata about the changeset the backend may wish to have
220
- return [list $cs(author) $cs(date) $cs(cmsg)]
221
-}
222
-
223
-# -----------------------------------------------------------------------------
224
-# Internals
225
-
226
-proc ::vc::cvs::ws::DefBase {path} {
227
- variable project
228
- variable base
229
-
230
- set base $path
231
-
232
- write 0 cvs "Base: $base"
233
- if {$project eq ""} {
234
- write 0 cvs "Project: <ALL>"
235
- } else {
236
- write 0 cvs "Project: $project"
237
- }
238
- return
239
-}
240
-
241
-proc ::vc::cvs::ws::RootPath {vs::ws::RootPath {} {
242
-
243
-
244
- if {$project eq ""} {es} {
245
- write 0 cvs "Scanning arc cvs "Scanning archives ..."
246
-
247
- set d [RootPath]
248
- set r {}
249
- set n 0
250
-
251
- ::foreach {rcs f} $files {
252
- write 1 cvs "Archive $rcs"
253
- # Get the meta data we need (revisions, timeline, messages).
254
- lappend r $f [process $d/$rcs]
255
- incr n
256
- }
257
-
258
- write 0 cvs "Processed [NSIPL $n file]"
259
- return $r
260
-}
261
-
262
-proc ::vc::cvs::ws::MakeTimeline {meta} {
263
- write 0 cvs "Generating coalesced timeline ..."
264
-
265
- set n 0
266
- ::foreach {f meta} $meta {
267
- array set md $meta
268
- array set date $md(date)
269
- array set auth $md(author)
270
- array set cmsg $md(commit)
271
- array set stat $md(state)
272
-
273
- ::foreach rev [lsort -dict [array names date]] {
274
- set operation [Operation $rev $stat($rev)]
275
- NoteDeadRoots $f $rev $operation
276
- timeline::add $date($rev) $f $rev $operation $auth($rev) $cmsg($rev)
277
- incr n
278
- }
279
-
280
- if {[info exists md(symbol)]} {
281
- branch::def $f date $md(symbol)
282
- }
283
-
284
- unset md
285
- unset date
286
- unset auth
287
- unset cmsg
288
- unset stat
289
- }
290
-
291
- write 0 cvs "Timeline has [NSIPL $n entry entries]"
292
- return
293
-}
294
-
295
-proc ::vc::cvs::ws::NoteDeadRoots {f rev operation} {
296
- # A dead-first revision is rev 1.1 with op R. For an example see
297
- # the file memchan/DEPENDENCIES. Such a file seems to exist only!
298
- # on its branch. The branches information is set on the revision
299
- # (extend rcsparser!), symbols has a tag, refering to a branch,
300
- # possibly magic.
301
-
302
- if {($rev eq "1.1") && ($operation eq "R")} {
303
- write 2 cvs "Dead root revision: $f"
304
- }
305
- return
306
-}
307
-
308
-proc ::vc::cvs::ws::Operation {rev state} {
309
- if {$state eq "dead"} {return "R"} ; # Removed
310
- if {$rev eq "1.1"} {return "A"} ; # Added
311
- if {[string match *.1.1 $rev]} {return "A"} ; # Added on a branch
312
- return "M" ; # Modified
313
-}
314
-
315
-proc ::vc::cvs::ws::MakeChangesets {} {
316
- write 0 cvs "Generating changesets from timeline"
317
-
318
- csets::init
319
- timeline::foreach date file revision operation author cmsg {
320
- csets::add $date $file $revision $operation $author $cmsg
321
- }
322
- csets::done
323
-
324
- write 0 cvs "Found [NSIPL [csets::nchangesetsength $cslist] changesets"]"
325
-
326
- set base [lindex $cslist 0]
327
- set cslist [the trunk
328
- ### ### ### ######### ######### #########
329
- ## Dump data of the unprocessing changeset
330
-
331
- puts /${base}/_________________ged, and
332
- # TODO: author
333
- base]
334
- parray cs
335
-
336
- # Which branch does base belong to?
337
- # - It has to be the base of an unprocessed branch!
338
- # Otherwise it would have been on either the trunk
339
- # or an already processed branch.
340
- # Where is its root changeset ?
341
- # - The root has to come before the base, it has already
342
- # been processed => Smaller id, older in time.
343
- # - Based on the files changed/removed by the base, and their
344
- # versions we know the root versions of these files, and we
345
- # can determine the changesets they are in => Intersection
346
- # plus cap from previous contraint gives us the possibl# ### ### ### ######### ######### #########
347
- exit
348
-
349
- set tag [FindBranch $base ..]
350
- set rt n [csets::num]base $root
351
-
352
- ets"
353
-
354
- set remaind 0
355
- set n [cse set n [csets::num]
356
- set parent {}
357
-
358
- for {set c 0} {$c < $n} {incr c} {
359
- if {[csets::isTrunk $c]} {
360
- csets::setParentOf #
361
-}
362
-
363
-proc ::vc::cvs::ws::Ma write 0 cvs "Found [NSIPL $t {trunk changeset}], [NSIPL [llength $remainder] {branch changeset}]#TBD
364
-#... FindBranch
365
-#.
366
-
367
-proc ::vc::cvs::ws::ProcessBranch {cslist} {
368
- write 0 cvs "Processing the remaining [SIPL [llength $cslist] changeset "[llength $cslist] changesets"]"
369
-
370
- set base [lindex $cslist 0]
371
- set cslist [lrange $cslist 1 end]
372
-
373
- csets::DUMP $base
374
-
375
- # Which branch does base belong to?
376
- # - It has to be the base of an unprocessed branch!
377
- # Otherwise it would have been on either the trunk
378
- # or an already processed branch.
379
- # Where is its root changeset ?
380
- # - The root has to come before the base, it has already
381
- # been processed => Smaller id, older in time.
382
- # - Based on the files changed/removed by the base, and their
383
- # versions we know the root versions of these files, and we
384
- # can determine the changesets they are in => Intersection
385
- # plus cap from previous contraint gives us the possible
386
- # candidates.
387
-
388
- write 4 cvs "Branch base $base"
389
-
390
- ::foreach {tag rootsig} [branch::find [csets::get $base]] break
391
-
392
- write 4 cvs "Branch tag $tag"
393
- write 4 cvs "Root sig $rootsig"
394
-
395
- set root [sig::find $base $rootsig]
396
-
397
- write 4 cvs "Branch root $root"
398
-
399
- write 0 cvs "Changeset $base, starting branch \"$tag\", rooted at $root"
400
- csets::setParentOf $base $root
401
-
402
- set remainder {}
403
- set t 1
404
-
405
- ::foreach c $cslist {
406
- #csets::DUMP $c
407
- if {[csets::sameBranch $c $base $tag]} {
408
- csets::setParentOf $c $base
409
- set base $c
410
- incr t
411
- lappend importable $c
412
- } else {
413
- lappend remainder $c
414
- }
415
- }
416
-
417
- write 0 cvs "Found [NSIPL $t "$tag changeset"], [NSIPL [llength $remainder] changeset] outside"
418
- return $remainder
419
-}
420
-
421
-proc ::vc::cvs::ws::Checkout {f r} {
422
- variable base
423
- variable project
424
-
425
- # Added or modified, put the requested version of the file into
426
- # the workspace.
427
-
428
- if {$project ne ""} {set f $project/$f}
429
- if {[catch {
430
- dova -d $base co -r $r $f
431
- } msg]} {
432
- if {[string match {*invalid change text*} $msg]} {
433
-
434
- # The archive of the file is corrupted and the chosen
435
- # version not accessible due to that. We report the
436
- # problem, but otherwise ignore it. As a consequence the
437
- # destination repository will not contain the full history
438
- # of the named file. By ignoring the problem we however
439
- # get as much as is possible.
440
-
441
- trouble::ad[NSIPL [llength $remainder] {branch changeset}]"
442
- return $remainder
443
-}
444
-
445
-proc ::vc::cvs::ws::ProcessBranch {cslist} {
446
- write 0 cvs "Processing the remaining [SIPL [llength $cslist] changeset "[llength $cslist] changesets"]"
447
-
448
- set base [lindex $cslist 0]
449
- set cslist [lran
--- a/tools/lib/cvs.tcl
+++ b/tools/lib/cvs.tcl
@@ -1,449 +0,0 @@
1 # -----------------------------------------------------------------------------
2 # Repository management (CVS)
3
4 # -----------------------------------------------------------------------------
5 # Requirements
6
7 package require Tcl 8.4
8 package require fileutil ; # Tcllib (traverse directory hierarchy)
9 package require vc::rcs::parser ; # Handling the RCS archive files.
10 package require vc::tools::log ; # User feedback
11 package require vc::tools::trouble ; # Error handling
12 package require vc::cvs::cmd ; # Access to cvs application.
13 package require vc::cvs::ws::files ; # Scan CVS repository for relevant files.
14 package require vc::cvs::ws::timeline ; # Manage timeline of all changes.
15 package require vc::cvs::ws::csets ; # Manage the changengeset file/rev signatures
16
17 namespace eval ::vc::cvs::ws {
18 vc::tools::log::system cvs
19 namespace import ::vc::tools::log::write
20 namespace import ::vc::rcs::parser::process
21 namespace import ::vc::cvs::cmd::dova
22
23 namespace eval trouble { namespace import ::vc::tools::trouble::* }
24 }
25
26 # -----------------------------------------------------------------------------
27 # API
28
29 # vc::cvs::ws::configure key value - Configure the subsystem.
30 # vc::cvs::ws::check src mv - Check if src is a CVS repository directory.
31 # vc::cvs::ws::begin src - Start new workspace and return the top-
32 # most directory co'd files are put into.
33 # vc::cvs::ws::ncsets - Retrieve total number of csets
34 # vc::cvs::ws::nimportable - Retrieve number of importable csets
35 # vc::cvs::ws::foreach csvar script - Run the script for each changeset, the
36 # id of the current changeset stored in
37 # the variable named by csvar.
38 # vc::cvs::ws::done - Close workspace and delete it.
39 # vc::cvs::ws::isadmin path - Check if path is an admin file of CVS
40 # vc::cvs::ws::checkout id - Have workspace contain the changeset id.
41 # vc::cvs::ws::get id - Retrieve data of a changeset.
42 #
43 # Configuration keys:
44 #
45 # -project path - Sub directory under 'src' to limit the import to.
46
47 # -----------------------------------------------------------------------------
48 # API Implementation
49
50 proc ::vc::cvs::ws::configure {key value} {
51 variable project
52
53 switch -exact -- $key {
54 -project { set project $value }
55 default {
56 return -code error "Unknown switch $key, expected \
57 -project"
58 }
59 }
60 return
61 }
62
63 proc ::vc::cvs::ws::check {src mv} {
64 variable project
65 upvar 1 $mv msg
66 if {
67 ![fileutil::test $src erd msg "CVS Repository"] ||
68 ![fileutil::test $src/CVSROOT erd msg "CVS Admin directory"] ||
69 (($project ne "") &&
70 ![fileutil::test $src/$project erd msg "Project directory"])
71 } {
72 return 0
73 }
74 return 1
75 }
76
77 proc ::vc::cvs::ws::begin {src} {
78 if {![check $src msg]} { return -code error $msg }
79
80 DefBase $src
81 MakeTimeline [ScanArchives [files::find [RootPath]]]
82 MakeChangesets
83 ProcessBranches
84
85 return [MakeWorkspace]
86 }
87
88 proc ::vc::cvs::ws::done {} {
89 variable workspace
90 file delete -force $workspace
91 return
92 }
93
94 proc ::vc::cvs::ws::foreach {cv script} {
95 variable importable
96 upvar 1 $cv c
97
98 ::foreach c [lsort -integer -increasing $importable] {
99 set code [catch {uplevel 1 $script} res]
100
101 # 0 - ok, 1 - error, 2 - return, 3 - break, 4 - continue
102 switch -- $code {
103 0 {}
104 1 { return -errorcode $::errorCode -errorinfo $::errorInfo -code error $res }
105 2 {}
106 3 { return }
107 4 {}
108 default { return -code $code $result }
109 }
110 }
111 return
112 }
113
114 proc ::vc::cvs::ws::ncsets {args} {
115 return [csets::num]
116 }
117
118 proc ::vc::cvs::ws::nimportable {args} {
119 variable importable
120 return [llength $importable]
121 }
122
123 proc ::vc::cvs::ws::isadmin {path} {
124 # Check if path is a CVS admin file.
125 if {[string match CVS/* $path]} {return 1}
126 if {[string match */CVS/* $path]} {return 1}
127 return 0
128 }
129
130 proc ::vc::cvs::ws::parentOf {id} { csets::parentOf $id }
131
132 proc ::vc::cvs::ws::checkout {id} {
133 variable workspace
134 cd $workspace
135
136 # TODO: Hide the direct access to the data structures behind
137 # TODO: accessors for date, cmsg, removed, added, changed, and
138 # TODO: author
139 array set cs [csets::get $id]
140
141 write 1 cvs "@ $cs(date)"
142 ::foreach l [split [string trim $cs(cmsg)] \n] {
143 write 1 cvs "| $l"
144 }
145
146 ::foreach {f r} $cs(removed) { write 2 cvs "R $f $r" ; Remove $f $r }
147 ::foreach {f r} $cs(added) { write 2 cvs "A $f $r" ; Checkout $f $r }
148 ::foreach {f r} $cs(changed) { write 2 cvs "M $f $r" ; Checkout $f $r }
149
150 # Provide metadata about the changeset the backend may wish to have
151 return [list $cs(author) $cs(date) $cs(cmsg)]
152 }
153
154 # -----------------------------------------------------------------------------
155 # Internals
156
157 proc ::vc::cvs::ws::DefBase {path} {
158 variable project
159 variable base
160
161 set base $path
162
163 write 0 cvs "Base: $base"
164 if {$project eq ""} {
165 write 0 cvs "Project: <ALL>"
166 } else {
167 write 0 cvs "Project: $project"
168 }
169 return
170 }
171
172 proc ::vc::cvs::ws::RootPath {} {
173 variable project
174 variable base
175
176 if {$project eq ""} {
177 return $base
178 } else {
179 return $base/$project
180 }
181 }
182
183 proc ::vc::cvs::ws::ScanArchives {files} {
184 write 0 cvs "Scanning archives ..."
185
186 set d [RootPath]
187 set r {}
188 set n 0
189
190 ::foreach {rcs f} $files {
191 write 1 cvs "Archive $rcs"
192 # Get the meta data we need (revisions, timeline, messages).
193 lappend r $f [process $d/$rcs]
194 incr n
195 }
196
197 write 0 cvs "Processed [NSIPL $n file]"
198 return $r
199 }
200
201 proc ::vc::cvs::ws::MakeTimeline {meta} {
202 write 0 cvs "Generating coalesced timeline ..."
203
204 set n 0
205 ::foreach {f meta} $meta {
206 array set md $meta
207 array set date $md(date)
208 array set auth $md(author)
209 array set cmsg $md(commit)
210 array set stat $md(state)
211
212 ::foreach rev [lsort -dict [array names date]] {
213 set operation [Operation $rev $stat($rev)]
214 NoteDeadRoots $f $rev $operation
215 timeline::add $date($rev) $f $rev $operation $auth($rev) #B Extend branch managementve $f $r }
216 ::foreach {f r} $cs(added) { write 2 cvs "A $f $r" ; Checkout $f $r }
217 ::foreach {f r} $cs(changed) { write 2 cvs "M $f $r" ; Checkout $f $r }
218
219 # Provide metadata about the changeset the backend may wish to have
220 return [list $cs(author) $cs(date) $cs(cmsg)]
221 }
222
223 # -----------------------------------------------------------------------------
224 # Internals
225
226 proc ::vc::cvs::ws::DefBase {path} {
227 variable project
228 variable base
229
230 set base $path
231
232 write 0 cvs "Base: $base"
233 if {$project eq ""} {
234 write 0 cvs "Project: <ALL>"
235 } else {
236 write 0 cvs "Project: $project"
237 }
238 return
239 }
240
241 proc ::vc::cvs::ws::RootPath {vs::ws::RootPath {} {
242
243
244 if {$project eq ""} {es} {
245 write 0 cvs "Scanning arc cvs "Scanning archives ..."
246
247 set d [RootPath]
248 set r {}
249 set n 0
250
251 ::foreach {rcs f} $files {
252 write 1 cvs "Archive $rcs"
253 # Get the meta data we need (revisions, timeline, messages).
254 lappend r $f [process $d/$rcs]
255 incr n
256 }
257
258 write 0 cvs "Processed [NSIPL $n file]"
259 return $r
260 }
261
262 proc ::vc::cvs::ws::MakeTimeline {meta} {
263 write 0 cvs "Generating coalesced timeline ..."
264
265 set n 0
266 ::foreach {f meta} $meta {
267 array set md $meta
268 array set date $md(date)
269 array set auth $md(author)
270 array set cmsg $md(commit)
271 array set stat $md(state)
272
273 ::foreach rev [lsort -dict [array names date]] {
274 set operation [Operation $rev $stat($rev)]
275 NoteDeadRoots $f $rev $operation
276 timeline::add $date($rev) $f $rev $operation $auth($rev) $cmsg($rev)
277 incr n
278 }
279
280 if {[info exists md(symbol)]} {
281 branch::def $f date $md(symbol)
282 }
283
284 unset md
285 unset date
286 unset auth
287 unset cmsg
288 unset stat
289 }
290
291 write 0 cvs "Timeline has [NSIPL $n entry entries]"
292 return
293 }
294
295 proc ::vc::cvs::ws::NoteDeadRoots {f rev operation} {
296 # A dead-first revision is rev 1.1 with op R. For an example see
297 # the file memchan/DEPENDENCIES. Such a file seems to exist only!
298 # on its branch. The branches information is set on the revision
299 # (extend rcsparser!), symbols has a tag, refering to a branch,
300 # possibly magic.
301
302 if {($rev eq "1.1") && ($operation eq "R")} {
303 write 2 cvs "Dead root revision: $f"
304 }
305 return
306 }
307
308 proc ::vc::cvs::ws::Operation {rev state} {
309 if {$state eq "dead"} {return "R"} ; # Removed
310 if {$rev eq "1.1"} {return "A"} ; # Added
311 if {[string match *.1.1 $rev]} {return "A"} ; # Added on a branch
312 return "M" ; # Modified
313 }
314
315 proc ::vc::cvs::ws::MakeChangesets {} {
316 write 0 cvs "Generating changesets from timeline"
317
318 csets::init
319 timeline::foreach date file revision operation author cmsg {
320 csets::add $date $file $revision $operation $author $cmsg
321 }
322 csets::done
323
324 write 0 cvs "Found [NSIPL [csets::nchangesetsength $cslist] changesets"]"
325
326 set base [lindex $cslist 0]
327 set cslist [the trunk
328 ### ### ### ######### ######### #########
329 ## Dump data of the unprocessing changeset
330
331 puts /${base}/_________________ged, and
332 # TODO: author
333 base]
334 parray cs
335
336 # Which branch does base belong to?
337 # - It has to be the base of an unprocessed branch!
338 # Otherwise it would have been on either the trunk
339 # or an already processed branch.
340 # Where is its root changeset ?
341 # - The root has to come before the base, it has already
342 # been processed => Smaller id, older in time.
343 # - Based on the files changed/removed by the base, and their
344 # versions we know the root versions of these files, and we
345 # can determine the changesets they are in => Intersection
346 # plus cap from previous contraint gives us the possibl# ### ### ### ######### ######### #########
347 exit
348
349 set tag [FindBranch $base ..]
350 set rt n [csets::num]base $root
351
352 ets"
353
354 set remaind 0
355 set n [cse set n [csets::num]
356 set parent {}
357
358 for {set c 0} {$c < $n} {incr c} {
359 if {[csets::isTrunk $c]} {
360 csets::setParentOf #
361 }
362
363 proc ::vc::cvs::ws::Ma write 0 cvs "Found [NSIPL $t {trunk changeset}], [NSIPL [llength $remainder] {branch changeset}]#TBD
364 #... FindBranch
365 #.
366
367 proc ::vc::cvs::ws::ProcessBranch {cslist} {
368 write 0 cvs "Processing the remaining [SIPL [llength $cslist] changeset "[llength $cslist] changesets"]"
369
370 set base [lindex $cslist 0]
371 set cslist [lrange $cslist 1 end]
372
373 csets::DUMP $base
374
375 # Which branch does base belong to?
376 # - It has to be the base of an unprocessed branch!
377 # Otherwise it would have been on either the trunk
378 # or an already processed branch.
379 # Where is its root changeset ?
380 # - The root has to come before the base, it has already
381 # been processed => Smaller id, older in time.
382 # - Based on the files changed/removed by the base, and their
383 # versions we know the root versions of these files, and we
384 # can determine the changesets they are in => Intersection
385 # plus cap from previous contraint gives us the possible
386 # candidates.
387
388 write 4 cvs "Branch base $base"
389
390 ::foreach {tag rootsig} [branch::find [csets::get $base]] break
391
392 write 4 cvs "Branch tag $tag"
393 write 4 cvs "Root sig $rootsig"
394
395 set root [sig::find $base $rootsig]
396
397 write 4 cvs "Branch root $root"
398
399 write 0 cvs "Changeset $base, starting branch \"$tag\", rooted at $root"
400 csets::setParentOf $base $root
401
402 set remainder {}
403 set t 1
404
405 ::foreach c $cslist {
406 #csets::DUMP $c
407 if {[csets::sameBranch $c $base $tag]} {
408 csets::setParentOf $c $base
409 set base $c
410 incr t
411 lappend importable $c
412 } else {
413 lappend remainder $c
414 }
415 }
416
417 write 0 cvs "Found [NSIPL $t "$tag changeset"], [NSIPL [llength $remainder] changeset] outside"
418 return $remainder
419 }
420
421 proc ::vc::cvs::ws::Checkout {f r} {
422 variable base
423 variable project
424
425 # Added or modified, put the requested version of the file into
426 # the workspace.
427
428 if {$project ne ""} {set f $project/$f}
429 if {[catch {
430 dova -d $base co -r $r $f
431 } msg]} {
432 if {[string match {*invalid change text*} $msg]} {
433
434 # The archive of the file is corrupted and the chosen
435 # version not accessible due to that. We report the
436 # problem, but otherwise ignore it. As a consequence the
437 # destination repository will not contain the full history
438 # of the named file. By ignoring the problem we however
439 # get as much as is possible.
440
441 trouble::ad[NSIPL [llength $remainder] {branch changeset}]"
442 return $remainder
443 }
444
445 proc ::vc::cvs::ws::ProcessBranch {cslist} {
446 write 0 cvs "Processing the remaining [SIPL [llength $cslist] changeset "[llength $cslist] changesets"]"
447
448 set base [lindex $cslist 0]
449 set cslist [lran
--- a/tools/lib/cvs.tcl
+++ b/tools/lib/cvs.tcl
@@ -1,449 +0,0 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
D tools/lib/cvs_cmd.tcl
-49
--- a/tools/lib/cvs_cmd.tcl
+++ b/tools/lib/cvs_cmd.tcl
@@ -1,49 +0,0 @@
1
-# -----------------------------------------------------------------------------
2
-# Access to the external cvs command.
3
-
4
-# -----------------------------------------------------------------------------
5
-# Requirements
6
-
7
-package require Tcl 8.4
8
-namespace eval ::vc::cvs::cmd {}
9
-
10
-# -----------------------------------------------------------------------------
11
-# API
12
-
13
-# vc::cvs::cmd::dova word... - Run a cvs command specified as var args.
14
-# vc::cvs::cmd::do words - Run a cvs command specified as a list.
15
-
16
-# -----------------------------------------------------------------------------
17
-# API Implementation
18
-
19
-proc ::vc::cvs::cmd::dova {args} {do $args}
20
-
21
-proc ::vc::cvs::cmd::do {words} {
22
- variable cmd
23
- if {![llength $words]} {
24
- return -code error "Empty cvs command"
25
- }
26
- # 8.5: exec $cmd {*}$words
27
- return [eval [linsert $words 0 exec $cmd]]
28
-}
29
-
30
-# -----------------------------------------------------------------------------
31
-# Internals.
32
-
33
-namespace eval ::vc::cvs::cmd {
34
- # Locate external cvs application.
35
- variable cmd [auto_execok cvs]
36
-
37
- # Bail out if not found.
38
- if {![llength $::vc::cvs::cmd::cmd]} {
39
- return -code error "Cvs application not found."
40
- }
41
-
42
- namespace export do dova
43
-}
44
-
45
-# -----------------------------------------------------------------------------
46
-# Ready
47
-
48
-package provide vc::cvs::cmd 1.0
49
-return
--- a/tools/lib/cvs_cmd.tcl
+++ b/tools/lib/cvs_cmd.tcl
@@ -1,49 +0,0 @@
1 # -----------------------------------------------------------------------------
2 # Access to the external cvs command.
3
4 # -----------------------------------------------------------------------------
5 # Requirements
6
7 package require Tcl 8.4
8 namespace eval ::vc::cvs::cmd {}
9
10 # -----------------------------------------------------------------------------
11 # API
12
13 # vc::cvs::cmd::dova word... - Run a cvs command specified as var args.
14 # vc::cvs::cmd::do words - Run a cvs command specified as a list.
15
16 # -----------------------------------------------------------------------------
17 # API Implementation
18
19 proc ::vc::cvs::cmd::dova {args} {do $args}
20
21 proc ::vc::cvs::cmd::do {words} {
22 variable cmd
23 if {![llength $words]} {
24 return -code error "Empty cvs command"
25 }
26 # 8.5: exec $cmd {*}$words
27 return [eval [linsert $words 0 exec $cmd]]
28 }
29
30 # -----------------------------------------------------------------------------
31 # Internals.
32
33 namespace eval ::vc::cvs::cmd {
34 # Locate external cvs application.
35 variable cmd [auto_execok cvs]
36
37 # Bail out if not found.
38 if {![llength $::vc::cvs::cmd::cmd]} {
39 return -code error "Cvs application not found."
40 }
41
42 namespace export do dova
43 }
44
45 # -----------------------------------------------------------------------------
46 # Ready
47
48 package provide vc::cvs::cmd 1.0
49 return
--- a/tools/lib/cvs_cmd.tcl
+++ b/tools/lib/cvs_cmd.tcl
@@ -1,49 +0,0 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
D tools/lib/cvs_csets.tcl
-159
--- a/tools/lib/cvs_csets.tcl
+++ b/tools/lib/cvs_csets.tcl
@@ -1,159 +0,0 @@
1
-# -----------------------------------------------------------------------------
2
-# Repository management (CVS), Changeset grouping and storage.
3
-
4
-# -----------------------------------------------------------------------------
5
-# Requirements
6
-
7
-package require Tcl 8.4
8
-
9
-namespace eval ::vc::
10
-# -----------------------------------------------------------------------------
11
-# API---------------------
12
-# API
13
-
14
-# vc::cvs::ws::csets::init - Initialize accumulator
15
-# vc::cvs::ws::csets::add - Add timeline entry to accumulor, may generate new cset
16
-# vc::cvs::ws::csets::done - Complete cset generation.
17
-#
18
-# vc::cvs::ws::csets::get id - Get data of a cset.
19
-# vc::cvs::ws::csets::num - Get number of csets.
20
-
21
-# -----------------------------------------------------------------------------
22
-# API Implementation
23
-
24
-proc ::vc::cvs::ws::csets::init {} {
25
- variable ncs 0
26
- Current::Clear
27
- return
28
-}
29
-
30
-proc ::vc::cvs::ws::csets::add {date file revision operation author cmsg} {
31
- if {![Current::Empty] && [Current::New $file $revision $author $cmsg]} {
32
- Save [Current::Complete]
33
- }
34
- Current::Add $date $file $revision $operation $author $cmsg
35
- return
36
-}
37
-
38
-proc ::vc::cvs::ws::csets::done {} {
39
- if {![Current::Empty]} {
40
- Save [Current::Complete]
41
- }
42
- return
43
-}
44
-
45
-proc ::vc::cvs::ws::csets::getproc ::vc::cvs::ws::csets::num {# -------------------------} {
46
- variable csets
47
- return [array size csets]
48
-}
49
-
50
-proc ::vc::cvs::ws::csets::isTrunk {id} {
51
- variable csets
52
- array set cs $csets($id)
53
- return [expr {$cs(lastd) == 2}]
54
-}
55
-
56
-proc ::vc::cvs::ws::csets::setParentOf {id parent} {
57
- variable csets
58
- lappend --------------parentOf {id# --------------- csets
59
- array set cs $csets($id)
60
- return $cs(parent)
61
-}
62
-
63
- Clear
64
- return $res
65
-}
66
-
67
-# -------------------------------------------------------------::ws::csets::get id - Get data of a cset.
68
-# vc::cvs::ws::csets::num - Get number of csets.
69
-
70
-# -----------------------------------------------------------------------------
71
-# API Implementation
72
-
73
-proc ::vc::cvs::ws::csets::init {} {
74
- variable ncs 0
75
- Current::Clear
76
- return
77
-}
78
-
79
-proc ::vc::cvs::ws::csets::add {date file revision operation author cmsg} {
80
- if {![Current::Empty] && [Current::New $file $revision $author $cmsg]} {
81
- Save [Current::Complete]
82
- }
83
- Current::Add $date $file $revision $operation $author $cmsg
84
- return
85
-}
86
-
87
-proc ::vc::cvs::ws::csets::done {} {
88
- if {![Current::Empty]} {
89
- Save [Current::Complete]
90
- }
91
- return
92
-}
93
-
94
-proc ::vc::cvs::ws::csets::get {id} {
95
- variable csets
96
- return $csets($id)
97
-}
98
-
99
-
100
-proc ::vc::cvs::ws::csets::DUMP {id} {
101
- puts /${id}/_________________
102
- array set cs [get $id]
103
- parray cs
104
- return
105
-}
106
-
107
-proc ::vc::cvs::ws::csets::num {} {
108
- variable csets
109
- return [array size csets]
110
-}
111
-
112
-proc ::vc::cvs::ws::csets::isTrunk {id} {
113
- variable csets
114
- array set cs $csets($id)
115
- return [expr {$cs(lastd) == 2}]
116
-}
117
-
118
-proc ::vc::cvs::ws::csets::setParentOf {id parent} {
119
- variable csets
120
- lappend csets($id) parent $parent
121
-
122
- array set cs $csets($id)
123
- sig::def $id $parent $cs(added) $cs(changed) $cs(removed)
124
- return
125
-}
126
-
127
-proc ::vc::cvs::ws::csets::parentOf {id} {
128
- variable csets
129
- array set cs $csets($id)
130
- return $cs(parent)
131
-}
132
-
133
-proc ::vc::cvs::ws::csets::sameBranch {id parent tag} {
134
- variable csets
135
- array set cs $csets($id)
136
- return [sig::next $parent $cs(added) $cs(changed) $cs(removed) $tag $cs(date)]
137
-}
138
-
139
-# -----------------------------------------------------------------------------
140
-# Internal helper commands: Changeset inspection and construction.
141
-
142
-proc ::vc::cvs::ws::csets::Save {data} {
143
- variable csets
144
- variable ncs
145
-
146
- set csets($ncs) $data
147
- incr ncs
148
- return
149
-}
150
-
151
-proc ::vc::cvs::ws::csets::Current::Clear {} {
152
- variable start {} ; # date
153
-}
154
-
155
-# -----------------------------------------------------------------------------
156
-# Ready
157
-
158
-package provide vc::cvs::ws::csets 1.0
159
-return
--- a/tools/lib/cvs_csets.tcl
+++ b/tools/lib/cvs_csets.tcl
@@ -1,159 +0,0 @@
1 # -----------------------------------------------------------------------------
2 # Repository management (CVS), Changeset grouping and storage.
3
4 # -----------------------------------------------------------------------------
5 # Requirements
6
7 package require Tcl 8.4
8
9 namespace eval ::vc::
10 # -----------------------------------------------------------------------------
11 # API---------------------
12 # API
13
14 # vc::cvs::ws::csets::init - Initialize accumulator
15 # vc::cvs::ws::csets::add - Add timeline entry to accumulor, may generate new cset
16 # vc::cvs::ws::csets::done - Complete cset generation.
17 #
18 # vc::cvs::ws::csets::get id - Get data of a cset.
19 # vc::cvs::ws::csets::num - Get number of csets.
20
21 # -----------------------------------------------------------------------------
22 # API Implementation
23
24 proc ::vc::cvs::ws::csets::init {} {
25 variable ncs 0
26 Current::Clear
27 return
28 }
29
30 proc ::vc::cvs::ws::csets::add {date file revision operation author cmsg} {
31 if {![Current::Empty] && [Current::New $file $revision $author $cmsg]} {
32 Save [Current::Complete]
33 }
34 Current::Add $date $file $revision $operation $author $cmsg
35 return
36 }
37
38 proc ::vc::cvs::ws::csets::done {} {
39 if {![Current::Empty]} {
40 Save [Current::Complete]
41 }
42 return
43 }
44
45 proc ::vc::cvs::ws::csets::getproc ::vc::cvs::ws::csets::num {# -------------------------} {
46 variable csets
47 return [array size csets]
48 }
49
50 proc ::vc::cvs::ws::csets::isTrunk {id} {
51 variable csets
52 array set cs $csets($id)
53 return [expr {$cs(lastd) == 2}]
54 }
55
56 proc ::vc::cvs::ws::csets::setParentOf {id parent} {
57 variable csets
58 lappend --------------parentOf {id# --------------- csets
59 array set cs $csets($id)
60 return $cs(parent)
61 }
62
63 Clear
64 return $res
65 }
66
67 # -------------------------------------------------------------::ws::csets::get id - Get data of a cset.
68 # vc::cvs::ws::csets::num - Get number of csets.
69
70 # -----------------------------------------------------------------------------
71 # API Implementation
72
73 proc ::vc::cvs::ws::csets::init {} {
74 variable ncs 0
75 Current::Clear
76 return
77 }
78
79 proc ::vc::cvs::ws::csets::add {date file revision operation author cmsg} {
80 if {![Current::Empty] && [Current::New $file $revision $author $cmsg]} {
81 Save [Current::Complete]
82 }
83 Current::Add $date $file $revision $operation $author $cmsg
84 return
85 }
86
87 proc ::vc::cvs::ws::csets::done {} {
88 if {![Current::Empty]} {
89 Save [Current::Complete]
90 }
91 return
92 }
93
94 proc ::vc::cvs::ws::csets::get {id} {
95 variable csets
96 return $csets($id)
97 }
98
99
100 proc ::vc::cvs::ws::csets::DUMP {id} {
101 puts /${id}/_________________
102 array set cs [get $id]
103 parray cs
104 return
105 }
106
107 proc ::vc::cvs::ws::csets::num {} {
108 variable csets
109 return [array size csets]
110 }
111
112 proc ::vc::cvs::ws::csets::isTrunk {id} {
113 variable csets
114 array set cs $csets($id)
115 return [expr {$cs(lastd) == 2}]
116 }
117
118 proc ::vc::cvs::ws::csets::setParentOf {id parent} {
119 variable csets
120 lappend csets($id) parent $parent
121
122 array set cs $csets($id)
123 sig::def $id $parent $cs(added) $cs(changed) $cs(removed)
124 return
125 }
126
127 proc ::vc::cvs::ws::csets::parentOf {id} {
128 variable csets
129 array set cs $csets($id)
130 return $cs(parent)
131 }
132
133 proc ::vc::cvs::ws::csets::sameBranch {id parent tag} {
134 variable csets
135 array set cs $csets($id)
136 return [sig::next $parent $cs(added) $cs(changed) $cs(removed) $tag $cs(date)]
137 }
138
139 # -----------------------------------------------------------------------------
140 # Internal helper commands: Changeset inspection and construction.
141
142 proc ::vc::cvs::ws::csets::Save {data} {
143 variable csets
144 variable ncs
145
146 set csets($ncs) $data
147 incr ncs
148 return
149 }
150
151 proc ::vc::cvs::ws::csets::Current::Clear {} {
152 variable start {} ; # date
153 }
154
155 # -----------------------------------------------------------------------------
156 # Ready
157
158 package provide vc::cvs::ws::csets 1.0
159 return
--- a/tools/lib/cvs_csets.tcl
+++ b/tools/lib/cvs_csets.tcl
@@ -1,159 +0,0 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
D tools/lib/cvs_files.tcl
-113
--- a/tools/lib/cvs_files.tcl
+++ b/tools/lib/cvs_files.tcl
@@ -1,113 +0,0 @@
1
-# -----------------------------------------------------------------------------
2
-# Repository management (CVS), archive files
3
-
4
-# -----------------------------------------------------------------------------
5
-# Requirements
6
-
7
-package require Tcl 8.4
8
-package require fileutil::traverse ; # Tcllib (traverse directory hierarchy)
9
-package require vc::tools::log ; # User feedback
10
-
11
-namespace eval ::vc::cvs::ws::files {
12
- namespace import ::vc::tools::log::write
13
- namespace import ::vc::tools::log::progress
14
-}
15
-
16
-# -----------------------------------------------------------------------------
17
-# API
18
-
19
-# vc::cvs::ws::files::find path - Find all RCS archives under the path.
20
-
21
-# -----------------------------------------------------------------------------
22
-# API Implementation
23
-
24
-proc ::vc::cvs::ws::files::find {path} {
25
-
26
- write 0 cvs "Scanning directory hierarchy $path ..."
27
-
28
- set t [fileutil::traverse %AUTO% $path]
29
- set n 0
30
- set r {}
31
-
32
- $t foreach rcs {
33
- if {![string match *,v $rcs]} continue
34
-
35
- # Now make rcs is relative to the base/project
36
- set rcs [fileutil::stripPath $path $rcs]
37
-
38
- if {[string match CVSROOT/* $rcs]} {
39
- write 2 cvs "Ignoring administrative file: $rcs"
40
- continue
41
- }
42
-
43
- set f [UserFile $rcs isattic]
44
-
45
- if {$isattic && [file exists $path/$f,v]} {
46
- # We have a regular archive and an Attic archive refering
47
- # to the same user visible file. Ignore the file in the
48
- # Attic.
49
-
50
- write 2 cvs "Ignoring superceded attic: $rcs"
51
-
52
- # TODO/CHECK. My method of co'ing exact file revisions per
53
- # the info in the collected csets has the flaw that I may
54
- # have to know exactly when what archive file to use, see
55
- # above. It might be better to use the info only to gather
56
- # when csets begin and end, and then to co complete slices
57
- # per exact timestamp (-D) instead of file revisions
58
- # (-r). The flaw in that is that csets can occur in the
59
- # same second (trf, memchan - check for examples). For
60
- # that exact checkout may be needed to recreate exact
61
- # sequence of changes. Grr. Six of one ...
62
-
63
- continue
64
- }
65
-
66
- lappend r $rcs $f
67
- incr n
68
- progress 0 cvs $n {}
69
- }
70
-
71
- $t destroy
72
- return $r
73
-}
74
-
75
-# -----------------------------------------------------------------------------
76
-# Internals
77
-
78
-proc ::vc::cvs::ws::files::UserFile {rcs iav} {
79
- upvar 1 $iav isattic
80
-
81
- # Derive the regular path from the rcs path. Meaning: Chop of the
82
- # ",v" suffix, and remove a possible "Attic".
83
-
84
- set f [string range $rcs 0 end-2]
85
-
86
- if {"Attic" eq [lindex [file split $rcs] end-1]} {
87
-
88
- # The construction below ensures that Attic/X maps to X
89
- # instead of ./X. Otherwise, Y/Attic/X maps to Y/X.
90
-
91
- set fx [file dirname [file dirname $f]]
92
- set f [file tail $f]
93
- if {$fx ne "."} { set f [file join $fx $f] }
94
-
95
- set isattic 1
96
- } else {
97
- set isattic 0
98
- }
99
-
100
- return $f
101
-}
102
-
103
-# -----------------------------------------------------------------------------
104
-
105
-namespace eval ::vc::cvs::ws::files {
106
- namespace export find
107
-}
108
-
109
-# -----------------------------------------------------------------------------
110
-# Ready
111
-
112
-package provide vc::cvs::ws::files 1.0
113
-return
--- a/tools/lib/cvs_files.tcl
+++ b/tools/lib/cvs_files.tcl
@@ -1,113 +0,0 @@
1 # -----------------------------------------------------------------------------
2 # Repository management (CVS), archive files
3
4 # -----------------------------------------------------------------------------
5 # Requirements
6
7 package require Tcl 8.4
8 package require fileutil::traverse ; # Tcllib (traverse directory hierarchy)
9 package require vc::tools::log ; # User feedback
10
11 namespace eval ::vc::cvs::ws::files {
12 namespace import ::vc::tools::log::write
13 namespace import ::vc::tools::log::progress
14 }
15
16 # -----------------------------------------------------------------------------
17 # API
18
19 # vc::cvs::ws::files::find path - Find all RCS archives under the path.
20
21 # -----------------------------------------------------------------------------
22 # API Implementation
23
24 proc ::vc::cvs::ws::files::find {path} {
25
26 write 0 cvs "Scanning directory hierarchy $path ..."
27
28 set t [fileutil::traverse %AUTO% $path]
29 set n 0
30 set r {}
31
32 $t foreach rcs {
33 if {![string match *,v $rcs]} continue
34
35 # Now make rcs is relative to the base/project
36 set rcs [fileutil::stripPath $path $rcs]
37
38 if {[string match CVSROOT/* $rcs]} {
39 write 2 cvs "Ignoring administrative file: $rcs"
40 continue
41 }
42
43 set f [UserFile $rcs isattic]
44
45 if {$isattic && [file exists $path/$f,v]} {
46 # We have a regular archive and an Attic archive refering
47 # to the same user visible file. Ignore the file in the
48 # Attic.
49
50 write 2 cvs "Ignoring superceded attic: $rcs"
51
52 # TODO/CHECK. My method of co'ing exact file revisions per
53 # the info in the collected csets has the flaw that I may
54 # have to know exactly when what archive file to use, see
55 # above. It might be better to use the info only to gather
56 # when csets begin and end, and then to co complete slices
57 # per exact timestamp (-D) instead of file revisions
58 # (-r). The flaw in that is that csets can occur in the
59 # same second (trf, memchan - check for examples). For
60 # that exact checkout may be needed to recreate exact
61 # sequence of changes. Grr. Six of one ...
62
63 continue
64 }
65
66 lappend r $rcs $f
67 incr n
68 progress 0 cvs $n {}
69 }
70
71 $t destroy
72 return $r
73 }
74
75 # -----------------------------------------------------------------------------
76 # Internals
77
78 proc ::vc::cvs::ws::files::UserFile {rcs iav} {
79 upvar 1 $iav isattic
80
81 # Derive the regular path from the rcs path. Meaning: Chop of the
82 # ",v" suffix, and remove a possible "Attic".
83
84 set f [string range $rcs 0 end-2]
85
86 if {"Attic" eq [lindex [file split $rcs] end-1]} {
87
88 # The construction below ensures that Attic/X maps to X
89 # instead of ./X. Otherwise, Y/Attic/X maps to Y/X.
90
91 set fx [file dirname [file dirname $f]]
92 set f [file tail $f]
93 if {$fx ne "."} { set f [file join $fx $f] }
94
95 set isattic 1
96 } else {
97 set isattic 0
98 }
99
100 return $f
101 }
102
103 # -----------------------------------------------------------------------------
104
105 namespace eval ::vc::cvs::ws::files {
106 namespace export find
107 }
108
109 # -----------------------------------------------------------------------------
110 # Ready
111
112 package provide vc::cvs::ws::files 1.0
113 return
--- a/tools/lib/cvs_files.tcl
+++ b/tools/lib/cvs_files.tcl
@@ -1,113 +0,0 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
D tools/lib/cvs_timeline.tcl
-87
--- a/tools/lib/cvs_timeline.tcl
+++ b/tools/lib/cvs_timeline.tcl
@@ -1,87 +0,0 @@
1
-# -----------------------------------------------------------------------------
2
-# Repository management (CVS), timeline of events.
3
-
4
-# -----------------------------------------------------------------------------
5
-# Requirements
6
-
7
-package require Tcl 8.4
8
-
9
-namespace eval ::vc::cvs::ws::timeline {}
10
-
11
-# -----------------------------------------------------------------------------
12
-# API
13
-
14
-# vc::cvs::ws::timeline::add date file revision operation author commit-msg
15
-# vc::cvs::ws::timeline::foreach date file revision operation author commit-msg script
16
-
17
-# Add entries to the timeline, and iterate over the timeline in proper order.
18
-
19
-# -----------------------------------------------------------------------------
20
-# API Implementation
21
-
22
-proc ::vc::cvs::ws::timeline::add {date file revision operation author cmsg} {
23
- variable timeline
24
- lappend timeline($date) [list $file $revision $operation $author $cmsg]
25
- return
26
-}
27
-
28
-proc ::vc::cvs::ws::timeline::foreach {dv fv rv ov av cv script} {
29
- upvar 1 $dv date $fv file $rv revision $ov operation $av author $cv cmsg
30
- variable timeline
31
-
32
- ::foreach date [lsort -dict [array names timeline]] {
33
- # file revision operation author commitmsg
34
- # 0 1 2 3 4/end
35
- # d e b c a
36
-
37
- set entries [lsort -index 1 \
38
- [lsort -index 0 \
39
- [lsort -index 3 \
40
- [lsort -index 2 \
41
- [lsort -index end \
42
- $timeline($date)]]]]]
43
- #puts [join $entries \n]
44
-
45
- ::foreach entry $entries {
46
- lassign $entry file revision operation author cmsg
47
- set code [catch {uplevel 1 $script} res]
48
-
49
- # 0 - ok, 1 - error, 2 - return, 3 - break, 4 - continue
50
- switch -- $code {
51
- 0 {}
52
- 1 { return -errorcode $::errorCode -errorinfo $::errorInfo -code error $res }
53
- 2 {}
54
- 3 { return }
55
- 4 {}
56
- default {
57
- return -code $code $result
58
- }
59
- }
60
- }
61
- }
62
- return
63
-}
64
-
65
-# -----------------------------------------------------------------------------
66
-# Internals
67
-
68
-proc ::vc::cvs::ws::timeline::lassign {l args} {
69
- ::foreach v $args {upvar 1 $v $v}
70
- ::foreach $args $l break
71
- return
72
-}
73
-
74
-namespace eval ::vc::cvs::ws::timeline {
75
- # Timeline: map (date -> list (file revision operation author commitmsg))
76
-
77
- variable timeline
78
- array set timeline {}
79
-
80
- namespace export add
81
-}
82
-
83
-# -----------------------------------------------------------------------------
84
-# Ready
85
-
86
-package provide vc::cvs::ws::timeline 1.0
87
-return
--- a/tools/lib/cvs_timeline.tcl
+++ b/tools/lib/cvs_timeline.tcl
@@ -1,87 +0,0 @@
1 # -----------------------------------------------------------------------------
2 # Repository management (CVS), timeline of events.
3
4 # -----------------------------------------------------------------------------
5 # Requirements
6
7 package require Tcl 8.4
8
9 namespace eval ::vc::cvs::ws::timeline {}
10
11 # -----------------------------------------------------------------------------
12 # API
13
14 # vc::cvs::ws::timeline::add date file revision operation author commit-msg
15 # vc::cvs::ws::timeline::foreach date file revision operation author commit-msg script
16
17 # Add entries to the timeline, and iterate over the timeline in proper order.
18
19 # -----------------------------------------------------------------------------
20 # API Implementation
21
22 proc ::vc::cvs::ws::timeline::add {date file revision operation author cmsg} {
23 variable timeline
24 lappend timeline($date) [list $file $revision $operation $author $cmsg]
25 return
26 }
27
28 proc ::vc::cvs::ws::timeline::foreach {dv fv rv ov av cv script} {
29 upvar 1 $dv date $fv file $rv revision $ov operation $av author $cv cmsg
30 variable timeline
31
32 ::foreach date [lsort -dict [array names timeline]] {
33 # file revision operation author commitmsg
34 # 0 1 2 3 4/end
35 # d e b c a
36
37 set entries [lsort -index 1 \
38 [lsort -index 0 \
39 [lsort -index 3 \
40 [lsort -index 2 \
41 [lsort -index end \
42 $timeline($date)]]]]]
43 #puts [join $entries \n]
44
45 ::foreach entry $entries {
46 lassign $entry file revision operation author cmsg
47 set code [catch {uplevel 1 $script} res]
48
49 # 0 - ok, 1 - error, 2 - return, 3 - break, 4 - continue
50 switch -- $code {
51 0 {}
52 1 { return -errorcode $::errorCode -errorinfo $::errorInfo -code error $res }
53 2 {}
54 3 { return }
55 4 {}
56 default {
57 return -code $code $result
58 }
59 }
60 }
61 }
62 return
63 }
64
65 # -----------------------------------------------------------------------------
66 # Internals
67
68 proc ::vc::cvs::ws::timeline::lassign {l args} {
69 ::foreach v $args {upvar 1 $v $v}
70 ::foreach $args $l break
71 return
72 }
73
74 namespace eval ::vc::cvs::ws::timeline {
75 # Timeline: map (date -> list (file revision operation author commitmsg))
76
77 variable timeline
78 array set timeline {}
79
80 namespace export add
81 }
82
83 # -----------------------------------------------------------------------------
84 # Ready
85
86 package provide vc::cvs::ws::timeline 1.0
87 return
--- a/tools/lib/cvs_timeline.tcl
+++ b/tools/lib/cvs_timeline.tcl
@@ -1,87 +0,0 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
D tools/lib/fossil.tcl
-231
--- a/tools/lib/fossil.tcl
+++ b/tools/lib/fossil.tcl
@@ -1,231 +0,0 @@
1
-# -----------------------------------------------------------------------------
2
-# Repository management (FOSSIL)
3
-
4
-# -----------------------------------------------------------------------------
5
-# Requirements
6
-
7
-package require Tcl 8.4
8
-package require vc::tools::log ; # User feedback
9
-package require vc::fossil::cmd ; # Access to fossil application.
10
-
11
-namespace eval ::vc::fossil::ws {
12
- vc::tools::log::system fossil
13
- namespace import ::vc::tools::log::write
14
- namespace import ::vc::fossil::cmd::do
15
- namespace import ::vc::fossil::cmd::dova
16
-}
17
-
18
-# -----------------------------------------------------------------------------
19
-# API
20
-
21
-# vc::fossil::ws::configure key value - Configure the subsystem.
22
-# vc::fossil::ws::begin src - Start new workspace for directory
23
-# vc::fossil::ws::done dst - Close workspace and copy to destination.
24
-# vc::fossil::ws::setup uuid - Move workspace to an older revision.
25
-# vc::fossil::ws::commit cset usr time msg - Look for changes and commit as new revision.
26
-
27
-# Configuration keys:
28
-#
29
-# -nosign bool default 0 (= sign imported changesets)
30
-# -breakat num default empty, no breakpoint.
31
-# Otherwise stop before committing the identified changeset.
32
-# -saveto path default empty, no saving.
33
-# Otherwise save the commit command to a file.
34
-# -appname string Default empty. Text to add to all commit messages.
35
-# -ignore cmdprefix Command to check if a file is relevant to the commit or not.
36
-# Signature: cmdprefix path -> bool; true => ignore.
37
-
38
-# -----------------------------------------------------------------------------
39
-# API Implementation
40
-
41
-proc ::vc::fossil::ws::configure {key value} {
42
- variable nosign
43
- variable breakat
44
- variable saveto
45
- variable appname
46
- variable ignore
47
-
48
- switch -exact -- $key {
49
- -appname { set appname $value }
50
- -breakat { set breakat $value }
51
- -ignore { set ignore $value }
52
- -nosign {
53
- if {![string is boolean -strict $value]} {
54
- return -code error "Expected boolean, got \"$value\""
55
- }
56
- set nosign $value
57
- }
58
- -saveto { set saveto $value }
59
- default {
60
- return -code error "Unknown switch $key, expected one of \
61
- -appname, -breakat, -ignore, -nosign, or -saveto"
62
- }
63
- }
64
- return
65
-}
66
-
67
-proc ::vc::fossil::ws::begin {origin} {
68
- variable base [file normalize $origin]
69
- variable rp [file normalize [fileutil::tempfile import2_fsl_rp_]]
70
-
71
- cd $origin
72
-
73
- dova new $rp ; # create and ...
74
- dova open $rp ; # ... connect
75
-
76
- write 0 fossil "Repository: $rp"
77
- return
78
-}
79
-
80
-proc ::vc::fossil::ws::done {destination} {
81
- variable rp
82
- file rename -force $rp $destination
83
- set rp {}
84
- return
85
-}
86
-
87
-proc ::vc::fossil::ws::setup {uuid} {
88
- variable lastuuid
89
- if {$uuid eq $lastuuid} return
90
- write 1 fossil "=> goto $uuid"
91
- dova update $uuid
92
- set lastuuid $uuid
93
- return
94
-}
95
-
96
-proc ::vc::fossil::ws::commit {cset user timestamp message} {
97
- variable lastuuid
98
- variable base
99
-
100
- cd $base
101
-
102
- # Commit the current state of the workspace. Scan for new and
103
- # removed files and issue the appropriate fossil add/rm commands
104
- # before actually comitting.
105
-
106
- HandleChanges added removed changed
107
-
108
- # Now commit, using the provided meta data, and capture the uuid
109
- # of the new baseline.
110
-
111
- set cmd [Command $cset [Message $user $timestamp $message]]
112
-
113
- if {[catch {
114
- do $cmd
115
- } line]} {
116
- if {![string match "*nothing has changed*" $line]} {
117
- return -code error $line
118
- }
119
-
120
- # 'Nothing changed' can happen for changesets containing only
121
- # dead-first revisions of one or more files. For fossil we
122
- # re-use the last baseline. TODO: Mark them as branchpoint,
123
- # and for what file.
124
-
125
- write 1 fossil "UNCHANGED, keeping last"
126
-
127
- return [list $lastuuid 0 0 0]
128
- }
129
-
130
- # Extract the uuid of the new revision.
131
- regsub -nocase -- {^\s*New_Version:\s*} [string trim $line] {} uuid
132
-
133
- set lastuuid $uuid
134
- return [list $uuid $added $removed $changed]
135
-}
136
-
137
-# -----------------------------------------------------------------------------
138
-# Internal helper commands, and data structures.
139
-
140
-proc ::vc::fossil::ws::HandleChanges {av rv cv} {
141
- upvar 1 $av added $rv removed $cv changed
142
-
143
- set added 0
144
- set removed 0
145
- set changed 0
146
-
147
- # Look for modified/removed files first, that way there won't be
148
- # any ADDED indicators. Nor REMOVED, only EDITED. Removed files
149
- # show up as EDITED while they are not registered as removed.
150
-
151
- foreach line [split [do changes] \n] {
152
- regsub {^\s*EDITED\s*} $line {} path
153
- if {[Ignore $path]} continue
154
-
155
- if {![file exists $path]} {
156
- dova rm $path
157
- incr removed
158
- write 2 fossil "- $path"
159
- } else {
160
- incr changed
161
- write 2 fossil "* $path"
162
- }
163
- }
164
-
165
- # Now look for unregistered added files.
166
-
167
- foreach path [split [do extra] \n] {
168
- if {[Ignore $path]} continue
169
- dova add $path
170
- incr added
171
- write 2 fossil "+ $path"
172
- }
173
-
174
- return
175
-}
176
-
177
-proc ::vc::fossil::ws::Message {user timestamp message} {
178
- variable appname
179
- set lines {}
180
- lappend lines "-- Originally by $user @ $timestamp"
181
- if {$appname ne ""} {
182
- lappend lines "-- Imported by $appname"
183
- }
184
- lappend lines [string trim $message]
185
- return [join $lines \n]
186
-}
187
-
188
-proc ::vc::fossil::ws::Command {cset message} {
189
- variable nosign
190
- variable saveto
191
- variable breakat
192
-
193
- set cmd [list commit -m $message]
194
-
195
- if {$nosign} { lappend cmd --nosign }
196
- if {$saveto ne ""} { fileutil::writeFile $saveto "$cmd\n" }
197
-
198
- if {$breakat eq $cset} {
199
- write 0 fossil Stopped.
200
- exit 0
201
- }
202
-
203
- return $cmd
204
-}
205
-
206
-proc ::vc::fossil::ws::Ignore {path} {
207
- variable ignore
208
- if {![llength $ignore]} {return 0}
209
- return [uplevel #0 [linsert $ignore end $path]]
210
-}
211
-
212
-namespace eval ::vc::fossil::ws {
213
- # Configuration settings.
214
- variable nosign 0 ; # Sign imported changesets
215
- variable breakat {} ; # Do not stop
216
- variable saveto {} ; # Do not save commit message
217
- variable appname {} ; # Name of importer application using the package.
218
- variable ignore {} ; # No files to ignore.
219
-
220
- variable base {} ; # Workspace directory
221
- variable rp {} ; # Repository the package works on.
222
- variable lastuuid {} ; # Uuid of last imported changeset.
223
-
224
- namespace export configure begin done setup commit
225
-}
226
-
227
-# -----------------------------------------------------------------------------
228
-# Ready
229
-
230
-package provide vc::fossil::ws 1.0
231
-return
--- a/tools/lib/fossil.tcl
+++ b/tools/lib/fossil.tcl
@@ -1,231 +0,0 @@
1 # -----------------------------------------------------------------------------
2 # Repository management (FOSSIL)
3
4 # -----------------------------------------------------------------------------
5 # Requirements
6
7 package require Tcl 8.4
8 package require vc::tools::log ; # User feedback
9 package require vc::fossil::cmd ; # Access to fossil application.
10
11 namespace eval ::vc::fossil::ws {
12 vc::tools::log::system fossil
13 namespace import ::vc::tools::log::write
14 namespace import ::vc::fossil::cmd::do
15 namespace import ::vc::fossil::cmd::dova
16 }
17
18 # -----------------------------------------------------------------------------
19 # API
20
21 # vc::fossil::ws::configure key value - Configure the subsystem.
22 # vc::fossil::ws::begin src - Start new workspace for directory
23 # vc::fossil::ws::done dst - Close workspace and copy to destination.
24 # vc::fossil::ws::setup uuid - Move workspace to an older revision.
25 # vc::fossil::ws::commit cset usr time msg - Look for changes and commit as new revision.
26
27 # Configuration keys:
28 #
29 # -nosign bool default 0 (= sign imported changesets)
30 # -breakat num default empty, no breakpoint.
31 # Otherwise stop before committing the identified changeset.
32 # -saveto path default empty, no saving.
33 # Otherwise save the commit command to a file.
34 # -appname string Default empty. Text to add to all commit messages.
35 # -ignore cmdprefix Command to check if a file is relevant to the commit or not.
36 # Signature: cmdprefix path -> bool; true => ignore.
37
38 # -----------------------------------------------------------------------------
39 # API Implementation
40
41 proc ::vc::fossil::ws::configure {key value} {
42 variable nosign
43 variable breakat
44 variable saveto
45 variable appname
46 variable ignore
47
48 switch -exact -- $key {
49 -appname { set appname $value }
50 -breakat { set breakat $value }
51 -ignore { set ignore $value }
52 -nosign {
53 if {![string is boolean -strict $value]} {
54 return -code error "Expected boolean, got \"$value\""
55 }
56 set nosign $value
57 }
58 -saveto { set saveto $value }
59 default {
60 return -code error "Unknown switch $key, expected one of \
61 -appname, -breakat, -ignore, -nosign, or -saveto"
62 }
63 }
64 return
65 }
66
67 proc ::vc::fossil::ws::begin {origin} {
68 variable base [file normalize $origin]
69 variable rp [file normalize [fileutil::tempfile import2_fsl_rp_]]
70
71 cd $origin
72
73 dova new $rp ; # create and ...
74 dova open $rp ; # ... connect
75
76 write 0 fossil "Repository: $rp"
77 return
78 }
79
80 proc ::vc::fossil::ws::done {destination} {
81 variable rp
82 file rename -force $rp $destination
83 set rp {}
84 return
85 }
86
87 proc ::vc::fossil::ws::setup {uuid} {
88 variable lastuuid
89 if {$uuid eq $lastuuid} return
90 write 1 fossil "=> goto $uuid"
91 dova update $uuid
92 set lastuuid $uuid
93 return
94 }
95
96 proc ::vc::fossil::ws::commit {cset user timestamp message} {
97 variable lastuuid
98 variable base
99
100 cd $base
101
102 # Commit the current state of the workspace. Scan for new and
103 # removed files and issue the appropriate fossil add/rm commands
104 # before actually comitting.
105
106 HandleChanges added removed changed
107
108 # Now commit, using the provided meta data, and capture the uuid
109 # of the new baseline.
110
111 set cmd [Command $cset [Message $user $timestamp $message]]
112
113 if {[catch {
114 do $cmd
115 } line]} {
116 if {![string match "*nothing has changed*" $line]} {
117 return -code error $line
118 }
119
120 # 'Nothing changed' can happen for changesets containing only
121 # dead-first revisions of one or more files. For fossil we
122 # re-use the last baseline. TODO: Mark them as branchpoint,
123 # and for what file.
124
125 write 1 fossil "UNCHANGED, keeping last"
126
127 return [list $lastuuid 0 0 0]
128 }
129
130 # Extract the uuid of the new revision.
131 regsub -nocase -- {^\s*New_Version:\s*} [string trim $line] {} uuid
132
133 set lastuuid $uuid
134 return [list $uuid $added $removed $changed]
135 }
136
137 # -----------------------------------------------------------------------------
138 # Internal helper commands, and data structures.
139
140 proc ::vc::fossil::ws::HandleChanges {av rv cv} {
141 upvar 1 $av added $rv removed $cv changed
142
143 set added 0
144 set removed 0
145 set changed 0
146
147 # Look for modified/removed files first, that way there won't be
148 # any ADDED indicators. Nor REMOVED, only EDITED. Removed files
149 # show up as EDITED while they are not registered as removed.
150
151 foreach line [split [do changes] \n] {
152 regsub {^\s*EDITED\s*} $line {} path
153 if {[Ignore $path]} continue
154
155 if {![file exists $path]} {
156 dova rm $path
157 incr removed
158 write 2 fossil "- $path"
159 } else {
160 incr changed
161 write 2 fossil "* $path"
162 }
163 }
164
165 # Now look for unregistered added files.
166
167 foreach path [split [do extra] \n] {
168 if {[Ignore $path]} continue
169 dova add $path
170 incr added
171 write 2 fossil "+ $path"
172 }
173
174 return
175 }
176
177 proc ::vc::fossil::ws::Message {user timestamp message} {
178 variable appname
179 set lines {}
180 lappend lines "-- Originally by $user @ $timestamp"
181 if {$appname ne ""} {
182 lappend lines "-- Imported by $appname"
183 }
184 lappend lines [string trim $message]
185 return [join $lines \n]
186 }
187
188 proc ::vc::fossil::ws::Command {cset message} {
189 variable nosign
190 variable saveto
191 variable breakat
192
193 set cmd [list commit -m $message]
194
195 if {$nosign} { lappend cmd --nosign }
196 if {$saveto ne ""} { fileutil::writeFile $saveto "$cmd\n" }
197
198 if {$breakat eq $cset} {
199 write 0 fossil Stopped.
200 exit 0
201 }
202
203 return $cmd
204 }
205
206 proc ::vc::fossil::ws::Ignore {path} {
207 variable ignore
208 if {![llength $ignore]} {return 0}
209 return [uplevel #0 [linsert $ignore end $path]]
210 }
211
212 namespace eval ::vc::fossil::ws {
213 # Configuration settings.
214 variable nosign 0 ; # Sign imported changesets
215 variable breakat {} ; # Do not stop
216 variable saveto {} ; # Do not save commit message
217 variable appname {} ; # Name of importer application using the package.
218 variable ignore {} ; # No files to ignore.
219
220 variable base {} ; # Workspace directory
221 variable rp {} ; # Repository the package works on.
222 variable lastuuid {} ; # Uuid of last imported changeset.
223
224 namespace export configure begin done setup commit
225 }
226
227 # -----------------------------------------------------------------------------
228 # Ready
229
230 package provide vc::fossil::ws 1.0
231 return
--- a/tools/lib/fossil.tcl
+++ b/tools/lib/fossil.tcl
@@ -1,231 +0,0 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
D tools/lib/fossil_cmd.tcl
-49
--- a/tools/lib/fossil_cmd.tcl
+++ b/tools/lib/fossil_cmd.tcl
@@ -1,49 +0,0 @@
1
-# -----------------------------------------------------------------------------
2
-# Access to the external fossil command.
3
-
4
-# -----------------------------------------------------------------------------
5
-# Requirements
6
-
7
-package require Tcl 8.4
8
-namespace eval ::vc::fossil::cmd {}
9
-
10
-# -----------------------------------------------------------------------------
11
-# API
12
-
13
-# vc::fossil::cmd::dova word... - Run a fossil command specified as var args
14
-# vc::fossil::cmd::do words - Run a fossil command specified in a list.
15
-
16
-# -----------------------------------------------------------------------------
17
-# API Implementation
18
-
19
-proc ::vc::fossil::cmd::dova {args} {do $args}
20
-
21
-proc ::vc::fossil::cmd::do {words} {
22
- variable cmd
23
- if {![llength $words]} {
24
- return -code error "Empty fossil command"
25
- }
26
- # 8.5: exec $cmd {*}$words
27
- return [eval [linsert $words 0 exec $cmd]]
28
-}
29
-
30
-# -----------------------------------------------------------------------------
31
-# Internals.
32
-
33
-namespace eval ::vc::fossil::cmd {
34
- # Locate external fossil application.
35
- variable cmd [auto_execok fossil]
36
-
37
- # Bail out if not found.
38
- if {![llength $::vc::fossil::cmd::cmd]} {
39
- return -code error "Fossil application not found."
40
- }
41
-
42
- namespace export do dova
43
-}
44
-
45
-# -----------------------------------------------------------------------------
46
-# Ready
47
-
48
-package provide vc::fossil::cmd 1.0
49
-return
--- a/tools/lib/fossil_cmd.tcl
+++ b/tools/lib/fossil_cmd.tcl
@@ -1,49 +0,0 @@
1 # -----------------------------------------------------------------------------
2 # Access to the external fossil command.
3
4 # -----------------------------------------------------------------------------
5 # Requirements
6
7 package require Tcl 8.4
8 namespace eval ::vc::fossil::cmd {}
9
10 # -----------------------------------------------------------------------------
11 # API
12
13 # vc::fossil::cmd::dova word... - Run a fossil command specified as var args
14 # vc::fossil::cmd::do words - Run a fossil command specified in a list.
15
16 # -----------------------------------------------------------------------------
17 # API Implementation
18
19 proc ::vc::fossil::cmd::dova {args} {do $args}
20
21 proc ::vc::fossil::cmd::do {words} {
22 variable cmd
23 if {![llength $words]} {
24 return -code error "Empty fossil command"
25 }
26 # 8.5: exec $cmd {*}$words
27 return [eval [linsert $words 0 exec $cmd]]
28 }
29
30 # -----------------------------------------------------------------------------
31 # Internals.
32
33 namespace eval ::vc::fossil::cmd {
34 # Locate external fossil application.
35 variable cmd [auto_execok fossil]
36
37 # Bail out if not found.
38 if {![llength $::vc::fossil::cmd::cmd]} {
39 return -code error "Fossil application not found."
40 }
41
42 namespace export do dova
43 }
44
45 # -----------------------------------------------------------------------------
46 # Ready
47
48 package provide vc::fossil::cmd 1.0
49 return
--- a/tools/lib/fossil_cmd.tcl
+++ b/tools/lib/fossil_cmd.tcl
@@ -1,49 +0,0 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
D tools/lib/import_map.tcl
-50
--- a/tools/lib/import_map.tcl
+++ b/tools/lib/import_map.tcl
@@ -1,50 +0,0 @@
1
-# -----------------------------------------------------------------------------
2
-# Management of the mapping between cvs changesets and fossil uuids.
3
-
4
-# -----------------------------------------------------------------------------
5
-# Requirements
6
-
7
-package require Tcl 8.4
8
-package require vc::tools::log ; # User feedback
9
-
10
-namespace eval ::vc::fossil::import::map {
11
- vc::tools::log::system map
12
- namespace import ::vc::tools::log::write
13
-}
14
-
15
-# -----------------------------------------------------------------------------
16
-# API
17
-
18
-# vc::fossil::import::map
19
-# set cset uuid - Associate changeset with uuid
20
-# get cset -> uuid - Retrieve uuid for changeset.
21
-
22
-# -----------------------------------------------------------------------------
23
-# API Implementation - Functionality
24
-
25
-proc ::vc::fossil::import::map::set {cset uuid} {
26
- variable map
27
- ::set map($cset) $uuid
28
- write 2 map "== $uuid"
29
- return
30
-}
31
-
32
-proc ::vc::fossil::import::map::get {cset} {
33
- variable map
34
- return $map($cset)
35
-}
36
-
37
-# -----------------------------------------------------------------------------
38
-
39
-namespace eval ::vc::fossil::import::map {
40
- variable map ; # Map from csets to uuids
41
- array set map {} ; #
42
-
43
- namespace export get set
44
-}
45
-
46
-# -----------------------------------------------------------------------------
47
-# Ready
48
-
49
-package provide vc::fossil::import::map 1.0
50
-return
--- a/tools/lib/import_map.tcl
+++ b/tools/lib/import_map.tcl
@@ -1,50 +0,0 @@
1 # -----------------------------------------------------------------------------
2 # Management of the mapping between cvs changesets and fossil uuids.
3
4 # -----------------------------------------------------------------------------
5 # Requirements
6
7 package require Tcl 8.4
8 package require vc::tools::log ; # User feedback
9
10 namespace eval ::vc::fossil::import::map {
11 vc::tools::log::system map
12 namespace import ::vc::tools::log::write
13 }
14
15 # -----------------------------------------------------------------------------
16 # API
17
18 # vc::fossil::import::map
19 # set cset uuid - Associate changeset with uuid
20 # get cset -> uuid - Retrieve uuid for changeset.
21
22 # -----------------------------------------------------------------------------
23 # API Implementation - Functionality
24
25 proc ::vc::fossil::import::map::set {cset uuid} {
26 variable map
27 ::set map($cset) $uuid
28 write 2 map "== $uuid"
29 return
30 }
31
32 proc ::vc::fossil::import::map::get {cset} {
33 variable map
34 return $map($cset)
35 }
36
37 # -----------------------------------------------------------------------------
38
39 namespace eval ::vc::fossil::import::map {
40 variable map ; # Map from csets to uuids
41 array set map {} ; #
42
43 namespace export get set
44 }
45
46 # -----------------------------------------------------------------------------
47 # Ready
48
49 package provide vc::fossil::import::map 1.0
50 return
--- a/tools/lib/import_map.tcl
+++ b/tools/lib/import_map.tcl
@@ -1,50 +0,0 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
D tools/lib/import_statistics.tcl
-116
--- a/tools/lib/import_statistics.tcl
+++ b/tools/lib/import_statistics.tcl
@@ -1,116 +0,0 @@
1
-# -----------------------------------------------------------------------------
2
-# Management of statistics for an import run.
3
-
4
-# -----------------------------------------------------------------------------
5
-# Requirements
6
-
7
-package require Tcl 8.4
8
-package require vc::tools::log ; # User feedback
9
-
10
-namespace eval ::vc::fossil::import::stats {
11
- vc::tools::log::system stats
12
- namespace import ::vc::tools::log::write
13
-}
14
-
15
-# -----------------------------------------------------------------------------
16
-# API
17
-
18
-# vc::fossil::import::stats
19
-# setup n m - Initialize module, expect n changesets, of m.
20
-# done - Write final statistics.
21
-# csbegin id - Import of identified changeset begins.
22
-# csend x - It took x seconds to import the changeset.
23
-#
24
-
25
-# -----------------------------------------------------------------------------
26
-# API Implementation - Functionality
27
-
28
-proc ::vc::fossil::import::stats::setup {n m} {
29
- variable run_format %[string length $n]s
30
- variable max_format %[string length $m]s
31
- variable total_csets $n
32
- variable total_running 0
33
- variable total_seconds 0.0
34
- return
35
-}
36
-
37
-proc ::vc::fossil::import::stats::done {} {
38
- variable total_csets
39
- variable total_seconds
40
-
41
- write 0 stats "========= [string repeat = 61]"
42
- write 0 stats "Imported $total_csets [expr {($total_csets == 1) ? "changeset" : "changesets"}]"
43
- write 0 stats "Within [F $total_seconds] seconds (avg [F [Avg]] seconds/changeset)"
44
- return
45
-}
46
-
47
-proc ::vc::fossil::import::stats::csbegin {cset} {
48
- variable max_format
49
- variable run_format
50
- variable total_running
51
- variable total_csets
52
-
53
- incr total_running
54
-
55
- write 0 stats "ChangeSet [format $max_format $cset] @ [format $run_format $total_running]/$total_csets ([F6 [expr {$total_running*100.0/$total_csets}]]%)"
56
- return
57
-}
58
-
59
-proc ::vc::fossil::import::stats::csend {seconds} {
60
- variable total_csets
61
- variable total_seconds
62
- variable total_running
63
-
64
- set total_seconds [expr {$total_seconds + $seconds}]
65
-
66
- set avg [Avg]
67
- set end [expr {$total_csets * $avg}]
68
- set rem [expr {$end - $total_seconds}]
69
-
70
- write 2 stats "Imported in [F7 $seconds] seconds"
71
- write 3 stats "Average Time/Cset [F7 $avg] seconds"
72
- write 3 stats "Current Runtime [FTime $total_seconds]"
73
- write 3 stats "Total Runtime (E) [FTime $end]"
74
- write 3 stats "Remaining Time (E) [FTime $rem]"
75
- # (E) for Estimated.
76
-
77
- return
78
-}
79
-
80
-# -----------------------------------------------------------------------------
81
-# Internal helper commands.
82
-
83
-proc ::vc::fossil::import::stats::FTime {s} {
84
- set m [expr {$s / 60}]
85
- set h [expr {$s / 3600}]
86
- return "[F7 $s] sec [F6 $m] min [F5 $h] hr"
87
-}
88
-
89
-proc ::vc::fossil::import::stats::F {x} { format %.2f $x }
90
-proc ::vc::fossil::import::stats::F5 {x} { format %5.2f $x }
91
-proc ::vc::fossil::import::stats::F6 {x} { format %6.2f $x }
92
-proc ::vc::fossil::import::stats::F7 {x} { format %7.2f $x }
93
-
94
-proc ::vc::fossil::import::stats::Avg {} {
95
- variable total_seconds
96
- variable total_running
97
- return [expr {$total_seconds/$total_running}]
98
-}
99
-
100
-# -----------------------------------------------------------------------------
101
-
102
-namespace eval ::vc::fossil::import::stats {
103
- variable total_csets 0 ; # Number of changesets to expect to be imported
104
- variable total_running 0 ; # Number of changesets which have been imported so far
105
- variable total_seconds 0 ; # Current runtime in seconds
106
- variable max_format %s ; # Format to print changeset id, based on the largest id.
107
- variable run_format %s ; # Format to print the number of imported csets.
108
-
109
- namespace export setup done csbegin csend
110
-}
111
-
112
-# -----------------------------------------------------------------------------
113
-# Ready
114
-
115
-package provide vc::fossil::import::stats 1.0
116
-return
--- a/tools/lib/import_statistics.tcl
+++ b/tools/lib/import_statistics.tcl
@@ -1,116 +0,0 @@
1 # -----------------------------------------------------------------------------
2 # Management of statistics for an import run.
3
4 # -----------------------------------------------------------------------------
5 # Requirements
6
7 package require Tcl 8.4
8 package require vc::tools::log ; # User feedback
9
10 namespace eval ::vc::fossil::import::stats {
11 vc::tools::log::system stats
12 namespace import ::vc::tools::log::write
13 }
14
15 # -----------------------------------------------------------------------------
16 # API
17
18 # vc::fossil::import::stats
19 # setup n m - Initialize module, expect n changesets, of m.
20 # done - Write final statistics.
21 # csbegin id - Import of identified changeset begins.
22 # csend x - It took x seconds to import the changeset.
23 #
24
25 # -----------------------------------------------------------------------------
26 # API Implementation - Functionality
27
28 proc ::vc::fossil::import::stats::setup {n m} {
29 variable run_format %[string length $n]s
30 variable max_format %[string length $m]s
31 variable total_csets $n
32 variable total_running 0
33 variable total_seconds 0.0
34 return
35 }
36
37 proc ::vc::fossil::import::stats::done {} {
38 variable total_csets
39 variable total_seconds
40
41 write 0 stats "========= [string repeat = 61]"
42 write 0 stats "Imported $total_csets [expr {($total_csets == 1) ? "changeset" : "changesets"}]"
43 write 0 stats "Within [F $total_seconds] seconds (avg [F [Avg]] seconds/changeset)"
44 return
45 }
46
47 proc ::vc::fossil::import::stats::csbegin {cset} {
48 variable max_format
49 variable run_format
50 variable total_running
51 variable total_csets
52
53 incr total_running
54
55 write 0 stats "ChangeSet [format $max_format $cset] @ [format $run_format $total_running]/$total_csets ([F6 [expr {$total_running*100.0/$total_csets}]]%)"
56 return
57 }
58
59 proc ::vc::fossil::import::stats::csend {seconds} {
60 variable total_csets
61 variable total_seconds
62 variable total_running
63
64 set total_seconds [expr {$total_seconds + $seconds}]
65
66 set avg [Avg]
67 set end [expr {$total_csets * $avg}]
68 set rem [expr {$end - $total_seconds}]
69
70 write 2 stats "Imported in [F7 $seconds] seconds"
71 write 3 stats "Average Time/Cset [F7 $avg] seconds"
72 write 3 stats "Current Runtime [FTime $total_seconds]"
73 write 3 stats "Total Runtime (E) [FTime $end]"
74 write 3 stats "Remaining Time (E) [FTime $rem]"
75 # (E) for Estimated.
76
77 return
78 }
79
80 # -----------------------------------------------------------------------------
81 # Internal helper commands.
82
83 proc ::vc::fossil::import::stats::FTime {s} {
84 set m [expr {$s / 60}]
85 set h [expr {$s / 3600}]
86 return "[F7 $s] sec [F6 $m] min [F5 $h] hr"
87 }
88
89 proc ::vc::fossil::import::stats::F {x} { format %.2f $x }
90 proc ::vc::fossil::import::stats::F5 {x} { format %5.2f $x }
91 proc ::vc::fossil::import::stats::F6 {x} { format %6.2f $x }
92 proc ::vc::fossil::import::stats::F7 {x} { format %7.2f $x }
93
94 proc ::vc::fossil::import::stats::Avg {} {
95 variable total_seconds
96 variable total_running
97 return [expr {$total_seconds/$total_running}]
98 }
99
100 # -----------------------------------------------------------------------------
101
102 namespace eval ::vc::fossil::import::stats {
103 variable total_csets 0 ; # Number of changesets to expect to be imported
104 variable total_running 0 ; # Number of changesets which have been imported so far
105 variable total_seconds 0 ; # Current runtime in seconds
106 variable max_format %s ; # Format to print changeset id, based on the largest id.
107 variable run_format %s ; # Format to print the number of imported csets.
108
109 namespace export setup done csbegin csend
110 }
111
112 # -----------------------------------------------------------------------------
113 # Ready
114
115 package provide vc::fossil::import::stats 1.0
116 return
--- a/tools/lib/import_statistics.tcl
+++ b/tools/lib/import_statistics.tcl
@@ -1,116 +0,0 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
D tools/lib/importcvs.tcl
-49
--- a/tools/lib/importcvs.tcl
+++ b/tools/lib/importcvs.tcl
@@ -1,49 +0,0 @@
1
-# -----------------------------------------------------------------------------
2
-# Tool packages. Main control module for importing from a CVS repository.
3
-
4
-# -----------------------------------------------------------------------------
5
-# Requirements
6
-
7
-package require Tcl 8.4
8
-package require vc::cvs::ws ; # Frontend, reading from source repository
9
-package require vc::fossil::ws ; # Backend, writing to destination repository.
10
-package require vc::tools::log ; # User feedback.
11
-package require vc::fossil::import::stats ; # Management for the Import Statistics.
12
-package require vc::fossil::import::map ; # Management of ; # Parser configuration
13
-
14
-namespace eval ::vc::fossil::import::cvs {
15
- vc::tools::log::system import
16
- namespace import ::vc::tools::log::write
17
- namespace eval cvs { namespace import ::vc::cvs::ws::* }
18
- namespace eval fossil { namespace import ::vc::fossil::ws::* }
19
- namespace eval stats { namespace import ::vc::fossil::import::stats::* }
20
- namespace eval map { namespace import ::vc
21
- fossil::configure -appname cvs2fossil
22
- fossil::configure -ignore ::vc::cvs::ws::isadmin
23
-}
24
-
25
-# -----------------------------------------------------------------------------
26
-# API
27
-
28
-# Configuration
29
-#
30
-# vc::fossil::import::cvs::configure key value - Set configuration
31
-#
32
-# Legal keys: -nosign <bool>, default false
33
-# -breakat <int>, default :none:
34
-# -saveto <path>, default :none:
35
-# -limit <path>, default :none:
36
-#
37
-# Functionality
38
-#
39
-# vc::fossil::import::cvs::run src dst - Perform an import.
40
-
41
-# -----------------------------------------------------------------------------
42
-# API Implementation - Functionality
43
-
44
-proc ::vc::fossil::import::cvs::configure {key value} {
45
- # The options are simply passed through to the fossil importer
46
- # backend.
47
- switch { fossil::configure -breakat $value }
48
- -nosign { fossil::configure -gn { fossil::configure -{ cvs::configure -{ fossil::configure -# -----------------------------------------------------------------------------
49
-#
--- a/tools/lib/importcvs.tcl
+++ b/tools/lib/importcvs.tcl
@@ -1,49 +0,0 @@
1 # -----------------------------------------------------------------------------
2 # Tool packages. Main control module for importing from a CVS repository.
3
4 # -----------------------------------------------------------------------------
5 # Requirements
6
7 package require Tcl 8.4
8 package require vc::cvs::ws ; # Frontend, reading from source repository
9 package require vc::fossil::ws ; # Backend, writing to destination repository.
10 package require vc::tools::log ; # User feedback.
11 package require vc::fossil::import::stats ; # Management for the Import Statistics.
12 package require vc::fossil::import::map ; # Management of ; # Parser configuration
13
14 namespace eval ::vc::fossil::import::cvs {
15 vc::tools::log::system import
16 namespace import ::vc::tools::log::write
17 namespace eval cvs { namespace import ::vc::cvs::ws::* }
18 namespace eval fossil { namespace import ::vc::fossil::ws::* }
19 namespace eval stats { namespace import ::vc::fossil::import::stats::* }
20 namespace eval map { namespace import ::vc
21 fossil::configure -appname cvs2fossil
22 fossil::configure -ignore ::vc::cvs::ws::isadmin
23 }
24
25 # -----------------------------------------------------------------------------
26 # API
27
28 # Configuration
29 #
30 # vc::fossil::import::cvs::configure key value - Set configuration
31 #
32 # Legal keys: -nosign <bool>, default false
33 # -breakat <int>, default :none:
34 # -saveto <path>, default :none:
35 # -limit <path>, default :none:
36 #
37 # Functionality
38 #
39 # vc::fossil::import::cvs::run src dst - Perform an import.
40
41 # -----------------------------------------------------------------------------
42 # API Implementation - Functionality
43
44 proc ::vc::fossil::import::cvs::configure {key value} {
45 # The options are simply passed through to the fossil importer
46 # backend.
47 switch { fossil::configure -breakat $value }
48 -nosign { fossil::configure -gn { fossil::configure -{ cvs::configure -{ fossil::configure -# -----------------------------------------------------------------------------
49 #
--- a/tools/lib/importcvs.tcl
+++ b/tools/lib/importcvs.tcl
@@ -1,49 +0,0 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
D tools/lib/log.tcl
-153
--- a/tools/lib/log.tcl
+++ b/tools/lib/log.tcl
@@ -1,153 +0,0 @@
1
-# -----------------------------------------------------------------------------
2
-# Tool packages. Logging (aka User feedback).
3
-
4
-# -----------------------------------------------------------------------------
5
-# Requirements
6
-
7
-package require Tcl 8.4
8
-namespace eval ::vc::tools::log {}
9
-
10
-# -----------------------------------------------------------------------------
11
-# API
12
-
13
-# Feedback generation.
14
-#
15
-# vc::tools::log::write verbosity system text - Write message to the log.
16
-# vc::tools::log::progress verbosity system n max - Drive a progress display.
17
-#
18
-# Note: max empty => infinite progress display, otherwise a finite display.
19
-
20
-# Administrative operations.
21
-#
22
-# vc::tools::log::verbosity level - Set the verbosity level of the application.
23
-# vc::tools::log::verbosity? - Query the verbosity level of the application.
24
-# vc::tools::log::setCmd cmdprefix - Set callback for output
25
-# vc::tools::log::system name - Register a system (enables tabular log formatting).
26
-
27
-# Callback API ( Executed at the global level).
28
-#
29
-# cmdprefix 'write' system text
30
-# cmdprefix 'progress' system n max
31
-
32
-# Standard callbacks defined by the package itself write to stdout.
33
-
34
-# -----------------------------------------------------------------------------
35
-# API Implementation - Feedback generation.
36
-
37
-# Write the message 'text' to log, for the named 'system'. The message
38
-# is written if and only if the message verbosity is less or equal the
39
-# chosen verbosity. A message of verbosity 0 cannot be blocked.
40
-
41
-proc ::vc::tools::log::write {verbosity system text} {
42
- variable loglevel
43
- variable logcmd
44
- variable sysfmt
45
- if {$verbosity > $loglevel} return
46
- uplevel #0 [linsert $logcmd end write [format $sysfmt $system] $text]
47
- return
48
-}
49
-
50
-# Similar to write, especially in the handling of the verbosity, to
51
-# drive progress displays. It signals that for some long running
52
-# operation we are at tick 'n' of at most 'max' ticks.
53
-
54
-proc ::vc::tools::log::progress {verbosity system n max} {
55
- variable loglevel
56
- variable logcmd
57
- variable sysfmt
58
- if {$verbosity > $loglevel} return
59
- uplevel #0 [linsert $logcmd end progress [format $sysfmt $system] $n $max]
60
- return
61
-}
62
-
63
-# -----------------------------------------------------------------------------
64
-# API Implementation - Administrative operations.
65
-
66
-# Set verbosity to the chosen 'level'. Only messages with a level less
67
-# or equal to this one will be shown.
68
-
69
-proc ::vc::tools::log::verbosity {level} {
70
- variable loglevel
71
- if {$level < 1} {set level 0}
72
- set loglevel $level
73
- return
74
-}
75
-
76
-# Query the currently set verbosity.
77
-
78
-proc ::vc::tools::log::verbosity? {} {
79
- variable loglevel
80
- return $loglevel
81
-}
82
-
83
-# Set the log callback handling the actual output of messages going
84
-# through the package.
85
-
86
-proc ::vc::tools::log::setCmd {cmdprefix} {
87
- variable logcmd $cmdprefix
88
- return
89
-}
90
-
91
-# Register a system name, to enable tabular formatting. This is done
92
-# by setting up a format specifier with a proper width. This is
93
-# handled in the generation command, before the output callback is
94
-# invoked.
95
-
96
-proc ::vc::tools::log::system {name} {
97
- variable sysfmt
98
- variable syslen
99
-
100
- set nlen [string length $name]
101
- if {$nlen < $syslen} return
102
-
103
- set syslen $nlen
104
- set sysfmt %-${syslen}s
105
- return
106
-}
107
-
108
-# -----------------------------------------------------------------------------
109
-# Internal operations - Standard output operation
110
-
111
-# Dispatch to the handlers of the possible operations.
112
-
113
-proc ::vc::tools::log::OUT {op args} {
114
- eval [linsert $args 0 ::vc::tools::log::OUT/$op]
115
- return
116
-}
117
-
118
-# Write handler. Each message is a line.
119
-
120
-proc ::vc::tools::log::OUT/write {system text} {
121
- puts "$system $text"
122
- return
123
-}
124
-
125
-# Progress handler. Uses \r to return to the beginning of the current
126
-# line without advancing.
127
-
128
-proc ::vc::tools::log::OUT/progress {system n max} {
129
- if {$max eq {}} {
130
- puts -nonewline "$system $n\r"
131
- } else {
132
- puts -nonewline "$system [format %[string length $max]s $n]/$max\r"
133
- }
134
- flush stdout
135
- return
136
-}
137
-
138
-# -----------------------------------------------------------------------------
139
-
140
-namespace eval ::vc::tools::log {
141
- variable loglevel 0 ; # Allow only uninteruptible messages.
142
- variable logcmd ::vc::tools::log::OUT ; # Standard output to stdout.
143
- variable sysfmt %s ; # Non-tabular formatting.
144
- variable syslen 0 ; # Ditto.
145
-
146
- namespace export write progress
147
-}
148
-
149
-# -----------------------------------------------------------------------------
150
-# Ready
151
-
152
-package provide vc::tools::log 1.0
153
-return
--- a/tools/lib/log.tcl
+++ b/tools/lib/log.tcl
@@ -1,153 +0,0 @@
1 # -----------------------------------------------------------------------------
2 # Tool packages. Logging (aka User feedback).
3
4 # -----------------------------------------------------------------------------
5 # Requirements
6
7 package require Tcl 8.4
8 namespace eval ::vc::tools::log {}
9
10 # -----------------------------------------------------------------------------
11 # API
12
13 # Feedback generation.
14 #
15 # vc::tools::log::write verbosity system text - Write message to the log.
16 # vc::tools::log::progress verbosity system n max - Drive a progress display.
17 #
18 # Note: max empty => infinite progress display, otherwise a finite display.
19
20 # Administrative operations.
21 #
22 # vc::tools::log::verbosity level - Set the verbosity level of the application.
23 # vc::tools::log::verbosity? - Query the verbosity level of the application.
24 # vc::tools::log::setCmd cmdprefix - Set callback for output
25 # vc::tools::log::system name - Register a system (enables tabular log formatting).
26
27 # Callback API ( Executed at the global level).
28 #
29 # cmdprefix 'write' system text
30 # cmdprefix 'progress' system n max
31
32 # Standard callbacks defined by the package itself write to stdout.
33
34 # -----------------------------------------------------------------------------
35 # API Implementation - Feedback generation.
36
37 # Write the message 'text' to log, for the named 'system'. The message
38 # is written if and only if the message verbosity is less or equal the
39 # chosen verbosity. A message of verbosity 0 cannot be blocked.
40
41 proc ::vc::tools::log::write {verbosity system text} {
42 variable loglevel
43 variable logcmd
44 variable sysfmt
45 if {$verbosity > $loglevel} return
46 uplevel #0 [linsert $logcmd end write [format $sysfmt $system] $text]
47 return
48 }
49
50 # Similar to write, especially in the handling of the verbosity, to
51 # drive progress displays. It signals that for some long running
52 # operation we are at tick 'n' of at most 'max' ticks.
53
54 proc ::vc::tools::log::progress {verbosity system n max} {
55 variable loglevel
56 variable logcmd
57 variable sysfmt
58 if {$verbosity > $loglevel} return
59 uplevel #0 [linsert $logcmd end progress [format $sysfmt $system] $n $max]
60 return
61 }
62
63 # -----------------------------------------------------------------------------
64 # API Implementation - Administrative operations.
65
66 # Set verbosity to the chosen 'level'. Only messages with a level less
67 # or equal to this one will be shown.
68
69 proc ::vc::tools::log::verbosity {level} {
70 variable loglevel
71 if {$level < 1} {set level 0}
72 set loglevel $level
73 return
74 }
75
76 # Query the currently set verbosity.
77
78 proc ::vc::tools::log::verbosity? {} {
79 variable loglevel
80 return $loglevel
81 }
82
83 # Set the log callback handling the actual output of messages going
84 # through the package.
85
86 proc ::vc::tools::log::setCmd {cmdprefix} {
87 variable logcmd $cmdprefix
88 return
89 }
90
91 # Register a system name, to enable tabular formatting. This is done
92 # by setting up a format specifier with a proper width. This is
93 # handled in the generation command, before the output callback is
94 # invoked.
95
96 proc ::vc::tools::log::system {name} {
97 variable sysfmt
98 variable syslen
99
100 set nlen [string length $name]
101 if {$nlen < $syslen} return
102
103 set syslen $nlen
104 set sysfmt %-${syslen}s
105 return
106 }
107
108 # -----------------------------------------------------------------------------
109 # Internal operations - Standard output operation
110
111 # Dispatch to the handlers of the possible operations.
112
113 proc ::vc::tools::log::OUT {op args} {
114 eval [linsert $args 0 ::vc::tools::log::OUT/$op]
115 return
116 }
117
118 # Write handler. Each message is a line.
119
120 proc ::vc::tools::log::OUT/write {system text} {
121 puts "$system $text"
122 return
123 }
124
125 # Progress handler. Uses \r to return to the beginning of the current
126 # line without advancing.
127
128 proc ::vc::tools::log::OUT/progress {system n max} {
129 if {$max eq {}} {
130 puts -nonewline "$system $n\r"
131 } else {
132 puts -nonewline "$system [format %[string length $max]s $n]/$max\r"
133 }
134 flush stdout
135 return
136 }
137
138 # -----------------------------------------------------------------------------
139
140 namespace eval ::vc::tools::log {
141 variable loglevel 0 ; # Allow only uninteruptible messages.
142 variable logcmd ::vc::tools::log::OUT ; # Standard output to stdout.
143 variable sysfmt %s ; # Non-tabular formatting.
144 variable syslen 0 ; # Ditto.
145
146 namespace export write progress
147 }
148
149 # -----------------------------------------------------------------------------
150 # Ready
151
152 package provide vc::tools::log 1.0
153 return
--- a/tools/lib/log.tcl
+++ b/tools/lib/log.tcl
@@ -1,153 +0,0 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
D tools/lib/pkgIndex.tcl
-14
--- a/tools/lib/pkgIndex.tcl
+++ b/tools/lib/pkgIndex.tcl
@@ -1,14 +0,0 @@
1
-if {![package vsatisfies [package require Tcl] 8.4]} return
2
-package ifneeded vc::rcs::parser 1.0 [list source [file join $dir rcsparser.tcl]]
3
-package ifneeded vc::cvs::cmd 1.0 [list source [file join $dir cvs_cmd.tcl]]
4
-package ifneeded vc::cvs::ws 1.0 [list source [file join $dir cvs.tcl]]
5
-package ifneeded vc::cvs::ws::files 1.0 [list source [file join $dir cvs_files.tcl]]
6
-package ifneeded vc::cvs::ws::timeline 1.0 [list source [file join $dir cvs_timeline.tcl]]
7
-package ifneeded vc::cvs::ws::csets 1.0 [list source [file join $dir cvs_csets.tcl]]
8
-package ifneeded vc::fossil::cmd 1.0 [list source [file join $dir fossil_cmd.tcl]]
9
-package ifneeded vc::fossil::ws 1.0 [list source [file join $dir fossil.tcl]]
10
-package ifneeded vc::fossil::import::cvs 1.0 [list source [file join $dir importcvs.tcl]]
11
-package ifneeded vc::fossil::import::stats 1.0 [list source [file join $dir import_statistics.tcl]]
12
-package ifneeded vc::fossil::import::map 1.0 [list source [file join $dir import_map.tcl]]
13
-package ifneeded vc::tools::log 1.0 [list source [file join $dir log.tcl]]
14
-package ifneeded vc::tools::trouble
--- a/tools/lib/pkgIndex.tcl
+++ b/tools/lib/pkgIndex.tcl
@@ -1,14 +0,0 @@
1 if {![package vsatisfies [package require Tcl] 8.4]} return
2 package ifneeded vc::rcs::parser 1.0 [list source [file join $dir rcsparser.tcl]]
3 package ifneeded vc::cvs::cmd 1.0 [list source [file join $dir cvs_cmd.tcl]]
4 package ifneeded vc::cvs::ws 1.0 [list source [file join $dir cvs.tcl]]
5 package ifneeded vc::cvs::ws::files 1.0 [list source [file join $dir cvs_files.tcl]]
6 package ifneeded vc::cvs::ws::timeline 1.0 [list source [file join $dir cvs_timeline.tcl]]
7 package ifneeded vc::cvs::ws::csets 1.0 [list source [file join $dir cvs_csets.tcl]]
8 package ifneeded vc::fossil::cmd 1.0 [list source [file join $dir fossil_cmd.tcl]]
9 package ifneeded vc::fossil::ws 1.0 [list source [file join $dir fossil.tcl]]
10 package ifneeded vc::fossil::import::cvs 1.0 [list source [file join $dir importcvs.tcl]]
11 package ifneeded vc::fossil::import::stats 1.0 [list source [file join $dir import_statistics.tcl]]
12 package ifneeded vc::fossil::import::map 1.0 [list source [file join $dir import_map.tcl]]
13 package ifneeded vc::tools::log 1.0 [list source [file join $dir log.tcl]]
14 package ifneeded vc::tools::trouble
--- a/tools/lib/pkgIndex.tcl
+++ b/tools/lib/pkgIndex.tcl
@@ -1,14 +0,0 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
D tools/lib/rcsparser.tcl
-228
--- a/tools/lib/rcsparser.tcl
+++ b/tools/lib/rcsparser.tcl
@@ -1,228 +0,0 @@
1
-# -----------------------------------------------------------------------------
2
-# Tool packages. Parsing RCS files.
3
-#
4
-# Some of the information in RCS files is skipped over, most
5
-# importantly the actual delta texts. The users of this parser need
6
-# only the meta-data about when revisions were added, the tree
7
-# (branching) structure, commit messages.
8
-#
9
-# The parser is based on Recursive Descent.
10
-
11
-# -----------------------------------------------------------------------------
12
-# Requirements
13
-
14
-package require Tcl 8.4
15
-package require fileutil ; # Tcllib (cat)
16
-package require vc::tools::log ; # User feedback
17
-
18
-namespace eval ::vc::rcs::parser {
19
- vc::tools::log::system rcs
20
- namesp::* return
21
-}
22
-
23
-proc ::vc::rcprogressAPI
24
-
25
-# vc::rcs::parser::process file
26
-#
27
-# Parses the rcs file and returns a dictionary containing the meta
28
-# data. The following keys are used
29
-#
30
-# Key Meaning
31
-# --- -------
32
-# 'head' head revision
33
-# 'branch' ?
34
-# 'symbol' dict (symbol -> revision)
35
-# 'lock' dict (symbol -> revision)
36
-# 'comment' file comment
37
-# 'expand' ?
38
-# 'date' dict (revision -> date)
39
-# 'author' dict (revision -> author)
40
-# 'state' dict (revision -> state)
41
-# 'parent' dict (revision -> parent revision)
42
-# 'commit' dict (revision -> commit message)
43
-#
44
-# The state 'dead' has special meaning, the user should know that.
45
-
46
-# -----------------------------------------------------------------------------
47
-# API Implementation
48
-
49
-proc ::vc::rcs::parser::chfile exists $cache] &&
50
-# -----------------------------------------------------------------------------
51
-# Tool packages. Parsing RCS files.
52
-#
53
-# Some of the information in RCS files is skipped over, most
54
-# importantly the actual delta texts. The users of this parser need
55
-# only the meta-data about when revisions were added, the tree
56
-# (branching) structure, commit messages.
57
-#
58
-# The parser is based on Recursive Descent--------------------------------------------------------------
59
-# Tool packages. Parsing RCS files.
60
-#
61
-# Some of the information in RCS files is skipped over, most
62
-# importantly the actual delta texts. The users of this parser need
63
-# only the meta-data about when revisions were added, the tree
64
-# (branching) structure, commit messages.
65
-#
66
-# The parser is based on Recursive Descent.
67
-
68
-# -----------------------------------------------------------------------------
69
-# Requirements
70
-
71
-package require Tcl 8.4
72
-package require fileutil ; # Tcllib (cat)
73
-package require vc::tools::log ; # User feedback
74
-
75
-namespace eval ::vc::rcs::parser {
76
- vc::tools::log::system rcs
77
- namesp::* return
78
-}
79
-
80
-proc ::vc::rcs::parser::Log {} {
81
- upvar 1 data data res res
82
- LiteraAPI
83
-
84
-# vc::rcs::parser::process file
85
-#
86
-# Parses the rcs file and returns a dictionary containing the meta
87
-# data. The following keys are used
88
-#
89
-# Key Meaning
90
-# --- -------
91
-# 'head' head revision
92
-# 'branch' ?
93
-# 'symbol' dict (symbol -> revision)
94
-# 'lock' dict (symbol -> revision)
95
-# 'comment' file comment
96
-# 'expand' ?
97
-# 'date' dict (revision -> date)
98
-# 'author' dict (revision -> author)
99
-# 'state' dict (revision -> state)
100
-# 'parent' dict (revision -> parent revision)
101
-# 'commit' dict (revision -> commit message)
102
-#
103
-# The state 'dead' has special meaning, the user should know that.
104
-
105
-# -----------------------------------------------------------------------------
106
-# API Implementation
107
-
108
-proc ::vc::rcs::parser::configure {key value} {
109
- variable cache
110
- switch -exact -- $key {
111
- -cache {
112
- set cache $value
113
- }
114
- default {
115
- return -code error "Unknown switch $key, expected one of -cache"
116
- }
117
- }
118
- return
119
-}
120
-
121
-proc ::vc::rcs::parser::process {path} {
122
- set cachfile exists $cache] &&
123
- ([file mtime $cach } {
124
- # Use preparsed data if not invalidated by changes to the
125
- # archive they are derived from.
126
- write 4 rcs {Load preparsed data block}
127
- return [fileutil::cat -encoding binary $cachefile]
128
- }
129
-
130
- set res [P]
131
- }
132
-
133
- set res [Process $path]
134
-
135
- # Save parse result for quick pickup by future runs.
136
- $res
137
-
138
- return $res
139
-}
140
-
141
-# -----------------------------------------------------------------------------
142
-
143
-proc ::vc::rcs::parser::Process {path} {
144
- set data [fileutil::cat -encoding binary $path]
145
- array set res {}
146
- set res(size) [file size $path]
147
- set res(done) 0
148
- set res(nsize) [string length $res(size)]
149
-
150
- Admin
151
- Deltas
152
- Description
153
- DeltaTexts
154
-
155
- # Remove parser state
156
- catch {unset res(id)}
157
- catch {unset res(lastval)}
158
- unset res(size)
159
- unset res(nsize)
160
- unset res(done)
161
-
162
- return [array get res]
163
-}
164
-
165
-proc ::vc::rcs::parser::Cache {path} {
166
- return ${path},,preparsed
167
-}
168
-
169
-# -----------------------------------------------------------------------------
170
-# Internal - Recursive Descent functions implementing the syntax.
171
-
172
-proc ::vc::rcs::parser::Admin {} {
173
- upvar 1 data data res res
174
- Head ; Branch ; Access ; Symbols ; Locks ; Strict ; Comment ; Expand
175
- return
176
-}
177
-
178
-proc ::vc::rcs::parser::Deltas {} {
179
- upvar 1 data data res res
180
- while {[Num 0]} { IsIdent ; Date ; Author ; State ; Branches ; NextRev }
181
- return
182
-}
183
-
184
-proc ::vc::rcs::parser::Description {} {
185
- upvar 1 data data res res
186
- Literal desc
187
- String 1
188
- Def desc
189
- return
190
-}
191
-
192
-proc ::vc::rcs::parser::DeltaTexts {} {
193
- upvar 1 data data res res
194
- while {[Num 0]} { IsIdent ; Log ; Text }
195
- return
196
-}
197
-
198
-proc ::vc::rcs::parser::Head {} {
199
- upvar 1 data data res res
200
- Literal head ; Num 1 ; Literal \;
201
- Def head
202
- return
203
-}
204
-
205
-proc ::vc::rcs::parser::Branch {} {
206
- upvar 1 data data res res
207
- if {![Literal branch 0]} return ; Num 1 ; Literal \;
208
- Def branch
209
- return
210
-}
211
-
212
-proc ::vc::rcs::parser::Access {} {
213
- upvar 1 data data res res
214
- Literal access ; Literal \;
215
- return
216
-}
217
-
218
-proc ::vc::rcs::parser::Symbols {} {
219
- upvar 1 data data res res
220
- Literal symbols
221
- while {[Ident]} { Num 1 ; Map symbol }
222
- Literal \;
223
- return
224
-}
225
-
226
-proc ::vc::rcs::parser::Locks {} {
227
- upvar 1 data data res res
228
- Lite
--- a/tools/lib/rcsparser.tcl
+++ b/tools/lib/rcsparser.tcl
@@ -1,228 +0,0 @@
1 # -----------------------------------------------------------------------------
2 # Tool packages. Parsing RCS files.
3 #
4 # Some of the information in RCS files is skipped over, most
5 # importantly the actual delta texts. The users of this parser need
6 # only the meta-data about when revisions were added, the tree
7 # (branching) structure, commit messages.
8 #
9 # The parser is based on Recursive Descent.
10
11 # -----------------------------------------------------------------------------
12 # Requirements
13
14 package require Tcl 8.4
15 package require fileutil ; # Tcllib (cat)
16 package require vc::tools::log ; # User feedback
17
18 namespace eval ::vc::rcs::parser {
19 vc::tools::log::system rcs
20 namesp::* return
21 }
22
23 proc ::vc::rcprogressAPI
24
25 # vc::rcs::parser::process file
26 #
27 # Parses the rcs file and returns a dictionary containing the meta
28 # data. The following keys are used
29 #
30 # Key Meaning
31 # --- -------
32 # 'head' head revision
33 # 'branch' ?
34 # 'symbol' dict (symbol -> revision)
35 # 'lock' dict (symbol -> revision)
36 # 'comment' file comment
37 # 'expand' ?
38 # 'date' dict (revision -> date)
39 # 'author' dict (revision -> author)
40 # 'state' dict (revision -> state)
41 # 'parent' dict (revision -> parent revision)
42 # 'commit' dict (revision -> commit message)
43 #
44 # The state 'dead' has special meaning, the user should know that.
45
46 # -----------------------------------------------------------------------------
47 # API Implementation
48
49 proc ::vc::rcs::parser::chfile exists $cache] &&
50 # -----------------------------------------------------------------------------
51 # Tool packages. Parsing RCS files.
52 #
53 # Some of the information in RCS files is skipped over, most
54 # importantly the actual delta texts. The users of this parser need
55 # only the meta-data about when revisions were added, the tree
56 # (branching) structure, commit messages.
57 #
58 # The parser is based on Recursive Descent--------------------------------------------------------------
59 # Tool packages. Parsing RCS files.
60 #
61 # Some of the information in RCS files is skipped over, most
62 # importantly the actual delta texts. The users of this parser need
63 # only the meta-data about when revisions were added, the tree
64 # (branching) structure, commit messages.
65 #
66 # The parser is based on Recursive Descent.
67
68 # -----------------------------------------------------------------------------
69 # Requirements
70
71 package require Tcl 8.4
72 package require fileutil ; # Tcllib (cat)
73 package require vc::tools::log ; # User feedback
74
75 namespace eval ::vc::rcs::parser {
76 vc::tools::log::system rcs
77 namesp::* return
78 }
79
80 proc ::vc::rcs::parser::Log {} {
81 upvar 1 data data res res
82 LiteraAPI
83
84 # vc::rcs::parser::process file
85 #
86 # Parses the rcs file and returns a dictionary containing the meta
87 # data. The following keys are used
88 #
89 # Key Meaning
90 # --- -------
91 # 'head' head revision
92 # 'branch' ?
93 # 'symbol' dict (symbol -> revision)
94 # 'lock' dict (symbol -> revision)
95 # 'comment' file comment
96 # 'expand' ?
97 # 'date' dict (revision -> date)
98 # 'author' dict (revision -> author)
99 # 'state' dict (revision -> state)
100 # 'parent' dict (revision -> parent revision)
101 # 'commit' dict (revision -> commit message)
102 #
103 # The state 'dead' has special meaning, the user should know that.
104
105 # -----------------------------------------------------------------------------
106 # API Implementation
107
108 proc ::vc::rcs::parser::configure {key value} {
109 variable cache
110 switch -exact -- $key {
111 -cache {
112 set cache $value
113 }
114 default {
115 return -code error "Unknown switch $key, expected one of -cache"
116 }
117 }
118 return
119 }
120
121 proc ::vc::rcs::parser::process {path} {
122 set cachfile exists $cache] &&
123 ([file mtime $cach } {
124 # Use preparsed data if not invalidated by changes to the
125 # archive they are derived from.
126 write 4 rcs {Load preparsed data block}
127 return [fileutil::cat -encoding binary $cachefile]
128 }
129
130 set res [P]
131 }
132
133 set res [Process $path]
134
135 # Save parse result for quick pickup by future runs.
136 $res
137
138 return $res
139 }
140
141 # -----------------------------------------------------------------------------
142
143 proc ::vc::rcs::parser::Process {path} {
144 set data [fileutil::cat -encoding binary $path]
145 array set res {}
146 set res(size) [file size $path]
147 set res(done) 0
148 set res(nsize) [string length $res(size)]
149
150 Admin
151 Deltas
152 Description
153 DeltaTexts
154
155 # Remove parser state
156 catch {unset res(id)}
157 catch {unset res(lastval)}
158 unset res(size)
159 unset res(nsize)
160 unset res(done)
161
162 return [array get res]
163 }
164
165 proc ::vc::rcs::parser::Cache {path} {
166 return ${path},,preparsed
167 }
168
169 # -----------------------------------------------------------------------------
170 # Internal - Recursive Descent functions implementing the syntax.
171
172 proc ::vc::rcs::parser::Admin {} {
173 upvar 1 data data res res
174 Head ; Branch ; Access ; Symbols ; Locks ; Strict ; Comment ; Expand
175 return
176 }
177
178 proc ::vc::rcs::parser::Deltas {} {
179 upvar 1 data data res res
180 while {[Num 0]} { IsIdent ; Date ; Author ; State ; Branches ; NextRev }
181 return
182 }
183
184 proc ::vc::rcs::parser::Description {} {
185 upvar 1 data data res res
186 Literal desc
187 String 1
188 Def desc
189 return
190 }
191
192 proc ::vc::rcs::parser::DeltaTexts {} {
193 upvar 1 data data res res
194 while {[Num 0]} { IsIdent ; Log ; Text }
195 return
196 }
197
198 proc ::vc::rcs::parser::Head {} {
199 upvar 1 data data res res
200 Literal head ; Num 1 ; Literal \;
201 Def head
202 return
203 }
204
205 proc ::vc::rcs::parser::Branch {} {
206 upvar 1 data data res res
207 if {![Literal branch 0]} return ; Num 1 ; Literal \;
208 Def branch
209 return
210 }
211
212 proc ::vc::rcs::parser::Access {} {
213 upvar 1 data data res res
214 Literal access ; Literal \;
215 return
216 }
217
218 proc ::vc::rcs::parser::Symbols {} {
219 upvar 1 data data res res
220 Literal symbols
221 while {[Ident]} { Num 1 ; Map symbol }
222 Literal \;
223 return
224 }
225
226 proc ::vc::rcs::parser::Locks {} {
227 upvar 1 data data res res
228 Lite
--- a/tools/lib/rcsparser.tcl
+++ b/tools/lib/rcsparser.tcl
@@ -1,228 +0,0 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
D tools/lib/trouble.tcl
-57
--- a/tools/lib/trouble.tcl
+++ b/tools/lib/trouble.tcl
@@ -1,57 +0,0 @@
1
-# -----------------------------------------------------------------------------
2
-# Tool packages. Error reporting.
3
-
4
-# -----------------------------------------------------------------------------
5
-# Requirements
6
-
7
-package require Tcl 8.4
8
-package require vc::tools::log
9
-
10
-namespace eval ::vc::tools::trouble {
11
- ::vc::tools::log::system trouble
12
- namespace import ::vc::tools::log::write
13
-}
14
-
15
-# -----------------------------------------------------------------------------
16
-# API
17
-
18
-# vc::tools::trouble::add message - Report error (shown in general
19
-# log), and remember for re-display at exit.
20
-
21
-# -----------------------------------------------------------------------------
22
-# API Implementation
23
-
24
-proc ::vc::tools::trouble::add {text} {
25
- variable messages
26
- lappend messages $text
27
- write trouble 0 $text
28
- return
29
-}
30
-
31
-# -----------------------------------------------------------------------------
32
-# Internals. Hook into the application exit, show the remembered messages, then
33
-# pass through the regular command.
34
-
35
-rename ::exit vc::tools::trouble::EXIT
36
-proc ::exit {{status 0}} {
37
- variable ::vc::tools::trouble::messages
38
- foreach m $messages {
39
- write trouble 0 $m
40
- }
41
- ::vc::tools::trouble::EXIT $status
42
- # Not reached.
43
- return
44
-}
45
-
46
-namespace eval ::vc::tools::trouble {
47
- # List of the remembered error messages to be shown at exit
48
- variable messages {}
49
-
50
- namespace export add
51
-}
52
-
53
-# -----------------------------------------------------------------------------
54
-# Ready
55
-
56
-package provide vc::tools::trouble 1.0
57
-return
--- a/tools/lib/trouble.tcl
+++ b/tools/lib/trouble.tcl
@@ -1,57 +0,0 @@
1 # -----------------------------------------------------------------------------
2 # Tool packages. Error reporting.
3
4 # -----------------------------------------------------------------------------
5 # Requirements
6
7 package require Tcl 8.4
8 package require vc::tools::log
9
10 namespace eval ::vc::tools::trouble {
11 ::vc::tools::log::system trouble
12 namespace import ::vc::tools::log::write
13 }
14
15 # -----------------------------------------------------------------------------
16 # API
17
18 # vc::tools::trouble::add message - Report error (shown in general
19 # log), and remember for re-display at exit.
20
21 # -----------------------------------------------------------------------------
22 # API Implementation
23
24 proc ::vc::tools::trouble::add {text} {
25 variable messages
26 lappend messages $text
27 write trouble 0 $text
28 return
29 }
30
31 # -----------------------------------------------------------------------------
32 # Internals. Hook into the application exit, show the remembered messages, then
33 # pass through the regular command.
34
35 rename ::exit vc::tools::trouble::EXIT
36 proc ::exit {{status 0}} {
37 variable ::vc::tools::trouble::messages
38 foreach m $messages {
39 write trouble 0 $m
40 }
41 ::vc::tools::trouble::EXIT $status
42 # Not reached.
43 return
44 }
45
46 namespace eval ::vc::tools::trouble {
47 # List of the remembered error messages to be shown at exit
48 variable messages {}
49
50 namespace export add
51 }
52
53 # -----------------------------------------------------------------------------
54 # Ready
55
56 package provide vc::tools::trouble 1.0
57 return
--- a/tools/lib/trouble.tcl
+++ b/tools/lib/trouble.tcl
@@ -1,57 +0,0 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Binary file

Binary file

Binary file

Binary file

Keyboard Shortcuts

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