Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Restructured code to let insertMatchingBlocks handle puting changes in the change list. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
bd368726a8cd06765773979938e148c5 |
User & Date: | peter.spjuth@gmail.com 2011-04-27 22:20:29.000 |
Context
2011-04-27
| ||
23:13 | Added -fine option for fine grained change chunks, useful for merging. check-in: 35053e21fc user: peter.spjuth@gmail.com tags: trunk | |
22:20 | Restructured code to let insertMatchingBlocks handle puting changes in the change list. check-in: bd368726a8 user: peter.spjuth@gmail.com tags: trunk | |
2011-04-25
| ||
15:58 | 3-way diff now handles basic cases. check-in: 674c783efa user: peter.spjuth@gmail.com tags: trunk | |
Changes
Changes to src/eskil.tcl.
︙ | ︙ | |||
446 447 448 449 450 451 452 | return [expr {($n1 > $n2 ? $n1 : $n2) + 1}] } else { return [expr {-($n1 > $n2 ? $n1 : $n2)}] } } # Insert two blocks of lines in the compare windows. | < | | | > > > > > > > > > > | | 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 | return [expr {($n1 > $n2 ? $n1 : $n2) + 1}] } else { return [expr {-($n1 > $n2 ? $n1 : $n2)}] } } # Insert two blocks of lines in the compare windows. # The return value is true if the block should not be considered a change proc insertMatchingBlocks {top block1 block2 line1 line2 details} { global doingLine1 doingLine2 # A large block may take time. Give a small warning. set n1 [llength $block1] set n2 [llength $block2] if {$n1 * $n2 > 1000} { set ::widgets($top,eqLabel) "!" #puts "Eskil warning: Analyzing a large block. ($size1 $size2)" update idletasks } # Detect if only newlines has changed within the block, e.g. # when rearranging newlines. if {$::eskil(ignorenewline)} { set res [ParseBlocksAcrossNewline $top $block1 $block2] if {$res != 0} { # FIXA: move this to ParseBlocksAcrossNewline if {$res > 0 && $details} { addChange $top $res change $line1 $n1 $line2 $n2 } else { addMapLines $top [expr {abs($res)}] } # Negative means considered not a change return [expr {$res < 0}] } } set apa [compareBlocks $block1 $block2] set t1 0 set t2 0 |
︙ | ︙ | |||
512 513 514 515 516 517 518 | "hl$::HighLightCount change" $::widgets($top,wDiff2) insert end "$bepa\n" new2 emptyLine $top 1 incr doingLine2 incr t2 } } | > > > > > | > | 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 | "hl$::HighLightCount change" $::widgets($top,wDiff2) insert end "$bepa\n" new2 emptyLine $top 1 incr doingLine2 incr t2 } } if {$details} { addChange $top [llength $apa] change $line1 $n1 $line2 $n2 } else { addMapLines $top [llength $apa] } return 0 } # Process one of the change/add/delete blocks reported by diff. # ch1 is a file channel for the left file # ch2 is a file channel for the right file # n1/n2 is the number of lines involved # line1/line2 says on what lines this block starts # If n1/n2 are both 0, it means that this is the last lines to be displayed. # In that case line1/line2, if non-zero says the last line to display. # The return value is true if the block should not be considered a change proc doText {top ch1 ch2 n1 n2 line1 line2} { global doingLine1 doingLine2 Pref if {$n1 == 0 && $n2 == 0} { # All blocks have been processed. Continue until end of file. # If "show all" is not on, just display a couple of context lines. set limit -1 |
︙ | ︙ | |||
558 559 560 561 562 563 564 | while {[gets $ch1 apa] != -1} { if {$line1 > 0 && $doingLine1 > $line1} break insertLine $top 1 $doingLine1 $apa incr doingLine1 incr t if {$limit >= 0 && $t >= $limit} break } | | | 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 | while {[gets $ch1 apa] != -1} { if {$line1 > 0 && $doingLine1 > $line1} break insertLine $top 1 $doingLine1 $apa incr doingLine1 incr t if {$limit >= 0 && $t >= $limit} break } return 0 } # Is this a change block, a delete block or a insert block? if {$n1 == 0} {set tag2 new2} else {set tag2 change} if {$n2 == 0} {set tag1 new1} else {set tag1 change} # Display all equal lines before next diff |
︙ | ︙ | |||
600 601 602 603 604 605 606 | } } incr doingLine1 incr doingLine2 incr t if {$::diff($top,limitlines) && \ ($::diff($top,mapMax) > $::diff($top,limitlines))} { | | | 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 | } } incr doingLine1 incr doingLine2 incr t if {$::diff($top,limitlines) && \ ($::diff($top,mapMax) > $::diff($top,limitlines))} { return 0 } } # This should not happen unless something is wrong... if {$doingLine2 != $line2} { disallowEdit $top $::widgets($top,wDiff1) insert end \ "**Bad alignment here!! $doingLine2 $line2**\n" |
︙ | ︙ | |||
644 645 646 647 648 649 650 | lappend block1 $apa } set block2 {} for {set t 0} {$t < $n2} {incr t} { gets $ch2 apa lappend block2 $apa } | | | < < < | 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 | lappend block1 $apa } set block2 {} for {set t 0} {$t < $n2} {incr t} { gets $ch2 apa lappend block2 $apa } set apa [insertMatchingBlocks $top $block1 $block2 $line1 $line2 1] if {$apa < 0} { # In this case, a change is not visible return 1 } } else { # No extra parsing at all. for {set t 0} {$t < $n1} {incr t} { gets $ch1 apa |
︙ | ︙ | |||
678 679 680 681 682 683 684 | emptyLine $top 2 } addChange $top $n1 $tag1 $line1 $n1 $line2 $n2 } } } # Empty return value | | | 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 | emptyLine $top 2 } addChange $top $n1 $tag1 $line1 $n1 $line2 $n2 } } } # Empty return value return 0 } proc enableRedo {top} { $top.m.mf entryconfigure "Redo Diff" -state normal $top.m.mt entryconfigure "Merge" -state normal } |
︙ | ︙ | |||
884 885 886 887 888 889 890 | } continue } # No change block anymore. If one just ended, display it. if {[llength $lblock] > 0 || [llength $rblock] > 0} { set ::doingLine1 $lblockl set ::doingLine2 $rblockl | | | 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 | } continue } # No change block anymore. If one just ended, display it. if {[llength $lblock] > 0 || [llength $rblock] > 0} { set ::doingLine1 $lblockl set ::doingLine2 $rblockl insertMatchingBlocks $top $lblock $rblock $lblockl $rblockl 0 set lblock {} set rblock {} } if {$lmode == "" && $rmode == ""} { insertLine $top 1 $lline $lstr insertLine $top 2 $rline $rstr incr leftc |
︙ | ︙ | |||
915 916 917 918 919 920 921 | continue } } # If the patch ended with a change block, display it. if {[llength $lblock] > 0 || [llength $rblock] > 0} { set ::doingLine1 $lblockl set ::doingLine2 $rblockl | | | 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 | continue } } # If the patch ended with a change block, display it. if {[llength $lblock] > 0 || [llength $rblock] > 0} { set ::doingLine1 $lblockl set ::doingLine2 $rblockl insertMatchingBlocks $top $lblock $rblock $lblockl $rblockl 0 set lblock {} set rblock {} } } # Read a patch file and display it proc displayPatch {top} { |
︙ | ︙ |