Fossil SCM
Honor timezones in imports from git.
Commit
1aef260f4c0a0fc74f45f624eb0cbe92b98bf6e8
Parent
1ebe4b02e426621…
1 file changed
+15
+15
| --- src/import.c | ||
| +++ src/import.c | ||
| @@ -575,22 +575,37 @@ | ||
| 575 | 575 | fossil_free(gg.zMark); |
| 576 | 576 | gg.zMark = fossil_strdup(&zLine[5]); |
| 577 | 577 | }else |
| 578 | 578 | if( memcmp(zLine, "tagger ", 7)==0 || memcmp(zLine, "committer ",10)==0 ){ |
| 579 | 579 | sqlite3_int64 secSince1970; |
| 580 | + int hastz; | |
| 581 | + char tzdir; | |
| 582 | + int tz; | |
| 580 | 583 | for(i=0; zLine[i] && zLine[i]!='<'; i++){} |
| 581 | 584 | if( zLine[i]==0 ) goto malformed_line; |
| 582 | 585 | z = &zLine[i+1]; |
| 583 | 586 | for(i=i+1; zLine[i] && zLine[i]!='>'; i++){} |
| 584 | 587 | if( zLine[i]==0 ) goto malformed_line; |
| 585 | 588 | zLine[i] = 0; |
| 586 | 589 | fossil_free(gg.zUser); |
| 587 | 590 | gg.zUser = fossil_strdup(z); |
| 588 | 591 | secSince1970 = 0; |
| 592 | + | |
| 593 | + /* We don't use sscanf here because of int64 portability issues. */ | |
| 589 | 594 | for(i=i+2; fossil_isdigit(zLine[i]); i++){ |
| 590 | 595 | secSince1970 = secSince1970*10 + zLine[i] - '0'; |
| 591 | 596 | } |
| 597 | + | |
| 598 | + /* Read in optional timezone modifier (we don't know if it's strictly | |
| 599 | + * optional, but better to be sure). */ | |
| 600 | + tzdir = '+'; | |
| 601 | + tz = 0; | |
| 602 | + hastz = sscanf(&zLine[i], " %c%d", &tzdir, &tz); | |
| 603 | + if ((hastz == 1) || (hastz > 2)) goto malformed_line; | |
| 604 | + secSince1970 += ((tzdir == '-') ? -1 : 1) * | |
| 605 | + ((tz/100)*3600 + (tz%100)*60); | |
| 606 | + | |
| 592 | 607 | fossil_free(gg.zDate); |
| 593 | 608 | gg.zDate = db_text(0, "SELECT datetime(%lld, 'unixepoch')", secSince1970); |
| 594 | 609 | gg.zDate[10] = 'T'; |
| 595 | 610 | }else |
| 596 | 611 | if( memcmp(zLine, "from ", 5)==0 ){ |
| 597 | 612 |
| --- src/import.c | |
| +++ src/import.c | |
| @@ -575,22 +575,37 @@ | |
| 575 | fossil_free(gg.zMark); |
| 576 | gg.zMark = fossil_strdup(&zLine[5]); |
| 577 | }else |
| 578 | if( memcmp(zLine, "tagger ", 7)==0 || memcmp(zLine, "committer ",10)==0 ){ |
| 579 | sqlite3_int64 secSince1970; |
| 580 | for(i=0; zLine[i] && zLine[i]!='<'; i++){} |
| 581 | if( zLine[i]==0 ) goto malformed_line; |
| 582 | z = &zLine[i+1]; |
| 583 | for(i=i+1; zLine[i] && zLine[i]!='>'; i++){} |
| 584 | if( zLine[i]==0 ) goto malformed_line; |
| 585 | zLine[i] = 0; |
| 586 | fossil_free(gg.zUser); |
| 587 | gg.zUser = fossil_strdup(z); |
| 588 | secSince1970 = 0; |
| 589 | for(i=i+2; fossil_isdigit(zLine[i]); i++){ |
| 590 | secSince1970 = secSince1970*10 + zLine[i] - '0'; |
| 591 | } |
| 592 | fossil_free(gg.zDate); |
| 593 | gg.zDate = db_text(0, "SELECT datetime(%lld, 'unixepoch')", secSince1970); |
| 594 | gg.zDate[10] = 'T'; |
| 595 | }else |
| 596 | if( memcmp(zLine, "from ", 5)==0 ){ |
| 597 |
| --- src/import.c | |
| +++ src/import.c | |
| @@ -575,22 +575,37 @@ | |
| 575 | fossil_free(gg.zMark); |
| 576 | gg.zMark = fossil_strdup(&zLine[5]); |
| 577 | }else |
| 578 | if( memcmp(zLine, "tagger ", 7)==0 || memcmp(zLine, "committer ",10)==0 ){ |
| 579 | sqlite3_int64 secSince1970; |
| 580 | int hastz; |
| 581 | char tzdir; |
| 582 | int tz; |
| 583 | for(i=0; zLine[i] && zLine[i]!='<'; i++){} |
| 584 | if( zLine[i]==0 ) goto malformed_line; |
| 585 | z = &zLine[i+1]; |
| 586 | for(i=i+1; zLine[i] && zLine[i]!='>'; i++){} |
| 587 | if( zLine[i]==0 ) goto malformed_line; |
| 588 | zLine[i] = 0; |
| 589 | fossil_free(gg.zUser); |
| 590 | gg.zUser = fossil_strdup(z); |
| 591 | secSince1970 = 0; |
| 592 | |
| 593 | /* We don't use sscanf here because of int64 portability issues. */ |
| 594 | for(i=i+2; fossil_isdigit(zLine[i]); i++){ |
| 595 | secSince1970 = secSince1970*10 + zLine[i] - '0'; |
| 596 | } |
| 597 | |
| 598 | /* Read in optional timezone modifier (we don't know if it's strictly |
| 599 | * optional, but better to be sure). */ |
| 600 | tzdir = '+'; |
| 601 | tz = 0; |
| 602 | hastz = sscanf(&zLine[i], " %c%d", &tzdir, &tz); |
| 603 | if ((hastz == 1) || (hastz > 2)) goto malformed_line; |
| 604 | secSince1970 += ((tzdir == '-') ? -1 : 1) * |
| 605 | ((tz/100)*3600 + (tz%100)*60); |
| 606 | |
| 607 | fossil_free(gg.zDate); |
| 608 | gg.zDate = db_text(0, "SELECT datetime(%lld, 'unixepoch')", secSince1970); |
| 609 | gg.zDate[10] = 'T'; |
| 610 | }else |
| 611 | if( memcmp(zLine, "from ", 5)==0 ){ |
| 612 |