| | @@ -35,15 +35,38 @@ |
| 35 | 35 | } |
| 36 | 36 | va_end(ap); |
| 37 | 37 | } |
| 38 | 38 | |
| 39 | 39 | /* |
| 40 | | -** Print the "Index:" message that patch wants to see at the top of a diff. |
| 40 | +** Print the "Index:" message that patches wants to see at the top of a diff. |
| 41 | +*/ |
| 42 | +void diff_print_index(const char *zFile, int diffFlags){ |
| 43 | + if( (diffFlags & DIFF_SIDEBYSIDE)==0 ){ |
| 44 | + char *z = mprintf("Index: %s\n%.66c\n", zFile, '='); |
| 45 | + diff_printf("%s", z); |
| 46 | + fossil_free(z); |
| 47 | + } |
| 48 | +} |
| 49 | + |
| 50 | +/* |
| 51 | +** Print the +++/--- filename lines for a diff operation. |
| 41 | 52 | */ |
| 42 | | -void diff_print_index(const char *zFile){ |
| 43 | | - diff_printf("Index: %s\n=======================================" |
| 44 | | - "============================\n", zFile); |
| 53 | +void diff_print_filenames(const char *zLeft, const char *zRight, int diffFlags){ |
| 54 | + char *z = 0; |
| 55 | + if( diffFlags & DIFF_SIDEBYSIDE ){ |
| 56 | + int w = diff_width(diffFlags); |
| 57 | + int n1 = strlen(zLeft); |
| 58 | + int x; |
| 59 | + if( n1>w*2 ) n1 = w*2; |
| 60 | + x = w*2+17 - (n1+2); |
| 61 | + z = mprintf("%.*c %.*s %.*c\n", |
| 62 | + x/2, '=', n1, zLeft, (x+1)/2, '='); |
| 63 | + }else{ |
| 64 | + z = mprintf("--- %s\n+++ %s\n", zLeft, zRight); |
| 65 | + } |
| 66 | + diff_printf("%s", z); |
| 67 | + fossil_free(z); |
| 45 | 68 | } |
| 46 | 69 | |
| 47 | 70 | /* |
| 48 | 71 | ** Show the difference between two files, one in memory and one on disk. |
| 49 | 72 | ** |
| | @@ -80,11 +103,11 @@ |
| 80 | 103 | |
| 81 | 104 | /* Compute and output the differences */ |
| 82 | 105 | blob_zero(&out); |
| 83 | 106 | text_diff(pFile1, &file2, &out, diffFlags); |
| 84 | 107 | if( blob_size(&out) ){ |
| 85 | | - diff_printf("--- %s\n+++ %s\n", zName, zName2); |
| 108 | + diff_print_filenames(zName, zName2, diffFlags); |
| 86 | 109 | diff_printf("%s\n", blob_str(&out)); |
| 87 | 110 | } |
| 88 | 111 | |
| 89 | 112 | /* Release memory resources */ |
| 90 | 113 | blob_reset(&file2); |
| | @@ -139,11 +162,11 @@ |
| 139 | 162 | if( zDiffCmd==0 ){ |
| 140 | 163 | Blob out; /* Diff output text */ |
| 141 | 164 | |
| 142 | 165 | blob_zero(&out); |
| 143 | 166 | text_diff(pFile1, pFile2, &out, diffFlags); |
| 144 | | - diff_printf("--- %s\n+++ %s\n", zName, zName); |
| 167 | + diff_print_filenames(zName, zName, diffFlags); |
| 145 | 168 | diff_printf("%s\n", blob_str(&out)); |
| 146 | 169 | |
| 147 | 170 | /* Release memory resources */ |
| 148 | 171 | blob_reset(&out); |
| 149 | 172 | }else{ |
| | @@ -281,21 +304,21 @@ |
| 281 | 304 | if( !asNewFile ){ showDiff = 0; } |
| 282 | 305 | } |
| 283 | 306 | if( showDiff ){ |
| 284 | 307 | Blob content; |
| 285 | 308 | if( !isLink != !file_wd_islink(zFullName) ){ |
| 286 | | - diff_print_index(zPathname); |
| 287 | | - diff_printf("--- %s\n+++ %s\n", zPathname, zPathname); |
| 309 | + diff_print_index(zPathname, diffFlags); |
| 310 | + diff_print_filenames(zPathname, zPathname, diffFlags); |
| 288 | 311 | diff_printf("cannot compute difference between symlink and regular file\n"); |
| 289 | 312 | continue; |
| 290 | 313 | } |
| 291 | 314 | if( srcid>0 ){ |
| 292 | 315 | content_get(srcid, &content); |
| 293 | 316 | }else{ |
| 294 | 317 | blob_zero(&content); |
| 295 | 318 | } |
| 296 | | - diff_print_index(zPathname); |
| 319 | + diff_print_index(zPathname, diffFlags); |
| 297 | 320 | diff_file(&content, zFullName, zPathname, zDiffCmd, diffFlags); |
| 298 | 321 | blob_reset(&content); |
| 299 | 322 | } |
| 300 | 323 | free(zToFree); |
| 301 | 324 | } |
| | @@ -321,11 +344,11 @@ |
| 321 | 344 | file_tree_name(zFileTreeName, &fname, 1); |
| 322 | 345 | zName = blob_str(&fname); |
| 323 | 346 | historical_version_of_file(zFrom, zName, &v1, &isLink1, 0, 0); |
| 324 | 347 | historical_version_of_file(zTo, zName, &v2, &isLink2, 0, 0); |
| 325 | 348 | if( isLink1 != isLink2 ){ |
| 326 | | - diff_printf("--- %s\n+++ %s\n", zName, zName); |
| 349 | + diff_print_filenames(zName, zName, diffFlags); |
| 327 | 350 | diff_printf("cannot compute difference between symlink and regular file\n"); |
| 328 | 351 | }else{ |
| 329 | 352 | diff_file_mem(&v1, &v2, zName, zDiffCmd, diffFlags); |
| 330 | 353 | } |
| 331 | 354 | blob_reset(&v1); |
| | @@ -344,11 +367,11 @@ |
| 344 | 367 | int diffFlags |
| 345 | 368 | ){ |
| 346 | 369 | Blob f1, f2; |
| 347 | 370 | int rid; |
| 348 | 371 | const char *zName = pFrom ? pFrom->zName : pTo->zName; |
| 349 | | - diff_print_index(zName); |
| 372 | + diff_print_index(zName, diffFlags); |
| 350 | 373 | if( pFrom ){ |
| 351 | 374 | rid = uuid_to_rid(pFrom->zUuid, 0); |
| 352 | 375 | content_get(rid, &f1); |
| 353 | 376 | }else{ |
| 354 | 377 | blob_zero(&f1); |
| | @@ -463,40 +486,29 @@ |
| 463 | 486 | int hasNFlag; /* True if -N or --new-file flag is used */ |
| 464 | 487 | const char *zFrom; /* Source version number */ |
| 465 | 488 | const char *zTo; /* Target version number */ |
| 466 | 489 | const char *zDiffCmd = 0; /* External diff command. NULL for internal diff */ |
| 467 | 490 | int diffFlags = 0; /* Flags to control the DIFF */ |
| 468 | | - const char *z; |
| 469 | 491 | int f; |
| 470 | 492 | |
| 471 | 493 | isGDiff = g.argv[1][0]=='g'; |
| 472 | 494 | isInternDiff = find_option("internal","i",0)!=0; |
| 473 | 495 | zFrom = find_option("from", "r", 1); |
| 474 | 496 | zTo = find_option("to", 0, 1); |
| 497 | + diffFlags = diff_options(); |
| 475 | 498 | hasNFlag = find_option("new-file","N",0)!=0; |
| 476 | | - if( find_option("side-by-side","y",0)!=0 ) diffFlags |= DIFF_SIDEBYSIDE; |
| 477 | | - if( (z = find_option("context","c",1))!=0 && (f = atoi(z))>0 ){ |
| 478 | | - if( f > DIFF_CONTEXT_MASK ) f = DIFF_CONTEXT_MASK; |
| 479 | | - diffFlags |= f; |
| 480 | | - } |
| 481 | | - if( (z = find_option("width","W",1))!=0 && (f = atoi(z))>0 ){ |
| 482 | | - f *= DIFF_CONTEXT_MASK+1; |
| 483 | | - if( f > DIFF_WIDTH_MASK ) f = DIFF_CONTEXT_MASK; |
| 484 | | - diffFlags |= f; |
| 485 | | - } |
| 486 | | - |
| 487 | | - |
| 488 | 499 | if( hasNFlag ) diffFlags |= DIFF_NEWFILE; |
| 500 | + |
| 489 | 501 | if( zTo==0 ){ |
| 490 | 502 | db_must_be_within_tree(); |
| 491 | 503 | verify_all_options(); |
| 492 | 504 | if( !isInternDiff ){ |
| 493 | 505 | zDiffCmd = db_get(isGDiff ? "gdiff-command" : "diff-command", 0); |
| 494 | 506 | } |
| 495 | 507 | if( g.argc>=3 ){ |
| 496 | 508 | for(f=2; f<g.argc; ++f){ |
| 497 | | - diff_one_against_disk(zFrom, zDiffCmd, 0, g.argv[f]); |
| 509 | + diff_one_against_disk(zFrom, zDiffCmd, diffFlags, g.argv[f]); |
| 498 | 510 | } |
| 499 | 511 | }else{ |
| 500 | 512 | diff_all_against_disk(zFrom, zDiffCmd, diffFlags); |
| 501 | 513 | } |
| 502 | 514 | }else if( zFrom==0 ){ |
| | @@ -507,11 +519,11 @@ |
| 507 | 519 | if( !isInternDiff ){ |
| 508 | 520 | zDiffCmd = db_get(isGDiff ? "gdiff-command" : "diff-command", 0); |
| 509 | 521 | } |
| 510 | 522 | if( g.argc>=3 ){ |
| 511 | 523 | for(f=2; f<g.argc; ++f){ |
| 512 | | - diff_one_two_versions(zFrom, zTo, zDiffCmd, 0, g.argv[f]); |
| 524 | + diff_one_two_versions(zFrom, zTo, zDiffCmd, diffFlags, g.argv[f]); |
| 513 | 525 | } |
| 514 | 526 | }else{ |
| 515 | 527 | diff_all_two_versions(zFrom, zTo, zDiffCmd, diffFlags); |
| 516 | 528 | } |
| 517 | 529 | } |
| 518 | 530 | |