Fossil SCM

First attempt to generate side-by-side diffs using the new formatter. This breaks the --tk option. The "fossil diff -b" and "--by" work, but side-by-side diff on /info pages and similar is currently busted. CSS is simplified, which means that skins will need to be modified. This is an incremental check-in.

drh 2021-09-01 19:53 diff-color-enhancements
Commit 4cd8a743cd0c1f9614917370486310890cb2133b60a7e104572baca713970235
+28 -93
--- src/default.css
+++ src/default.css
@@ -529,101 +529,36 @@
529529
line-height: 100%;
530530
}
531531
ul.filelist li {
532532
padding-top: 1px;
533533
}
534
-table.sbsdiffcols {
535
- width: 90%;
536
- border-spacing: 0;
537
-}
538
-table.sbsdiffcols td {
539
- padding: 0;
540
- vertical-align: top;
541
-}
542
-table.sbsdiffcols pre {
543
- margin: 0;
544
- padding: 0;
545
- border: 0;
546
- font-size: inherit;
547
- background: inherit;
548
- color: inherit;
549
-}
550
-div.difflncol {
551
- padding-right: 1em;
552
- text-align: right;
553
- color: #a0a0a0;
554
-}
555
-div.difftxtcol {
556
- width: 45em;
557
- overflow-x: auto;
558
-}
559
-div.diffmkrcol {
560
- padding: 0 1em;
561
-}
562
-span.diffchng {
563
- background-color: #c0c0ff;
564
- font-weight: bold;
565
-}
566
-span.diffadd {
567
- background-color: #c0ffc0;
568
- font-weight: bold;
569
-}
570
-span.diffrm {
571
- background-color: #ffc8c8;
572
- font-weight: bold;
573
-}
574
-span.diffhr {
575
- display: inline-block;
576
- margin: .5em 0 1em;
577
- color: #0000ff;
578
-}
579
-span.diffln {
580
- color: #a0a0a0;
581
-}
582
-pre.udiffln {
583
- color: #a0a0a0;
584
-}
585
-pre.udiffln ins {
586
- background-color: #a0e4b2;
587
- text-decoration: none;
588
-}
589
-pre.udiffln del {
590
- background-color: #ffc0c0;
591
- text-decoration: none;
592
-}
593
-pre.udifftxt ins {
594
- background-color: #dafbe1;
595
- text-decoration: none;
596
-}
597
-pre.udifftxt del {
598
- background-color: #ffe8e8;
599
- text-decoration: none;
600
-}
601
-pre.udifftxt ins mark {
602
- background-color: #a0e4b2;
603
- text-decoration: none;
604
- font-weight: bold;
605
-}
606
-pre.udifftxt del mark {
607
- background-color: #ffc0c0;
608
- text-decoration: none;
609
- font-weight: bold;
610
-}
611
-
612
-table.diff {
613
- width: 90%;
614
- border-spacing: 0;
615
-}
616
-td.diffln {
617
- text-align: right;
618
- padding: 0 0 0 1em;
619
-}
620
-td.diffsep {
621
- padding: 0 0.5em 0 0.5em;
622
-}
623
-td.difftxt {
624
- width: 100%;
534
+
535
+/* Rules governing diff layout and colors */
536
+table.diff {
537
+ width: 98%;
538
+ border-spacing: 0;
539
+}
540
+table.diff td {
541
+ vertical-align: top;
542
+}
543
+table.diff pre {
544
+ margin: 0 0 0 0;
545
+}
546
+td.diffln {
547
+ width: 1px;
548
+ text-align: right;
549
+ padding: 0 1em 0 0;
550
+}
551
+td.difflne {
552
+ padding-bottom: 0.4em;
553
+}
554
+td.diffsep {
555
+ width: 1px;
556
+ padding: 0 0.3em 0 1em;
557
+}
558
+td.difftxt pre {
559
+ overflow-x: auto;
625560
}
626561
td.diffln ins {
627562
background-color: #a0e4b2;
628563
text-decoration: none;
629564
}
@@ -647,16 +582,16 @@
647582
}
648583
td.difftxt ins {
649584
background-color: #dafbe1;
650585
text-decoration: none;
651586
}
652
-td.udifftxt ins > ins {
587
+td.difftxt ins > ins {
653588
background-color: #a0e4b2;
654589
text-decoration: none;
655590
font-weight: bold;
656591
}
657
-td.udifftxt ins mark {
592
+td.difftxt ins mark {
658593
background-color: #c0c0ff;
659594
text-decoration: none;
660595
font-weight: bold;
661596
}
662597
663598
--- src/default.css
+++ src/default.css
@@ -529,101 +529,36 @@
529 line-height: 100%;
530 }
531 ul.filelist li {
532 padding-top: 1px;
533 }
534 table.sbsdiffcols {
535 width: 90%;
536 border-spacing: 0;
537 }
538 table.sbsdiffcols td {
539 padding: 0;
540 vertical-align: top;
541 }
542 table.sbsdiffcols pre {
543 margin: 0;
544 padding: 0;
545 border: 0;
546 font-size: inherit;
547 background: inherit;
548 color: inherit;
549 }
550 div.difflncol {
551 padding-right: 1em;
552 text-align: right;
553 color: #a0a0a0;
554 }
555 div.difftxtcol {
556 width: 45em;
557 overflow-x: auto;
558 }
559 div.diffmkrcol {
560 padding: 0 1em;
561 }
562 span.diffchng {
563 background-color: #c0c0ff;
564 font-weight: bold;
565 }
566 span.diffadd {
567 background-color: #c0ffc0;
568 font-weight: bold;
569 }
570 span.diffrm {
571 background-color: #ffc8c8;
572 font-weight: bold;
573 }
574 span.diffhr {
575 display: inline-block;
576 margin: .5em 0 1em;
577 color: #0000ff;
578 }
579 span.diffln {
580 color: #a0a0a0;
581 }
582 pre.udiffln {
583 color: #a0a0a0;
584 }
585 pre.udiffln ins {
586 background-color: #a0e4b2;
587 text-decoration: none;
588 }
589 pre.udiffln del {
590 background-color: #ffc0c0;
591 text-decoration: none;
592 }
593 pre.udifftxt ins {
594 background-color: #dafbe1;
595 text-decoration: none;
596 }
597 pre.udifftxt del {
598 background-color: #ffe8e8;
599 text-decoration: none;
600 }
601 pre.udifftxt ins mark {
602 background-color: #a0e4b2;
603 text-decoration: none;
604 font-weight: bold;
605 }
606 pre.udifftxt del mark {
607 background-color: #ffc0c0;
608 text-decoration: none;
609 font-weight: bold;
610 }
611
612 table.diff {
613 width: 90%;
614 border-spacing: 0;
615 }
616 td.diffln {
617 text-align: right;
618 padding: 0 0 0 1em;
619 }
620 td.diffsep {
621 padding: 0 0.5em 0 0.5em;
622 }
623 td.difftxt {
624 width: 100%;
625 }
626 td.diffln ins {
627 background-color: #a0e4b2;
628 text-decoration: none;
629 }
@@ -647,16 +582,16 @@
647 }
648 td.difftxt ins {
649 background-color: #dafbe1;
650 text-decoration: none;
651 }
652 td.udifftxt ins > ins {
653 background-color: #a0e4b2;
654 text-decoration: none;
655 font-weight: bold;
656 }
657 td.udifftxt ins mark {
658 background-color: #c0c0ff;
659 text-decoration: none;
660 font-weight: bold;
661 }
662
663
--- src/default.css
+++ src/default.css
@@ -529,101 +529,36 @@
529 line-height: 100%;
530 }
531 ul.filelist li {
532 padding-top: 1px;
533 }
534
535 /* Rules governing diff layout and colors */
536 table.diff {
537 width: 98%;
538 border-spacing: 0;
539 }
540 table.diff td {
541 vertical-align: top;
542 }
543 table.diff pre {
544 margin: 0 0 0 0;
545 }
546 td.diffln {
547 width: 1px;
548 text-align: right;
549 padding: 0 1em 0 0;
550 }
551 td.difflne {
552 padding-bottom: 0.4em;
553 }
554 td.diffsep {
555 width: 1px;
556 padding: 0 0.3em 0 1em;
557 }
558 td.difftxt pre {
559 overflow-x: auto;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
560 }
561 td.diffln ins {
562 background-color: #a0e4b2;
563 text-decoration: none;
564 }
@@ -647,16 +582,16 @@
582 }
583 td.difftxt ins {
584 background-color: #dafbe1;
585 text-decoration: none;
586 }
587 td.difftxt ins > ins {
588 background-color: #a0e4b2;
589 text-decoration: none;
590 font-weight: bold;
591 }
592 td.difftxt ins mark {
593 background-color: #c0c0ff;
594 text-decoration: none;
595 font-weight: bold;
596 }
597
598
+185 -4
--- src/diff.c
+++ src/diff.c
@@ -1924,12 +1924,12 @@
19241924
p->nPending = 0;
19251925
}
19261926
static void dfunifiedSkip(DiffBuilder *p, unsigned int n, int isFinal){
19271927
dfunifiedFinishRow(p);
19281928
if( (p->lnLeft || p->lnRight) && !isFinal ){
1929
- blob_append(p->pOut, "<tr><td class=\"diffskip\" colspan=\"2\">"
1930
- "<hr></td><td></td><td></td></tr>\n", -1);
1929
+ blob_append(p->pOut, "<tr><td class=\"diffln difflne\">"
1930
+ "&#xfe19;</td><td></td><td></td></tr>\n", -1);
19311931
}
19321932
p->lnLeft += n;
19331933
p->lnRight += n;
19341934
}
19351935
static void dfunifiedCommon(DiffBuilder *p, const DLine *pLine){
@@ -2039,11 +2039,187 @@
20392039
p->xEnd = dfunifiedEnd;
20402040
p->lnLeft = p->lnRight = 0;
20412041
p->eState = 0;
20422042
p->nPending = 0;
20432043
p->pOut = pOut;
2044
- blob_append(pOut, "<table class=\"diff\">\n", -1);
2044
+ blob_append(pOut, "<table class=\"diff udiff\">\n", -1);
2045
+ blob_init(&p->aCol[0], 0, 0);
2046
+ blob_init(&p->aCol[1], 0, 0);
2047
+ blob_init(&p->aCol[2], 0, 0);
2048
+ blob_init(&p->aCol[3], 0, 0);
2049
+ blob_init(&p->aCol[4], 0, 0);
2050
+ return p;
2051
+}
2052
+
2053
+/************************* DiffBuilderSplit ******************************/
2054
+
2055
+/* Accumulator strategy:
2056
+**
2057
+** * Left line numbers are output directly to p->pOut
2058
+** * Left text accumulates in p->aCol[0].
2059
+** * Edit marks accumulates in p->aCol[1].
2060
+** * Right line numbers accumulate in p->aCol[2].
2061
+** * Right text accumulates in p->aCol[3].
2062
+**
2063
+** eState:
2064
+** 0 In common block
2065
+** 1 Have <del> on the left
2066
+** 2 Have <ins> on the right
2067
+** 3 Have <del> on left and <ins> on the right
2068
+*/
2069
+static void dfsplitChangeState(DiffBuilder *p, int newState){
2070
+ if( p->eState == newState ) return;
2071
+ if( (p->eState&1)==0 && (newState & 1)!=0 ){
2072
+ blob_append(p->pOut, "<del>", 5);
2073
+ blob_append(&p->aCol[0], "<del>", 5);
2074
+ p->eState |= 1;
2075
+ }else if( (p->eState&1)!=0 && (newState & 1)==0 ){
2076
+ blob_append(p->pOut, "</del>", 6);
2077
+ blob_append(&p->aCol[0], "</del>", 6);
2078
+ p->eState &= ~1;
2079
+ }
2080
+ if( (p->eState&2)==0 && (newState & 2)!=0 ){
2081
+ blob_append(&p->aCol[2], "<ins>", 5);
2082
+ blob_append(&p->aCol[3], "<ins>", 5);
2083
+ p->eState |= 2;
2084
+ }else if( (p->eState&2)!=0 && (newState & 2)==0 ){
2085
+ blob_append(&p->aCol[2], "</ins>", 6);
2086
+ blob_append(&p->aCol[3], "</ins>", 6);
2087
+ p->eState &= ~2;
2088
+ }
2089
+}
2090
+static void dfsplitFinishRow(DiffBuilder *p){
2091
+ if( blob_size(&p->aCol[0])==0 ) return;
2092
+ dfsplitChangeState(p, 0);
2093
+ blob_append(p->pOut, "</pre></td><td class=\"difftxt difftxtl\"><pre>\n",-1);
2094
+ blob_append_xfer(p->pOut, &p->aCol[0]);
2095
+ blob_append(p->pOut, "</pre></td><td class=\"diffsep\"><pre>\n", -1);
2096
+ blob_append_xfer(p->pOut, &p->aCol[1]);
2097
+ blob_append(p->pOut, "</pre></td><td class=\"diffln difflnr\"><pre>\n",-1);
2098
+ blob_append_xfer(p->pOut, &p->aCol[2]);
2099
+ blob_append(p->pOut, "</pre></td><td class=\"difftxt difftxtr\"><pre>\n",-1);
2100
+ blob_append_xfer(p->pOut, &p->aCol[3]);
2101
+ blob_append(p->pOut, "</pre></td></tr>\n", -1);
2102
+}
2103
+static void dfsplitStartRow(DiffBuilder *p){
2104
+ if( blob_size(&p->aCol[0])>0 ) return;
2105
+ blob_append(p->pOut,"<tr><td class=\"diffln difflnl\"><pre>\n", -1);
2106
+ p->eState = 0;
2107
+}
2108
+static void dfsplitSkip(DiffBuilder *p, unsigned int n, int isFinal){
2109
+ dfsplitFinishRow(p);
2110
+ if( (p->lnLeft || p->lnRight) && !isFinal ){
2111
+ blob_append(p->pOut,
2112
+ "<tr><td class=\"diffln difflnl difflne\">&#xfe19;</td>"
2113
+ "<td></td><td></td>"
2114
+ "<td class=\"diffln difflnr difflne\">&#xfe19;</td>"
2115
+ "<td/td></tr>\n", -1);
2116
+ }
2117
+ p->lnLeft += n;
2118
+ p->lnRight += n;
2119
+}
2120
+static void dfsplitCommon(DiffBuilder *p, const DLine *pLine){
2121
+ int iCol = 0;
2122
+ dfsplitStartRow(p);
2123
+ dfsplitChangeState(p, 0);
2124
+ p->lnLeft++;
2125
+ p->lnRight++;
2126
+ blob_appendf(p->pOut,"%d\n", p->lnLeft);
2127
+ jsonize_to_blob(&p->aCol[0], pLine->z, (int)pLine->n, &iCol);
2128
+ blob_append_char(&p->aCol[0], '\n');
2129
+ blob_append_char(&p->aCol[1], '\n');
2130
+ blob_appendf(&p->aCol[2],"%d\n",p->lnRight);
2131
+ jsonize_to_blob(&p->aCol[3], pLine->z, (int)pLine->n, &iCol);
2132
+ blob_append_char(&p->aCol[3], '\n');
2133
+}
2134
+static void dfsplitInsert(DiffBuilder *p, const DLine *pLine){
2135
+ int iCol = 0;
2136
+ dfsplitStartRow(p);
2137
+ dfsplitChangeState(p, 2);
2138
+ p->lnRight++;
2139
+ blob_append_char(p->pOut, '\n');
2140
+ blob_append_char(&p->aCol[0], '\n');
2141
+ blob_append(&p->aCol[1], "&gt;\n", -1);
2142
+ blob_appendf(&p->aCol[2],"%d\n", p->lnRight);
2143
+ blob_append(&p->aCol[3], "<ins>", 5);
2144
+ jsonize_to_blob(&p->aCol[3], pLine->z, (int)pLine->n, &iCol);
2145
+ blob_append(&p->aCol[3], "</ins>\n", 7);
2146
+}
2147
+static void dfsplitDelete(DiffBuilder *p, const DLine *pLine){
2148
+ int iCol = 0;
2149
+ dfsplitStartRow(p);
2150
+ dfsplitChangeState(p, 1);
2151
+ p->lnLeft++;
2152
+ blob_appendf(p->pOut,"%d\n", p->lnLeft);
2153
+ blob_append(&p->aCol[0], "<del>", 5);
2154
+ jsonize_to_blob(&p->aCol[0], pLine->z, (int)pLine->n, &iCol);
2155
+ blob_append(&p->aCol[0], "</del>\n", 7);
2156
+ blob_append(&p->aCol[1], "&lt;\n", -1);
2157
+ blob_append_char(&p->aCol[2],'\n');
2158
+ blob_append_char(&p->aCol[3],'\n');
2159
+}
2160
+static void dfsplitEdit(DiffBuilder *p, const DLine *pX, const DLine *pY){
2161
+ int i;
2162
+ int x;
2163
+ int iCol;
2164
+ ChangeSpan span;
2165
+ oneLineChange(pX, pY, &span);
2166
+ dfsplitStartRow(p);
2167
+ dfsplitChangeState(p, 3);
2168
+ p->lnLeft++;
2169
+ p->lnRight++;
2170
+ blob_appendf(p->pOut,"%d\n", p->lnLeft);
2171
+ for(i=x=iCol=0; i<span.n; i++){
2172
+ int ofst = span.a[i].iStart1;
2173
+ int len = span.a[i].iLen1;
2174
+ if( len ){
2175
+ jsonize_to_blob(&p->aCol[0], pX->z+x, ofst - x, &iCol);
2176
+ x = ofst;
2177
+ blob_append(&p->aCol[0], "<del>", 5);
2178
+ jsonize_to_blob(&p->aCol[0], pX->z+x, len, &iCol);
2179
+ x += len;
2180
+ blob_append(&p->aCol[0], "</del>", 6);
2181
+ }
2182
+ }
2183
+ if( x<pX->n ) jsonize_to_blob(&p->aCol[0], pX->z+x, pX->n - x, &iCol);
2184
+ blob_append_char(&p->aCol[0], '\n');
2185
+
2186
+ blob_append(&p->aCol[1], "|\n", 2);
2187
+
2188
+ blob_appendf(&p->aCol[2],"%d\n", p->lnRight);
2189
+ for(i=x=iCol=0; i<span.n; i++){
2190
+ int ofst = span.a[i].iStart2;
2191
+ int len = span.a[i].iLen2;
2192
+ if( len ){
2193
+ jsonize_to_blob(&p->aCol[3], pY->z+x, ofst - x, &iCol);
2194
+ x = ofst;
2195
+ blob_append(&p->aCol[3], "<ins>", 5);
2196
+ jsonize_to_blob(&p->aCol[3], pY->z+x, len, &iCol);
2197
+ x += len;
2198
+ blob_append(&p->aCol[3], "</ins>", 6);
2199
+ }
2200
+ }
2201
+ if( x<pY->n ) jsonize_to_blob(&p->aCol[3], pY->z+x, pY->n - x, &iCol);
2202
+ blob_append_char(&p->aCol[3], '\n');
2203
+}
2204
+static void dfsplitEnd(DiffBuilder *p){
2205
+ dfsplitFinishRow(p);
2206
+ blob_append(p->pOut, "</table>\n",-1);
2207
+ fossil_free(p);
2208
+}
2209
+static DiffBuilder *dfsplitNew(Blob *pOut){
2210
+ DiffBuilder *p = fossil_malloc(sizeof(*p));
2211
+ p->xSkip = dfsplitSkip;
2212
+ p->xCommon = dfsplitCommon;
2213
+ p->xInsert = dfsplitInsert;
2214
+ p->xDelete = dfsplitDelete;
2215
+ p->xEdit = dfsplitEdit;
2216
+ p->xEnd = dfsplitEnd;
2217
+ p->lnLeft = p->lnRight = 0;
2218
+ p->eState = 0;
2219
+ p->pOut = pOut;
2220
+ blob_append(pOut, "<table class=\"diff splitdiff\">\n", -1);
20452221
blob_init(&p->aCol[0], 0, 0);
20462222
blob_init(&p->aCol[1], 0, 0);
20472223
blob_init(&p->aCol[2], 0, 0);
20482224
blob_init(&p->aCol[3], 0, 0);
20492225
blob_init(&p->aCol[4], 0, 0);
@@ -2774,11 +2950,16 @@
27742950
}else if( diffFlags & DIFF_JSON ){
27752951
DiffBuilder *pBuilder = dfjsonNew(pOut);
27762952
formatDiff(&c, pRe, diffFlags, pBuilder);
27772953
blob_append_char(pOut, '\n');
27782954
}else if( diffFlags & DIFF_SIDEBYSIDE ){
2779
- sbsDiff(&c, pOut, pRe, diffFlags);
2955
+ if( diffFlags & DIFF_HTML ){
2956
+ DiffBuilder *pBuilder = dfsplitNew(pOut);
2957
+ formatDiff(&c, pRe, diffFlags, pBuilder);
2958
+ }else{
2959
+ sbsDiff(&c, pOut, pRe, diffFlags);
2960
+ }
27802961
}else if( diffFlags & DIFF_DEBUG ){
27812962
DiffBuilder *pBuilder = dfdebugNew(pOut);
27822963
formatDiff(&c, pRe, diffFlags, pBuilder);
27832964
}else if( diffFlags & DIFF_HTML ){
27842965
DiffBuilder *pBuilder = dfunifiedNew(pOut);
27852966
27862967
ADDED src/diff.js
--- src/diff.c
+++ src/diff.c
@@ -1924,12 +1924,12 @@
1924 p->nPending = 0;
1925 }
1926 static void dfunifiedSkip(DiffBuilder *p, unsigned int n, int isFinal){
1927 dfunifiedFinishRow(p);
1928 if( (p->lnLeft || p->lnRight) && !isFinal ){
1929 blob_append(p->pOut, "<tr><td class=\"diffskip\" colspan=\"2\">"
1930 "<hr></td><td></td><td></td></tr>\n", -1);
1931 }
1932 p->lnLeft += n;
1933 p->lnRight += n;
1934 }
1935 static void dfunifiedCommon(DiffBuilder *p, const DLine *pLine){
@@ -2039,11 +2039,187 @@
2039 p->xEnd = dfunifiedEnd;
2040 p->lnLeft = p->lnRight = 0;
2041 p->eState = 0;
2042 p->nPending = 0;
2043 p->pOut = pOut;
2044 blob_append(pOut, "<table class=\"diff\">\n", -1);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2045 blob_init(&p->aCol[0], 0, 0);
2046 blob_init(&p->aCol[1], 0, 0);
2047 blob_init(&p->aCol[2], 0, 0);
2048 blob_init(&p->aCol[3], 0, 0);
2049 blob_init(&p->aCol[4], 0, 0);
@@ -2774,11 +2950,16 @@
2774 }else if( diffFlags & DIFF_JSON ){
2775 DiffBuilder *pBuilder = dfjsonNew(pOut);
2776 formatDiff(&c, pRe, diffFlags, pBuilder);
2777 blob_append_char(pOut, '\n');
2778 }else if( diffFlags & DIFF_SIDEBYSIDE ){
2779 sbsDiff(&c, pOut, pRe, diffFlags);
 
 
 
 
 
2780 }else if( diffFlags & DIFF_DEBUG ){
2781 DiffBuilder *pBuilder = dfdebugNew(pOut);
2782 formatDiff(&c, pRe, diffFlags, pBuilder);
2783 }else if( diffFlags & DIFF_HTML ){
2784 DiffBuilder *pBuilder = dfunifiedNew(pOut);
2785
2786 DDED src/diff.js
--- src/diff.c
+++ src/diff.c
@@ -1924,12 +1924,12 @@
1924 p->nPending = 0;
1925 }
1926 static void dfunifiedSkip(DiffBuilder *p, unsigned int n, int isFinal){
1927 dfunifiedFinishRow(p);
1928 if( (p->lnLeft || p->lnRight) && !isFinal ){
1929 blob_append(p->pOut, "<tr><td class=\"diffln difflne\">"
1930 "&#xfe19;</td><td></td><td></td></tr>\n", -1);
1931 }
1932 p->lnLeft += n;
1933 p->lnRight += n;
1934 }
1935 static void dfunifiedCommon(DiffBuilder *p, const DLine *pLine){
@@ -2039,11 +2039,187 @@
2039 p->xEnd = dfunifiedEnd;
2040 p->lnLeft = p->lnRight = 0;
2041 p->eState = 0;
2042 p->nPending = 0;
2043 p->pOut = pOut;
2044 blob_append(pOut, "<table class=\"diff udiff\">\n", -1);
2045 blob_init(&p->aCol[0], 0, 0);
2046 blob_init(&p->aCol[1], 0, 0);
2047 blob_init(&p->aCol[2], 0, 0);
2048 blob_init(&p->aCol[3], 0, 0);
2049 blob_init(&p->aCol[4], 0, 0);
2050 return p;
2051 }
2052
2053 /************************* DiffBuilderSplit ******************************/
2054
2055 /* Accumulator strategy:
2056 **
2057 ** * Left line numbers are output directly to p->pOut
2058 ** * Left text accumulates in p->aCol[0].
2059 ** * Edit marks accumulates in p->aCol[1].
2060 ** * Right line numbers accumulate in p->aCol[2].
2061 ** * Right text accumulates in p->aCol[3].
2062 **
2063 ** eState:
2064 ** 0 In common block
2065 ** 1 Have <del> on the left
2066 ** 2 Have <ins> on the right
2067 ** 3 Have <del> on left and <ins> on the right
2068 */
2069 static void dfsplitChangeState(DiffBuilder *p, int newState){
2070 if( p->eState == newState ) return;
2071 if( (p->eState&1)==0 && (newState & 1)!=0 ){
2072 blob_append(p->pOut, "<del>", 5);
2073 blob_append(&p->aCol[0], "<del>", 5);
2074 p->eState |= 1;
2075 }else if( (p->eState&1)!=0 && (newState & 1)==0 ){
2076 blob_append(p->pOut, "</del>", 6);
2077 blob_append(&p->aCol[0], "</del>", 6);
2078 p->eState &= ~1;
2079 }
2080 if( (p->eState&2)==0 && (newState & 2)!=0 ){
2081 blob_append(&p->aCol[2], "<ins>", 5);
2082 blob_append(&p->aCol[3], "<ins>", 5);
2083 p->eState |= 2;
2084 }else if( (p->eState&2)!=0 && (newState & 2)==0 ){
2085 blob_append(&p->aCol[2], "</ins>", 6);
2086 blob_append(&p->aCol[3], "</ins>", 6);
2087 p->eState &= ~2;
2088 }
2089 }
2090 static void dfsplitFinishRow(DiffBuilder *p){
2091 if( blob_size(&p->aCol[0])==0 ) return;
2092 dfsplitChangeState(p, 0);
2093 blob_append(p->pOut, "</pre></td><td class=\"difftxt difftxtl\"><pre>\n",-1);
2094 blob_append_xfer(p->pOut, &p->aCol[0]);
2095 blob_append(p->pOut, "</pre></td><td class=\"diffsep\"><pre>\n", -1);
2096 blob_append_xfer(p->pOut, &p->aCol[1]);
2097 blob_append(p->pOut, "</pre></td><td class=\"diffln difflnr\"><pre>\n",-1);
2098 blob_append_xfer(p->pOut, &p->aCol[2]);
2099 blob_append(p->pOut, "</pre></td><td class=\"difftxt difftxtr\"><pre>\n",-1);
2100 blob_append_xfer(p->pOut, &p->aCol[3]);
2101 blob_append(p->pOut, "</pre></td></tr>\n", -1);
2102 }
2103 static void dfsplitStartRow(DiffBuilder *p){
2104 if( blob_size(&p->aCol[0])>0 ) return;
2105 blob_append(p->pOut,"<tr><td class=\"diffln difflnl\"><pre>\n", -1);
2106 p->eState = 0;
2107 }
2108 static void dfsplitSkip(DiffBuilder *p, unsigned int n, int isFinal){
2109 dfsplitFinishRow(p);
2110 if( (p->lnLeft || p->lnRight) && !isFinal ){
2111 blob_append(p->pOut,
2112 "<tr><td class=\"diffln difflnl difflne\">&#xfe19;</td>"
2113 "<td></td><td></td>"
2114 "<td class=\"diffln difflnr difflne\">&#xfe19;</td>"
2115 "<td/td></tr>\n", -1);
2116 }
2117 p->lnLeft += n;
2118 p->lnRight += n;
2119 }
2120 static void dfsplitCommon(DiffBuilder *p, const DLine *pLine){
2121 int iCol = 0;
2122 dfsplitStartRow(p);
2123 dfsplitChangeState(p, 0);
2124 p->lnLeft++;
2125 p->lnRight++;
2126 blob_appendf(p->pOut,"%d\n", p->lnLeft);
2127 jsonize_to_blob(&p->aCol[0], pLine->z, (int)pLine->n, &iCol);
2128 blob_append_char(&p->aCol[0], '\n');
2129 blob_append_char(&p->aCol[1], '\n');
2130 blob_appendf(&p->aCol[2],"%d\n",p->lnRight);
2131 jsonize_to_blob(&p->aCol[3], pLine->z, (int)pLine->n, &iCol);
2132 blob_append_char(&p->aCol[3], '\n');
2133 }
2134 static void dfsplitInsert(DiffBuilder *p, const DLine *pLine){
2135 int iCol = 0;
2136 dfsplitStartRow(p);
2137 dfsplitChangeState(p, 2);
2138 p->lnRight++;
2139 blob_append_char(p->pOut, '\n');
2140 blob_append_char(&p->aCol[0], '\n');
2141 blob_append(&p->aCol[1], "&gt;\n", -1);
2142 blob_appendf(&p->aCol[2],"%d\n", p->lnRight);
2143 blob_append(&p->aCol[3], "<ins>", 5);
2144 jsonize_to_blob(&p->aCol[3], pLine->z, (int)pLine->n, &iCol);
2145 blob_append(&p->aCol[3], "</ins>\n", 7);
2146 }
2147 static void dfsplitDelete(DiffBuilder *p, const DLine *pLine){
2148 int iCol = 0;
2149 dfsplitStartRow(p);
2150 dfsplitChangeState(p, 1);
2151 p->lnLeft++;
2152 blob_appendf(p->pOut,"%d\n", p->lnLeft);
2153 blob_append(&p->aCol[0], "<del>", 5);
2154 jsonize_to_blob(&p->aCol[0], pLine->z, (int)pLine->n, &iCol);
2155 blob_append(&p->aCol[0], "</del>\n", 7);
2156 blob_append(&p->aCol[1], "&lt;\n", -1);
2157 blob_append_char(&p->aCol[2],'\n');
2158 blob_append_char(&p->aCol[3],'\n');
2159 }
2160 static void dfsplitEdit(DiffBuilder *p, const DLine *pX, const DLine *pY){
2161 int i;
2162 int x;
2163 int iCol;
2164 ChangeSpan span;
2165 oneLineChange(pX, pY, &span);
2166 dfsplitStartRow(p);
2167 dfsplitChangeState(p, 3);
2168 p->lnLeft++;
2169 p->lnRight++;
2170 blob_appendf(p->pOut,"%d\n", p->lnLeft);
2171 for(i=x=iCol=0; i<span.n; i++){
2172 int ofst = span.a[i].iStart1;
2173 int len = span.a[i].iLen1;
2174 if( len ){
2175 jsonize_to_blob(&p->aCol[0], pX->z+x, ofst - x, &iCol);
2176 x = ofst;
2177 blob_append(&p->aCol[0], "<del>", 5);
2178 jsonize_to_blob(&p->aCol[0], pX->z+x, len, &iCol);
2179 x += len;
2180 blob_append(&p->aCol[0], "</del>", 6);
2181 }
2182 }
2183 if( x<pX->n ) jsonize_to_blob(&p->aCol[0], pX->z+x, pX->n - x, &iCol);
2184 blob_append_char(&p->aCol[0], '\n');
2185
2186 blob_append(&p->aCol[1], "|\n", 2);
2187
2188 blob_appendf(&p->aCol[2],"%d\n", p->lnRight);
2189 for(i=x=iCol=0; i<span.n; i++){
2190 int ofst = span.a[i].iStart2;
2191 int len = span.a[i].iLen2;
2192 if( len ){
2193 jsonize_to_blob(&p->aCol[3], pY->z+x, ofst - x, &iCol);
2194 x = ofst;
2195 blob_append(&p->aCol[3], "<ins>", 5);
2196 jsonize_to_blob(&p->aCol[3], pY->z+x, len, &iCol);
2197 x += len;
2198 blob_append(&p->aCol[3], "</ins>", 6);
2199 }
2200 }
2201 if( x<pY->n ) jsonize_to_blob(&p->aCol[3], pY->z+x, pY->n - x, &iCol);
2202 blob_append_char(&p->aCol[3], '\n');
2203 }
2204 static void dfsplitEnd(DiffBuilder *p){
2205 dfsplitFinishRow(p);
2206 blob_append(p->pOut, "</table>\n",-1);
2207 fossil_free(p);
2208 }
2209 static DiffBuilder *dfsplitNew(Blob *pOut){
2210 DiffBuilder *p = fossil_malloc(sizeof(*p));
2211 p->xSkip = dfsplitSkip;
2212 p->xCommon = dfsplitCommon;
2213 p->xInsert = dfsplitInsert;
2214 p->xDelete = dfsplitDelete;
2215 p->xEdit = dfsplitEdit;
2216 p->xEnd = dfsplitEnd;
2217 p->lnLeft = p->lnRight = 0;
2218 p->eState = 0;
2219 p->pOut = pOut;
2220 blob_append(pOut, "<table class=\"diff splitdiff\">\n", -1);
2221 blob_init(&p->aCol[0], 0, 0);
2222 blob_init(&p->aCol[1], 0, 0);
2223 blob_init(&p->aCol[2], 0, 0);
2224 blob_init(&p->aCol[3], 0, 0);
2225 blob_init(&p->aCol[4], 0, 0);
@@ -2774,11 +2950,16 @@
2950 }else if( diffFlags & DIFF_JSON ){
2951 DiffBuilder *pBuilder = dfjsonNew(pOut);
2952 formatDiff(&c, pRe, diffFlags, pBuilder);
2953 blob_append_char(pOut, '\n');
2954 }else if( diffFlags & DIFF_SIDEBYSIDE ){
2955 if( diffFlags & DIFF_HTML ){
2956 DiffBuilder *pBuilder = dfsplitNew(pOut);
2957 formatDiff(&c, pRe, diffFlags, pBuilder);
2958 }else{
2959 sbsDiff(&c, pOut, pRe, diffFlags);
2960 }
2961 }else if( diffFlags & DIFF_DEBUG ){
2962 DiffBuilder *pBuilder = dfdebugNew(pOut);
2963 formatDiff(&c, pRe, diffFlags, pBuilder);
2964 }else if( diffFlags & DIFF_HTML ){
2965 DiffBuilder *pBuilder = dfunifiedNew(pOut);
2966
2967 DDED src/diff.js
+23
--- a/src/diff.js
+++ b/src/diff.js
@@ -0,0 +1,23 @@
1
+/* Keeps the horizo the display of unified and side-by-side diffs.
2
+**
3
+** In all cases, the table columns tagged with "difftxt" are expanded,
4
+** where possible, to fill the width of the screen.
5
+**
6
+** For a side-by-side diff, if either column is two wide to fit on the
7
+** display, scrollbars are added. The scrollbars are linked, so that
8
+** both sides scroll together. Left and right arrows also scroll.
9
+*/
10
+(ow.addEventListener('load',function(){
11
+ var SCROLL_LEN = 25;
12
+ function initDiff(diff){
13
+ var txtCols = diff.querySelectorAll('td.difftxt');
14
+ var txtPres = diff.querySelectorAll('td.diffxt pre');
15
+ var width = 0;
16
+ if(txtPres.length>=2)Math.max(t setTimeout(checkWidth, 100)var allDifftxtPres[0].scrollLeft = txtPres[1ColCols[0].scrollLeft = txtCol/
17
+(ow.addEventListener('load',function(){
18
+ var SCROLL_LEN = 25;
19
+ function initDiff(diff){
20
+ var txtCols = diff.querySelectorAll('td.difftxt');
21
+ var txtPres = diff.querySelectorAll('td.diffxt pre');
22
+ var width = 0;
23
+ if(txtPres.length>=2)Math.max(t setTimeout(checkWidth, 100)var allDifftxtPres[0].scrollLeft = txtPres[1ColCols[0].scrollLeft = txtCol
--- a/src/diff.js
+++ b/src/diff.js
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/src/diff.js
+++ b/src/diff.js
@@ -0,0 +1,23 @@
1 /* Keeps the horizo the display of unified and side-by-side diffs.
2 **
3 ** In all cases, the table columns tagged with "difftxt" are expanded,
4 ** where possible, to fill the width of the screen.
5 **
6 ** For a side-by-side diff, if either column is two wide to fit on the
7 ** display, scrollbars are added. The scrollbars are linked, so that
8 ** both sides scroll together. Left and right arrows also scroll.
9 */
10 (ow.addEventListener('load',function(){
11 var SCROLL_LEN = 25;
12 function initDiff(diff){
13 var txtCols = diff.querySelectorAll('td.difftxt');
14 var txtPres = diff.querySelectorAll('td.diffxt pre');
15 var width = 0;
16 if(txtPres.length>=2)Math.max(t setTimeout(checkWidth, 100)var allDifftxtPres[0].scrollLeft = txtPres[1ColCols[0].scrollLeft = txtCol/
17 (ow.addEventListener('load',function(){
18 var SCROLL_LEN = 25;
19 function initDiff(diff){
20 var txtCols = diff.querySelectorAll('td.difftxt');
21 var txtPres = diff.querySelectorAll('td.diffxt pre');
22 var width = 0;
23 if(txtPres.length>=2)Math.max(t setTimeout(checkWidth, 100)var allDifftxtPres[0].scrollLeft = txtPres[1ColCols[0].scrollLeft = txtCol
+19 -86
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -185,105 +185,38 @@
185185
@ <!DOCTYPE html>
186186
@ <html>
187187
@ <head>
188188
@ <meta charset="UTF-8">
189189
@ <style>
190
-@ table.sbsdiffcols {
191
-@ width: 90%;
192
-@ border-spacing: 0;
193
-@ }
194
-@ table.sbsdiffcols td {
195
-@ padding: 0;
196
-@ vertical-align: top;
197
-@ }
198
-@ table.sbsdiffcols pre {
199
-@ margin: 0;
200
-@ padding: 0;
201
-@ border: 0;
202
-@ }
203
-@ div.difflncol {
204
-@ padding-right: 1em;
205
-@ text-align: right;
206
-@ color: #a0a0a0;
207
-@ }
208
-@ div.difftxtcol {
209
-@ width: 10em;
210
-@ overflow-x: auto;
211
-@ }
212
-@ div.diffmkrcol {
213
-@ padding: 0 1em;
214
-@ }
215
-@ span.diffchng {
216
-@ background-color: #c0c0ff;
217
-@ font-weight: bold;
218
-@ }
219
-@ span.diffadd {
220
-@ background-color: #c0ffc0;
221
-@ font-weight: bold;
222
-@ }
223
-@ span.diffrm {
224
-@ background-color: #ffc8c8;
225
-@ font-weight: bold;
226
-@ }
227
-@ span.diffhr {
228
-@ display: inline-block;
229
-@ margin: .5em 0 1em;
230
-@ color: #0000ff;
231
-@ }
232
-@ span.diffln {
233
-@ color: #a0a0a0;
234
-@ }
235
-@ table.udiff {
236
-@ width: 90%;
237
-@ border-spacing: 0;
238
-@ }
239
-@ pre.udiffln {
240
-@ color: #a0a0a0;
241
-@ }
242
-@ pre.udiffln ins {
243
-@ background-color: #a0e4b2;
244
-@ text-decoration: none;
245
-@ }
246
-@ pre.udiffln del {
247
-@ background-color: #ffc0c0;
248
-@ text-decoration: none;
249
-@ }
250
-@ pre.udifftxt ins {
251
-@ background-color: #dafbe1;
252
-@ text-decoration: none;
253
-@ }
254
-@ pre.udifftxt del {
255
-@ background-color: #ffe8e8;
256
-@ text-decoration: none;
257
-@ }
258
-@ pre.udifftxt ins mark {
259
-@ background-color: #a0e4b2;
260
-@ text-decoration: none;
261
-@ font-weight: bold;
262
-@ }
263
-@ pre.udifftxt del mark {
264
-@ background-color: #ffc0c0;
265
-@ text-decoration: none;
266
-@ font-weight: bold;
267
-@ }
268190
@ h1 {
269191
@ font-size: 150%;
270192
@ }
271193
@
272194
@ table.diff {
273
-@ width: 90%;
195
+@ width: 98%;
274196
@ border-spacing: 0;
275197
@ }
198
+@ table.diff td {
199
+@ vertical-align: top;
200
+@ }
201
+@ table.diff pre {
202
+@ margin: 0 0 0 0;
203
+@ }
276204
@ td.diffln {
205
+@ width: 1px;
277206
@ text-align: right;
278
-@ padding: 0 0 0 1em;
207
+@ padding: 0 1em 0 0;
208
+@ }
209
+@ td.difflne {
210
+@ padding-bottom: 0.4em;
279211
@ }
280212
@ td.diffsep {
281
-@ padding: 0 0.5em 0 0.5em;
213
+@ width: 1px;
214
+@ padding: 0 0.3em 0 1em;
282215
@ }
283
-@ td.difftxt {
284
-@ width: 100%;
216
+@ td.difftxt pre {
217
+@ overflow-x: auto;
285218
@ }
286219
@ td.diffln ins {
287220
@ background-color: #a0e4b2;
288221
@ text-decoration: none;
289222
@ }
@@ -401,11 +334,11 @@
401334
** of FOSSIL_BROWSER_DIFF_DELAY milliseconds, delete the temp file.
402335
*/
403336
void diff_end(u64 diffFlags, int nErr){
404337
if( (diffFlags & DIFF_WEBPAGE)!=0 ){
405338
if( diffFlags & DIFF_SIDEBYSIDE ){
406
- const unsigned char *zJs = builtin_file("sbsdiff.js", 0);
339
+ const unsigned char *zJs = builtin_file("diff.js", 0);
407340
fossil_print("<script>\n%s</script>\n", zJs);
408341
}
409342
fossil_print("%s", zWebpageEnd);
410343
}
411344
if( (diffFlags & DIFF_BROWSER)!=0 && nErr==0 ){
@@ -902,11 +835,11 @@
902835
}else{
903836
cmp = fossil_strcmp(pFromFile->zName, pToFile->zName);
904837
}
905838
if( cmp<0 ){
906839
if( file_dir_match(pFileDir, pFromFile->zName) ){
907
- if( (diffFlags & DIFF_NUMSTAT)==0 ){
840
+ if( (diffFlags & (DIFF_NUMSTAT|DIFF_HTML))==0 ){
908841
fossil_print("DELETED %s\n", pFromFile->zName);
909842
}
910843
if( asNewFlag ){
911844
diff_manifest_entry(pFromFile, 0, zDiffCmd, zBinGlob,
912845
fIncludeBinary, diffFlags);
@@ -913,11 +846,11 @@
913846
}
914847
}
915848
pFromFile = manifest_file_next(pFrom,0);
916849
}else if( cmp>0 ){
917850
if( file_dir_match(pFileDir, pToFile->zName) ){
918
- if( (diffFlags & DIFF_NUMSTAT)==0 ){
851
+ if( (diffFlags & (DIFF_NUMSTAT|DIFF_HTML))==0 ){
919852
fossil_print("ADDED %s\n", pToFile->zName);
920853
}
921854
if( asNewFlag ){
922855
diff_manifest_entry(0, pToFile, zDiffCmd, zBinGlob,
923856
fIncludeBinary, diffFlags);
924857
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -185,105 +185,38 @@
185 @ <!DOCTYPE html>
186 @ <html>
187 @ <head>
188 @ <meta charset="UTF-8">
189 @ <style>
190 @ table.sbsdiffcols {
191 @ width: 90%;
192 @ border-spacing: 0;
193 @ }
194 @ table.sbsdiffcols td {
195 @ padding: 0;
196 @ vertical-align: top;
197 @ }
198 @ table.sbsdiffcols pre {
199 @ margin: 0;
200 @ padding: 0;
201 @ border: 0;
202 @ }
203 @ div.difflncol {
204 @ padding-right: 1em;
205 @ text-align: right;
206 @ color: #a0a0a0;
207 @ }
208 @ div.difftxtcol {
209 @ width: 10em;
210 @ overflow-x: auto;
211 @ }
212 @ div.diffmkrcol {
213 @ padding: 0 1em;
214 @ }
215 @ span.diffchng {
216 @ background-color: #c0c0ff;
217 @ font-weight: bold;
218 @ }
219 @ span.diffadd {
220 @ background-color: #c0ffc0;
221 @ font-weight: bold;
222 @ }
223 @ span.diffrm {
224 @ background-color: #ffc8c8;
225 @ font-weight: bold;
226 @ }
227 @ span.diffhr {
228 @ display: inline-block;
229 @ margin: .5em 0 1em;
230 @ color: #0000ff;
231 @ }
232 @ span.diffln {
233 @ color: #a0a0a0;
234 @ }
235 @ table.udiff {
236 @ width: 90%;
237 @ border-spacing: 0;
238 @ }
239 @ pre.udiffln {
240 @ color: #a0a0a0;
241 @ }
242 @ pre.udiffln ins {
243 @ background-color: #a0e4b2;
244 @ text-decoration: none;
245 @ }
246 @ pre.udiffln del {
247 @ background-color: #ffc0c0;
248 @ text-decoration: none;
249 @ }
250 @ pre.udifftxt ins {
251 @ background-color: #dafbe1;
252 @ text-decoration: none;
253 @ }
254 @ pre.udifftxt del {
255 @ background-color: #ffe8e8;
256 @ text-decoration: none;
257 @ }
258 @ pre.udifftxt ins mark {
259 @ background-color: #a0e4b2;
260 @ text-decoration: none;
261 @ font-weight: bold;
262 @ }
263 @ pre.udifftxt del mark {
264 @ background-color: #ffc0c0;
265 @ text-decoration: none;
266 @ font-weight: bold;
267 @ }
268 @ h1 {
269 @ font-size: 150%;
270 @ }
271 @
272 @ table.diff {
273 @ width: 90%;
274 @ border-spacing: 0;
275 @ }
 
 
 
 
 
 
276 @ td.diffln {
 
277 @ text-align: right;
278 @ padding: 0 0 0 1em;
 
 
 
279 @ }
280 @ td.diffsep {
281 @ padding: 0 0.5em 0 0.5em;
 
282 @ }
283 @ td.difftxt {
284 @ width: 100%;
285 @ }
286 @ td.diffln ins {
287 @ background-color: #a0e4b2;
288 @ text-decoration: none;
289 @ }
@@ -401,11 +334,11 @@
401 ** of FOSSIL_BROWSER_DIFF_DELAY milliseconds, delete the temp file.
402 */
403 void diff_end(u64 diffFlags, int nErr){
404 if( (diffFlags & DIFF_WEBPAGE)!=0 ){
405 if( diffFlags & DIFF_SIDEBYSIDE ){
406 const unsigned char *zJs = builtin_file("sbsdiff.js", 0);
407 fossil_print("<script>\n%s</script>\n", zJs);
408 }
409 fossil_print("%s", zWebpageEnd);
410 }
411 if( (diffFlags & DIFF_BROWSER)!=0 && nErr==0 ){
@@ -902,11 +835,11 @@
902 }else{
903 cmp = fossil_strcmp(pFromFile->zName, pToFile->zName);
904 }
905 if( cmp<0 ){
906 if( file_dir_match(pFileDir, pFromFile->zName) ){
907 if( (diffFlags & DIFF_NUMSTAT)==0 ){
908 fossil_print("DELETED %s\n", pFromFile->zName);
909 }
910 if( asNewFlag ){
911 diff_manifest_entry(pFromFile, 0, zDiffCmd, zBinGlob,
912 fIncludeBinary, diffFlags);
@@ -913,11 +846,11 @@
913 }
914 }
915 pFromFile = manifest_file_next(pFrom,0);
916 }else if( cmp>0 ){
917 if( file_dir_match(pFileDir, pToFile->zName) ){
918 if( (diffFlags & DIFF_NUMSTAT)==0 ){
919 fossil_print("ADDED %s\n", pToFile->zName);
920 }
921 if( asNewFlag ){
922 diff_manifest_entry(0, pToFile, zDiffCmd, zBinGlob,
923 fIncludeBinary, diffFlags);
924
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -185,105 +185,38 @@
185 @ <!DOCTYPE html>
186 @ <html>
187 @ <head>
188 @ <meta charset="UTF-8">
189 @ <style>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
190 @ h1 {
191 @ font-size: 150%;
192 @ }
193 @
194 @ table.diff {
195 @ width: 98%;
196 @ border-spacing: 0;
197 @ }
198 @ table.diff td {
199 @ vertical-align: top;
200 @ }
201 @ table.diff pre {
202 @ margin: 0 0 0 0;
203 @ }
204 @ td.diffln {
205 @ width: 1px;
206 @ text-align: right;
207 @ padding: 0 1em 0 0;
208 @ }
209 @ td.difflne {
210 @ padding-bottom: 0.4em;
211 @ }
212 @ td.diffsep {
213 @ width: 1px;
214 @ padding: 0 0.3em 0 1em;
215 @ }
216 @ td.difftxt pre {
217 @ overflow-x: auto;
218 @ }
219 @ td.diffln ins {
220 @ background-color: #a0e4b2;
221 @ text-decoration: none;
222 @ }
@@ -401,11 +334,11 @@
334 ** of FOSSIL_BROWSER_DIFF_DELAY milliseconds, delete the temp file.
335 */
336 void diff_end(u64 diffFlags, int nErr){
337 if( (diffFlags & DIFF_WEBPAGE)!=0 ){
338 if( diffFlags & DIFF_SIDEBYSIDE ){
339 const unsigned char *zJs = builtin_file("diff.js", 0);
340 fossil_print("<script>\n%s</script>\n", zJs);
341 }
342 fossil_print("%s", zWebpageEnd);
343 }
344 if( (diffFlags & DIFF_BROWSER)!=0 && nErr==0 ){
@@ -902,11 +835,11 @@
835 }else{
836 cmp = fossil_strcmp(pFromFile->zName, pToFile->zName);
837 }
838 if( cmp<0 ){
839 if( file_dir_match(pFileDir, pFromFile->zName) ){
840 if( (diffFlags & (DIFF_NUMSTAT|DIFF_HTML))==0 ){
841 fossil_print("DELETED %s\n", pFromFile->zName);
842 }
843 if( asNewFlag ){
844 diff_manifest_entry(pFromFile, 0, zDiffCmd, zBinGlob,
845 fIncludeBinary, diffFlags);
@@ -913,11 +846,11 @@
846 }
847 }
848 pFromFile = manifest_file_next(pFrom,0);
849 }else if( cmp>0 ){
850 if( file_dir_match(pFileDir, pToFile->zName) ){
851 if( (diffFlags & (DIFF_NUMSTAT|DIFF_HTML))==0 ){
852 fossil_print("ADDED %s\n", pToFile->zName);
853 }
854 if( asNewFlag ){
855 diff_manifest_entry(0, pToFile, zDiffCmd, zBinGlob,
856 fIncludeBinary, diffFlags);
857
--- src/main.mk
+++ src/main.mk
@@ -218,10 +218,11 @@
218218
$(SRCDIR)/alerts/plunk.wav \
219219
$(SRCDIR)/chat.js \
220220
$(SRCDIR)/ci_edit.js \
221221
$(SRCDIR)/copybtn.js \
222222
$(SRCDIR)/default.css \
223
+ $(SRCDIR)/diff.js \
223224
$(SRCDIR)/diff.tcl \
224225
$(SRCDIR)/forum.js \
225226
$(SRCDIR)/fossil.bootstrap.js \
226227
$(SRCDIR)/fossil.confirmer.js \
227228
$(SRCDIR)/fossil.copybutton.js \
228229
--- src/main.mk
+++ src/main.mk
@@ -218,10 +218,11 @@
218 $(SRCDIR)/alerts/plunk.wav \
219 $(SRCDIR)/chat.js \
220 $(SRCDIR)/ci_edit.js \
221 $(SRCDIR)/copybtn.js \
222 $(SRCDIR)/default.css \
 
223 $(SRCDIR)/diff.tcl \
224 $(SRCDIR)/forum.js \
225 $(SRCDIR)/fossil.bootstrap.js \
226 $(SRCDIR)/fossil.confirmer.js \
227 $(SRCDIR)/fossil.copybutton.js \
228
--- src/main.mk
+++ src/main.mk
@@ -218,10 +218,11 @@
218 $(SRCDIR)/alerts/plunk.wav \
219 $(SRCDIR)/chat.js \
220 $(SRCDIR)/ci_edit.js \
221 $(SRCDIR)/copybtn.js \
222 $(SRCDIR)/default.css \
223 $(SRCDIR)/diff.js \
224 $(SRCDIR)/diff.tcl \
225 $(SRCDIR)/forum.js \
226 $(SRCDIR)/fossil.bootstrap.js \
227 $(SRCDIR)/fossil.confirmer.js \
228 $(SRCDIR)/fossil.copybutton.js \
229
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -627,10 +627,11 @@
627627
$(SRCDIR)/alerts/plunk.wav \
628628
$(SRCDIR)/chat.js \
629629
$(SRCDIR)/ci_edit.js \
630630
$(SRCDIR)/copybtn.js \
631631
$(SRCDIR)/default.css \
632
+ $(SRCDIR)/diff.js \
632633
$(SRCDIR)/diff.tcl \
633634
$(SRCDIR)/forum.js \
634635
$(SRCDIR)/fossil.bootstrap.js \
635636
$(SRCDIR)/fossil.confirmer.js \
636637
$(SRCDIR)/fossil.copybutton.js \
637638
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -627,10 +627,11 @@
627 $(SRCDIR)/alerts/plunk.wav \
628 $(SRCDIR)/chat.js \
629 $(SRCDIR)/ci_edit.js \
630 $(SRCDIR)/copybtn.js \
631 $(SRCDIR)/default.css \
 
632 $(SRCDIR)/diff.tcl \
633 $(SRCDIR)/forum.js \
634 $(SRCDIR)/fossil.bootstrap.js \
635 $(SRCDIR)/fossil.confirmer.js \
636 $(SRCDIR)/fossil.copybutton.js \
637
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -627,10 +627,11 @@
627 $(SRCDIR)/alerts/plunk.wav \
628 $(SRCDIR)/chat.js \
629 $(SRCDIR)/ci_edit.js \
630 $(SRCDIR)/copybtn.js \
631 $(SRCDIR)/default.css \
632 $(SRCDIR)/diff.js \
633 $(SRCDIR)/diff.tcl \
634 $(SRCDIR)/forum.js \
635 $(SRCDIR)/fossil.bootstrap.js \
636 $(SRCDIR)/fossil.confirmer.js \
637 $(SRCDIR)/fossil.copybutton.js \
638
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -569,10 +569,11 @@
569569
"$(SRCDIR)\alerts\plunk.wav" \
570570
"$(SRCDIR)\chat.js" \
571571
"$(SRCDIR)\ci_edit.js" \
572572
"$(SRCDIR)\copybtn.js" \
573573
"$(SRCDIR)\default.css" \
574
+ "$(SRCDIR)\diff.js" \
574575
"$(SRCDIR)\diff.tcl" \
575576
"$(SRCDIR)\forum.js" \
576577
"$(SRCDIR)\fossil.bootstrap.js" \
577578
"$(SRCDIR)\fossil.confirmer.js" \
578579
"$(SRCDIR)\fossil.copybutton.js" \
@@ -1177,10 +1178,11 @@
11771178
echo "$(SRCDIR)\alerts/plunk.wav" >> $@
11781179
echo "$(SRCDIR)\chat.js" >> $@
11791180
echo "$(SRCDIR)\ci_edit.js" >> $@
11801181
echo "$(SRCDIR)\copybtn.js" >> $@
11811182
echo "$(SRCDIR)\default.css" >> $@
1183
+ echo "$(SRCDIR)\diff.js" >> $@
11821184
echo "$(SRCDIR)\diff.tcl" >> $@
11831185
echo "$(SRCDIR)\forum.js" >> $@
11841186
echo "$(SRCDIR)\fossil.bootstrap.js" >> $@
11851187
echo "$(SRCDIR)\fossil.confirmer.js" >> $@
11861188
echo "$(SRCDIR)\fossil.copybutton.js" >> $@
11871189
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -569,10 +569,11 @@
569 "$(SRCDIR)\alerts\plunk.wav" \
570 "$(SRCDIR)\chat.js" \
571 "$(SRCDIR)\ci_edit.js" \
572 "$(SRCDIR)\copybtn.js" \
573 "$(SRCDIR)\default.css" \
 
574 "$(SRCDIR)\diff.tcl" \
575 "$(SRCDIR)\forum.js" \
576 "$(SRCDIR)\fossil.bootstrap.js" \
577 "$(SRCDIR)\fossil.confirmer.js" \
578 "$(SRCDIR)\fossil.copybutton.js" \
@@ -1177,10 +1178,11 @@
1177 echo "$(SRCDIR)\alerts/plunk.wav" >> $@
1178 echo "$(SRCDIR)\chat.js" >> $@
1179 echo "$(SRCDIR)\ci_edit.js" >> $@
1180 echo "$(SRCDIR)\copybtn.js" >> $@
1181 echo "$(SRCDIR)\default.css" >> $@
 
1182 echo "$(SRCDIR)\diff.tcl" >> $@
1183 echo "$(SRCDIR)\forum.js" >> $@
1184 echo "$(SRCDIR)\fossil.bootstrap.js" >> $@
1185 echo "$(SRCDIR)\fossil.confirmer.js" >> $@
1186 echo "$(SRCDIR)\fossil.copybutton.js" >> $@
1187
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -569,10 +569,11 @@
569 "$(SRCDIR)\alerts\plunk.wav" \
570 "$(SRCDIR)\chat.js" \
571 "$(SRCDIR)\ci_edit.js" \
572 "$(SRCDIR)\copybtn.js" \
573 "$(SRCDIR)\default.css" \
574 "$(SRCDIR)\diff.js" \
575 "$(SRCDIR)\diff.tcl" \
576 "$(SRCDIR)\forum.js" \
577 "$(SRCDIR)\fossil.bootstrap.js" \
578 "$(SRCDIR)\fossil.confirmer.js" \
579 "$(SRCDIR)\fossil.copybutton.js" \
@@ -1177,10 +1178,11 @@
1178 echo "$(SRCDIR)\alerts/plunk.wav" >> $@
1179 echo "$(SRCDIR)\chat.js" >> $@
1180 echo "$(SRCDIR)\ci_edit.js" >> $@
1181 echo "$(SRCDIR)\copybtn.js" >> $@
1182 echo "$(SRCDIR)\default.css" >> $@
1183 echo "$(SRCDIR)\diff.js" >> $@
1184 echo "$(SRCDIR)\diff.tcl" >> $@
1185 echo "$(SRCDIR)\forum.js" >> $@
1186 echo "$(SRCDIR)\fossil.bootstrap.js" >> $@
1187 echo "$(SRCDIR)\fossil.confirmer.js" >> $@
1188 echo "$(SRCDIR)\fossil.copybutton.js" >> $@
1189

Keyboard Shortcuts

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