@@ -61,60 +61,111 @@
61 61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** closeMode==2.
62 62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
63 63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void compute_leaves(int iBase, int closeMode){
64 64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Bag seen; /* Descendants seen */
65 65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Bag pending; /* Unpropagated descendants */
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Stmt q; /* Query to find children of a check-in */
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Stmt q1; /* Query to find children of a check-in */
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Stmt q2; /* Query to detect if a merge is across branches */
67 68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Stmt isBr; /* Query to check to see if a check-in starts a new branch */
68 69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Stmt ins; /* INSERT statement for a new record */
69 70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Create the LEAVES table if it does not already exist. Make sure
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** it is empty.
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
70 74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_multi_exec(
71 75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"CREATE TEMP TABLE IF NOT EXISTS leaves("
72 76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" rid INTEGER PRIMARY KEY"
73 77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
");"
74 78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"DELETE FROM leaves;"
75 79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- bag_init(&seen);
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- bag_init(&pending);
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* We are checking all descendants of iBase. If iBase==0, then
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** change iBase to be the root of the entire check-in hierarchy.
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
78 84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( iBase<=0 ){
79 85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iBase = db_int(0, "SELECT objid FROM event WHERE type='ci'"
80 86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" ORDER BY mtime LIMIT 1");
81 87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( iBase==0 ) return;
82 88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Initialize the bags. */
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bag_init(&seen);
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bag_init(&pending);
83 93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
bag_insert(&pending, iBase);
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_prepare(&q, "SELECT cid FROM plink WHERE pid=:rid");
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This query returns all non-merge children of check-in :rid */
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q1, "SELECT cid FROM plink WHERE pid=:rid AND isprim");
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This query returns all merge children of check-in :rid where
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the child and parent are on same branch. The child and
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** parent are assumed to be on same branch if they have
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the same set of propagated symbolic tags.
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q2,
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT cid FROM plink"
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE pid=:rid AND NOT isprim"
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " AND (SELECT group_concat(x) FROM ("
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " SELECT tag.tagid AS x FROM tagxref, tag"
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE tagxref.rid=:rid AND tagxref.tagtype=2"
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " AND tag.tagid=tagxref.tagid AND tagxref.srcid=0"
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " AND tag.tagname GLOB 'sym-*'"
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " ORDER BY 1))"
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " == (SELECT group_concat(x) FROM ("
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " SELECT tag.tagid AS x FROM tagxref, tag"
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE tagxref.rid=plink.cid AND tagxref.tagtype=2"
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " AND tag.tagid=tagxref.tagid AND tagxref.srcid=0"
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " AND tag.tagname GLOB 'sym-*'"
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " ORDER BY 1))"
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This query returns a single row if check-in :rid is the first
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** check-in of a new branch. In other words, it returns a row if
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** check-in :rid has the 'newbranch' tag.
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
85 124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_prepare(&isBr,
86 125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"SELECT 1 FROM tagxref WHERE rid=:rid AND tagid=%d AND tagtype=1",
87 126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
TAG_NEWBRANCH
88 127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This statement inserts check-in :rid into the LEAVES table.
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
89 131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_prepare(&ins, "INSERT OR IGNORE INTO leaves VALUES(:rid)");
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
90 133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( bag_count(&pending) ){
91 134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rid = bag_first(&pending);
92 135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int cnt = 0;
93 136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
bag_remove(&pending, rid);
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_bind_int(&q, ":rid", rid);
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( db_step(&q)==SQLITE_ROW ){
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int cid = db_column_int(&q, 0);
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_bind_int(&q1, ":rid", rid);
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( db_step(&q1)==SQLITE_ROW ){
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int cid = db_column_int(&q1, 0);
97 140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( bag_insert(&seen, cid) ){
98 141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
bag_insert(&pending, cid);
99 142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
100 143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_bind_int(&isBr, ":rid", cid);
101 144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( db_step(&isBr)==SQLITE_DONE ){
102 145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cnt++;
103 146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
104 147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_reset(&isBr);
105 148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_reset(&q);
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_reset(&q1);
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( cnt==0 ){
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_bind_int(&q2, ":rid", rid);
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( db_step(&q2)==SQLITE_ROW ){
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cnt++;
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_reset(&q2);
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
107 157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( cnt==0 ){
108 158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_bind_int(&ins, ":rid", rid);
109 159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_step(&ins);
110 160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_reset(&ins);
111 161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
112 162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
113 163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&ins);
114 164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&isBr);
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_finalize(&q);
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_finalize(&q2);
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_finalize(&q1);
116 167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
bag_clear(&pending);
117 168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
bag_clear(&seen);
118 169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( closeMode==1 ){
119 170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_multi_exec(
120 171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"DELETE FROM leaves WHERE rid IN"
121 172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!