@@ -0,0 +1,154 @@
1 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## -*- tcl -*-
2 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # # ## ### ##### ######## ############# #####################
3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Copyright (c) 2007 Andreas Kupries.
4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #
5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # This software is licensed as described in the file LICENSE, which
6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # you should have received as part of this distribution.
7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #
8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # This software consists of voluntary contributions made by many
9 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # individuals. For exact contribution history, see the revision
10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # history and logs, available at http://fossil-scm.hwaci.com/fossil
11 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # # ## ### ##### ######## ############# #####################
12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Blob storage. Each instance stores the blob data of a single rcs
14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## archive file, i.e. which file, all text ranges, delta dependencies,
15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## and associated revisions (as object references). The data is
16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## persistent and used by the import pass(es) to expand the revisions
17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## of a file.
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # # ## ### ##### ######## ############# #####################
20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Requirements
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ package require Tcl 8.4 ; # Required runtime.
23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ package require snit ; # OO system.
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ package require vc::fossil::import::cvs::state ; # State storage.
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ package require vc::fossil::import::cvs::integrity ; # State integrity checks.
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ package require vc::tools::trouble ; # Error reporting.
27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ package require vc::tools::log ; # User feedback
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #package require vc::tools::misc ; # Text formatting
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # # ## ### ##### ######## ############# #####################
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ##
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ snit::type ::vc::fossil::import::cvs::blobstore {
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # # ## ### ##### ######## #############
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Public API
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ constructor {fid} {
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set myfile $fid
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ array set myparent {}
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ array set myblob {}
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ method setid {id} {
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ integrity assert {$myfile eq ""} {Already has an id, '$myfile'}
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set myfile $id
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Remember the file revision object for the revision REVNR.
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ method add {revnr rev} {
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set myblob($revnr) $rev
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Remember that the DELTA revision is specified as a delta against
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # the BASE revision. Both are specified as revision numbers.
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ method delta {delta base} {
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set myparent($delta) $base
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Specify the text range in the archive file for the data of the
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # revision identified by REVNR.
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ method extend {revnr textrange} {
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct::list assign $textrange coff end
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set clen [expr {$end - $coff}]
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lappend myblob($revnr) $coff $clen
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Write the stored information into the persistent state.
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ method persist {} {
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ array set bids {}
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ state transaction {
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Phase I: Store the basic blob information.
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach revnr [lsort [array names myblob]] {
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct::list assign $myblob($revnr) rev coff clen
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ state run {
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ INSERT INTO blob (bid, rid, fid, coff, clen, pid)
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ VALUES (NULL, NULL, $myfile, $coff, $clen, NULL)
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set current [state id]
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set bids($revnr) $current
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Ia. Set the reference to the revision of the blob,
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # if applicable. We can have blobs without revisions,
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # their revisions were removed as irrelevant. We need
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # them however for the proper delta ordering and patch
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # application when expanding a file (-> Import passes).
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set rid [$rev id]
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {$rid eq ""} continue
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ state run {
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ UPDATE blob
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SET rid = $rid
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERE bid = $current
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Phase II: Set the parent links for deltas.
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach revnr [array names myparent] {
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set bid $bids($revnr)
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set pid $bids($myparent($revnr))
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ state run {
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ UPDATE blob
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SET pid = $pid
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERE bid = $bid
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # # ## ### ##### ######## #############
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## State
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ variable myfile {} ; # Id of the file the blobs belong to.
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ variable myparent -array {} ; # Map delta-encoded revision numbers
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # to their baseline revisions.
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ variable myblob -array {} ; # Map revision numbers to associated
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # file revision object and text
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # range.
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # # ## ### ##### ######## #############
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Configuration
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pragma -hastypeinfo no ; # no type introspection
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pragma -hasinfo no ; # no object introspection
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pragma -hastypemethods no ; # type is not relevant.
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # # ## ### ##### ######## #############
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ namespace eval ::vc::fossil::import::cvs {
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ namespace export blobstore
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ namespace eval blobstore {
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ namespace import ::vc::tools::trouble
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ namespace import ::vc::tools::log
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ namespace import ::vc::fossil::import::cvs::state
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ namespace import ::vc::fossil::import::cvs::integrity
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # # ## ### ##### ######## ############# #####################
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Ready
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ package provide vc::fossil::import: