Fossil SCM

Text diff output is now more like other common unix tools in its handling of missing files.

drh 2023-12-31 18:23 trunk merge
Commit caa6ad39db44392953b47626b381b0c54d5216db57e73aa1c4195984906dd242
+16 -2
--- src/checkin.c
+++ src/checkin.c
@@ -1365,17 +1365,31 @@
13651365
'#'
13661366
);
13671367
diff_options(&DCfg, 0, 1);
13681368
DCfg.diffFlags |= DIFF_VERBOSE;
13691369
if( g.aCommitFile ){
1370
+ Stmt q;
1371
+ Blob sql = BLOB_INITIALIZER;
13701372
FileDirList *diffFiles;
13711373
int i;
13721374
for(i=0; g.aCommitFile[i]!=0; ++i){}
13731375
diffFiles = fossil_malloc_zero((i+1) * sizeof(*diffFiles));
13741376
for(i=0; g.aCommitFile[i]!=0; ++i){
1375
- diffFiles[i].zName = db_text(0,
1376
- "SELECT pathname FROM vfile WHERE id=%d", g.aCommitFile[i]);
1377
+ blob_append_sql(&sql,
1378
+ "SELECT pathname, deleted, rid WHERE id=%d",
1379
+ g.aCommitFile[i]);
1380
+ db_prepare(&q, "%s", blob_sql_text(&sql));
1381
+ blob_reset(&sql);
1382
+ assert( db_step(&q)==SQLITE_ROW );
1383
+ diffFiles[i].zName = fossil_strdup(db_column_text(&q, 0));
1384
+ DCfg.diffFlags &= (~DIFF_FILE_MASK);
1385
+ if( db_column_int(&q, 1) ){
1386
+ DCfg.diffFlags |= DIFF_FILE_DELETED;
1387
+ }else if( db_column_int(&q, 2)==0 ){
1388
+ DCfg.diffFlags |= DIFF_FILE_ADDED;
1389
+ }
1390
+ db_finalize(&q);
13771391
if( fossil_strcmp(diffFiles[i].zName, "." )==0 ){
13781392
diffFiles[0].zName[0] = '.';
13791393
diffFiles[0].zName[1] = 0;
13801394
break;
13811395
}
13821396
--- src/checkin.c
+++ src/checkin.c
@@ -1365,17 +1365,31 @@
1365 '#'
1366 );
1367 diff_options(&DCfg, 0, 1);
1368 DCfg.diffFlags |= DIFF_VERBOSE;
1369 if( g.aCommitFile ){
 
 
1370 FileDirList *diffFiles;
1371 int i;
1372 for(i=0; g.aCommitFile[i]!=0; ++i){}
1373 diffFiles = fossil_malloc_zero((i+1) * sizeof(*diffFiles));
1374 for(i=0; g.aCommitFile[i]!=0; ++i){
1375 diffFiles[i].zName = db_text(0,
1376 "SELECT pathname FROM vfile WHERE id=%d", g.aCommitFile[i]);
 
 
 
 
 
 
 
 
 
 
 
 
1377 if( fossil_strcmp(diffFiles[i].zName, "." )==0 ){
1378 diffFiles[0].zName[0] = '.';
1379 diffFiles[0].zName[1] = 0;
1380 break;
1381 }
1382
--- src/checkin.c
+++ src/checkin.c
@@ -1365,17 +1365,31 @@
1365 '#'
1366 );
1367 diff_options(&DCfg, 0, 1);
1368 DCfg.diffFlags |= DIFF_VERBOSE;
1369 if( g.aCommitFile ){
1370 Stmt q;
1371 Blob sql = BLOB_INITIALIZER;
1372 FileDirList *diffFiles;
1373 int i;
1374 for(i=0; g.aCommitFile[i]!=0; ++i){}
1375 diffFiles = fossil_malloc_zero((i+1) * sizeof(*diffFiles));
1376 for(i=0; g.aCommitFile[i]!=0; ++i){
1377 blob_append_sql(&sql,
1378 "SELECT pathname, deleted, rid WHERE id=%d",
1379 g.aCommitFile[i]);
1380 db_prepare(&q, "%s", blob_sql_text(&sql));
1381 blob_reset(&sql);
1382 assert( db_step(&q)==SQLITE_ROW );
1383 diffFiles[i].zName = fossil_strdup(db_column_text(&q, 0));
1384 DCfg.diffFlags &= (~DIFF_FILE_MASK);
1385 if( db_column_int(&q, 1) ){
1386 DCfg.diffFlags |= DIFF_FILE_DELETED;
1387 }else if( db_column_int(&q, 2)==0 ){
1388 DCfg.diffFlags |= DIFF_FILE_ADDED;
1389 }
1390 db_finalize(&q);
1391 if( fossil_strcmp(diffFiles[i].zName, "." )==0 ){
1392 diffFiles[0].zName[0] = '.';
1393 diffFiles[0].zName[1] = 0;
1394 break;
1395 }
1396
+7
--- src/diff.c
+++ src/diff.c
@@ -50,10 +50,17 @@
5050
#define DIFF_TCL 0x00080000 /* For the --tk option */
5151
#define DIFF_INCBINARY 0x00100000 /* The --diff-binary option */
5252
#define DIFF_SHOW_VERS 0x00200000 /* Show compared versions */
5353
#define DIFF_DARKMODE 0x00400000 /* Use dark mode for HTML */
5454
55
+/*
56
+** Per file information that may influence output.
57
+*/
58
+#define DIFF_FILE_ADDED 0x40000000 /* Added or rename destination */
59
+#define DIFF_FILE_DELETED 0x80000000 /* Deleted or rename source */
60
+#define DIFF_FILE_MASK 0xc0000000 /* Used for clearing file flags */
61
+
5562
/*
5663
** These error messages are shared in multiple locations. They are defined
5764
** here for consistency.
5865
*/
5966
#define DIFF_CANNOT_COMPUTE_BINARY \
6067
--- src/diff.c
+++ src/diff.c
@@ -50,10 +50,17 @@
50 #define DIFF_TCL 0x00080000 /* For the --tk option */
51 #define DIFF_INCBINARY 0x00100000 /* The --diff-binary option */
52 #define DIFF_SHOW_VERS 0x00200000 /* Show compared versions */
53 #define DIFF_DARKMODE 0x00400000 /* Use dark mode for HTML */
54
 
 
 
 
 
 
 
55 /*
56 ** These error messages are shared in multiple locations. They are defined
57 ** here for consistency.
58 */
59 #define DIFF_CANNOT_COMPUTE_BINARY \
60
--- src/diff.c
+++ src/diff.c
@@ -50,10 +50,17 @@
50 #define DIFF_TCL 0x00080000 /* For the --tk option */
51 #define DIFF_INCBINARY 0x00100000 /* The --diff-binary option */
52 #define DIFF_SHOW_VERS 0x00200000 /* Show compared versions */
53 #define DIFF_DARKMODE 0x00400000 /* Use dark mode for HTML */
54
55 /*
56 ** Per file information that may influence output.
57 */
58 #define DIFF_FILE_ADDED 0x40000000 /* Added or rename destination */
59 #define DIFF_FILE_DELETED 0x80000000 /* Deleted or rename source */
60 #define DIFF_FILE_MASK 0xc0000000 /* Used for clearing file flags */
61
62 /*
63 ** These error messages are shared in multiple locations. They are defined
64 ** here for consistency.
65 */
66 #define DIFF_CANNOT_COMPUTE_BINARY \
67
+7
--- src/diff.c
+++ src/diff.c
@@ -50,10 +50,17 @@
5050
#define DIFF_TCL 0x00080000 /* For the --tk option */
5151
#define DIFF_INCBINARY 0x00100000 /* The --diff-binary option */
5252
#define DIFF_SHOW_VERS 0x00200000 /* Show compared versions */
5353
#define DIFF_DARKMODE 0x00400000 /* Use dark mode for HTML */
5454
55
+/*
56
+** Per file information that may influence output.
57
+*/
58
+#define DIFF_FILE_ADDED 0x40000000 /* Added or rename destination */
59
+#define DIFF_FILE_DELETED 0x80000000 /* Deleted or rename source */
60
+#define DIFF_FILE_MASK 0xc0000000 /* Used for clearing file flags */
61
+
5562
/*
5663
** These error messages are shared in multiple locations. They are defined
5764
** here for consistency.
5865
*/
5966
#define DIFF_CANNOT_COMPUTE_BINARY \
6067
--- src/diff.c
+++ src/diff.c
@@ -50,10 +50,17 @@
50 #define DIFF_TCL 0x00080000 /* For the --tk option */
51 #define DIFF_INCBINARY 0x00100000 /* The --diff-binary option */
52 #define DIFF_SHOW_VERS 0x00200000 /* Show compared versions */
53 #define DIFF_DARKMODE 0x00400000 /* Use dark mode for HTML */
54
 
 
 
 
 
 
 
55 /*
56 ** These error messages are shared in multiple locations. They are defined
57 ** here for consistency.
58 */
59 #define DIFF_CANNOT_COMPUTE_BINARY \
60
--- src/diff.c
+++ src/diff.c
@@ -50,10 +50,17 @@
50 #define DIFF_TCL 0x00080000 /* For the --tk option */
51 #define DIFF_INCBINARY 0x00100000 /* The --diff-binary option */
52 #define DIFF_SHOW_VERS 0x00200000 /* Show compared versions */
53 #define DIFF_DARKMODE 0x00400000 /* Use dark mode for HTML */
54
55 /*
56 ** Per file information that may influence output.
57 */
58 #define DIFF_FILE_ADDED 0x40000000 /* Added or rename destination */
59 #define DIFF_FILE_DELETED 0x80000000 /* Deleted or rename source */
60 #define DIFF_FILE_MASK 0xc0000000 /* Used for clearing file flags */
61
62 /*
63 ** These error messages are shared in multiple locations. They are defined
64 ** here for consistency.
65 */
66 #define DIFF_CANNOT_COMPUTE_BINARY \
67
+45 -9
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -161,10 +161,13 @@
161161
const char *zRight, /* Name of the right file */
162162
DiffConfig *pCfg, /* Diff configuration */
163163
Blob *pOut /* Write to this blob, or stdout of this is NULL */
164164
){
165165
u64 diffFlags = pCfg->diffFlags;
166
+ /* Standardize on /dev/null, regardless of platform. */
167
+ if( pCfg->diffFlags & DIFF_FILE_ADDED ) zLeft = "/dev/null";
168
+ if( pCfg->diffFlags & DIFF_FILE_DELETED ) zRight = "/dev/null";
166169
if( diffFlags & (DIFF_BRIEF|DIFF_RAW) ){
167170
/* no-op */
168171
}else if( diffFlags & DIFF_DEBUG ){
169172
blob_appendf(pOut, "FILE-LEFT %s\nFILE-RIGHT %s\n", zLeft, zRight);
170173
}else if( diffFlags & DIFF_WEBPAGE ){
@@ -574,11 +577,11 @@
574577
Blob file2; /* Content of zFile2 */
575578
const char *zName2; /* Name of zFile2 for display */
576579
577580
/* Read content of zFile2 into memory */
578581
blob_zero(&file2);
579
- if( file_size(zFile2, ExtFILE)<0 ){
582
+ if( pCfg->diffFlags & DIFF_FILE_DELETED || file_size(zFile2, ExtFILE)<0 ){
580583
zName2 = NULL_DEVICE;
581584
}else{
582585
blob_read_from_file(&file2, zFile2, ExtFILE);
583586
zName2 = zName;
584587
}
@@ -605,10 +608,11 @@
605608
/* Release memory resources */
606609
blob_reset(&file2);
607610
}else{
608611
Blob nameFile1; /* Name of temporary file to old pFile1 content */
609612
Blob cmd; /* Text of command to run */
613
+ int useTempfile = 1;
610614
611615
if( (pCfg->diffFlags & DIFF_INCBINARY)==0 ){
612616
Blob file2;
613617
if( looks_like_binary(pFile1) ){
614618
fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY);
@@ -636,11 +640,20 @@
636640
}
637641
638642
/* Construct a temporary file to hold pFile1 based on the name of
639643
** zFile2 */
640644
file_tempname(&nameFile1, zFile2, "orig");
641
- blob_write_to_file(pFile1, blob_str(&nameFile1));
645
+#if !defined(_WIN32)
646
+ /* On Unix, use /dev/null for added or deleted files. */
647
+ if( pCfg->diffFlags & DIFF_FILE_ADDED ){
648
+ blob_init(&nameFile1, NULL_DEVICE, -1);
649
+ useTempfile = 0;
650
+ }else if( pCfg->diffFlags & DIFF_FILE_DELETED ){
651
+ zFile2 = NULL_DEVICE;
652
+ }
653
+#endif
654
+ if( useTempfile ) blob_write_to_file(pFile1, blob_str(&nameFile1));
642655
643656
/* Construct the external diff command */
644657
blob_zero(&cmd);
645658
blob_append(&cmd, pCfg->zDiffCmd, -1);
646659
if( pCfg->diffFlags & DIFF_INVERT ){
@@ -653,11 +666,11 @@
653666
654667
/* Run the external diff command */
655668
fossil_system(blob_str(&cmd));
656669
657670
/* Delete the temporary file and clean up memory used */
658
- file_delete(blob_str(&nameFile1));
671
+ if( useTempfile ) file_delete(blob_str(&nameFile1));
659672
blob_reset(&nameFile1);
660673
blob_reset(&cmd);
661674
}
662675
}
663676
@@ -697,10 +710,12 @@
697710
blob_reset(&out);
698711
}else{
699712
Blob cmd;
700713
Blob temp1;
701714
Blob temp2;
715
+ int useTempfile1 = 1;
716
+ int useTempfile2 = 1;
702717
703718
if( (pCfg->diffFlags & DIFF_INCBINARY)==0 ){
704719
if( looks_like_binary(pFile1) || looks_like_binary(pFile2) ){
705720
fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY);
706721
return;
@@ -714,15 +729,25 @@
714729
}
715730
glob_free(pBinary);
716731
}
717732
}
718733
719
- /* Construct a temporary file names */
734
+ /* Construct temporary file names */
720735
file_tempname(&temp1, zName, "before");
721736
file_tempname(&temp2, zName, "after");
722
- blob_write_to_file(pFile1, blob_str(&temp1));
723
- blob_write_to_file(pFile2, blob_str(&temp2));
737
+#if !defined(_WIN32)
738
+ /* On Unix, use /dev/null for added or deleted files. */
739
+ if( pCfg->diffFlags & DIFF_FILE_ADDED ){
740
+ useTempfile1 = 0;
741
+ blob_init(&temp1, NULL_DEVICE, -1);
742
+ }else if( pCfg->diffFlags & DIFF_FILE_DELETED ){
743
+ useTempfile2 = 0;
744
+ blob_init(&temp2, NULL_DEVICE, -1);
745
+ }
746
+#endif
747
+ if( useTempfile1 ) blob_write_to_file(pFile1, blob_str(&temp1));
748
+ if( useTempfile2 ) blob_write_to_file(pFile2, blob_str(&temp2));
724749
725750
/* Construct the external diff command */
726751
blob_zero(&cmd);
727752
blob_append(&cmd, pCfg->zDiffCmd, -1);
728753
blob_append_escaped_arg(&cmd, blob_str(&temp1), 1);
@@ -730,12 +755,12 @@
730755
731756
/* Run the external diff command */
732757
fossil_system(blob_str(&cmd));
733758
734759
/* Delete the temporary file and clean up memory used */
735
- file_delete(blob_str(&temp1));
736
- file_delete(blob_str(&temp2));
760
+ if( useTempfile1 ) file_delete(blob_str(&temp1));
761
+ if( useTempfile2 ) file_delete(blob_str(&temp2));
737762
738763
blob_reset(&temp1);
739764
blob_reset(&temp2);
740765
blob_reset(&cmd);
741766
}
@@ -850,26 +875,31 @@
850875
}else{
851876
blob_set(&fname, g.zLocalRoot);
852877
blob_append(&fname, zPathname, -1);
853878
}
854879
zFullName = blob_str(&fname);
880
+ pCfg->diffFlags &= (~DIFF_FILE_MASK);
855881
if( isDeleted ){
856882
if( !isNumStat ){ fossil_print("DELETED %s\n", zPathname); }
883
+ pCfg->diffFlags |= DIFF_FILE_DELETED;
857884
if( !asNewFile ){ showDiff = 0; zFullName = NULL_DEVICE; }
858885
}else if( file_access(zFullName, F_OK) ){
859886
if( !isNumStat ){ fossil_print("MISSING %s\n", zPathname); }
860887
if( !asNewFile ){ showDiff = 0; }
861888
}else if( isNew ){
862889
if( !isNumStat ){ fossil_print("ADDED %s\n", zPathname); }
890
+ pCfg->diffFlags |= DIFF_FILE_ADDED;
863891
srcid = 0;
864892
if( !asNewFile ){ showDiff = 0; }
865893
}else if( isChnged==3 ){
866894
if( !isNumStat ){ fossil_print("ADDED_BY_MERGE %s\n", zPathname); }
895
+ pCfg->diffFlags |= DIFF_FILE_ADDED;
867896
srcid = 0;
868897
if( !asNewFile ){ showDiff = 0; }
869898
}else if( isChnged==5 ){
870899
if( !isNumStat ){ fossil_print("ADDED_BY_INTEGRATE %s\n", zPathname); }
900
+ pCfg->diffFlags |= DIFF_FILE_ADDED;
871901
srcid = 0;
872902
if( !asNewFile ){ showDiff = 0; }
873903
}
874904
if( showDiff ){
875905
Blob content;
@@ -882,11 +912,14 @@
882912
if( srcid>0 ){
883913
content_get(srcid, &content);
884914
}else{
885915
blob_zero(&content);
886916
}
887
- if( isChnged==0 || !file_same_as_blob(&content, zFullName) ){
917
+ if( isChnged==0
918
+ || pCfg->diffFlags & DIFF_FILE_DELETED
919
+ || !file_same_as_blob(&content, zFullName)
920
+ ){
888921
diff_print_index(zPathname, pCfg, pOut);
889922
diff_file(&content, zFullName, zPathname, pCfg, pOut);
890923
}
891924
blob_reset(&content);
892925
}
@@ -1011,15 +1044,17 @@
10111044
}else if( pToFile==0 ){
10121045
cmp = -1;
10131046
}else{
10141047
cmp = fossil_strcmp(pFromFile->zName, pToFile->zName);
10151048
}
1049
+ pCfg->diffFlags &= (~DIFF_FILE_MASK);
10161050
if( cmp<0 ){
10171051
if( file_dir_match(pFileDir, pFromFile->zName) ){
10181052
if( (pCfg->diffFlags & (DIFF_NUMSTAT|DIFF_HTML))==0 ){
10191053
fossil_print("DELETED %s\n", pFromFile->zName);
10201054
}
1055
+ pCfg->diffFlags |= DIFF_FILE_DELETED;
10211056
if( asNewFlag ){
10221057
diff_manifest_entry(pFromFile, 0, pCfg);
10231058
}
10241059
}
10251060
pFromFile = manifest_file_next(pFrom,0);
@@ -1027,10 +1062,11 @@
10271062
if( file_dir_match(pFileDir, pToFile->zName) ){
10281063
if( (pCfg->diffFlags &
10291064
(DIFF_NUMSTAT|DIFF_HTML|DIFF_TCL|DIFF_JSON))==0 ){
10301065
fossil_print("ADDED %s\n", pToFile->zName);
10311066
}
1067
+ pCfg->diffFlags |= DIFF_FILE_ADDED;
10321068
if( asNewFlag ){
10331069
diff_manifest_entry(0, pToFile, pCfg);
10341070
}
10351071
}
10361072
pToFile = manifest_file_next(pTo,0);
10371073
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -161,10 +161,13 @@
161 const char *zRight, /* Name of the right file */
162 DiffConfig *pCfg, /* Diff configuration */
163 Blob *pOut /* Write to this blob, or stdout of this is NULL */
164 ){
165 u64 diffFlags = pCfg->diffFlags;
 
 
 
166 if( diffFlags & (DIFF_BRIEF|DIFF_RAW) ){
167 /* no-op */
168 }else if( diffFlags & DIFF_DEBUG ){
169 blob_appendf(pOut, "FILE-LEFT %s\nFILE-RIGHT %s\n", zLeft, zRight);
170 }else if( diffFlags & DIFF_WEBPAGE ){
@@ -574,11 +577,11 @@
574 Blob file2; /* Content of zFile2 */
575 const char *zName2; /* Name of zFile2 for display */
576
577 /* Read content of zFile2 into memory */
578 blob_zero(&file2);
579 if( file_size(zFile2, ExtFILE)<0 ){
580 zName2 = NULL_DEVICE;
581 }else{
582 blob_read_from_file(&file2, zFile2, ExtFILE);
583 zName2 = zName;
584 }
@@ -605,10 +608,11 @@
605 /* Release memory resources */
606 blob_reset(&file2);
607 }else{
608 Blob nameFile1; /* Name of temporary file to old pFile1 content */
609 Blob cmd; /* Text of command to run */
 
610
611 if( (pCfg->diffFlags & DIFF_INCBINARY)==0 ){
612 Blob file2;
613 if( looks_like_binary(pFile1) ){
614 fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY);
@@ -636,11 +640,20 @@
636 }
637
638 /* Construct a temporary file to hold pFile1 based on the name of
639 ** zFile2 */
640 file_tempname(&nameFile1, zFile2, "orig");
641 blob_write_to_file(pFile1, blob_str(&nameFile1));
 
 
 
 
 
 
 
 
 
642
643 /* Construct the external diff command */
644 blob_zero(&cmd);
645 blob_append(&cmd, pCfg->zDiffCmd, -1);
646 if( pCfg->diffFlags & DIFF_INVERT ){
@@ -653,11 +666,11 @@
653
654 /* Run the external diff command */
655 fossil_system(blob_str(&cmd));
656
657 /* Delete the temporary file and clean up memory used */
658 file_delete(blob_str(&nameFile1));
659 blob_reset(&nameFile1);
660 blob_reset(&cmd);
661 }
662 }
663
@@ -697,10 +710,12 @@
697 blob_reset(&out);
698 }else{
699 Blob cmd;
700 Blob temp1;
701 Blob temp2;
 
 
702
703 if( (pCfg->diffFlags & DIFF_INCBINARY)==0 ){
704 if( looks_like_binary(pFile1) || looks_like_binary(pFile2) ){
705 fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY);
706 return;
@@ -714,15 +729,25 @@
714 }
715 glob_free(pBinary);
716 }
717 }
718
719 /* Construct a temporary file names */
720 file_tempname(&temp1, zName, "before");
721 file_tempname(&temp2, zName, "after");
722 blob_write_to_file(pFile1, blob_str(&temp1));
723 blob_write_to_file(pFile2, blob_str(&temp2));
 
 
 
 
 
 
 
 
 
 
724
725 /* Construct the external diff command */
726 blob_zero(&cmd);
727 blob_append(&cmd, pCfg->zDiffCmd, -1);
728 blob_append_escaped_arg(&cmd, blob_str(&temp1), 1);
@@ -730,12 +755,12 @@
730
731 /* Run the external diff command */
732 fossil_system(blob_str(&cmd));
733
734 /* Delete the temporary file and clean up memory used */
735 file_delete(blob_str(&temp1));
736 file_delete(blob_str(&temp2));
737
738 blob_reset(&temp1);
739 blob_reset(&temp2);
740 blob_reset(&cmd);
741 }
@@ -850,26 +875,31 @@
850 }else{
851 blob_set(&fname, g.zLocalRoot);
852 blob_append(&fname, zPathname, -1);
853 }
854 zFullName = blob_str(&fname);
 
855 if( isDeleted ){
856 if( !isNumStat ){ fossil_print("DELETED %s\n", zPathname); }
 
857 if( !asNewFile ){ showDiff = 0; zFullName = NULL_DEVICE; }
858 }else if( file_access(zFullName, F_OK) ){
859 if( !isNumStat ){ fossil_print("MISSING %s\n", zPathname); }
860 if( !asNewFile ){ showDiff = 0; }
861 }else if( isNew ){
862 if( !isNumStat ){ fossil_print("ADDED %s\n", zPathname); }
 
863 srcid = 0;
864 if( !asNewFile ){ showDiff = 0; }
865 }else if( isChnged==3 ){
866 if( !isNumStat ){ fossil_print("ADDED_BY_MERGE %s\n", zPathname); }
 
867 srcid = 0;
868 if( !asNewFile ){ showDiff = 0; }
869 }else if( isChnged==5 ){
870 if( !isNumStat ){ fossil_print("ADDED_BY_INTEGRATE %s\n", zPathname); }
 
871 srcid = 0;
872 if( !asNewFile ){ showDiff = 0; }
873 }
874 if( showDiff ){
875 Blob content;
@@ -882,11 +912,14 @@
882 if( srcid>0 ){
883 content_get(srcid, &content);
884 }else{
885 blob_zero(&content);
886 }
887 if( isChnged==0 || !file_same_as_blob(&content, zFullName) ){
 
 
 
888 diff_print_index(zPathname, pCfg, pOut);
889 diff_file(&content, zFullName, zPathname, pCfg, pOut);
890 }
891 blob_reset(&content);
892 }
@@ -1011,15 +1044,17 @@
1011 }else if( pToFile==0 ){
1012 cmp = -1;
1013 }else{
1014 cmp = fossil_strcmp(pFromFile->zName, pToFile->zName);
1015 }
 
1016 if( cmp<0 ){
1017 if( file_dir_match(pFileDir, pFromFile->zName) ){
1018 if( (pCfg->diffFlags & (DIFF_NUMSTAT|DIFF_HTML))==0 ){
1019 fossil_print("DELETED %s\n", pFromFile->zName);
1020 }
 
1021 if( asNewFlag ){
1022 diff_manifest_entry(pFromFile, 0, pCfg);
1023 }
1024 }
1025 pFromFile = manifest_file_next(pFrom,0);
@@ -1027,10 +1062,11 @@
1027 if( file_dir_match(pFileDir, pToFile->zName) ){
1028 if( (pCfg->diffFlags &
1029 (DIFF_NUMSTAT|DIFF_HTML|DIFF_TCL|DIFF_JSON))==0 ){
1030 fossil_print("ADDED %s\n", pToFile->zName);
1031 }
 
1032 if( asNewFlag ){
1033 diff_manifest_entry(0, pToFile, pCfg);
1034 }
1035 }
1036 pToFile = manifest_file_next(pTo,0);
1037
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -161,10 +161,13 @@
161 const char *zRight, /* Name of the right file */
162 DiffConfig *pCfg, /* Diff configuration */
163 Blob *pOut /* Write to this blob, or stdout of this is NULL */
164 ){
165 u64 diffFlags = pCfg->diffFlags;
166 /* Standardize on /dev/null, regardless of platform. */
167 if( pCfg->diffFlags & DIFF_FILE_ADDED ) zLeft = "/dev/null";
168 if( pCfg->diffFlags & DIFF_FILE_DELETED ) zRight = "/dev/null";
169 if( diffFlags & (DIFF_BRIEF|DIFF_RAW) ){
170 /* no-op */
171 }else if( diffFlags & DIFF_DEBUG ){
172 blob_appendf(pOut, "FILE-LEFT %s\nFILE-RIGHT %s\n", zLeft, zRight);
173 }else if( diffFlags & DIFF_WEBPAGE ){
@@ -574,11 +577,11 @@
577 Blob file2; /* Content of zFile2 */
578 const char *zName2; /* Name of zFile2 for display */
579
580 /* Read content of zFile2 into memory */
581 blob_zero(&file2);
582 if( pCfg->diffFlags & DIFF_FILE_DELETED || file_size(zFile2, ExtFILE)<0 ){
583 zName2 = NULL_DEVICE;
584 }else{
585 blob_read_from_file(&file2, zFile2, ExtFILE);
586 zName2 = zName;
587 }
@@ -605,10 +608,11 @@
608 /* Release memory resources */
609 blob_reset(&file2);
610 }else{
611 Blob nameFile1; /* Name of temporary file to old pFile1 content */
612 Blob cmd; /* Text of command to run */
613 int useTempfile = 1;
614
615 if( (pCfg->diffFlags & DIFF_INCBINARY)==0 ){
616 Blob file2;
617 if( looks_like_binary(pFile1) ){
618 fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY);
@@ -636,11 +640,20 @@
640 }
641
642 /* Construct a temporary file to hold pFile1 based on the name of
643 ** zFile2 */
644 file_tempname(&nameFile1, zFile2, "orig");
645 #if !defined(_WIN32)
646 /* On Unix, use /dev/null for added or deleted files. */
647 if( pCfg->diffFlags & DIFF_FILE_ADDED ){
648 blob_init(&nameFile1, NULL_DEVICE, -1);
649 useTempfile = 0;
650 }else if( pCfg->diffFlags & DIFF_FILE_DELETED ){
651 zFile2 = NULL_DEVICE;
652 }
653 #endif
654 if( useTempfile ) blob_write_to_file(pFile1, blob_str(&nameFile1));
655
656 /* Construct the external diff command */
657 blob_zero(&cmd);
658 blob_append(&cmd, pCfg->zDiffCmd, -1);
659 if( pCfg->diffFlags & DIFF_INVERT ){
@@ -653,11 +666,11 @@
666
667 /* Run the external diff command */
668 fossil_system(blob_str(&cmd));
669
670 /* Delete the temporary file and clean up memory used */
671 if( useTempfile ) file_delete(blob_str(&nameFile1));
672 blob_reset(&nameFile1);
673 blob_reset(&cmd);
674 }
675 }
676
@@ -697,10 +710,12 @@
710 blob_reset(&out);
711 }else{
712 Blob cmd;
713 Blob temp1;
714 Blob temp2;
715 int useTempfile1 = 1;
716 int useTempfile2 = 1;
717
718 if( (pCfg->diffFlags & DIFF_INCBINARY)==0 ){
719 if( looks_like_binary(pFile1) || looks_like_binary(pFile2) ){
720 fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY);
721 return;
@@ -714,15 +729,25 @@
729 }
730 glob_free(pBinary);
731 }
732 }
733
734 /* Construct temporary file names */
735 file_tempname(&temp1, zName, "before");
736 file_tempname(&temp2, zName, "after");
737 #if !defined(_WIN32)
738 /* On Unix, use /dev/null for added or deleted files. */
739 if( pCfg->diffFlags & DIFF_FILE_ADDED ){
740 useTempfile1 = 0;
741 blob_init(&temp1, NULL_DEVICE, -1);
742 }else if( pCfg->diffFlags & DIFF_FILE_DELETED ){
743 useTempfile2 = 0;
744 blob_init(&temp2, NULL_DEVICE, -1);
745 }
746 #endif
747 if( useTempfile1 ) blob_write_to_file(pFile1, blob_str(&temp1));
748 if( useTempfile2 ) blob_write_to_file(pFile2, blob_str(&temp2));
749
750 /* Construct the external diff command */
751 blob_zero(&cmd);
752 blob_append(&cmd, pCfg->zDiffCmd, -1);
753 blob_append_escaped_arg(&cmd, blob_str(&temp1), 1);
@@ -730,12 +755,12 @@
755
756 /* Run the external diff command */
757 fossil_system(blob_str(&cmd));
758
759 /* Delete the temporary file and clean up memory used */
760 if( useTempfile1 ) file_delete(blob_str(&temp1));
761 if( useTempfile2 ) file_delete(blob_str(&temp2));
762
763 blob_reset(&temp1);
764 blob_reset(&temp2);
765 blob_reset(&cmd);
766 }
@@ -850,26 +875,31 @@
875 }else{
876 blob_set(&fname, g.zLocalRoot);
877 blob_append(&fname, zPathname, -1);
878 }
879 zFullName = blob_str(&fname);
880 pCfg->diffFlags &= (~DIFF_FILE_MASK);
881 if( isDeleted ){
882 if( !isNumStat ){ fossil_print("DELETED %s\n", zPathname); }
883 pCfg->diffFlags |= DIFF_FILE_DELETED;
884 if( !asNewFile ){ showDiff = 0; zFullName = NULL_DEVICE; }
885 }else if( file_access(zFullName, F_OK) ){
886 if( !isNumStat ){ fossil_print("MISSING %s\n", zPathname); }
887 if( !asNewFile ){ showDiff = 0; }
888 }else if( isNew ){
889 if( !isNumStat ){ fossil_print("ADDED %s\n", zPathname); }
890 pCfg->diffFlags |= DIFF_FILE_ADDED;
891 srcid = 0;
892 if( !asNewFile ){ showDiff = 0; }
893 }else if( isChnged==3 ){
894 if( !isNumStat ){ fossil_print("ADDED_BY_MERGE %s\n", zPathname); }
895 pCfg->diffFlags |= DIFF_FILE_ADDED;
896 srcid = 0;
897 if( !asNewFile ){ showDiff = 0; }
898 }else if( isChnged==5 ){
899 if( !isNumStat ){ fossil_print("ADDED_BY_INTEGRATE %s\n", zPathname); }
900 pCfg->diffFlags |= DIFF_FILE_ADDED;
901 srcid = 0;
902 if( !asNewFile ){ showDiff = 0; }
903 }
904 if( showDiff ){
905 Blob content;
@@ -882,11 +912,14 @@
912 if( srcid>0 ){
913 content_get(srcid, &content);
914 }else{
915 blob_zero(&content);
916 }
917 if( isChnged==0
918 || pCfg->diffFlags & DIFF_FILE_DELETED
919 || !file_same_as_blob(&content, zFullName)
920 ){
921 diff_print_index(zPathname, pCfg, pOut);
922 diff_file(&content, zFullName, zPathname, pCfg, pOut);
923 }
924 blob_reset(&content);
925 }
@@ -1011,15 +1044,17 @@
1044 }else if( pToFile==0 ){
1045 cmp = -1;
1046 }else{
1047 cmp = fossil_strcmp(pFromFile->zName, pToFile->zName);
1048 }
1049 pCfg->diffFlags &= (~DIFF_FILE_MASK);
1050 if( cmp<0 ){
1051 if( file_dir_match(pFileDir, pFromFile->zName) ){
1052 if( (pCfg->diffFlags & (DIFF_NUMSTAT|DIFF_HTML))==0 ){
1053 fossil_print("DELETED %s\n", pFromFile->zName);
1054 }
1055 pCfg->diffFlags |= DIFF_FILE_DELETED;
1056 if( asNewFlag ){
1057 diff_manifest_entry(pFromFile, 0, pCfg);
1058 }
1059 }
1060 pFromFile = manifest_file_next(pFrom,0);
@@ -1027,10 +1062,11 @@
1062 if( file_dir_match(pFileDir, pToFile->zName) ){
1063 if( (pCfg->diffFlags &
1064 (DIFF_NUMSTAT|DIFF_HTML|DIFF_TCL|DIFF_JSON))==0 ){
1065 fossil_print("ADDED %s\n", pToFile->zName);
1066 }
1067 pCfg->diffFlags |= DIFF_FILE_ADDED;
1068 if( asNewFlag ){
1069 diff_manifest_entry(0, pToFile, pCfg);
1070 }
1071 }
1072 pToFile = manifest_file_next(pTo,0);
1073
+45 -9
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -161,10 +161,13 @@
161161
const char *zRight, /* Name of the right file */
162162
DiffConfig *pCfg, /* Diff configuration */
163163
Blob *pOut /* Write to this blob, or stdout of this is NULL */
164164
){
165165
u64 diffFlags = pCfg->diffFlags;
166
+ /* Standardize on /dev/null, regardless of platform. */
167
+ if( pCfg->diffFlags & DIFF_FILE_ADDED ) zLeft = "/dev/null";
168
+ if( pCfg->diffFlags & DIFF_FILE_DELETED ) zRight = "/dev/null";
166169
if( diffFlags & (DIFF_BRIEF|DIFF_RAW) ){
167170
/* no-op */
168171
}else if( diffFlags & DIFF_DEBUG ){
169172
blob_appendf(pOut, "FILE-LEFT %s\nFILE-RIGHT %s\n", zLeft, zRight);
170173
}else if( diffFlags & DIFF_WEBPAGE ){
@@ -574,11 +577,11 @@
574577
Blob file2; /* Content of zFile2 */
575578
const char *zName2; /* Name of zFile2 for display */
576579
577580
/* Read content of zFile2 into memory */
578581
blob_zero(&file2);
579
- if( file_size(zFile2, ExtFILE)<0 ){
582
+ if( pCfg->diffFlags & DIFF_FILE_DELETED || file_size(zFile2, ExtFILE)<0 ){
580583
zName2 = NULL_DEVICE;
581584
}else{
582585
blob_read_from_file(&file2, zFile2, ExtFILE);
583586
zName2 = zName;
584587
}
@@ -605,10 +608,11 @@
605608
/* Release memory resources */
606609
blob_reset(&file2);
607610
}else{
608611
Blob nameFile1; /* Name of temporary file to old pFile1 content */
609612
Blob cmd; /* Text of command to run */
613
+ int useTempfile = 1;
610614
611615
if( (pCfg->diffFlags & DIFF_INCBINARY)==0 ){
612616
Blob file2;
613617
if( looks_like_binary(pFile1) ){
614618
fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY);
@@ -636,11 +640,20 @@
636640
}
637641
638642
/* Construct a temporary file to hold pFile1 based on the name of
639643
** zFile2 */
640644
file_tempname(&nameFile1, zFile2, "orig");
641
- blob_write_to_file(pFile1, blob_str(&nameFile1));
645
+#if !defined(_WIN32)
646
+ /* On Unix, use /dev/null for added or deleted files. */
647
+ if( pCfg->diffFlags & DIFF_FILE_ADDED ){
648
+ blob_init(&nameFile1, NULL_DEVICE, -1);
649
+ useTempfile = 0;
650
+ }else if( pCfg->diffFlags & DIFF_FILE_DELETED ){
651
+ zFile2 = NULL_DEVICE;
652
+ }
653
+#endif
654
+ if( useTempfile ) blob_write_to_file(pFile1, blob_str(&nameFile1));
642655
643656
/* Construct the external diff command */
644657
blob_zero(&cmd);
645658
blob_append(&cmd, pCfg->zDiffCmd, -1);
646659
if( pCfg->diffFlags & DIFF_INVERT ){
@@ -653,11 +666,11 @@
653666
654667
/* Run the external diff command */
655668
fossil_system(blob_str(&cmd));
656669
657670
/* Delete the temporary file and clean up memory used */
658
- file_delete(blob_str(&nameFile1));
671
+ if( useTempfile ) file_delete(blob_str(&nameFile1));
659672
blob_reset(&nameFile1);
660673
blob_reset(&cmd);
661674
}
662675
}
663676
@@ -697,10 +710,12 @@
697710
blob_reset(&out);
698711
}else{
699712
Blob cmd;
700713
Blob temp1;
701714
Blob temp2;
715
+ int useTempfile1 = 1;
716
+ int useTempfile2 = 1;
702717
703718
if( (pCfg->diffFlags & DIFF_INCBINARY)==0 ){
704719
if( looks_like_binary(pFile1) || looks_like_binary(pFile2) ){
705720
fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY);
706721
return;
@@ -714,15 +729,25 @@
714729
}
715730
glob_free(pBinary);
716731
}
717732
}
718733
719
- /* Construct a temporary file names */
734
+ /* Construct temporary file names */
720735
file_tempname(&temp1, zName, "before");
721736
file_tempname(&temp2, zName, "after");
722
- blob_write_to_file(pFile1, blob_str(&temp1));
723
- blob_write_to_file(pFile2, blob_str(&temp2));
737
+#if !defined(_WIN32)
738
+ /* On Unix, use /dev/null for added or deleted files. */
739
+ if( pCfg->diffFlags & DIFF_FILE_ADDED ){
740
+ useTempfile1 = 0;
741
+ blob_init(&temp1, NULL_DEVICE, -1);
742
+ }else if( pCfg->diffFlags & DIFF_FILE_DELETED ){
743
+ useTempfile2 = 0;
744
+ blob_init(&temp2, NULL_DEVICE, -1);
745
+ }
746
+#endif
747
+ if( useTempfile1 ) blob_write_to_file(pFile1, blob_str(&temp1));
748
+ if( useTempfile2 ) blob_write_to_file(pFile2, blob_str(&temp2));
724749
725750
/* Construct the external diff command */
726751
blob_zero(&cmd);
727752
blob_append(&cmd, pCfg->zDiffCmd, -1);
728753
blob_append_escaped_arg(&cmd, blob_str(&temp1), 1);
@@ -730,12 +755,12 @@
730755
731756
/* Run the external diff command */
732757
fossil_system(blob_str(&cmd));
733758
734759
/* Delete the temporary file and clean up memory used */
735
- file_delete(blob_str(&temp1));
736
- file_delete(blob_str(&temp2));
760
+ if( useTempfile1 ) file_delete(blob_str(&temp1));
761
+ if( useTempfile2 ) file_delete(blob_str(&temp2));
737762
738763
blob_reset(&temp1);
739764
blob_reset(&temp2);
740765
blob_reset(&cmd);
741766
}
@@ -850,26 +875,31 @@
850875
}else{
851876
blob_set(&fname, g.zLocalRoot);
852877
blob_append(&fname, zPathname, -1);
853878
}
854879
zFullName = blob_str(&fname);
880
+ pCfg->diffFlags &= (~DIFF_FILE_MASK);
855881
if( isDeleted ){
856882
if( !isNumStat ){ fossil_print("DELETED %s\n", zPathname); }
883
+ pCfg->diffFlags |= DIFF_FILE_DELETED;
857884
if( !asNewFile ){ showDiff = 0; zFullName = NULL_DEVICE; }
858885
}else if( file_access(zFullName, F_OK) ){
859886
if( !isNumStat ){ fossil_print("MISSING %s\n", zPathname); }
860887
if( !asNewFile ){ showDiff = 0; }
861888
}else if( isNew ){
862889
if( !isNumStat ){ fossil_print("ADDED %s\n", zPathname); }
890
+ pCfg->diffFlags |= DIFF_FILE_ADDED;
863891
srcid = 0;
864892
if( !asNewFile ){ showDiff = 0; }
865893
}else if( isChnged==3 ){
866894
if( !isNumStat ){ fossil_print("ADDED_BY_MERGE %s\n", zPathname); }
895
+ pCfg->diffFlags |= DIFF_FILE_ADDED;
867896
srcid = 0;
868897
if( !asNewFile ){ showDiff = 0; }
869898
}else if( isChnged==5 ){
870899
if( !isNumStat ){ fossil_print("ADDED_BY_INTEGRATE %s\n", zPathname); }
900
+ pCfg->diffFlags |= DIFF_FILE_ADDED;
871901
srcid = 0;
872902
if( !asNewFile ){ showDiff = 0; }
873903
}
874904
if( showDiff ){
875905
Blob content;
@@ -882,11 +912,14 @@
882912
if( srcid>0 ){
883913
content_get(srcid, &content);
884914
}else{
885915
blob_zero(&content);
886916
}
887
- if( isChnged==0 || !file_same_as_blob(&content, zFullName) ){
917
+ if( isChnged==0
918
+ || pCfg->diffFlags & DIFF_FILE_DELETED
919
+ || !file_same_as_blob(&content, zFullName)
920
+ ){
888921
diff_print_index(zPathname, pCfg, pOut);
889922
diff_file(&content, zFullName, zPathname, pCfg, pOut);
890923
}
891924
blob_reset(&content);
892925
}
@@ -1011,15 +1044,17 @@
10111044
}else if( pToFile==0 ){
10121045
cmp = -1;
10131046
}else{
10141047
cmp = fossil_strcmp(pFromFile->zName, pToFile->zName);
10151048
}
1049
+ pCfg->diffFlags &= (~DIFF_FILE_MASK);
10161050
if( cmp<0 ){
10171051
if( file_dir_match(pFileDir, pFromFile->zName) ){
10181052
if( (pCfg->diffFlags & (DIFF_NUMSTAT|DIFF_HTML))==0 ){
10191053
fossil_print("DELETED %s\n", pFromFile->zName);
10201054
}
1055
+ pCfg->diffFlags |= DIFF_FILE_DELETED;
10211056
if( asNewFlag ){
10221057
diff_manifest_entry(pFromFile, 0, pCfg);
10231058
}
10241059
}
10251060
pFromFile = manifest_file_next(pFrom,0);
@@ -1027,10 +1062,11 @@
10271062
if( file_dir_match(pFileDir, pToFile->zName) ){
10281063
if( (pCfg->diffFlags &
10291064
(DIFF_NUMSTAT|DIFF_HTML|DIFF_TCL|DIFF_JSON))==0 ){
10301065
fossil_print("ADDED %s\n", pToFile->zName);
10311066
}
1067
+ pCfg->diffFlags |= DIFF_FILE_ADDED;
10321068
if( asNewFlag ){
10331069
diff_manifest_entry(0, pToFile, pCfg);
10341070
}
10351071
}
10361072
pToFile = manifest_file_next(pTo,0);
10371073
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -161,10 +161,13 @@
161 const char *zRight, /* Name of the right file */
162 DiffConfig *pCfg, /* Diff configuration */
163 Blob *pOut /* Write to this blob, or stdout of this is NULL */
164 ){
165 u64 diffFlags = pCfg->diffFlags;
 
 
 
166 if( diffFlags & (DIFF_BRIEF|DIFF_RAW) ){
167 /* no-op */
168 }else if( diffFlags & DIFF_DEBUG ){
169 blob_appendf(pOut, "FILE-LEFT %s\nFILE-RIGHT %s\n", zLeft, zRight);
170 }else if( diffFlags & DIFF_WEBPAGE ){
@@ -574,11 +577,11 @@
574 Blob file2; /* Content of zFile2 */
575 const char *zName2; /* Name of zFile2 for display */
576
577 /* Read content of zFile2 into memory */
578 blob_zero(&file2);
579 if( file_size(zFile2, ExtFILE)<0 ){
580 zName2 = NULL_DEVICE;
581 }else{
582 blob_read_from_file(&file2, zFile2, ExtFILE);
583 zName2 = zName;
584 }
@@ -605,10 +608,11 @@
605 /* Release memory resources */
606 blob_reset(&file2);
607 }else{
608 Blob nameFile1; /* Name of temporary file to old pFile1 content */
609 Blob cmd; /* Text of command to run */
 
610
611 if( (pCfg->diffFlags & DIFF_INCBINARY)==0 ){
612 Blob file2;
613 if( looks_like_binary(pFile1) ){
614 fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY);
@@ -636,11 +640,20 @@
636 }
637
638 /* Construct a temporary file to hold pFile1 based on the name of
639 ** zFile2 */
640 file_tempname(&nameFile1, zFile2, "orig");
641 blob_write_to_file(pFile1, blob_str(&nameFile1));
 
 
 
 
 
 
 
 
 
642
643 /* Construct the external diff command */
644 blob_zero(&cmd);
645 blob_append(&cmd, pCfg->zDiffCmd, -1);
646 if( pCfg->diffFlags & DIFF_INVERT ){
@@ -653,11 +666,11 @@
653
654 /* Run the external diff command */
655 fossil_system(blob_str(&cmd));
656
657 /* Delete the temporary file and clean up memory used */
658 file_delete(blob_str(&nameFile1));
659 blob_reset(&nameFile1);
660 blob_reset(&cmd);
661 }
662 }
663
@@ -697,10 +710,12 @@
697 blob_reset(&out);
698 }else{
699 Blob cmd;
700 Blob temp1;
701 Blob temp2;
 
 
702
703 if( (pCfg->diffFlags & DIFF_INCBINARY)==0 ){
704 if( looks_like_binary(pFile1) || looks_like_binary(pFile2) ){
705 fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY);
706 return;
@@ -714,15 +729,25 @@
714 }
715 glob_free(pBinary);
716 }
717 }
718
719 /* Construct a temporary file names */
720 file_tempname(&temp1, zName, "before");
721 file_tempname(&temp2, zName, "after");
722 blob_write_to_file(pFile1, blob_str(&temp1));
723 blob_write_to_file(pFile2, blob_str(&temp2));
 
 
 
 
 
 
 
 
 
 
724
725 /* Construct the external diff command */
726 blob_zero(&cmd);
727 blob_append(&cmd, pCfg->zDiffCmd, -1);
728 blob_append_escaped_arg(&cmd, blob_str(&temp1), 1);
@@ -730,12 +755,12 @@
730
731 /* Run the external diff command */
732 fossil_system(blob_str(&cmd));
733
734 /* Delete the temporary file and clean up memory used */
735 file_delete(blob_str(&temp1));
736 file_delete(blob_str(&temp2));
737
738 blob_reset(&temp1);
739 blob_reset(&temp2);
740 blob_reset(&cmd);
741 }
@@ -850,26 +875,31 @@
850 }else{
851 blob_set(&fname, g.zLocalRoot);
852 blob_append(&fname, zPathname, -1);
853 }
854 zFullName = blob_str(&fname);
 
855 if( isDeleted ){
856 if( !isNumStat ){ fossil_print("DELETED %s\n", zPathname); }
 
857 if( !asNewFile ){ showDiff = 0; zFullName = NULL_DEVICE; }
858 }else if( file_access(zFullName, F_OK) ){
859 if( !isNumStat ){ fossil_print("MISSING %s\n", zPathname); }
860 if( !asNewFile ){ showDiff = 0; }
861 }else if( isNew ){
862 if( !isNumStat ){ fossil_print("ADDED %s\n", zPathname); }
 
863 srcid = 0;
864 if( !asNewFile ){ showDiff = 0; }
865 }else if( isChnged==3 ){
866 if( !isNumStat ){ fossil_print("ADDED_BY_MERGE %s\n", zPathname); }
 
867 srcid = 0;
868 if( !asNewFile ){ showDiff = 0; }
869 }else if( isChnged==5 ){
870 if( !isNumStat ){ fossil_print("ADDED_BY_INTEGRATE %s\n", zPathname); }
 
871 srcid = 0;
872 if( !asNewFile ){ showDiff = 0; }
873 }
874 if( showDiff ){
875 Blob content;
@@ -882,11 +912,14 @@
882 if( srcid>0 ){
883 content_get(srcid, &content);
884 }else{
885 blob_zero(&content);
886 }
887 if( isChnged==0 || !file_same_as_blob(&content, zFullName) ){
 
 
 
888 diff_print_index(zPathname, pCfg, pOut);
889 diff_file(&content, zFullName, zPathname, pCfg, pOut);
890 }
891 blob_reset(&content);
892 }
@@ -1011,15 +1044,17 @@
1011 }else if( pToFile==0 ){
1012 cmp = -1;
1013 }else{
1014 cmp = fossil_strcmp(pFromFile->zName, pToFile->zName);
1015 }
 
1016 if( cmp<0 ){
1017 if( file_dir_match(pFileDir, pFromFile->zName) ){
1018 if( (pCfg->diffFlags & (DIFF_NUMSTAT|DIFF_HTML))==0 ){
1019 fossil_print("DELETED %s\n", pFromFile->zName);
1020 }
 
1021 if( asNewFlag ){
1022 diff_manifest_entry(pFromFile, 0, pCfg);
1023 }
1024 }
1025 pFromFile = manifest_file_next(pFrom,0);
@@ -1027,10 +1062,11 @@
1027 if( file_dir_match(pFileDir, pToFile->zName) ){
1028 if( (pCfg->diffFlags &
1029 (DIFF_NUMSTAT|DIFF_HTML|DIFF_TCL|DIFF_JSON))==0 ){
1030 fossil_print("ADDED %s\n", pToFile->zName);
1031 }
 
1032 if( asNewFlag ){
1033 diff_manifest_entry(0, pToFile, pCfg);
1034 }
1035 }
1036 pToFile = manifest_file_next(pTo,0);
1037
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -161,10 +161,13 @@
161 const char *zRight, /* Name of the right file */
162 DiffConfig *pCfg, /* Diff configuration */
163 Blob *pOut /* Write to this blob, or stdout of this is NULL */
164 ){
165 u64 diffFlags = pCfg->diffFlags;
166 /* Standardize on /dev/null, regardless of platform. */
167 if( pCfg->diffFlags & DIFF_FILE_ADDED ) zLeft = "/dev/null";
168 if( pCfg->diffFlags & DIFF_FILE_DELETED ) zRight = "/dev/null";
169 if( diffFlags & (DIFF_BRIEF|DIFF_RAW) ){
170 /* no-op */
171 }else if( diffFlags & DIFF_DEBUG ){
172 blob_appendf(pOut, "FILE-LEFT %s\nFILE-RIGHT %s\n", zLeft, zRight);
173 }else if( diffFlags & DIFF_WEBPAGE ){
@@ -574,11 +577,11 @@
577 Blob file2; /* Content of zFile2 */
578 const char *zName2; /* Name of zFile2 for display */
579
580 /* Read content of zFile2 into memory */
581 blob_zero(&file2);
582 if( pCfg->diffFlags & DIFF_FILE_DELETED || file_size(zFile2, ExtFILE)<0 ){
583 zName2 = NULL_DEVICE;
584 }else{
585 blob_read_from_file(&file2, zFile2, ExtFILE);
586 zName2 = zName;
587 }
@@ -605,10 +608,11 @@
608 /* Release memory resources */
609 blob_reset(&file2);
610 }else{
611 Blob nameFile1; /* Name of temporary file to old pFile1 content */
612 Blob cmd; /* Text of command to run */
613 int useTempfile = 1;
614
615 if( (pCfg->diffFlags & DIFF_INCBINARY)==0 ){
616 Blob file2;
617 if( looks_like_binary(pFile1) ){
618 fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY);
@@ -636,11 +640,20 @@
640 }
641
642 /* Construct a temporary file to hold pFile1 based on the name of
643 ** zFile2 */
644 file_tempname(&nameFile1, zFile2, "orig");
645 #if !defined(_WIN32)
646 /* On Unix, use /dev/null for added or deleted files. */
647 if( pCfg->diffFlags & DIFF_FILE_ADDED ){
648 blob_init(&nameFile1, NULL_DEVICE, -1);
649 useTempfile = 0;
650 }else if( pCfg->diffFlags & DIFF_FILE_DELETED ){
651 zFile2 = NULL_DEVICE;
652 }
653 #endif
654 if( useTempfile ) blob_write_to_file(pFile1, blob_str(&nameFile1));
655
656 /* Construct the external diff command */
657 blob_zero(&cmd);
658 blob_append(&cmd, pCfg->zDiffCmd, -1);
659 if( pCfg->diffFlags & DIFF_INVERT ){
@@ -653,11 +666,11 @@
666
667 /* Run the external diff command */
668 fossil_system(blob_str(&cmd));
669
670 /* Delete the temporary file and clean up memory used */
671 if( useTempfile ) file_delete(blob_str(&nameFile1));
672 blob_reset(&nameFile1);
673 blob_reset(&cmd);
674 }
675 }
676
@@ -697,10 +710,12 @@
710 blob_reset(&out);
711 }else{
712 Blob cmd;
713 Blob temp1;
714 Blob temp2;
715 int useTempfile1 = 1;
716 int useTempfile2 = 1;
717
718 if( (pCfg->diffFlags & DIFF_INCBINARY)==0 ){
719 if( looks_like_binary(pFile1) || looks_like_binary(pFile2) ){
720 fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY);
721 return;
@@ -714,15 +729,25 @@
729 }
730 glob_free(pBinary);
731 }
732 }
733
734 /* Construct temporary file names */
735 file_tempname(&temp1, zName, "before");
736 file_tempname(&temp2, zName, "after");
737 #if !defined(_WIN32)
738 /* On Unix, use /dev/null for added or deleted files. */
739 if( pCfg->diffFlags & DIFF_FILE_ADDED ){
740 useTempfile1 = 0;
741 blob_init(&temp1, NULL_DEVICE, -1);
742 }else if( pCfg->diffFlags & DIFF_FILE_DELETED ){
743 useTempfile2 = 0;
744 blob_init(&temp2, NULL_DEVICE, -1);
745 }
746 #endif
747 if( useTempfile1 ) blob_write_to_file(pFile1, blob_str(&temp1));
748 if( useTempfile2 ) blob_write_to_file(pFile2, blob_str(&temp2));
749
750 /* Construct the external diff command */
751 blob_zero(&cmd);
752 blob_append(&cmd, pCfg->zDiffCmd, -1);
753 blob_append_escaped_arg(&cmd, blob_str(&temp1), 1);
@@ -730,12 +755,12 @@
755
756 /* Run the external diff command */
757 fossil_system(blob_str(&cmd));
758
759 /* Delete the temporary file and clean up memory used */
760 if( useTempfile1 ) file_delete(blob_str(&temp1));
761 if( useTempfile2 ) file_delete(blob_str(&temp2));
762
763 blob_reset(&temp1);
764 blob_reset(&temp2);
765 blob_reset(&cmd);
766 }
@@ -850,26 +875,31 @@
875 }else{
876 blob_set(&fname, g.zLocalRoot);
877 blob_append(&fname, zPathname, -1);
878 }
879 zFullName = blob_str(&fname);
880 pCfg->diffFlags &= (~DIFF_FILE_MASK);
881 if( isDeleted ){
882 if( !isNumStat ){ fossil_print("DELETED %s\n", zPathname); }
883 pCfg->diffFlags |= DIFF_FILE_DELETED;
884 if( !asNewFile ){ showDiff = 0; zFullName = NULL_DEVICE; }
885 }else if( file_access(zFullName, F_OK) ){
886 if( !isNumStat ){ fossil_print("MISSING %s\n", zPathname); }
887 if( !asNewFile ){ showDiff = 0; }
888 }else if( isNew ){
889 if( !isNumStat ){ fossil_print("ADDED %s\n", zPathname); }
890 pCfg->diffFlags |= DIFF_FILE_ADDED;
891 srcid = 0;
892 if( !asNewFile ){ showDiff = 0; }
893 }else if( isChnged==3 ){
894 if( !isNumStat ){ fossil_print("ADDED_BY_MERGE %s\n", zPathname); }
895 pCfg->diffFlags |= DIFF_FILE_ADDED;
896 srcid = 0;
897 if( !asNewFile ){ showDiff = 0; }
898 }else if( isChnged==5 ){
899 if( !isNumStat ){ fossil_print("ADDED_BY_INTEGRATE %s\n", zPathname); }
900 pCfg->diffFlags |= DIFF_FILE_ADDED;
901 srcid = 0;
902 if( !asNewFile ){ showDiff = 0; }
903 }
904 if( showDiff ){
905 Blob content;
@@ -882,11 +912,14 @@
912 if( srcid>0 ){
913 content_get(srcid, &content);
914 }else{
915 blob_zero(&content);
916 }
917 if( isChnged==0
918 || pCfg->diffFlags & DIFF_FILE_DELETED
919 || !file_same_as_blob(&content, zFullName)
920 ){
921 diff_print_index(zPathname, pCfg, pOut);
922 diff_file(&content, zFullName, zPathname, pCfg, pOut);
923 }
924 blob_reset(&content);
925 }
@@ -1011,15 +1044,17 @@
1044 }else if( pToFile==0 ){
1045 cmp = -1;
1046 }else{
1047 cmp = fossil_strcmp(pFromFile->zName, pToFile->zName);
1048 }
1049 pCfg->diffFlags &= (~DIFF_FILE_MASK);
1050 if( cmp<0 ){
1051 if( file_dir_match(pFileDir, pFromFile->zName) ){
1052 if( (pCfg->diffFlags & (DIFF_NUMSTAT|DIFF_HTML))==0 ){
1053 fossil_print("DELETED %s\n", pFromFile->zName);
1054 }
1055 pCfg->diffFlags |= DIFF_FILE_DELETED;
1056 if( asNewFlag ){
1057 diff_manifest_entry(pFromFile, 0, pCfg);
1058 }
1059 }
1060 pFromFile = manifest_file_next(pFrom,0);
@@ -1027,10 +1062,11 @@
1062 if( file_dir_match(pFileDir, pToFile->zName) ){
1063 if( (pCfg->diffFlags &
1064 (DIFF_NUMSTAT|DIFF_HTML|DIFF_TCL|DIFF_JSON))==0 ){
1065 fossil_print("ADDED %s\n", pToFile->zName);
1066 }
1067 pCfg->diffFlags |= DIFF_FILE_ADDED;
1068 if( asNewFlag ){
1069 diff_manifest_entry(0, pToFile, pCfg);
1070 }
1071 }
1072 pToFile = manifest_file_next(pTo,0);
1073
--- src/patch.c
+++ src/patch.c
@@ -799,19 +799,22 @@
799799
}
800800
}
801801
zName = db_column_text(&q, 1);
802802
rid = db_column_int(&q, 0);
803803
804
+ pCfg->diffFlags &= (~DIFF_FILE_MASK);
804805
if( db_column_type(&q,3)==SQLITE_NULL ){
805806
if( !bWebpage ) fossil_print("DELETE %s\n", zName);
807
+ pCfg->diffFlags |= DIFF_FILE_DELETED;
806808
diff_print_index(zName, pCfg, 0);
807809
content_get(rid, &a);
808810
diff_file_mem(&a, &empty, zName, pCfg);
809811
}else if( rid==0 ){
810812
db_ephemeral_blob(&q, 3, &a);
811813
blob_uncompress(&a, &a);
812814
if( !bWebpage ) fossil_print("ADDED %s\n", zName);
815
+ pCfg->diffFlags |= DIFF_FILE_ADDED;
813816
diff_print_index(zName, pCfg, 0);
814817
diff_file_mem(&empty, &a, zName, pCfg);
815818
blob_reset(&a);
816819
}else if( db_column_bytes(&q, 3)>0 ){
817820
Blob delta;
818821
--- src/patch.c
+++ src/patch.c
@@ -799,19 +799,22 @@
799 }
800 }
801 zName = db_column_text(&q, 1);
802 rid = db_column_int(&q, 0);
803
 
804 if( db_column_type(&q,3)==SQLITE_NULL ){
805 if( !bWebpage ) fossil_print("DELETE %s\n", zName);
 
806 diff_print_index(zName, pCfg, 0);
807 content_get(rid, &a);
808 diff_file_mem(&a, &empty, zName, pCfg);
809 }else if( rid==0 ){
810 db_ephemeral_blob(&q, 3, &a);
811 blob_uncompress(&a, &a);
812 if( !bWebpage ) fossil_print("ADDED %s\n", zName);
 
813 diff_print_index(zName, pCfg, 0);
814 diff_file_mem(&empty, &a, zName, pCfg);
815 blob_reset(&a);
816 }else if( db_column_bytes(&q, 3)>0 ){
817 Blob delta;
818
--- src/patch.c
+++ src/patch.c
@@ -799,19 +799,22 @@
799 }
800 }
801 zName = db_column_text(&q, 1);
802 rid = db_column_int(&q, 0);
803
804 pCfg->diffFlags &= (~DIFF_FILE_MASK);
805 if( db_column_type(&q,3)==SQLITE_NULL ){
806 if( !bWebpage ) fossil_print("DELETE %s\n", zName);
807 pCfg->diffFlags |= DIFF_FILE_DELETED;
808 diff_print_index(zName, pCfg, 0);
809 content_get(rid, &a);
810 diff_file_mem(&a, &empty, zName, pCfg);
811 }else if( rid==0 ){
812 db_ephemeral_blob(&q, 3, &a);
813 blob_uncompress(&a, &a);
814 if( !bWebpage ) fossil_print("ADDED %s\n", zName);
815 pCfg->diffFlags |= DIFF_FILE_ADDED;
816 diff_print_index(zName, pCfg, 0);
817 diff_file_mem(&empty, &a, zName, pCfg);
818 blob_reset(&a);
819 }else if( db_column_bytes(&q, 3)>0 ){
820 Blob delta;
821
--- src/stash.c
+++ src/stash.c
@@ -427,17 +427,20 @@
427427
int isLink = db_column_int(&q, 3);
428428
const char *zOrig = db_column_text(&q, 4);
429429
const char *zNew = db_column_text(&q, 5);
430430
char *zOPath = mprintf("%s%s", g.zLocalRoot, zOrig);
431431
Blob a, b;
432
+ pCfg->diffFlags &= (~DIFF_FILE_MASK);
432433
if( rid==0 ){
433434
db_ephemeral_blob(&q, 6, &a);
434435
if( !bWebpage ) fossil_print("ADDED %s\n", zNew);
436
+ pCfg->diffFlags |= DIFF_FILE_ADDED;
435437
diff_print_index(zNew, pCfg, 0);
436438
diff_file_mem(&empty, &a, zNew, pCfg);
437439
}else if( isRemoved ){
438440
if( !bWebpage) fossil_print("DELETE %s\n", zOrig);
441
+ pCfg->diffFlags |= DIFF_FILE_DELETED;
439442
diff_print_index(zNew, pCfg, 0);
440443
if( fBaseline ){
441444
content_get(rid, &a);
442445
diff_file_mem(&a, &empty, zOrig, pCfg);
443446
}
444447
--- src/stash.c
+++ src/stash.c
@@ -427,17 +427,20 @@
427 int isLink = db_column_int(&q, 3);
428 const char *zOrig = db_column_text(&q, 4);
429 const char *zNew = db_column_text(&q, 5);
430 char *zOPath = mprintf("%s%s", g.zLocalRoot, zOrig);
431 Blob a, b;
 
432 if( rid==0 ){
433 db_ephemeral_blob(&q, 6, &a);
434 if( !bWebpage ) fossil_print("ADDED %s\n", zNew);
 
435 diff_print_index(zNew, pCfg, 0);
436 diff_file_mem(&empty, &a, zNew, pCfg);
437 }else if( isRemoved ){
438 if( !bWebpage) fossil_print("DELETE %s\n", zOrig);
 
439 diff_print_index(zNew, pCfg, 0);
440 if( fBaseline ){
441 content_get(rid, &a);
442 diff_file_mem(&a, &empty, zOrig, pCfg);
443 }
444
--- src/stash.c
+++ src/stash.c
@@ -427,17 +427,20 @@
427 int isLink = db_column_int(&q, 3);
428 const char *zOrig = db_column_text(&q, 4);
429 const char *zNew = db_column_text(&q, 5);
430 char *zOPath = mprintf("%s%s", g.zLocalRoot, zOrig);
431 Blob a, b;
432 pCfg->diffFlags &= (~DIFF_FILE_MASK);
433 if( rid==0 ){
434 db_ephemeral_blob(&q, 6, &a);
435 if( !bWebpage ) fossil_print("ADDED %s\n", zNew);
436 pCfg->diffFlags |= DIFF_FILE_ADDED;
437 diff_print_index(zNew, pCfg, 0);
438 diff_file_mem(&empty, &a, zNew, pCfg);
439 }else if( isRemoved ){
440 if( !bWebpage) fossil_print("DELETE %s\n", zOrig);
441 pCfg->diffFlags |= DIFF_FILE_DELETED;
442 diff_print_index(zNew, pCfg, 0);
443 if( fBaseline ){
444 content_get(rid, &a);
445 diff_file_mem(&a, &empty, zOrig, pCfg);
446 }
447
--- src/stash.c
+++ src/stash.c
@@ -427,17 +427,20 @@
427427
int isLink = db_column_int(&q, 3);
428428
const char *zOrig = db_column_text(&q, 4);
429429
const char *zNew = db_column_text(&q, 5);
430430
char *zOPath = mprintf("%s%s", g.zLocalRoot, zOrig);
431431
Blob a, b;
432
+ pCfg->diffFlags &= (~DIFF_FILE_MASK);
432433
if( rid==0 ){
433434
db_ephemeral_blob(&q, 6, &a);
434435
if( !bWebpage ) fossil_print("ADDED %s\n", zNew);
436
+ pCfg->diffFlags |= DIFF_FILE_ADDED;
435437
diff_print_index(zNew, pCfg, 0);
436438
diff_file_mem(&empty, &a, zNew, pCfg);
437439
}else if( isRemoved ){
438440
if( !bWebpage) fossil_print("DELETE %s\n", zOrig);
441
+ pCfg->diffFlags |= DIFF_FILE_DELETED;
439442
diff_print_index(zNew, pCfg, 0);
440443
if( fBaseline ){
441444
content_get(rid, &a);
442445
diff_file_mem(&a, &empty, zOrig, pCfg);
443446
}
444447
--- src/stash.c
+++ src/stash.c
@@ -427,17 +427,20 @@
427 int isLink = db_column_int(&q, 3);
428 const char *zOrig = db_column_text(&q, 4);
429 const char *zNew = db_column_text(&q, 5);
430 char *zOPath = mprintf("%s%s", g.zLocalRoot, zOrig);
431 Blob a, b;
 
432 if( rid==0 ){
433 db_ephemeral_blob(&q, 6, &a);
434 if( !bWebpage ) fossil_print("ADDED %s\n", zNew);
 
435 diff_print_index(zNew, pCfg, 0);
436 diff_file_mem(&empty, &a, zNew, pCfg);
437 }else if( isRemoved ){
438 if( !bWebpage) fossil_print("DELETE %s\n", zOrig);
 
439 diff_print_index(zNew, pCfg, 0);
440 if( fBaseline ){
441 content_get(rid, &a);
442 diff_file_mem(&a, &empty, zOrig, pCfg);
443 }
444
--- src/stash.c
+++ src/stash.c
@@ -427,17 +427,20 @@
427 int isLink = db_column_int(&q, 3);
428 const char *zOrig = db_column_text(&q, 4);
429 const char *zNew = db_column_text(&q, 5);
430 char *zOPath = mprintf("%s%s", g.zLocalRoot, zOrig);
431 Blob a, b;
432 pCfg->diffFlags &= (~DIFF_FILE_MASK);
433 if( rid==0 ){
434 db_ephemeral_blob(&q, 6, &a);
435 if( !bWebpage ) fossil_print("ADDED %s\n", zNew);
436 pCfg->diffFlags |= DIFF_FILE_ADDED;
437 diff_print_index(zNew, pCfg, 0);
438 diff_file_mem(&empty, &a, zNew, pCfg);
439 }else if( isRemoved ){
440 if( !bWebpage) fossil_print("DELETE %s\n", zOrig);
441 pCfg->diffFlags |= DIFF_FILE_DELETED;
442 diff_print_index(zNew, pCfg, 0);
443 if( fBaseline ){
444 content_get(rid, &a);
445 diff_file_mem(&a, &empty, zOrig, pCfg);
446 }
447
--- test/diff.test
+++ test/diff.test
@@ -126,9 +126,37 @@
126126
> 7 "mno": {
127127
> 8 "pqr": false
128128
> 9 }
129129
5 } 10 }
130130
6 } 11 }}}
131
+
132
+###############################################################################
133
+
134
+fossil rm file1.dat
135
+fossil diff -v file1.dat
136
+
137
+test diff-deleted-file-1 {[normalize_result] eq {DELETED file1.dat
138
+Index: file1.dat
139
+==================================================================
140
+--- file1.dat
++++ /dev/null
141
+@@ -1,1 +0,0 @@
142
+-test file 1 (one line no term).}}
143
+
144
+###############################################################################
145
+
146
+write_file file6.dat "test file 6 (one line no term)."
147
+fossil add file6.dat
148
+
149
+fossil diff -v file6.dat
150
+
151
+test diff-added-file-1 {[normalize_result] eq {ADDED file6.dat
152
+Index: file6.dat
153
+==================================================================
154
+--- /dev/null
++++ file6.dat
155
+@@ -0,0 +1,1 @@
156
++test file 6 (one line no term).}}
131157
132158
###############################################################################
133159
134160
test_cleanup
135161
--- test/diff.test
+++ test/diff.test
@@ -126,9 +126,37 @@
126 > 7 "mno": {
127 > 8 "pqr": false
128 > 9 }
129 5 } 10 }
130 6 } 11 }}}
 
 
 
 
 
 
 
 
 
 
++++ /dev/null
 
 
 
 
 
 
 
 
 
 
 
 
 
 
++++ file6.dat
 
 
131
132 ###############################################################################
133
134 test_cleanup
135
--- test/diff.test
+++ test/diff.test
@@ -126,9 +126,37 @@
126 > 7 "mno": {
127 > 8 "pqr": false
128 > 9 }
129 5 } 10 }
130 6 } 11 }}}
131
132 ###############################################################################
133
134 fossil rm file1.dat
135 fossil diff -v file1.dat
136
137 test diff-deleted-file-1 {[normalize_result] eq {DELETED file1.dat
138 Index: file1.dat
139 ==================================================================
140 --- file1.dat
++++ /dev/null
141 @@ -1,1 +0,0 @@
142 -test file 1 (one line no term).}}
143
144 ###############################################################################
145
146 write_file file6.dat "test file 6 (one line no term)."
147 fossil add file6.dat
148
149 fossil diff -v file6.dat
150
151 test diff-added-file-1 {[normalize_result] eq {ADDED file6.dat
152 Index: file6.dat
153 ==================================================================
154 --- /dev/null
++++ file6.dat
155 @@ -0,0 +1,1 @@
156 +test file 6 (one line no term).}}
157
158 ###############################################################################
159
160 test_cleanup
161
--- test/diff.test
+++ test/diff.test
@@ -126,9 +126,37 @@
126126
> 7 "mno": {
127127
> 8 "pqr": false
128128
> 9 }
129129
5 } 10 }
130130
6 } 11 }}}
131
+
132
+###############################################################################
133
+
134
+fossil rm file1.dat
135
+fossil diff -v file1.dat
136
+
137
+test diff-deleted-file-1 {[normalize_result] eq {DELETED file1.dat
138
+Index: file1.dat
139
+==================================================================
140
+--- file1.dat
++++ /dev/null
141
+@@ -1,1 +0,0 @@
142
+-test file 1 (one line no term).}}
143
+
144
+###############################################################################
145
+
146
+write_file file6.dat "test file 6 (one line no term)."
147
+fossil add file6.dat
148
+
149
+fossil diff -v file6.dat
150
+
151
+test diff-added-file-1 {[normalize_result] eq {ADDED file6.dat
152
+Index: file6.dat
153
+==================================================================
154
+--- /dev/null
++++ file6.dat
155
+@@ -0,0 +1,1 @@
156
++test file 6 (one line no term).}}
131157
132158
###############################################################################
133159
134160
test_cleanup
135161
--- test/diff.test
+++ test/diff.test
@@ -126,9 +126,37 @@
126 > 7 "mno": {
127 > 8 "pqr": false
128 > 9 }
129 5 } 10 }
130 6 } 11 }}}
 
 
 
 
 
 
 
 
 
 
++++ /dev/null
 
 
 
 
 
 
 
 
 
 
 
 
 
 
++++ file6.dat
 
 
131
132 ###############################################################################
133
134 test_cleanup
135
--- test/diff.test
+++ test/diff.test
@@ -126,9 +126,37 @@
126 > 7 "mno": {
127 > 8 "pqr": false
128 > 9 }
129 5 } 10 }
130 6 } 11 }}}
131
132 ###############################################################################
133
134 fossil rm file1.dat
135 fossil diff -v file1.dat
136
137 test diff-deleted-file-1 {[normalize_result] eq {DELETED file1.dat
138 Index: file1.dat
139 ==================================================================
140 --- file1.dat
++++ /dev/null
141 @@ -1,1 +0,0 @@
142 -test file 1 (one line no term).}}
143
144 ###############################################################################
145
146 write_file file6.dat "test file 6 (one line no term)."
147 fossil add file6.dat
148
149 fossil diff -v file6.dat
150
151 test diff-added-file-1 {[normalize_result] eq {ADDED file6.dat
152 Index: file6.dat
153 ==================================================================
154 --- /dev/null
++++ file6.dat
155 @@ -0,0 +1,1 @@
156 +test file 6 (one line no term).}}
157
158 ###############################################################################
159
160 test_cleanup
161

Keyboard Shortcuts

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