Fossil SCM

Honor timezones in imports from git.

drh 2014-01-13 23:41 trunk merge
Commit 1aef260f4c0a0fc74f45f624eb0cbe92b98bf6e8
1 file changed +15
+15
--- src/import.c
+++ src/import.c
@@ -575,22 +575,37 @@
575575
fossil_free(gg.zMark);
576576
gg.zMark = fossil_strdup(&zLine[5]);
577577
}else
578578
if( memcmp(zLine, "tagger ", 7)==0 || memcmp(zLine, "committer ",10)==0 ){
579579
sqlite3_int64 secSince1970;
580
+ int hastz;
581
+ char tzdir;
582
+ int tz;
580583
for(i=0; zLine[i] && zLine[i]!='<'; i++){}
581584
if( zLine[i]==0 ) goto malformed_line;
582585
z = &zLine[i+1];
583586
for(i=i+1; zLine[i] && zLine[i]!='>'; i++){}
584587
if( zLine[i]==0 ) goto malformed_line;
585588
zLine[i] = 0;
586589
fossil_free(gg.zUser);
587590
gg.zUser = fossil_strdup(z);
588591
secSince1970 = 0;
592
+
593
+ /* We don't use sscanf here because of int64 portability issues. */
589594
for(i=i+2; fossil_isdigit(zLine[i]); i++){
590595
secSince1970 = secSince1970*10 + zLine[i] - '0';
591596
}
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
+
592607
fossil_free(gg.zDate);
593608
gg.zDate = db_text(0, "SELECT datetime(%lld, 'unixepoch')", secSince1970);
594609
gg.zDate[10] = 'T';
595610
}else
596611
if( memcmp(zLine, "from ", 5)==0 ){
597612
--- 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

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button