304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
|
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
|
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
|
# Phase I: Pull the revisions from memory and fill the graphs
# with them...
set earcs {} ; # Arcs for expansion graph
set zarcs {} ; # Arcs for zip graph
set revmap {} ; # path -> rid map to later merge uuid information
foreach {rid revnr parent child coff clen} [state run {
SELECT R.rid, R.rev, R.parent, R.child, R.coff, R.clen
FROM revision R
WHERE R.fid = $myid
foreach {rid revnr parent child coff clen cid cparent} [state run {
SELECT B.rid, R.rev, R.parent, R.child, B.coff, B.clen, B.bid, B.pid
FROM blob B
LEFT OUTER JOIN revision R
ON B.rid = R.rid
WHERE B.fid = $myid
}] {
# Main data are blobs, most will have revisions, but not
# all. The expansion graph is blob based, whereas the
# recompression graph is revision based.
if {$revnr ne ""} {
lappend revmap r$revnr $rid
lappend revmap r$revnr $rid
$zp node insert $rid
$zp node set $rid revnr $revnr
$zp node set $rid label <$revnr>
$zp node insert $rid
$zp node set $rid revnr $revnr
$zp node set $rid label <$revnr>
if {$child ne ""} {
lappend zarcs $child $rid
}
if {$child ne ""} {
lappend zarcs $child $rid
}
$ex node insert $rid
$ex node set $rid text [list $coff $clen]
$ex node set $rid revnr $revnr
$ex node set $rid label <$revnr>
if {[rev istrunkrevnr $revnr]} {
# On the trunk, this revision is a delta based on the
# child. That makes the child our predecessor.
if {$child eq ""} continue
lappend earcs $child $rid
} else {
# We fake a revnr for the blobs which have no
# On a branch this revision is a delta based on the
# revision, for use in the expansion graph.
# parent. That makes the parent our predecessor.
if {$parent eq ""} {
# Detached branch root, this is a patch based on
# the empty string.
$ex node set $rid __base__ r__empty__
set revnr ghost$cid
}
# Now the expansion graph.
$ex node insert $cid
$ex node set $cid text [list $coff $clen]
$ex node set $cid revnr $revnr
continue
}
lappend earcs $parent $rid
$ex node set $cid label <$revnr>
if {$cparent ne ""} {
# The expansion arcs go from baseline to delta
# descendant, based on the blob information.
lappend earcs $cparent $cid
}
}
# Phase II: Insert the accumulated dependencies
foreach {from to} $earcs { $ex arc insert $from $to }
foreach {from to} $zarcs { $zp arc insert $from $to }
|