Fossil SCM
Text diff output is now more like other common unix tools in its handling of missing files.
Commit
caa6ad39db44392953b47626b381b0c54d5216db57e73aa1c4195984906dd242
Parent
e90fd9bef8f47f5…
10 files changed
+16
-2
+7
+7
+45
-9
+45
-9
+3
+3
+3
+26
+26
+16
-2
| --- src/checkin.c | ||
| +++ src/checkin.c | ||
| @@ -1365,17 +1365,31 @@ | ||
| 1365 | 1365 | '#' |
| 1366 | 1366 | ); |
| 1367 | 1367 | diff_options(&DCfg, 0, 1); |
| 1368 | 1368 | DCfg.diffFlags |= DIFF_VERBOSE; |
| 1369 | 1369 | if( g.aCommitFile ){ |
| 1370 | + Stmt q; | |
| 1371 | + Blob sql = BLOB_INITIALIZER; | |
| 1370 | 1372 | FileDirList *diffFiles; |
| 1371 | 1373 | int i; |
| 1372 | 1374 | for(i=0; g.aCommitFile[i]!=0; ++i){} |
| 1373 | 1375 | diffFiles = fossil_malloc_zero((i+1) * sizeof(*diffFiles)); |
| 1374 | 1376 | 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); | |
| 1377 | 1391 | if( fossil_strcmp(diffFiles[i].zName, "." )==0 ){ |
| 1378 | 1392 | diffFiles[0].zName[0] = '.'; |
| 1379 | 1393 | diffFiles[0].zName[1] = 0; |
| 1380 | 1394 | break; |
| 1381 | 1395 | } |
| 1382 | 1396 |
| --- 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 @@ | ||
| 50 | 50 | #define DIFF_TCL 0x00080000 /* For the --tk option */ |
| 51 | 51 | #define DIFF_INCBINARY 0x00100000 /* The --diff-binary option */ |
| 52 | 52 | #define DIFF_SHOW_VERS 0x00200000 /* Show compared versions */ |
| 53 | 53 | #define DIFF_DARKMODE 0x00400000 /* Use dark mode for HTML */ |
| 54 | 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 | + | |
| 55 | 62 | /* |
| 56 | 63 | ** These error messages are shared in multiple locations. They are defined |
| 57 | 64 | ** here for consistency. |
| 58 | 65 | */ |
| 59 | 66 | #define DIFF_CANNOT_COMPUTE_BINARY \ |
| 60 | 67 |
| --- 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 @@ | ||
| 50 | 50 | #define DIFF_TCL 0x00080000 /* For the --tk option */ |
| 51 | 51 | #define DIFF_INCBINARY 0x00100000 /* The --diff-binary option */ |
| 52 | 52 | #define DIFF_SHOW_VERS 0x00200000 /* Show compared versions */ |
| 53 | 53 | #define DIFF_DARKMODE 0x00400000 /* Use dark mode for HTML */ |
| 54 | 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 | + | |
| 55 | 62 | /* |
| 56 | 63 | ** These error messages are shared in multiple locations. They are defined |
| 57 | 64 | ** here for consistency. |
| 58 | 65 | */ |
| 59 | 66 | #define DIFF_CANNOT_COMPUTE_BINARY \ |
| 60 | 67 |
| --- 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 @@ | ||
| 161 | 161 | const char *zRight, /* Name of the right file */ |
| 162 | 162 | DiffConfig *pCfg, /* Diff configuration */ |
| 163 | 163 | Blob *pOut /* Write to this blob, or stdout of this is NULL */ |
| 164 | 164 | ){ |
| 165 | 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"; | |
| 166 | 169 | if( diffFlags & (DIFF_BRIEF|DIFF_RAW) ){ |
| 167 | 170 | /* no-op */ |
| 168 | 171 | }else if( diffFlags & DIFF_DEBUG ){ |
| 169 | 172 | blob_appendf(pOut, "FILE-LEFT %s\nFILE-RIGHT %s\n", zLeft, zRight); |
| 170 | 173 | }else if( diffFlags & DIFF_WEBPAGE ){ |
| @@ -574,11 +577,11 @@ | ||
| 574 | 577 | Blob file2; /* Content of zFile2 */ |
| 575 | 578 | const char *zName2; /* Name of zFile2 for display */ |
| 576 | 579 | |
| 577 | 580 | /* Read content of zFile2 into memory */ |
| 578 | 581 | blob_zero(&file2); |
| 579 | - if( file_size(zFile2, ExtFILE)<0 ){ | |
| 582 | + if( pCfg->diffFlags & DIFF_FILE_DELETED || file_size(zFile2, ExtFILE)<0 ){ | |
| 580 | 583 | zName2 = NULL_DEVICE; |
| 581 | 584 | }else{ |
| 582 | 585 | blob_read_from_file(&file2, zFile2, ExtFILE); |
| 583 | 586 | zName2 = zName; |
| 584 | 587 | } |
| @@ -605,10 +608,11 @@ | ||
| 605 | 608 | /* Release memory resources */ |
| 606 | 609 | blob_reset(&file2); |
| 607 | 610 | }else{ |
| 608 | 611 | Blob nameFile1; /* Name of temporary file to old pFile1 content */ |
| 609 | 612 | Blob cmd; /* Text of command to run */ |
| 613 | + int useTempfile = 1; | |
| 610 | 614 | |
| 611 | 615 | if( (pCfg->diffFlags & DIFF_INCBINARY)==0 ){ |
| 612 | 616 | Blob file2; |
| 613 | 617 | if( looks_like_binary(pFile1) ){ |
| 614 | 618 | fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY); |
| @@ -636,11 +640,20 @@ | ||
| 636 | 640 | } |
| 637 | 641 | |
| 638 | 642 | /* Construct a temporary file to hold pFile1 based on the name of |
| 639 | 643 | ** zFile2 */ |
| 640 | 644 | 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)); | |
| 642 | 655 | |
| 643 | 656 | /* Construct the external diff command */ |
| 644 | 657 | blob_zero(&cmd); |
| 645 | 658 | blob_append(&cmd, pCfg->zDiffCmd, -1); |
| 646 | 659 | if( pCfg->diffFlags & DIFF_INVERT ){ |
| @@ -653,11 +666,11 @@ | ||
| 653 | 666 | |
| 654 | 667 | /* Run the external diff command */ |
| 655 | 668 | fossil_system(blob_str(&cmd)); |
| 656 | 669 | |
| 657 | 670 | /* Delete the temporary file and clean up memory used */ |
| 658 | - file_delete(blob_str(&nameFile1)); | |
| 671 | + if( useTempfile ) file_delete(blob_str(&nameFile1)); | |
| 659 | 672 | blob_reset(&nameFile1); |
| 660 | 673 | blob_reset(&cmd); |
| 661 | 674 | } |
| 662 | 675 | } |
| 663 | 676 | |
| @@ -697,10 +710,12 @@ | ||
| 697 | 710 | blob_reset(&out); |
| 698 | 711 | }else{ |
| 699 | 712 | Blob cmd; |
| 700 | 713 | Blob temp1; |
| 701 | 714 | Blob temp2; |
| 715 | + int useTempfile1 = 1; | |
| 716 | + int useTempfile2 = 1; | |
| 702 | 717 | |
| 703 | 718 | if( (pCfg->diffFlags & DIFF_INCBINARY)==0 ){ |
| 704 | 719 | if( looks_like_binary(pFile1) || looks_like_binary(pFile2) ){ |
| 705 | 720 | fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY); |
| 706 | 721 | return; |
| @@ -714,15 +729,25 @@ | ||
| 714 | 729 | } |
| 715 | 730 | glob_free(pBinary); |
| 716 | 731 | } |
| 717 | 732 | } |
| 718 | 733 | |
| 719 | - /* Construct a temporary file names */ | |
| 734 | + /* Construct temporary file names */ | |
| 720 | 735 | file_tempname(&temp1, zName, "before"); |
| 721 | 736 | 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)); | |
| 724 | 749 | |
| 725 | 750 | /* Construct the external diff command */ |
| 726 | 751 | blob_zero(&cmd); |
| 727 | 752 | blob_append(&cmd, pCfg->zDiffCmd, -1); |
| 728 | 753 | blob_append_escaped_arg(&cmd, blob_str(&temp1), 1); |
| @@ -730,12 +755,12 @@ | ||
| 730 | 755 | |
| 731 | 756 | /* Run the external diff command */ |
| 732 | 757 | fossil_system(blob_str(&cmd)); |
| 733 | 758 | |
| 734 | 759 | /* 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)); | |
| 737 | 762 | |
| 738 | 763 | blob_reset(&temp1); |
| 739 | 764 | blob_reset(&temp2); |
| 740 | 765 | blob_reset(&cmd); |
| 741 | 766 | } |
| @@ -850,26 +875,31 @@ | ||
| 850 | 875 | }else{ |
| 851 | 876 | blob_set(&fname, g.zLocalRoot); |
| 852 | 877 | blob_append(&fname, zPathname, -1); |
| 853 | 878 | } |
| 854 | 879 | zFullName = blob_str(&fname); |
| 880 | + pCfg->diffFlags &= (~DIFF_FILE_MASK); | |
| 855 | 881 | if( isDeleted ){ |
| 856 | 882 | if( !isNumStat ){ fossil_print("DELETED %s\n", zPathname); } |
| 883 | + pCfg->diffFlags |= DIFF_FILE_DELETED; | |
| 857 | 884 | if( !asNewFile ){ showDiff = 0; zFullName = NULL_DEVICE; } |
| 858 | 885 | }else if( file_access(zFullName, F_OK) ){ |
| 859 | 886 | if( !isNumStat ){ fossil_print("MISSING %s\n", zPathname); } |
| 860 | 887 | if( !asNewFile ){ showDiff = 0; } |
| 861 | 888 | }else if( isNew ){ |
| 862 | 889 | if( !isNumStat ){ fossil_print("ADDED %s\n", zPathname); } |
| 890 | + pCfg->diffFlags |= DIFF_FILE_ADDED; | |
| 863 | 891 | srcid = 0; |
| 864 | 892 | if( !asNewFile ){ showDiff = 0; } |
| 865 | 893 | }else if( isChnged==3 ){ |
| 866 | 894 | if( !isNumStat ){ fossil_print("ADDED_BY_MERGE %s\n", zPathname); } |
| 895 | + pCfg->diffFlags |= DIFF_FILE_ADDED; | |
| 867 | 896 | srcid = 0; |
| 868 | 897 | if( !asNewFile ){ showDiff = 0; } |
| 869 | 898 | }else if( isChnged==5 ){ |
| 870 | 899 | if( !isNumStat ){ fossil_print("ADDED_BY_INTEGRATE %s\n", zPathname); } |
| 900 | + pCfg->diffFlags |= DIFF_FILE_ADDED; | |
| 871 | 901 | srcid = 0; |
| 872 | 902 | if( !asNewFile ){ showDiff = 0; } |
| 873 | 903 | } |
| 874 | 904 | if( showDiff ){ |
| 875 | 905 | Blob content; |
| @@ -882,11 +912,14 @@ | ||
| 882 | 912 | if( srcid>0 ){ |
| 883 | 913 | content_get(srcid, &content); |
| 884 | 914 | }else{ |
| 885 | 915 | blob_zero(&content); |
| 886 | 916 | } |
| 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 | + ){ | |
| 888 | 921 | diff_print_index(zPathname, pCfg, pOut); |
| 889 | 922 | diff_file(&content, zFullName, zPathname, pCfg, pOut); |
| 890 | 923 | } |
| 891 | 924 | blob_reset(&content); |
| 892 | 925 | } |
| @@ -1011,15 +1044,17 @@ | ||
| 1011 | 1044 | }else if( pToFile==0 ){ |
| 1012 | 1045 | cmp = -1; |
| 1013 | 1046 | }else{ |
| 1014 | 1047 | cmp = fossil_strcmp(pFromFile->zName, pToFile->zName); |
| 1015 | 1048 | } |
| 1049 | + pCfg->diffFlags &= (~DIFF_FILE_MASK); | |
| 1016 | 1050 | if( cmp<0 ){ |
| 1017 | 1051 | if( file_dir_match(pFileDir, pFromFile->zName) ){ |
| 1018 | 1052 | if( (pCfg->diffFlags & (DIFF_NUMSTAT|DIFF_HTML))==0 ){ |
| 1019 | 1053 | fossil_print("DELETED %s\n", pFromFile->zName); |
| 1020 | 1054 | } |
| 1055 | + pCfg->diffFlags |= DIFF_FILE_DELETED; | |
| 1021 | 1056 | if( asNewFlag ){ |
| 1022 | 1057 | diff_manifest_entry(pFromFile, 0, pCfg); |
| 1023 | 1058 | } |
| 1024 | 1059 | } |
| 1025 | 1060 | pFromFile = manifest_file_next(pFrom,0); |
| @@ -1027,10 +1062,11 @@ | ||
| 1027 | 1062 | if( file_dir_match(pFileDir, pToFile->zName) ){ |
| 1028 | 1063 | if( (pCfg->diffFlags & |
| 1029 | 1064 | (DIFF_NUMSTAT|DIFF_HTML|DIFF_TCL|DIFF_JSON))==0 ){ |
| 1030 | 1065 | fossil_print("ADDED %s\n", pToFile->zName); |
| 1031 | 1066 | } |
| 1067 | + pCfg->diffFlags |= DIFF_FILE_ADDED; | |
| 1032 | 1068 | if( asNewFlag ){ |
| 1033 | 1069 | diff_manifest_entry(0, pToFile, pCfg); |
| 1034 | 1070 | } |
| 1035 | 1071 | } |
| 1036 | 1072 | pToFile = manifest_file_next(pTo,0); |
| 1037 | 1073 |
| --- 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 @@ | ||
| 161 | 161 | const char *zRight, /* Name of the right file */ |
| 162 | 162 | DiffConfig *pCfg, /* Diff configuration */ |
| 163 | 163 | Blob *pOut /* Write to this blob, or stdout of this is NULL */ |
| 164 | 164 | ){ |
| 165 | 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"; | |
| 166 | 169 | if( diffFlags & (DIFF_BRIEF|DIFF_RAW) ){ |
| 167 | 170 | /* no-op */ |
| 168 | 171 | }else if( diffFlags & DIFF_DEBUG ){ |
| 169 | 172 | blob_appendf(pOut, "FILE-LEFT %s\nFILE-RIGHT %s\n", zLeft, zRight); |
| 170 | 173 | }else if( diffFlags & DIFF_WEBPAGE ){ |
| @@ -574,11 +577,11 @@ | ||
| 574 | 577 | Blob file2; /* Content of zFile2 */ |
| 575 | 578 | const char *zName2; /* Name of zFile2 for display */ |
| 576 | 579 | |
| 577 | 580 | /* Read content of zFile2 into memory */ |
| 578 | 581 | blob_zero(&file2); |
| 579 | - if( file_size(zFile2, ExtFILE)<0 ){ | |
| 582 | + if( pCfg->diffFlags & DIFF_FILE_DELETED || file_size(zFile2, ExtFILE)<0 ){ | |
| 580 | 583 | zName2 = NULL_DEVICE; |
| 581 | 584 | }else{ |
| 582 | 585 | blob_read_from_file(&file2, zFile2, ExtFILE); |
| 583 | 586 | zName2 = zName; |
| 584 | 587 | } |
| @@ -605,10 +608,11 @@ | ||
| 605 | 608 | /* Release memory resources */ |
| 606 | 609 | blob_reset(&file2); |
| 607 | 610 | }else{ |
| 608 | 611 | Blob nameFile1; /* Name of temporary file to old pFile1 content */ |
| 609 | 612 | Blob cmd; /* Text of command to run */ |
| 613 | + int useTempfile = 1; | |
| 610 | 614 | |
| 611 | 615 | if( (pCfg->diffFlags & DIFF_INCBINARY)==0 ){ |
| 612 | 616 | Blob file2; |
| 613 | 617 | if( looks_like_binary(pFile1) ){ |
| 614 | 618 | fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY); |
| @@ -636,11 +640,20 @@ | ||
| 636 | 640 | } |
| 637 | 641 | |
| 638 | 642 | /* Construct a temporary file to hold pFile1 based on the name of |
| 639 | 643 | ** zFile2 */ |
| 640 | 644 | 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)); | |
| 642 | 655 | |
| 643 | 656 | /* Construct the external diff command */ |
| 644 | 657 | blob_zero(&cmd); |
| 645 | 658 | blob_append(&cmd, pCfg->zDiffCmd, -1); |
| 646 | 659 | if( pCfg->diffFlags & DIFF_INVERT ){ |
| @@ -653,11 +666,11 @@ | ||
| 653 | 666 | |
| 654 | 667 | /* Run the external diff command */ |
| 655 | 668 | fossil_system(blob_str(&cmd)); |
| 656 | 669 | |
| 657 | 670 | /* Delete the temporary file and clean up memory used */ |
| 658 | - file_delete(blob_str(&nameFile1)); | |
| 671 | + if( useTempfile ) file_delete(blob_str(&nameFile1)); | |
| 659 | 672 | blob_reset(&nameFile1); |
| 660 | 673 | blob_reset(&cmd); |
| 661 | 674 | } |
| 662 | 675 | } |
| 663 | 676 | |
| @@ -697,10 +710,12 @@ | ||
| 697 | 710 | blob_reset(&out); |
| 698 | 711 | }else{ |
| 699 | 712 | Blob cmd; |
| 700 | 713 | Blob temp1; |
| 701 | 714 | Blob temp2; |
| 715 | + int useTempfile1 = 1; | |
| 716 | + int useTempfile2 = 1; | |
| 702 | 717 | |
| 703 | 718 | if( (pCfg->diffFlags & DIFF_INCBINARY)==0 ){ |
| 704 | 719 | if( looks_like_binary(pFile1) || looks_like_binary(pFile2) ){ |
| 705 | 720 | fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY); |
| 706 | 721 | return; |
| @@ -714,15 +729,25 @@ | ||
| 714 | 729 | } |
| 715 | 730 | glob_free(pBinary); |
| 716 | 731 | } |
| 717 | 732 | } |
| 718 | 733 | |
| 719 | - /* Construct a temporary file names */ | |
| 734 | + /* Construct temporary file names */ | |
| 720 | 735 | file_tempname(&temp1, zName, "before"); |
| 721 | 736 | 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)); | |
| 724 | 749 | |
| 725 | 750 | /* Construct the external diff command */ |
| 726 | 751 | blob_zero(&cmd); |
| 727 | 752 | blob_append(&cmd, pCfg->zDiffCmd, -1); |
| 728 | 753 | blob_append_escaped_arg(&cmd, blob_str(&temp1), 1); |
| @@ -730,12 +755,12 @@ | ||
| 730 | 755 | |
| 731 | 756 | /* Run the external diff command */ |
| 732 | 757 | fossil_system(blob_str(&cmd)); |
| 733 | 758 | |
| 734 | 759 | /* 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)); | |
| 737 | 762 | |
| 738 | 763 | blob_reset(&temp1); |
| 739 | 764 | blob_reset(&temp2); |
| 740 | 765 | blob_reset(&cmd); |
| 741 | 766 | } |
| @@ -850,26 +875,31 @@ | ||
| 850 | 875 | }else{ |
| 851 | 876 | blob_set(&fname, g.zLocalRoot); |
| 852 | 877 | blob_append(&fname, zPathname, -1); |
| 853 | 878 | } |
| 854 | 879 | zFullName = blob_str(&fname); |
| 880 | + pCfg->diffFlags &= (~DIFF_FILE_MASK); | |
| 855 | 881 | if( isDeleted ){ |
| 856 | 882 | if( !isNumStat ){ fossil_print("DELETED %s\n", zPathname); } |
| 883 | + pCfg->diffFlags |= DIFF_FILE_DELETED; | |
| 857 | 884 | if( !asNewFile ){ showDiff = 0; zFullName = NULL_DEVICE; } |
| 858 | 885 | }else if( file_access(zFullName, F_OK) ){ |
| 859 | 886 | if( !isNumStat ){ fossil_print("MISSING %s\n", zPathname); } |
| 860 | 887 | if( !asNewFile ){ showDiff = 0; } |
| 861 | 888 | }else if( isNew ){ |
| 862 | 889 | if( !isNumStat ){ fossil_print("ADDED %s\n", zPathname); } |
| 890 | + pCfg->diffFlags |= DIFF_FILE_ADDED; | |
| 863 | 891 | srcid = 0; |
| 864 | 892 | if( !asNewFile ){ showDiff = 0; } |
| 865 | 893 | }else if( isChnged==3 ){ |
| 866 | 894 | if( !isNumStat ){ fossil_print("ADDED_BY_MERGE %s\n", zPathname); } |
| 895 | + pCfg->diffFlags |= DIFF_FILE_ADDED; | |
| 867 | 896 | srcid = 0; |
| 868 | 897 | if( !asNewFile ){ showDiff = 0; } |
| 869 | 898 | }else if( isChnged==5 ){ |
| 870 | 899 | if( !isNumStat ){ fossil_print("ADDED_BY_INTEGRATE %s\n", zPathname); } |
| 900 | + pCfg->diffFlags |= DIFF_FILE_ADDED; | |
| 871 | 901 | srcid = 0; |
| 872 | 902 | if( !asNewFile ){ showDiff = 0; } |
| 873 | 903 | } |
| 874 | 904 | if( showDiff ){ |
| 875 | 905 | Blob content; |
| @@ -882,11 +912,14 @@ | ||
| 882 | 912 | if( srcid>0 ){ |
| 883 | 913 | content_get(srcid, &content); |
| 884 | 914 | }else{ |
| 885 | 915 | blob_zero(&content); |
| 886 | 916 | } |
| 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 | + ){ | |
| 888 | 921 | diff_print_index(zPathname, pCfg, pOut); |
| 889 | 922 | diff_file(&content, zFullName, zPathname, pCfg, pOut); |
| 890 | 923 | } |
| 891 | 924 | blob_reset(&content); |
| 892 | 925 | } |
| @@ -1011,15 +1044,17 @@ | ||
| 1011 | 1044 | }else if( pToFile==0 ){ |
| 1012 | 1045 | cmp = -1; |
| 1013 | 1046 | }else{ |
| 1014 | 1047 | cmp = fossil_strcmp(pFromFile->zName, pToFile->zName); |
| 1015 | 1048 | } |
| 1049 | + pCfg->diffFlags &= (~DIFF_FILE_MASK); | |
| 1016 | 1050 | if( cmp<0 ){ |
| 1017 | 1051 | if( file_dir_match(pFileDir, pFromFile->zName) ){ |
| 1018 | 1052 | if( (pCfg->diffFlags & (DIFF_NUMSTAT|DIFF_HTML))==0 ){ |
| 1019 | 1053 | fossil_print("DELETED %s\n", pFromFile->zName); |
| 1020 | 1054 | } |
| 1055 | + pCfg->diffFlags |= DIFF_FILE_DELETED; | |
| 1021 | 1056 | if( asNewFlag ){ |
| 1022 | 1057 | diff_manifest_entry(pFromFile, 0, pCfg); |
| 1023 | 1058 | } |
| 1024 | 1059 | } |
| 1025 | 1060 | pFromFile = manifest_file_next(pFrom,0); |
| @@ -1027,10 +1062,11 @@ | ||
| 1027 | 1062 | if( file_dir_match(pFileDir, pToFile->zName) ){ |
| 1028 | 1063 | if( (pCfg->diffFlags & |
| 1029 | 1064 | (DIFF_NUMSTAT|DIFF_HTML|DIFF_TCL|DIFF_JSON))==0 ){ |
| 1030 | 1065 | fossil_print("ADDED %s\n", pToFile->zName); |
| 1031 | 1066 | } |
| 1067 | + pCfg->diffFlags |= DIFF_FILE_ADDED; | |
| 1032 | 1068 | if( asNewFlag ){ |
| 1033 | 1069 | diff_manifest_entry(0, pToFile, pCfg); |
| 1034 | 1070 | } |
| 1035 | 1071 | } |
| 1036 | 1072 | pToFile = manifest_file_next(pTo,0); |
| 1037 | 1073 |
| --- 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 |
+3
| --- src/patch.c | ||
| +++ src/patch.c | ||
| @@ -799,19 +799,22 @@ | ||
| 799 | 799 | } |
| 800 | 800 | } |
| 801 | 801 | zName = db_column_text(&q, 1); |
| 802 | 802 | rid = db_column_int(&q, 0); |
| 803 | 803 | |
| 804 | + pCfg->diffFlags &= (~DIFF_FILE_MASK); | |
| 804 | 805 | if( db_column_type(&q,3)==SQLITE_NULL ){ |
| 805 | 806 | if( !bWebpage ) fossil_print("DELETE %s\n", zName); |
| 807 | + pCfg->diffFlags |= DIFF_FILE_DELETED; | |
| 806 | 808 | diff_print_index(zName, pCfg, 0); |
| 807 | 809 | content_get(rid, &a); |
| 808 | 810 | diff_file_mem(&a, &empty, zName, pCfg); |
| 809 | 811 | }else if( rid==0 ){ |
| 810 | 812 | db_ephemeral_blob(&q, 3, &a); |
| 811 | 813 | blob_uncompress(&a, &a); |
| 812 | 814 | if( !bWebpage ) fossil_print("ADDED %s\n", zName); |
| 815 | + pCfg->diffFlags |= DIFF_FILE_ADDED; | |
| 813 | 816 | diff_print_index(zName, pCfg, 0); |
| 814 | 817 | diff_file_mem(&empty, &a, zName, pCfg); |
| 815 | 818 | blob_reset(&a); |
| 816 | 819 | }else if( db_column_bytes(&q, 3)>0 ){ |
| 817 | 820 | Blob delta; |
| 818 | 821 |
| --- 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 |
+3
| --- src/stash.c | ||
| +++ src/stash.c | ||
| @@ -427,17 +427,20 @@ | ||
| 427 | 427 | int isLink = db_column_int(&q, 3); |
| 428 | 428 | const char *zOrig = db_column_text(&q, 4); |
| 429 | 429 | const char *zNew = db_column_text(&q, 5); |
| 430 | 430 | char *zOPath = mprintf("%s%s", g.zLocalRoot, zOrig); |
| 431 | 431 | Blob a, b; |
| 432 | + pCfg->diffFlags &= (~DIFF_FILE_MASK); | |
| 432 | 433 | if( rid==0 ){ |
| 433 | 434 | db_ephemeral_blob(&q, 6, &a); |
| 434 | 435 | if( !bWebpage ) fossil_print("ADDED %s\n", zNew); |
| 436 | + pCfg->diffFlags |= DIFF_FILE_ADDED; | |
| 435 | 437 | diff_print_index(zNew, pCfg, 0); |
| 436 | 438 | diff_file_mem(&empty, &a, zNew, pCfg); |
| 437 | 439 | }else if( isRemoved ){ |
| 438 | 440 | if( !bWebpage) fossil_print("DELETE %s\n", zOrig); |
| 441 | + pCfg->diffFlags |= DIFF_FILE_DELETED; | |
| 439 | 442 | diff_print_index(zNew, pCfg, 0); |
| 440 | 443 | if( fBaseline ){ |
| 441 | 444 | content_get(rid, &a); |
| 442 | 445 | diff_file_mem(&a, &empty, zOrig, pCfg); |
| 443 | 446 | } |
| 444 | 447 |
| --- 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 |
+3
| --- src/stash.c | ||
| +++ src/stash.c | ||
| @@ -427,17 +427,20 @@ | ||
| 427 | 427 | int isLink = db_column_int(&q, 3); |
| 428 | 428 | const char *zOrig = db_column_text(&q, 4); |
| 429 | 429 | const char *zNew = db_column_text(&q, 5); |
| 430 | 430 | char *zOPath = mprintf("%s%s", g.zLocalRoot, zOrig); |
| 431 | 431 | Blob a, b; |
| 432 | + pCfg->diffFlags &= (~DIFF_FILE_MASK); | |
| 432 | 433 | if( rid==0 ){ |
| 433 | 434 | db_ephemeral_blob(&q, 6, &a); |
| 434 | 435 | if( !bWebpage ) fossil_print("ADDED %s\n", zNew); |
| 436 | + pCfg->diffFlags |= DIFF_FILE_ADDED; | |
| 435 | 437 | diff_print_index(zNew, pCfg, 0); |
| 436 | 438 | diff_file_mem(&empty, &a, zNew, pCfg); |
| 437 | 439 | }else if( isRemoved ){ |
| 438 | 440 | if( !bWebpage) fossil_print("DELETE %s\n", zOrig); |
| 441 | + pCfg->diffFlags |= DIFF_FILE_DELETED; | |
| 439 | 442 | diff_print_index(zNew, pCfg, 0); |
| 440 | 443 | if( fBaseline ){ |
| 441 | 444 | content_get(rid, &a); |
| 442 | 445 | diff_file_mem(&a, &empty, zOrig, pCfg); |
| 443 | 446 | } |
| 444 | 447 |
| --- 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 |
+26
| --- test/diff.test | ||
| +++ test/diff.test | ||
| @@ -126,9 +126,37 @@ | ||
| 126 | 126 | > 7 "mno": { |
| 127 | 127 | > 8 "pqr": false |
| 128 | 128 | > 9 } |
| 129 | 129 | 5 } 10 } |
| 130 | 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).}} | |
| 131 | 157 | |
| 132 | 158 | ############################################################################### |
| 133 | 159 | |
| 134 | 160 | test_cleanup |
| 135 | 161 |
| --- 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 |
+26
| --- test/diff.test | ||
| +++ test/diff.test | ||
| @@ -126,9 +126,37 @@ | ||
| 126 | 126 | > 7 "mno": { |
| 127 | 127 | > 8 "pqr": false |
| 128 | 128 | > 9 } |
| 129 | 129 | 5 } 10 } |
| 130 | 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).}} | |
| 131 | 157 | |
| 132 | 158 | ############################################################################### |
| 133 | 159 | |
| 134 | 160 | test_cleanup |
| 135 | 161 |
| --- 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 |