Fossil SCM
Output appropriate error messages and abort if the date argument to the --date-override option is malformed. Ticket [dba59ec54423f19]
Commit
e0248776d31daa4b7a57593cb48f4ddda7364bb5
Parent
61ca4141ccb2560…
2 files changed
+18
-2
+2
-3
+18
-2
| --- src/checkin.c | ||
| +++ src/checkin.c | ||
| @@ -518,10 +518,27 @@ | ||
| 518 | 518 | fossil_fatal("ancestor check-in [%.10s] (%s) is younger (clock skew?)", |
| 519 | 519 | zUuid, zDate); |
| 520 | 520 | } |
| 521 | 521 | #endif |
| 522 | 522 | } |
| 523 | + | |
| 524 | +/* | |
| 525 | +** zDate should be a valid date string. Convert this string into the | |
| 526 | +** format YYYY-MM-DDTHH:MM:SS. If the string is not a valid date, | |
| 527 | +** print a fatal error and quit. | |
| 528 | +*/ | |
| 529 | +char *date_in_standard_format(const char *zInputDate){ | |
| 530 | + char *zDate = db_text(0, "SELECT datetime(%Q)", zInputDate); | |
| 531 | + if( zDate[0]==0 ){ | |
| 532 | + fossil_fatal("unrecognized date format (%s): use \"YYYY-MM-DD HH:MM:SS\"", | |
| 533 | + zInputDate); | |
| 534 | + } | |
| 535 | + assert( strlen(zDate)==19 ); | |
| 536 | + assert( zDate[10]==' ' ); | |
| 537 | + zDate[10] = 'T'; | |
| 538 | + return zDate; | |
| 539 | +} | |
| 523 | 540 | |
| 524 | 541 | /* |
| 525 | 542 | ** COMMAND: ci |
| 526 | 543 | ** COMMAND: commit |
| 527 | 544 | ** |
| @@ -739,12 +756,11 @@ | ||
| 739 | 756 | blob_zero(&manifest); |
| 740 | 757 | if( blob_size(&comment)==0 ){ |
| 741 | 758 | blob_append(&comment, "(no comment)", -1); |
| 742 | 759 | } |
| 743 | 760 | blob_appendf(&manifest, "C %F\n", blob_str(&comment)); |
| 744 | - zDate = db_text(0, "SELECT datetime('%q')", zDateOvrd ? zDateOvrd : "now"); | |
| 745 | - zDate[10] = 'T'; | |
| 761 | + zDate = date_in_standard_format(zDateOvrd ? zDateOvrd : "now"); | |
| 746 | 762 | blob_appendf(&manifest, "D %s\n", zDate); |
| 747 | 763 | zDate[10] = ' '; |
| 748 | 764 | db_prepare(&q, |
| 749 | 765 | "SELECT pathname, uuid, origname, blob.rid, isexe" |
| 750 | 766 | " FROM vfile JOIN blob ON vfile.mrid=blob.rid" |
| 751 | 767 |
| --- src/checkin.c | |
| +++ src/checkin.c | |
| @@ -518,10 +518,27 @@ | |
| 518 | fossil_fatal("ancestor check-in [%.10s] (%s) is younger (clock skew?)", |
| 519 | zUuid, zDate); |
| 520 | } |
| 521 | #endif |
| 522 | } |
| 523 | |
| 524 | /* |
| 525 | ** COMMAND: ci |
| 526 | ** COMMAND: commit |
| 527 | ** |
| @@ -739,12 +756,11 @@ | |
| 739 | blob_zero(&manifest); |
| 740 | if( blob_size(&comment)==0 ){ |
| 741 | blob_append(&comment, "(no comment)", -1); |
| 742 | } |
| 743 | blob_appendf(&manifest, "C %F\n", blob_str(&comment)); |
| 744 | zDate = db_text(0, "SELECT datetime('%q')", zDateOvrd ? zDateOvrd : "now"); |
| 745 | zDate[10] = 'T'; |
| 746 | blob_appendf(&manifest, "D %s\n", zDate); |
| 747 | zDate[10] = ' '; |
| 748 | db_prepare(&q, |
| 749 | "SELECT pathname, uuid, origname, blob.rid, isexe" |
| 750 | " FROM vfile JOIN blob ON vfile.mrid=blob.rid" |
| 751 |
| --- src/checkin.c | |
| +++ src/checkin.c | |
| @@ -518,10 +518,27 @@ | |
| 518 | fossil_fatal("ancestor check-in [%.10s] (%s) is younger (clock skew?)", |
| 519 | zUuid, zDate); |
| 520 | } |
| 521 | #endif |
| 522 | } |
| 523 | |
| 524 | /* |
| 525 | ** zDate should be a valid date string. Convert this string into the |
| 526 | ** format YYYY-MM-DDTHH:MM:SS. If the string is not a valid date, |
| 527 | ** print a fatal error and quit. |
| 528 | */ |
| 529 | char *date_in_standard_format(const char *zInputDate){ |
| 530 | char *zDate = db_text(0, "SELECT datetime(%Q)", zInputDate); |
| 531 | if( zDate[0]==0 ){ |
| 532 | fossil_fatal("unrecognized date format (%s): use \"YYYY-MM-DD HH:MM:SS\"", |
| 533 | zInputDate); |
| 534 | } |
| 535 | assert( strlen(zDate)==19 ); |
| 536 | assert( zDate[10]==' ' ); |
| 537 | zDate[10] = 'T'; |
| 538 | return zDate; |
| 539 | } |
| 540 | |
| 541 | /* |
| 542 | ** COMMAND: ci |
| 543 | ** COMMAND: commit |
| 544 | ** |
| @@ -739,12 +756,11 @@ | |
| 756 | blob_zero(&manifest); |
| 757 | if( blob_size(&comment)==0 ){ |
| 758 | blob_append(&comment, "(no comment)", -1); |
| 759 | } |
| 760 | blob_appendf(&manifest, "C %F\n", blob_str(&comment)); |
| 761 | zDate = date_in_standard_format(zDateOvrd ? zDateOvrd : "now"); |
| 762 | blob_appendf(&manifest, "D %s\n", zDate); |
| 763 | zDate[10] = ' '; |
| 764 | db_prepare(&q, |
| 765 | "SELECT pathname, uuid, origname, blob.rid, isexe" |
| 766 | " FROM vfile JOIN blob ON vfile.mrid=blob.rid" |
| 767 |
M
src/db.c
+2
-3
| --- src/db.c | ||
| +++ src/db.c | ||
| @@ -134,16 +134,16 @@ | ||
| 134 | 134 | if( busy || g.db==0 ) return; |
| 135 | 135 | busy = 1; |
| 136 | 136 | undo_rollback(); |
| 137 | 137 | if( nBegin ){ |
| 138 | 138 | sqlite3_exec(g.db, "ROLLBACK", 0, 0, 0); |
| 139 | + nBegin = 0; | |
| 139 | 140 | if( isNewRepo ){ |
| 140 | 141 | db_close(); |
| 141 | 142 | unlink(g.zRepositoryName); |
| 142 | 143 | } |
| 143 | 144 | } |
| 144 | - nBegin = 0; | |
| 145 | 145 | busy = 0; |
| 146 | 146 | } |
| 147 | 147 | |
| 148 | 148 | /* |
| 149 | 149 | ** Install a commit hook. Hooks are installed in sequence order. |
| @@ -1005,12 +1005,11 @@ | ||
| 1005 | 1005 | |
| 1006 | 1006 | if( zInitialDate ){ |
| 1007 | 1007 | int rid; |
| 1008 | 1008 | blob_zero(&manifest); |
| 1009 | 1009 | blob_appendf(&manifest, "C initial\\sempty\\scheck-in\n"); |
| 1010 | - zDate = db_text(0, "SELECT datetime(%Q)", zInitialDate); | |
| 1011 | - zDate[10]='T'; | |
| 1010 | + zDate = date_in_standard_format(zInitialDate); | |
| 1012 | 1011 | blob_appendf(&manifest, "D %s\n", zDate); |
| 1013 | 1012 | blob_appendf(&manifest, "P\n"); |
| 1014 | 1013 | md5sum_init(); |
| 1015 | 1014 | blob_appendf(&manifest, "R %s\n", md5sum_finish(0)); |
| 1016 | 1015 | blob_appendf(&manifest, "T *branch * trunk\n"); |
| 1017 | 1016 |
| --- src/db.c | |
| +++ src/db.c | |
| @@ -134,16 +134,16 @@ | |
| 134 | if( busy || g.db==0 ) return; |
| 135 | busy = 1; |
| 136 | undo_rollback(); |
| 137 | if( nBegin ){ |
| 138 | sqlite3_exec(g.db, "ROLLBACK", 0, 0, 0); |
| 139 | if( isNewRepo ){ |
| 140 | db_close(); |
| 141 | unlink(g.zRepositoryName); |
| 142 | } |
| 143 | } |
| 144 | nBegin = 0; |
| 145 | busy = 0; |
| 146 | } |
| 147 | |
| 148 | /* |
| 149 | ** Install a commit hook. Hooks are installed in sequence order. |
| @@ -1005,12 +1005,11 @@ | |
| 1005 | |
| 1006 | if( zInitialDate ){ |
| 1007 | int rid; |
| 1008 | blob_zero(&manifest); |
| 1009 | blob_appendf(&manifest, "C initial\\sempty\\scheck-in\n"); |
| 1010 | zDate = db_text(0, "SELECT datetime(%Q)", zInitialDate); |
| 1011 | zDate[10]='T'; |
| 1012 | blob_appendf(&manifest, "D %s\n", zDate); |
| 1013 | blob_appendf(&manifest, "P\n"); |
| 1014 | md5sum_init(); |
| 1015 | blob_appendf(&manifest, "R %s\n", md5sum_finish(0)); |
| 1016 | blob_appendf(&manifest, "T *branch * trunk\n"); |
| 1017 |
| --- src/db.c | |
| +++ src/db.c | |
| @@ -134,16 +134,16 @@ | |
| 134 | if( busy || g.db==0 ) return; |
| 135 | busy = 1; |
| 136 | undo_rollback(); |
| 137 | if( nBegin ){ |
| 138 | sqlite3_exec(g.db, "ROLLBACK", 0, 0, 0); |
| 139 | nBegin = 0; |
| 140 | if( isNewRepo ){ |
| 141 | db_close(); |
| 142 | unlink(g.zRepositoryName); |
| 143 | } |
| 144 | } |
| 145 | busy = 0; |
| 146 | } |
| 147 | |
| 148 | /* |
| 149 | ** Install a commit hook. Hooks are installed in sequence order. |
| @@ -1005,12 +1005,11 @@ | |
| 1005 | |
| 1006 | if( zInitialDate ){ |
| 1007 | int rid; |
| 1008 | blob_zero(&manifest); |
| 1009 | blob_appendf(&manifest, "C initial\\sempty\\scheck-in\n"); |
| 1010 | zDate = date_in_standard_format(zInitialDate); |
| 1011 | blob_appendf(&manifest, "D %s\n", zDate); |
| 1012 | blob_appendf(&manifest, "P\n"); |
| 1013 | md5sum_init(); |
| 1014 | blob_appendf(&manifest, "R %s\n", md5sum_finish(0)); |
| 1015 | blob_appendf(&manifest, "T *branch * trunk\n"); |
| 1016 |