@@ -28,25 +28,31 @@
28 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
snit::type ::vc::fossil::import::cvs::integrity {
29 29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# # ## ### ##### ######## #############
30 30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
## Public API
31 31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
32 32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typemethod strict {} {
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log write 4 integrity {Check database consistency}
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33 35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
set n 0
34 36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
AllButMeta
35 37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Meta
36 38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return
37 39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
38 40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
39 41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typemethod metarelaxed {} {
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log write 4 integrity {Check database consistency}
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40 44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
set n 0
41 45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
AllButMeta
42 46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return
43 47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
44 48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
45 49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typemethod changesets {} {
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log write 4 integrity {Check database consistency}
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
46 52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
set n 0
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- RevisionCSetLinkage
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AllChangesets
48 54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
RevisionChangesets
49 55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SymbolChangesets
50 56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return
51 57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
52 58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -54,11 +60,10 @@
54 60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
## Internal methods
55 61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
56 62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proc AllButMeta {} {
57 63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# This code performs a number of paranoid checks of the
58 64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# database, searching for inconsistent cross-references.
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- log write 4 integrity {Check database consistency}
60 65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
61 66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
upvar 1 n n ; # Counter for the checks (we print an id before
62 67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# the main label).
63 68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
64 69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# Find all revisions which disagree with their line of
@@ -269,11 +274,10 @@
269 274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
270 275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
271 276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proc Meta {} {
272 277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# This code performs a number of paranoid checks of the
273 278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# database, searching for inconsistent cross-references.
274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- log write 4 integrity {Check database consistency}
275 279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
276 280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
upvar 1 n n ; # Counter for the checks (we print an id before
277 281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# the main label).
278 282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
279 283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# Find all revisions which disgree with their meta data about
@@ -289,26 +293,254 @@
289 293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
;
290 294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
291 295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return
292 296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
293 297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- proc RevisionCSetLinkage {} {
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc AllChangesets {} {
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # This code performs a number of paranoid checks of the
300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # database, searching for inconsistent changeset/revision
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # information.
302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ upvar 1 n n ; # Counter for the checks (we print an id before
304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # the main label).
305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Find all revisions which are not used by at least one
307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # revision changeset.
308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Check \
309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {All revisions have to be used by least one revision changeset} \
310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {is not used by a revision changeset} {
311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ -- Unused revisions = All revisions
312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ -- - revisions used by revision changesets.
313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ --
314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ -- Both sets can be computed easily, and subtracted
315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ -- from each other. Then we can get the associated
316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ -- file (name) for display.
317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SELECT F.name, R.rev
319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FROM revision R, file F
320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERE R.rid IN (SELECT rid FROM revision -- All revisions
321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ EXCEPT -- subtract
322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SELECT CR.rid FROM csrevision CR, changeset C -- revisions used
323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERE C.cid = CR.cid -- by any revision
324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND C.type = 0) -- changeset
325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND R.fid = F.fid -- get file of unused revision
326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Find all revisions which are used by more than one revision
328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # changeset.
329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Check \
330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {All revisions have to be used by at most one revision changeset} \
331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {is used by multiple revision changesets} {
332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ -- Principle of operation: Get all revision/changeset
333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ -- pairs for all revision changesets, group by
334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ -- revision to aggregate the changeset, counting
335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ -- them. From the resulting revision/count table
336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ -- select those with more than one user, and get their
337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ -- associated file (name) for display.
338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SELECT F.name, R.rev
340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FROM revision R, file F,
341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (SELECT CR.rid AS rid, count(CR.cid) AS count
342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FROM csrevision CR, changeset C
343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERE C.type = 0
344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND C.cid = CR.cid
345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ GROUP BY CR.rid ) AS U
346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERE U.count > 1
347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND R.rid = U.rid
348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND R.fid = F.fid
349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # All revisions in all changesets have to agree on the LOD
351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # their changeset belongs to. In other words, all revisions in
352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # a changeset have to refer to the same line of development.
353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #
354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Instead of looking at all pairs of revisions in all
355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # changesets we generate the distinct set of all LODs
356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # referenced by the revisions of a changeset, look for those
357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # with cardinality > 1, and get the identifying information
358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # for the changesets found thusly.
359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CheckCS \
360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {All revisions in a changeset have to belong to the same LOD} \
361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {: Its revisions disagree about the LOD they belong to} {
362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SELECT T.name, C.cid
363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FROM changeset C, cstype T
364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERE C.cid IN (SELECT U.cid
365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FROM (SELECT DISTINCT CR.cid AS cid, R.lod AS lod
366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FROM csrevision CR, revision R
367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERE CR.rid = R.rid) AS U
368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ GROUP BY U.cid HAVING COUNT(U.lod) > 1)
369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND T.tid = C.type
370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # All revisions in all changesets have to agree on the project
372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # their changeset belongs to. In other words, all revisions in
373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # a changeset have to refer to the same project.
374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #
375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Instead of looking at all pairs of revisions in all
376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # changesets we generate the distinct set of all projects
377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # referenced by the revisions of a changeset, look for those
378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # with cardinality > 1, and get the identifying information
379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # for the changesets found thusly.
380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CheckCS \
381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {All revisions in a changeset have to belong to the same project} \
382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {: Its revisions disagree about the project they belong to} {
383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SELECT T.name, C.cid
384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FROM changeset C, cstype T
385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERE C.cid IN (SELECT U.cid
386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FROM (SELECT DISTINCT CR.cid AS cid, F.pid AS pid
387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FROM csrevision CR, revision R, file F
388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERE CR.rid = R.rid
389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND F.fid = R.fid) AS U
390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ GROUP BY U.cid HAVING COUNT(U.pid) > 1)
391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND T.tid = C.type
392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # All revisions in a single changeset have to belong to
394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # different files. Conversely: No two revisions of a single
395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # file are allowed to be in the same changeset.
396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #
397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Instead of looking at all pairs of revisions in all
398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # changesets we generate the distinct set of all files
399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # referenced by the revisions of a changeset, and look for
400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # those with cardinality < the cardinality of the set of
401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # revisions, and get the identifying information for the
402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # changesets found thusly.
403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CheckCS \
404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {All revisions in a changeset have to belong to different files} \
405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {: Its revisions share files} {
406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SELECT T.name, C.cid
407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FROM changeset C, cstype T
408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERE C.cid IN (SELECT VV.cid
409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FROM (SELECT U.cid as cid, COUNT (U.fid) AS fcount
410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FROM (SELECT DISTINCT CR.cid AS cid, R.fid AS fid
411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FROM csrevision CR, revision R
412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERE CR.rid = R.rid) AS U
413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ GROUP BY U.cid) AS UU,
414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (SELECT V.cid AS cid, COUNT (V.rid) AS rcount
415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FROM csrevision V
416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ GROUP BY V.cid) AS VV
417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERE VV.cid = UU.cid
418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND UU.fcount < VV.rcount)
419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND T.tid = C.type
420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
295 422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
296 423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
297 424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proc RevisionChangesets {} {
425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # This code performs a number of paranoid checks of the
426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # database, searching for inconsistent changeset/revision
427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # information.
428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ upvar 1 n n ; # Counter for the checks (we print an id before
430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # the main label).
431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # All revisions used by revision changesets have to refer to
433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # the same meta information as their changeset.
434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CheckInCS \
435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {All revisions have to agree with their revision changeset about the used meta information} \
436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {disagrees with its revision changeset @ about the meta information} {
437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SELECT CT.name, C.cid, F.name, R.rev
438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FROM changeset C, cstype CT, revision R, file F, csrevision CR
439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERE C.type = 0 -- revision changesets only
440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND C.cid = CR.cid -- changeset --> its revisions
441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND R.rid = CR.rid -- look at them
442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND R.mid != C.src -- Only those which disagree with changeset about the meta
443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND R.fid = F.fid -- get file of the revision
444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND CT.tid = C.type -- get changeset type, for labeling
445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
298 447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
299 448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
300 449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proc SymbolChangesets {} {
450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # This code performs a number of paranoid checks of the
451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # database, searching for inconsistent changeset/revision
452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # information.
453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return ; # Disabled for now, bottlenecks ...
455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ upvar 1 n n ; # Counter for the checks (we print an id before
457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # the main label).
458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # The next two checks are BOTTLENECKS. In essence we are
460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # checking each symbol changeset one by one.
461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # TODO: Try to rephrase the checks to make more use of
463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # indices, set and stream operations.
464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # All revisions used by tag symbol changesets have to have the
466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # changeset's tag associated with them.
467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CheckInCS \
468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {All revisions used by tag symbol changesets have to have the changeset's tag attached to them} \
469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {does not have the tag of its symbol changeset @ attached to it} {
470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SELECT CT.name, C.cid, F.name, R.rev
471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FROM changeset C, cstype CT, revision R, file F, csrevision CR, tag T
472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERE C.type = 1 -- symbol changesets only
473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND C.src = T.sid -- tag only, linked by symbol id
474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND C.cid = CR.cid -- changeset --> its revisions
475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND R.rid = CR.rid -- look at the revisions
476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ -- and look for the tag among the attached ones.
477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND T.sid NOT IN (SELECT TB.sid
478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FROM tag TB
479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERE TB.rev = R.rid)
480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND R.fid = F.fid -- get file of revision
481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # All revisions used by branch symbol changesets have to have
484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # the changeset's branch associated with them.
485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CheckInCS \
487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {All revisions used by branch symbol changesets have to have the changeset's branch attached to them} \
488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {does not have the branch of its symbol changeset @ attached to it} {
489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SELECT CT.name, C.cid, F.name, R.rev, C.cid
490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FROM changeset C, cstype CT, revision R, file F, csrevision CR, branch B
491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERE C.type = 1 -- symbol changesets only
492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND C.src = B.sid -- branches only
493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND C.cid = CR.cid -- changeset --> its revisions
494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND R.rid = CR.rid -- look at the revisions
495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ -- and look for the branch among the attached ones.
496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND B.sid NOT IN (SELECT BB.sid
497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FROM branch BB
498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERE BB.root = R.rid)
499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AND R.fid = F.fid -- get file of revision
500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # TODO
503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # The state has to contain at least one tag symbol changeset
504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # for all known tags.
505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # TODO
507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # The state has to contain at least one branch symbol changeset
508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # for all known branches.
509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
301 510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
302 511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
303 512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
304 513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proc Check {header label sql} {
305 514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
upvar 1 n n
306 515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
set ok 1
307 516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
foreach {fname revnr} [state run $sql] {
308 517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
set ok 0
309 518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
trouble fatal "$fname <$revnr> $label"
519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log write 5 integrity "\[[format %02d [incr n]]\] [expr {$ok ? "Ok " : "Failed"}] ... $header"
521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc CheckCS {header label sql} {
525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ upvar 1 n n
526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set ok 1
527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach {ctype cid} [state run $sql] {
528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set ok 0
529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ trouble fatal "<$ctype $cid> $label"
530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log write 5 integrity "\[[format %02d [incr n]]\] [expr {$ok ? "Ok " : "Failed"}] ... $header"
532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc CheckInCS {header label sql} {
536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ upvar 1 n n
537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set ok 1
538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach {cstype csid fname revnr} [state run $sql] {
539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set ok 0
540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set b "<$cstype $csid>"
541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ trouble fatal "$fname <$revnr> [string map [list @ $b] $label]"
310 542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
311 543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
log write 5 integrity "\[[format %02d [incr n]]\] [expr {$ok ? "Ok " : "Failed"}] ... $header"
312 544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return
313 545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
314 546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
315 547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!