@@ -34,10 +34,22 @@
34 34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char isExe; /* True if executable */
35 35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char isLink; /* True if symlink */
36 36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
37 37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
38 38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * Flags to indicate whether the import is to an existing or new repository;
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * or using the --attribute option and in the process of importing a commit or
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * tag (to determine the artifact type during fast_insert_content()).
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ enum import_mode {
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OLD_REPO,
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ NEW_REPO,
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ COMMIT_ATTR,
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ TAG_ATTR
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39 51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
40 52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** State information common to all import types.
41 53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
42 54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static struct {
43 55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zTrunkName; /* Name of trunk branch */
@@ -58,10 +70,11 @@
58 70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zPrevBranch; /* The branch of the previous check-in */
59 71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *aData; /* Data content */
60 72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zMark; /* The current mark */
61 73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zDate; /* Date/time stamp */
62 74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zUser; /* User name */
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zEmail; /* Email from Git committer string */
63 76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zComment; /* Comment of a commit */
64 77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zFrom; /* from value as a hash */
65 78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zPrevCheckin; /* Name of the previous check-in */
66 79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zFromMark; /* The mark of the "from" field */
67 80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nMerge; /* Number of merge values */
@@ -115,10 +128,11 @@
115 128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(gg.zBranch); gg.zBranch = 0;
116 129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(gg.aData); gg.aData = 0;
117 130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(gg.zMark); gg.zMark = 0;
118 131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(gg.zDate); gg.zDate = 0;
119 132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(gg.zUser); gg.zUser = 0;
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_free(gg.zEmail); gg.zEmail = 0;
120 134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(gg.zComment); gg.zComment = 0;
121 135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(gg.zFrom); gg.zFrom = 0;
122 136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(gg.zFromMark); gg.zFromMark = 0;
123 137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<gg.nMerge; i++){
124 138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(gg.azMerge[i]); gg.azMerge[i] = 0;
@@ -139,10 +153,23 @@
139 153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(&gg, 0, sizeof(gg));
140 154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
141 155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
gg.xFinish = finish_noop;
142 156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
143 157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static struct{
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zMasterName; /* Name of master branch */
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int authorFlag; /* Use author as checkin committer */
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob altRecord; /* Record to cross-check --attribute'd commits */
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ uint8_t commitType:2; /* To indicate --attribute'd manifest or tag */
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ uint8_t importType:2; /* To indicate import into new or existing repo */
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nGitAttr; /* Number of Git --attribute entries */
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct { /* Git --attribute details */
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zUser;
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zEmail;
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } *gitUserInfo;
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } ggit;
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
144 171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
145 172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Insert an artifact into the BLOB table if it isn't there already.
146 173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If zMark is not zero, create a cross-reference from that mark back
147 174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to the newly inserted artifact.
148 175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -160,10 +187,35 @@
160 187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob cmpr;
161 188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rid;
162 189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
163 190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
hname_hash(pContent, 0, &hash);
164 191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rid = db_int(0, "SELECT rid FROM blob WHERE uuid=%B", &hash);
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * If this repo has had --attribute'd commits, we need to check the blob
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * table for manifests with U cards constructed from both the username and
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * email address to ensure no duplicate entries are attempted.
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (ggit.commitType == COMMIT_ATTR && rid == 0) {
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&hash);
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ hname_hash(&ggit.altRecord, 0, &hash);
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rid = db_int(0, "SELECT rid FROM blob WHERE uuid=%B", &hash);
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * Likewise, for --attribute'd tags pop the tag artifact with the alternate
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * U card from the temp xtag2 table; both these tags and the above commit
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * artifacts are the same as pContent albeit with the {user|email} U card.
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (ggit.commitType == TAG_ATTR && rid == 0) {
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_blob(&ggit.altRecord,
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT tcontent FROM xtag2 ORDER BY ROWID ASC LIMIT 1");
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "DELETE FROM xtag2 WHERE tcontent=%Q", blob_str(&ggit.altRecord)
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&hash);
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ hname_hash(&ggit.altRecord, 0, &hash);
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rid = db_int(0, "SELECT rid FROM blob WHERE uuid=%B", &hash);
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
165 217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rid==0 ){
166 218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static Stmt ins;
167 219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( g.rcvid>0 );
168 220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_static_prepare(&ins,
169 221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"INSERT INTO blob(uuid, size, rcvid, content)"
@@ -280,11 +332,11 @@
280 332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void finish_commit(void){
281 333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
282 334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zFromBranch;
283 335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *aTCard[4]; /* Array of T cards for manifest */
284 336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nTCard = 0; /* Entries used in aTCard[] */
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Blob record, cksum;
337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob record, cksum, altCksum;
286 338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
287 339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
import_prior_files();
288 340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
qsort(gg.aFile, gg.nFile, sizeof(gg.aFile[0]), mfile_cmp);
289 341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&record);
290 342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&record, "C %F\n", gg.zComment);
@@ -342,10 +394,24 @@
342 394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<nTCard; i++) free(aTCard[i]);
343 395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
344 396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
free(zFromBranch);
345 397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_multi_exec("INSERT INTO xbranch(tname, brnm) VALUES(%Q,%Q)",
346 398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
gg.zMark, gg.zBranch);
399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * The fx_git table indicates this repo has --attribute'd commits; therefore,
401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * blob entries may exist with U cards generated from either a username or
402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * email address. Create both for cross-checking to avoid adding duplicates.
403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (db_table_exists("repository", "fx_git") &&
405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_text(0, "SELECT user FROM fx_git WHERE email=%Q", gg.zEmail)) {
406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_copy(&ggit.altRecord, &record);
407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&ggit.altRecord, "U %F\n", gg.zEmail);
408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ md5sum_blob(&ggit.altRecord, &altCksum);
409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&ggit.altRecord, "Z %b\n", &altCksum);
410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&altCksum);
411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ggit.commitType = COMMIT_ATTR;
412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
347 413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&record, "U %F\n", gg.zUser);
348 414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
md5sum_blob(&record, &cksum);
349 415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&record, "Z %b\n", &cksum);
350 416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fast_insert_content(&record, gg.zMark, 0, 1, 1);
351 417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&cksum);
@@ -359,16 +425,41 @@
359 425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
360 426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This behavior seems like a bug in git-fast-export, but it is easier
361 427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to work around the problem than to fix git-fast-export.
362 428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
363 429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( gg.tagCommit && gg.zDate && gg.zUser && gg.zFrom ){
430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob altTag;
364 431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
record.nUsed = 0
365 432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*in case fast_insert_comment() did not indirectly blob_reset() it */;
366 433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&record, "D %s\n", gg.zDate);
367 434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&record, "T +sym-%F%F%F %s\n", gimport.zBranchPre, gg.zBranch,
368 435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
gimport.zBranchSuf, gg.zPrevCheckin);
369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(&record, "U %F\n", gg.zUser);
436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * If --attribute'd commits are present, we also need tag artifacts of the
438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * other potential U card value to be cross-checked against the blob table.
439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * Due to the abovementioned Git bug, store in a different table: xtag2.
440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (ggit.commitType == COMMIT_ATTR) {
442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_copy(&altTag, &record);
443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&altTag, "U %F\n", gg.zEmail);
444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ md5sum_blob(&altTag, &altCksum);
445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&altTag, "Z %b\n", &altCksum);
446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(
447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "INSERT OR REPLACE INTO xtag2(tname, tcontent)"
448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " VALUES(%Q,%Q)", gg.zBranch, blob_str(&altTag)
449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&altCksum);
451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&altTag);
452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ggit.commitType = TAG_ATTR;
453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * IF this is a brand new repo, ONLY one type of tag artifact can exist in
456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * the blob table, which are those generated in THIS session---and these
457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * will only contain the U card created with the gg.zUser value.
458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&record, "U %F\n", ggit.importType == NEW_REPO ?
460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ gg.zUser : gg.zEmail);
370 461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
md5sum_blob(&record, &cksum);
371 462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&record, "Z %b\n", &cksum);
372 463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_multi_exec(
373 464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"INSERT OR REPLACE INTO xtag(tname, tcontent)"
374 465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" VALUES(%Q,%Q)", gg.zBranch, blob_str(&record)
@@ -540,20 +631,10 @@
540 631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
541 632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zName[i] = 0;
542 633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
543 634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
544 635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static struct{
546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zMasterName; /* Name of master branch */
547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int authorFlag; /* Use author as checkin committer */
548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nGitAttr; /* Number of Git --attribute entries */
549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct { /* Git --attribute details */
550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *zUser;
551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *zEmail;
552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- } *gitUserInfo;
553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- } ggit;
554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
555 636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
556 637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Read the git-fast-import format from pIn and insert the corresponding
557 638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** content into the database.
558 639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
559 640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void git_fast_import(FILE *pIn){
@@ -691,10 +772,11 @@
691 772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
692 773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if (ggit.nGitAttr > 0 || db_table_exists("repository", "fx_git")) {
693 774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
gg.zUser = db_text(gg.zUser,
694 775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"SELECT user FROM fx_git WHERE email=%Q", z);
695 776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ gg.zEmail = fossil_strdup(z); /* Keep email for blob table cross-check */
696 778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
secSince1970 = 0;
697 779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(zTo++; fossil_isdigit(*zTo); zTo++){
698 780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
secSince1970 = secSince1970*10 + *zTo - '0';
699 781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
700 782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(gg.zDate);
@@ -1723,10 +1805,11 @@
1723 1805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
1724 1806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void import_cmd(void){
1725 1807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zPassword;
1726 1808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
FILE *pIn;
1727 1809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Stmt q;
1810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int fd; /* To duplicate stdin file descriptor. */
1728 1811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int forceFlag = find_option("force", "f", 0)!=0;
1729 1812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int svnFlag = find_option("svn", 0, 0)!=0;
1730 1813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int gitFlag = find_option("git", 0, 0)!=0;
1731 1814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int omitRebuild = find_option("no-rebuild",0,0)!=0;
1732 1815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int omitVacuum = find_option("no-vacuum",0,0)!=0;
@@ -1826,16 +1909,45 @@
1826 1909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1827 1910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.argc==4 ){
1828 1911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIn = fossil_fopen(g.argv[3], "rb");
1829 1912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pIn==0 ) fossil_fatal("cannot open input file \"%s\"", g.argv[3]);
1830 1913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
1831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pIn = stdin;
1914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * If piping from stdin with git fast-export, we need to duplicate a fd
1916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * so we can also accept keyboard input from the user (see: block at 1931).
1917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if defined(_WIN32) || defined(_WIN64)
1919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fd = _dup(fileno(stdin));
1920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else /* if UNIX */
1921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fd = dup(fileno(stdin));
1922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* dup() hack */
1923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIn = fdopen(fd, "r");
1924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (void) freopen("/dev/tty", "r", stdin);
1832 1925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_binary_mode(pIn);
1833 1926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !incrFlag ){
1835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( forceFlag ) file_delete(g.argv[2]);
1927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * If neither --incremental nor --force has been passed but the repository
1929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * file exists, prompt the user to continue with an incremental import.
1930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (forceFlag && file_size(g.argv[2], ExtFILE) != -1)
1932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ file_delete(g.argv[2]);
1933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (!incrFlag && file_size(g.argv[2], ExtFILE) == -1) {
1836 1934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_create_repository(g.argv[2]);
1935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ggit.importType = NEW_REPO;
1936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } else if (!incrFlag && file_size(g.argv[2], ExtFILE) != -1) {
1937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob x;
1938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char c;
1939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print( "[!] Repository file exists: <%s>\n", g.argv[2]);
1940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ prompt_user(">>> Proceed with incremental import [Y/n]? ", &x);
1941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ c = blob_str(&x)[0];
1942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&x);
1943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ incrFlag = (c != 'n' && c != 'N' );
1944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (!incrFlag) {
1945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("Please either provide an alternative filename, delete "
1946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "the\nfile, or use --force to overwrite the existing repository.\n");
1947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ exit(1);
1948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1837 1949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1838 1950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_open_repository(g.argv[2]);
1839 1951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_open_config(0, 0);
1840 1952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_unprotect(PROTECT_ALL);
1841 1953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -1920,17 +2032,21 @@
1920 2032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The XTAG table records information about tags that need to be applied
1921 2033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to various branches after the import finishes. The xtag.tcontent field
1922 2034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** contains the text of an artifact that will add a tag to a check-in.
1923 2035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The git-fast-export file format might specify the same tag multiple
1924 2036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** times but only the last tag should be used. And we do not know which
1925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** occurrence of the tag is the last until the import finishes.
2037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** occurrence of the tag is the last until the import finishes. Also,
2038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** depending on whether --attribute'd, artifacts may contain U cards made
2039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** with either username or emailaddr, so store the last seen version of
2040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** each in the xtag and xtag2 tables, respectively.
1926 2041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
1927 2042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_multi_exec(
1928 2043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"CREATE TEMP TABLE xmark(tname TEXT UNIQUE, trid INT, tuuid TEXT);"
1929 2044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"CREATE INDEX temp.i_xmark ON xmark(trid);"
1930 2045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"CREATE TEMP TABLE xbranch(tname TEXT UNIQUE, brnm TEXT);"
1931 2046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"CREATE TEMP TABLE xtag(tname TEXT UNIQUE, tcontent TEXT);"
2047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "CREATE TEMP TABLE xtag2(tname TEXT UNIQUE, tcontent TEXT);"
1932 2048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
1933 2049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1934 2050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( markfile_in ){
1935 2051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
FILE *f = fossil_fopen(markfile_in, "r");
1936 2052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !f ){
@@ -1949,22 +2065,26 @@
1949 2065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to either a desired username or full contact information string.
1950 2066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
1951 2067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(ggit.nGitAttr > 0) {
1952 2068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int idx;
1953 2069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_unprotect(PROTECT_ALL);
1954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_multi_exec(
1955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "CREATE TABLE fx_git(user TEXT, email TEXT UNIQUE);"
1956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
2070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (!db_table_exists("repository", "fx_git")) {
2071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(
2072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "CREATE TABLE fx_git(user TEXT, email TEXT UNIQUE);"
2073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
2074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1957 2075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(idx = 0; idx < ggit.nGitAttr; ++idx ){
1958 2076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_multi_exec(
1959 2077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"INSERT OR IGNORE INTO fx_git(user, email) VALUES(%Q, %Q)",
1960 2078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ggit.gitUserInfo[idx].zUser, ggit.gitUserInfo[idx].zEmail
1961 2079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
1962 2080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1963 2081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_protect_pop();
1964 2082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1965 2083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
git_fast_import(pIn);
2084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (ggit.commitType == COMMIT_ATTR)
2085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ggit.commitType = TAG_ATTR;
1966 2086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_prepare(&q, "SELECT tcontent FROM xtag");
1967 2087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( db_step(&q)==SQLITE_ROW ){
1968 2088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob record;
1969 2089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_ephemeral_blob(&q, 0, &record);
1970 2090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fast_insert_content(&record, 0, 0, 0, 1);
1971 2091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!