Fossil SCM
Improved handling of branches and tags in the "fossil import" command.
Commit
b2f637510a69c2ae0ecd6eb017158a05402e1cd5
Parent
6f8cd72b08e3d6c…
1 file changed
+24
-3
+24
-3
| --- src/import.c | ||
| +++ src/import.c | ||
| @@ -33,11 +33,12 @@ | ||
| 33 | 33 | char *aData; /* Data content */ |
| 34 | 34 | char *zMark; /* The current mark */ |
| 35 | 35 | char *zDate; /* Date/time stamp */ |
| 36 | 36 | char *zUser; /* User name */ |
| 37 | 37 | char *zComment; /* Comment of a commit */ |
| 38 | - char *zFrom; /* from value */ | |
| 38 | + char *zFrom; /* from value as a UUID */ | |
| 39 | + char *zFromMark; /* The mark of the "from" field */ | |
| 39 | 40 | int nMerge; /* Number of merge values */ |
| 40 | 41 | int nMergeAlloc; /* Number of slots in azMerge[] */ |
| 41 | 42 | char **azMerge; /* Merge values */ |
| 42 | 43 | int nFile; /* Number of aFile values */ |
| 43 | 44 | int nFileAlloc; /* Number of slots in aFile[] */ |
| @@ -65,10 +66,11 @@ | ||
| 65 | 66 | fossil_free(gg.zMark); gg.zMark = 0; |
| 66 | 67 | fossil_free(gg.zDate); gg.zDate = 0; |
| 67 | 68 | fossil_free(gg.zUser); gg.zUser = 0; |
| 68 | 69 | fossil_free(gg.zComment); gg.zComment = 0; |
| 69 | 70 | fossil_free(gg.zFrom); gg.zFrom = 0; |
| 71 | + fossil_free(gg.zFromMark); gg.zFromMark = 0; | |
| 70 | 72 | for(i=0; i<gg.nMerge; i++){ |
| 71 | 73 | fossil_free(gg.azMerge[i]); gg.azMerge[i] = 0; |
| 72 | 74 | } |
| 73 | 75 | gg.nMerge = 0; |
| 74 | 76 | for(i=0; i<gg.nFile; i++){ |
| @@ -177,10 +179,11 @@ | ||
| 177 | 179 | ** Use data accumulated in gg from a "commit" record to add a new |
| 178 | 180 | ** manifest artifact to the BLOB table. |
| 179 | 181 | */ |
| 180 | 182 | static void finish_commit(void){ |
| 181 | 183 | int i; |
| 184 | + char *zFromBranch; | |
| 182 | 185 | Blob record, cksum; |
| 183 | 186 | qsort(gg.aFile, gg.nFile, sizeof(gg.aFile[0]), mfile_cmp); |
| 184 | 187 | blob_zero(&record); |
| 185 | 188 | blob_appendf(&record, "C %F\n", gg.zComment); |
| 186 | 189 | blob_appendf(&record, "D %s\n", gg.zDate); |
| @@ -196,11 +199,27 @@ | ||
| 196 | 199 | blob_appendf(&record, "P %s", gg.zFrom); |
| 197 | 200 | for(i=0; i<gg.nMerge; i++){ |
| 198 | 201 | blob_appendf(&record, " %s", gg.azMerge[i]); |
| 199 | 202 | } |
| 200 | 203 | blob_append(&record, "\n", 1); |
| 204 | + zFromBranch = db_text(0, "SELECT brnm FROM xbranch WHERE tname=%Q", | |
| 205 | + gg.zFromMark); | |
| 206 | + }else{ | |
| 207 | + zFromBranch = 0; | |
| 208 | + } | |
| 209 | + if( zFromBranch==0 || strcmp(zFromBranch, gg.zBranch)!=0 ){ | |
| 210 | + blob_appendf(&record, "T *branch * %F\n", gg.zBranch); | |
| 211 | + blob_appendf(&record, "T *sym-%F *\n", gg.zBranch); | |
| 212 | + if( zFromBranch ){ | |
| 213 | + blob_appendf(&record, "T -sym-%F *\n", zFromBranch); | |
| 214 | + } | |
| 215 | + } | |
| 216 | + if( gg.zFrom==0 ){ | |
| 217 | + blob_appendf(&record, "T +sym-trunk *\n"); | |
| 201 | 218 | } |
| 219 | + db_multi_exec("INSERT INTO xbranch(tname, brnm) VALUES(%Q,%Q)", | |
| 220 | + gg.zMark, gg.zBranch); | |
| 202 | 221 | blob_appendf(&record, "U %F\n", gg.zUser); |
| 203 | 222 | md5sum_blob(&record, &cksum); |
| 204 | 223 | blob_appendf(&record, "Z %b\n", &cksum); |
| 205 | 224 | fast_insert_content(&record, gg.zMark); |
| 206 | 225 | blob_reset(&record); |
| @@ -419,10 +438,12 @@ | ||
| 419 | 438 | gg.zDate = db_text(0, "SELECT datetime(%lld, 'unixepoch')", secSince1970); |
| 420 | 439 | gg.zDate[10] = 'T'; |
| 421 | 440 | }else |
| 422 | 441 | if( memcmp(zLine, "from ", 5)==0 ){ |
| 423 | 442 | trim_newline(&zLine[5]); |
| 443 | + fossil_free(gg.zFromMark); | |
| 444 | + gg.zFromMark = import_strdup(&zLine[5]); | |
| 424 | 445 | fossil_free(gg.zFrom); |
| 425 | 446 | gg.zFrom = resolve_committish(&zLine[5]); |
| 426 | 447 | }else |
| 427 | 448 | if( memcmp(zLine, "merge ", 6)==0 ){ |
| 428 | 449 | trim_newline(&zLine[6]); |
| @@ -554,12 +575,12 @@ | ||
| 554 | 575 | if( forceFlag ) unlink(g.argv[2]); |
| 555 | 576 | db_create_repository(g.argv[2]); |
| 556 | 577 | db_open_repository(g.argv[2]); |
| 557 | 578 | db_open_config(0); |
| 558 | 579 | db_multi_exec( |
| 559 | - "ATTACH ':memory:' AS mem1;" | |
| 560 | - "CREATE TABLE mem1.xtag(tname TEXT UNIQUE, trid INT, tuuid TEXT);" | |
| 580 | + "CREATE TEMP TABLE xtag(tname TEXT UNIQUE, trid INT, tuuid TEXT);" | |
| 581 | + "CREATE TEMP TABLE xbranch(tname TEXT UNIQUE, brnm TEXT);" | |
| 561 | 582 | ); |
| 562 | 583 | db_begin_transaction(); |
| 563 | 584 | db_initial_setup(0, 0, 1); |
| 564 | 585 | git_fast_import(pIn); |
| 565 | 586 | db_end_transaction(0); |
| 566 | 587 |
| --- src/import.c | |
| +++ src/import.c | |
| @@ -33,11 +33,12 @@ | |
| 33 | char *aData; /* Data content */ |
| 34 | char *zMark; /* The current mark */ |
| 35 | char *zDate; /* Date/time stamp */ |
| 36 | char *zUser; /* User name */ |
| 37 | char *zComment; /* Comment of a commit */ |
| 38 | char *zFrom; /* from value */ |
| 39 | int nMerge; /* Number of merge values */ |
| 40 | int nMergeAlloc; /* Number of slots in azMerge[] */ |
| 41 | char **azMerge; /* Merge values */ |
| 42 | int nFile; /* Number of aFile values */ |
| 43 | int nFileAlloc; /* Number of slots in aFile[] */ |
| @@ -65,10 +66,11 @@ | |
| 65 | fossil_free(gg.zMark); gg.zMark = 0; |
| 66 | fossil_free(gg.zDate); gg.zDate = 0; |
| 67 | fossil_free(gg.zUser); gg.zUser = 0; |
| 68 | fossil_free(gg.zComment); gg.zComment = 0; |
| 69 | fossil_free(gg.zFrom); gg.zFrom = 0; |
| 70 | for(i=0; i<gg.nMerge; i++){ |
| 71 | fossil_free(gg.azMerge[i]); gg.azMerge[i] = 0; |
| 72 | } |
| 73 | gg.nMerge = 0; |
| 74 | for(i=0; i<gg.nFile; i++){ |
| @@ -177,10 +179,11 @@ | |
| 177 | ** Use data accumulated in gg from a "commit" record to add a new |
| 178 | ** manifest artifact to the BLOB table. |
| 179 | */ |
| 180 | static void finish_commit(void){ |
| 181 | int i; |
| 182 | Blob record, cksum; |
| 183 | qsort(gg.aFile, gg.nFile, sizeof(gg.aFile[0]), mfile_cmp); |
| 184 | blob_zero(&record); |
| 185 | blob_appendf(&record, "C %F\n", gg.zComment); |
| 186 | blob_appendf(&record, "D %s\n", gg.zDate); |
| @@ -196,11 +199,27 @@ | |
| 196 | blob_appendf(&record, "P %s", gg.zFrom); |
| 197 | for(i=0; i<gg.nMerge; i++){ |
| 198 | blob_appendf(&record, " %s", gg.azMerge[i]); |
| 199 | } |
| 200 | blob_append(&record, "\n", 1); |
| 201 | } |
| 202 | blob_appendf(&record, "U %F\n", gg.zUser); |
| 203 | md5sum_blob(&record, &cksum); |
| 204 | blob_appendf(&record, "Z %b\n", &cksum); |
| 205 | fast_insert_content(&record, gg.zMark); |
| 206 | blob_reset(&record); |
| @@ -419,10 +438,12 @@ | |
| 419 | gg.zDate = db_text(0, "SELECT datetime(%lld, 'unixepoch')", secSince1970); |
| 420 | gg.zDate[10] = 'T'; |
| 421 | }else |
| 422 | if( memcmp(zLine, "from ", 5)==0 ){ |
| 423 | trim_newline(&zLine[5]); |
| 424 | fossil_free(gg.zFrom); |
| 425 | gg.zFrom = resolve_committish(&zLine[5]); |
| 426 | }else |
| 427 | if( memcmp(zLine, "merge ", 6)==0 ){ |
| 428 | trim_newline(&zLine[6]); |
| @@ -554,12 +575,12 @@ | |
| 554 | if( forceFlag ) unlink(g.argv[2]); |
| 555 | db_create_repository(g.argv[2]); |
| 556 | db_open_repository(g.argv[2]); |
| 557 | db_open_config(0); |
| 558 | db_multi_exec( |
| 559 | "ATTACH ':memory:' AS mem1;" |
| 560 | "CREATE TABLE mem1.xtag(tname TEXT UNIQUE, trid INT, tuuid TEXT);" |
| 561 | ); |
| 562 | db_begin_transaction(); |
| 563 | db_initial_setup(0, 0, 1); |
| 564 | git_fast_import(pIn); |
| 565 | db_end_transaction(0); |
| 566 |
| --- src/import.c | |
| +++ src/import.c | |
| @@ -33,11 +33,12 @@ | |
| 33 | char *aData; /* Data content */ |
| 34 | char *zMark; /* The current mark */ |
| 35 | char *zDate; /* Date/time stamp */ |
| 36 | char *zUser; /* User name */ |
| 37 | char *zComment; /* Comment of a commit */ |
| 38 | char *zFrom; /* from value as a UUID */ |
| 39 | char *zFromMark; /* The mark of the "from" field */ |
| 40 | int nMerge; /* Number of merge values */ |
| 41 | int nMergeAlloc; /* Number of slots in azMerge[] */ |
| 42 | char **azMerge; /* Merge values */ |
| 43 | int nFile; /* Number of aFile values */ |
| 44 | int nFileAlloc; /* Number of slots in aFile[] */ |
| @@ -65,10 +66,11 @@ | |
| 66 | fossil_free(gg.zMark); gg.zMark = 0; |
| 67 | fossil_free(gg.zDate); gg.zDate = 0; |
| 68 | fossil_free(gg.zUser); gg.zUser = 0; |
| 69 | fossil_free(gg.zComment); gg.zComment = 0; |
| 70 | fossil_free(gg.zFrom); gg.zFrom = 0; |
| 71 | fossil_free(gg.zFromMark); gg.zFromMark = 0; |
| 72 | for(i=0; i<gg.nMerge; i++){ |
| 73 | fossil_free(gg.azMerge[i]); gg.azMerge[i] = 0; |
| 74 | } |
| 75 | gg.nMerge = 0; |
| 76 | for(i=0; i<gg.nFile; i++){ |
| @@ -177,10 +179,11 @@ | |
| 179 | ** Use data accumulated in gg from a "commit" record to add a new |
| 180 | ** manifest artifact to the BLOB table. |
| 181 | */ |
| 182 | static void finish_commit(void){ |
| 183 | int i; |
| 184 | char *zFromBranch; |
| 185 | Blob record, cksum; |
| 186 | qsort(gg.aFile, gg.nFile, sizeof(gg.aFile[0]), mfile_cmp); |
| 187 | blob_zero(&record); |
| 188 | blob_appendf(&record, "C %F\n", gg.zComment); |
| 189 | blob_appendf(&record, "D %s\n", gg.zDate); |
| @@ -196,11 +199,27 @@ | |
| 199 | blob_appendf(&record, "P %s", gg.zFrom); |
| 200 | for(i=0; i<gg.nMerge; i++){ |
| 201 | blob_appendf(&record, " %s", gg.azMerge[i]); |
| 202 | } |
| 203 | blob_append(&record, "\n", 1); |
| 204 | zFromBranch = db_text(0, "SELECT brnm FROM xbranch WHERE tname=%Q", |
| 205 | gg.zFromMark); |
| 206 | }else{ |
| 207 | zFromBranch = 0; |
| 208 | } |
| 209 | if( zFromBranch==0 || strcmp(zFromBranch, gg.zBranch)!=0 ){ |
| 210 | blob_appendf(&record, "T *branch * %F\n", gg.zBranch); |
| 211 | blob_appendf(&record, "T *sym-%F *\n", gg.zBranch); |
| 212 | if( zFromBranch ){ |
| 213 | blob_appendf(&record, "T -sym-%F *\n", zFromBranch); |
| 214 | } |
| 215 | } |
| 216 | if( gg.zFrom==0 ){ |
| 217 | blob_appendf(&record, "T +sym-trunk *\n"); |
| 218 | } |
| 219 | db_multi_exec("INSERT INTO xbranch(tname, brnm) VALUES(%Q,%Q)", |
| 220 | gg.zMark, gg.zBranch); |
| 221 | blob_appendf(&record, "U %F\n", gg.zUser); |
| 222 | md5sum_blob(&record, &cksum); |
| 223 | blob_appendf(&record, "Z %b\n", &cksum); |
| 224 | fast_insert_content(&record, gg.zMark); |
| 225 | blob_reset(&record); |
| @@ -419,10 +438,12 @@ | |
| 438 | gg.zDate = db_text(0, "SELECT datetime(%lld, 'unixepoch')", secSince1970); |
| 439 | gg.zDate[10] = 'T'; |
| 440 | }else |
| 441 | if( memcmp(zLine, "from ", 5)==0 ){ |
| 442 | trim_newline(&zLine[5]); |
| 443 | fossil_free(gg.zFromMark); |
| 444 | gg.zFromMark = import_strdup(&zLine[5]); |
| 445 | fossil_free(gg.zFrom); |
| 446 | gg.zFrom = resolve_committish(&zLine[5]); |
| 447 | }else |
| 448 | if( memcmp(zLine, "merge ", 6)==0 ){ |
| 449 | trim_newline(&zLine[6]); |
| @@ -554,12 +575,12 @@ | |
| 575 | if( forceFlag ) unlink(g.argv[2]); |
| 576 | db_create_repository(g.argv[2]); |
| 577 | db_open_repository(g.argv[2]); |
| 578 | db_open_config(0); |
| 579 | db_multi_exec( |
| 580 | "CREATE TEMP TABLE xtag(tname TEXT UNIQUE, trid INT, tuuid TEXT);" |
| 581 | "CREATE TEMP TABLE xbranch(tname TEXT UNIQUE, brnm TEXT);" |
| 582 | ); |
| 583 | db_begin_transaction(); |
| 584 | db_initial_setup(0, 0, 1); |
| 585 | git_fast_import(pIn); |
| 586 | db_end_transaction(0); |
| 587 |