Fossil SCM

Fix "stash diff" command so if file on filesystem is same as the stashed file, don't print "CHANGED" and skip the diff. This match regular "fossil diff" command.

mgagnon 2026-06-18 12:57 UTC trunk
Commit 71b0c80bbcce72c6eb10c10a0768e9cc3018fd7468067faae6626470dd21df63
2 files changed +1 -1 +13 -3
+1 -1
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -776,11 +776,11 @@
776776
777777
/*
778778
** Return true if the disk file is identical to the Blob. Return zero
779779
** if the files differ in any way.
780780
*/
781
-static int file_same_as_blob(Blob *blob, const char *zDiskFile){
781
+int file_same_as_blob(Blob *blob, const char *zDiskFile){
782782
Blob file;
783783
int rc = 0;
784784
if( blob_size(blob)!=file_size(zDiskFile, ExtFILE) ) return 0;
785785
blob_zero(&file);
786786
blob_read_from_file(&file, zDiskFile, ExtFILE);
787787
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -776,11 +776,11 @@
776
777 /*
778 ** Return true if the disk file is identical to the Blob. Return zero
779 ** if the files differ in any way.
780 */
781 static int file_same_as_blob(Blob *blob, const char *zDiskFile){
782 Blob file;
783 int rc = 0;
784 if( blob_size(blob)!=file_size(zDiskFile, ExtFILE) ) return 0;
785 blob_zero(&file);
786 blob_read_from_file(&file, zDiskFile, ExtFILE);
787
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -776,11 +776,11 @@
776
777 /*
778 ** Return true if the disk file is identical to the Blob. Return zero
779 ** if the files differ in any way.
780 */
781 int file_same_as_blob(Blob *blob, const char *zDiskFile){
782 Blob file;
783 int rc = 0;
784 if( blob_size(blob)!=file_size(zDiskFile, ExtFILE) ) return 0;
785 blob_zero(&file);
786 blob_read_from_file(&file, zDiskFile, ExtFILE);
787
+13 -3
--- src/stash.c
+++ src/stash.c
@@ -447,24 +447,34 @@
447447
}
448448
}else{
449449
Blob delta;
450450
int isOrigLink = file_islink(zOPath);
451451
db_ephemeral_blob(&q, 6, &delta);
452
- if( !bWebpage ) fossil_print("CHANGED %s\n", zNew);
453452
if( !isOrigLink != !isLink ){
453
+ if( !bWebpage ) fossil_print("CHANGED %s\n", zNew);
454454
diff_print_index(zNew, pCfg, 0);
455455
diff_print_filenames(zOrig, zNew, pCfg, 0);
456456
printf(DIFF_CANNOT_COMPUTE_SYMLINK);
457457
}else{
458
+ int isChanged = 0;
458459
content_get(rid, &a);
459460
blob_delta_apply(&a, &delta, &b);
460461
if( fBaseline ){
461
- diff_file_mem(&a, &b, zNew, pCfg);
462
- }else{
462
+ if( blob_compare(&a, &b) ){
463
+ isChanged = 1;
464
+ if( !bWebpage ) fossil_print("CHANGED %s\n", zNew);
465
+ diff_file_mem(&a, &b, zNew, pCfg);
466
+ }
467
+ }else if( !file_same_as_blob(&b, zOPath) ){
468
+ isChanged = 1;
469
+ if( !bWebpage ) fossil_print("CHANGED %s\n", zNew);
463470
pCfg->diffFlags ^= DIFF_INVERT;
464471
diff_file(&b, zOPath, zNew, pCfg, 0);
465472
pCfg->diffFlags ^= DIFF_INVERT;
473
+ }
474
+ if( !bWebpage && !isChanged && pCfg->diffFlags & DIFF_VERBOSE ){
475
+ fossil_print("UNCHANGED %s\n", zNew);
466476
}
467477
blob_reset(&a);
468478
blob_reset(&b);
469479
}
470480
blob_reset(&delta);
471481
--- src/stash.c
+++ src/stash.c
@@ -447,24 +447,34 @@
447 }
448 }else{
449 Blob delta;
450 int isOrigLink = file_islink(zOPath);
451 db_ephemeral_blob(&q, 6, &delta);
452 if( !bWebpage ) fossil_print("CHANGED %s\n", zNew);
453 if( !isOrigLink != !isLink ){
 
454 diff_print_index(zNew, pCfg, 0);
455 diff_print_filenames(zOrig, zNew, pCfg, 0);
456 printf(DIFF_CANNOT_COMPUTE_SYMLINK);
457 }else{
 
458 content_get(rid, &a);
459 blob_delta_apply(&a, &delta, &b);
460 if( fBaseline ){
461 diff_file_mem(&a, &b, zNew, pCfg);
462 }else{
 
 
 
 
 
 
463 pCfg->diffFlags ^= DIFF_INVERT;
464 diff_file(&b, zOPath, zNew, pCfg, 0);
465 pCfg->diffFlags ^= DIFF_INVERT;
 
 
 
466 }
467 blob_reset(&a);
468 blob_reset(&b);
469 }
470 blob_reset(&delta);
471
--- src/stash.c
+++ src/stash.c
@@ -447,24 +447,34 @@
447 }
448 }else{
449 Blob delta;
450 int isOrigLink = file_islink(zOPath);
451 db_ephemeral_blob(&q, 6, &delta);
 
452 if( !isOrigLink != !isLink ){
453 if( !bWebpage ) fossil_print("CHANGED %s\n", zNew);
454 diff_print_index(zNew, pCfg, 0);
455 diff_print_filenames(zOrig, zNew, pCfg, 0);
456 printf(DIFF_CANNOT_COMPUTE_SYMLINK);
457 }else{
458 int isChanged = 0;
459 content_get(rid, &a);
460 blob_delta_apply(&a, &delta, &b);
461 if( fBaseline ){
462 if( blob_compare(&a, &b) ){
463 isChanged = 1;
464 if( !bWebpage ) fossil_print("CHANGED %s\n", zNew);
465 diff_file_mem(&a, &b, zNew, pCfg);
466 }
467 }else if( !file_same_as_blob(&b, zOPath) ){
468 isChanged = 1;
469 if( !bWebpage ) fossil_print("CHANGED %s\n", zNew);
470 pCfg->diffFlags ^= DIFF_INVERT;
471 diff_file(&b, zOPath, zNew, pCfg, 0);
472 pCfg->diffFlags ^= DIFF_INVERT;
473 }
474 if( !bWebpage && !isChanged && pCfg->diffFlags & DIFF_VERBOSE ){
475 fossil_print("UNCHANGED %s\n", zNew);
476 }
477 blob_reset(&a);
478 blob_reset(&b);
479 }
480 blob_reset(&delta);
481

Keyboard Shortcuts

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