Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Changed separate diff to use -range option to DiffUtil::diffFiles. Moved widget related global data to ::widgets. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
8b189f33857b4b41b2b2f6c5f1be1d3d |
User & Date: | peter 2004-05-23 13:16:02.000 |
Context
2004-05-24
| ||
11:36 | Added map at dirdiff scrollbar. Redesigned font selector a bit using newer widgets. Added menu entry to step down in either side in dirdiff. Added Help menu in dirdiff window. Provide some info to help DiffUtil to locate diff executable. check-in: b217995849 user: peter tags: trunk | |
2004-05-23
| ||
13:16 | Changed separate diff to use -range option to DiffUtil::diffFiles. Moved widget related global data to ::widgets. check-in: 8b189f3385 user: peter tags: trunk | |
11:09 | Moved execution of diff to DiffUtil package. Remade align to use flag of DiffUtil::diffFiles. check-in: 656ffb6673 user: peter tags: trunk | |
Changes
Changes to src/eskil.tcl.
︙ | ︙ | |||
693 694 695 696 697 698 699 | } } return $apa } # Insert lineno and text proc insertLine {top n line text {tag {}}} { | | | | | | | 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 | } } return $apa } # Insert lineno and text proc insertLine {top n line text {tag {}}} { $::widgets($top,wDiff$n) insert end "$text\n" $tag if {$tag != ""} { set tag "hl$::HighLightCount $tag" } $::widgets($top,wLine$n) insert end [myFormL $line] $tag } proc emptyLine {top n {highlight 1}} { if {$highlight} { $::widgets($top,wLine$n) insert end "\n" hl$::HighLightCount } else { $::widgets($top,wLine$n) insert end "*****\n" } $::widgets($top,wDiff$n) insert end "\n" } # Insert one line in each text widget. # Mark them as changed, and optionally parse them. proc insertMatchingLines {top line1 line2} { global doingLine1 doingLine2 Pref |
︙ | ︙ | |||
737 738 739 740 741 742 743 | if {$res1 != $xres1 || $res2 != $xres2} { tk_messageBox -title Mismatch! \ -message ":$res1:\n:$res2:\n:$xres1:\n:$xres2:" } } set dotag 0 set n [maxAbs [llength $res1] [llength $res2]] | | | | | | | | | | | | | 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 | if {$res1 != $xres1 || $res2 != $xres2} { tk_messageBox -title Mismatch! \ -message ":$res1:\n:$res2:\n:$xres1:\n:$xres2:" } } set dotag 0 set n [maxAbs [llength $res1] [llength $res2]] $::widgets($top,wLine1) insert end [myFormL $doingLine1] "hl$::HighLightCount change" $::widgets($top,wLine2) insert end [myFormL $doingLine2] "hl$::HighLightCount change" set new1 "new1" set new2 "new2" set change "change" foreach i1 $res1 i2 $res2 { incr n -1 if {$dotag} { if {$n == 1 && $Pref(marklast)} { lappend new1 last lappend new2 last lappend change last } if {$i1 eq ""} { $::widgets($top,wDiff2) insert end $i2 $new2 } elseif {$i2 eq ""} { $::widgets($top,wDiff1) insert end $i1 $new1 } else { $::widgets($top,wDiff1) insert end $i1 $change $::widgets($top,wDiff2) insert end $i2 $change } set dotag 0 } else { $::widgets($top,wDiff1) insert end $i1 $::widgets($top,wDiff2) insert end $i2 set dotag 1 } } $::widgets($top,wDiff1) insert end "\n" $::widgets($top,wDiff2) insert end "\n" } else { insertLine $top 1 $doingLine1 $line1 "change" insertLine $top 2 $doingLine2 $line2 "change" } incr doingLine1 incr doingLine2 } # Insert two blocks of lines in the compare windows. # Returns number of lines used to display the blocks proc insertMatchingBlocks {top block1 block2} { global doingLine1 doingLine2 # A large block may take time. Give a small warning. if {[llength $block1] * [llength $block2] > 1000} { set ::widgets($top,eqLabel) "!" #puts "Eskil warning: Analyzing a large block. ($size1 $size2)" update idletasks } set apa [compareBlocks $block1 $block2] set t1 0 |
︙ | ︙ | |||
804 805 806 807 808 809 810 | incr t2 } elseif {$c eq "C"} { # This is two lines that the block matching considered # too different to use line parsing on them. # Marked the whole line as deleted/inserted set textline1 [lindex $block1 $t1] set textline2 [lindex $block2 $t2] | | | | | | | | | | | | | > > > > | 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 | incr t2 } elseif {$c eq "C"} { # This is two lines that the block matching considered # too different to use line parsing on them. # Marked the whole line as deleted/inserted set textline1 [lindex $block1 $t1] set textline2 [lindex $block2 $t2] $::widgets($top,wLine1) insert end [myFormL $doingLine1] \ "hl$::HighLightCount change" $::widgets($top,wDiff1) insert end "$textline1\n" new1 $::widgets($top,wLine2) insert end [myFormL $doingLine2] \ "hl$::HighLightCount change" $::widgets($top,wDiff2) insert end "$textline2\n" new2 incr doingLine1 incr doingLine2 incr t1 incr t2 } elseif {$c eq "d"} { set bepa [lindex $block1 $t1] $::widgets($top,wLine1) insert end [myFormL $doingLine1] \ "hl$::HighLightCount change" $::widgets($top,wDiff1) insert end "$bepa\n" new1 emptyLine $top 2 incr doingLine1 incr t1 } elseif {$c eq "a"} { set bepa [lindex $block2 $t2] $::widgets($top,wLine2) insert end [myFormL $doingLine2] \ "hl$::HighLightCount change" $::widgets($top,wDiff2) insert end "$bepa\n" new2 emptyLine $top 1 incr doingLine2 incr t2 } } return [llength $apa] } # 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. 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 "only diffs" is on, just display a couple of context lines. set limit -1 if {$Pref(context) > 0} { set limit $Pref(context) } # Consider any total limit on displayed lines. if {$::diff($top,limitlines)} { set limit [expr {$::diff($top,limitlines) - $::diff($top,mapMax)}] if {$limit < 0} { set limit 0 } } set t 0 while {[gets $ch2 apa] != -1} { if {$line2 > 0 && $doingLine2 > $line2} break insertLine $top 2 $doingLine2 $apa incr doingLine2 incr ::diff($top,mapMax) incr t if {$limit >= 0 && $t >= $limit} break } set t 0 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 } |
︙ | ︙ | |||
911 912 913 914 915 916 917 | if {$::diff($top,limitlines) && \ ($::diff($top,mapMax) > $::diff($top,limitlines))} { return } } # This should not happen unless something is wrong... if {$doingLine2 != $line2} { | | | | | | 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 | if {$::diff($top,limitlines) && \ ($::diff($top,mapMax) > $::diff($top,limitlines))} { return } } # This should not happen unless something is wrong... if {$doingLine2 != $line2} { $::widgets($top,wDiff1) insert end \ "**Bad alignment here!! $doingLine2 $line2**\n" $::widgets($top,wDiff2) insert end \ "**Bad alignment here!! $doingLine2 $line2**\n" $::widgets($top,wLine1) insert end "\n" $::widgets($top,wLine2) insert end "\n" } # Process the block if {$n1 == $n2 && ($n1 == 1 || $Pref(parse) < 2)} { # Never do block parsing for one line blocks. # If block parsing is turned off, only do line parsing for |
︙ | ︙ | |||
1001 1002 1003 1004 1005 1006 1007 | $top.mt.m entryconfigure "Merge" -state disabled } proc busyCursor {top} { global oldcursor oldcursor2 if {![info exists oldcursor]} { set oldcursor [$top cget -cursor] | | | | | | | | | | | | | | 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 | $top.mt.m entryconfigure "Merge" -state disabled } proc busyCursor {top} { global oldcursor oldcursor2 if {![info exists oldcursor]} { set oldcursor [$top cget -cursor] set oldcursor2 [$::widgets($top,wDiff1) cget -cursor] } $top config -cursor watch foreach item {wLine1 wDiff1 wLine2 wDiff2} { if {[info exists ::widgets($top,$item)]} { set w $::widgets($top,$item) $w config -cursor watch } } } proc normalCursor {top} { global oldcursor oldcursor2 $top config -cursor $oldcursor foreach item {wLine1 wDiff1 wLine2 wDiff2} { if {[info exists ::widgets($top,$item)]} { set w $::widgets($top,$item) $w config -cursor $oldcursor2 } } } # Read a conflict file and extract the two versions. proc prepareConflict {top} { global Pref set ::diff($top,leftFile) [tmpFile] set ::diff($top,rightFile) [tmpFile] set ch1 [open $::diff($top,leftFile) w] set ch2 [open $::diff($top,rightFile) w] set ch [open $::diff($top,conflictFile) r] set ::diff($top,conflictDiff) {} set leftLine 1 set rightLine 1 set state both set rightName "" set leftName "" while {[gets $ch line] != -1} { if {[string match <<<<<<* $line]} { |
︙ | ︙ | |||
1074 1075 1076 1077 1078 1079 1080 | } } close $ch close $ch1 close $ch2 if {$leftName eq "" && $rightName eq ""} { | | | | | | | | | 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 | } } close $ch close $ch1 close $ch2 if {$leftName eq "" && $rightName eq ""} { set leftName "No Conflict: [file tail $::diff($top,conflictFile)]" set rightName $leftName } set ::diff($top,leftLabel) $leftName set ::diff($top,rightLabel) $rightName update idletasks } # Clean up after a conflict diff. proc cleanupConflict {top} { global Pref clearTmp $::diff($top,rightFile) $::diff($top,leftFile) set ::diff($top,rightFile) $::diff($top,conflictFile) set ::diff($top,leftFile) $::diff($top,conflictFile) } # Display one chunk from a patch file proc displayOnePatch {top leftLines rightLines leftLine rightLine} { emptyLine $top 1 emptyLine $top 2 |
︙ | ︙ | |||
1190 1191 1192 1193 1194 1195 1196 | continue } } } # Read a patch file and display it proc displayPatch {top} { | | | | | | 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 | continue } } } # Read a patch file and display it proc displayPatch {top} { global Pref set ::diff($top,leftLabel) "Patch $::diff($top,patchFile): old" set ::diff($top,rightLabel) "Patch $::diff($top,patchFile): new" update idletasks set ch [open $::diff($top,patchFile) r] set style "" set divider "-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-" set leftLine 1 set rightLine 1 set leftLines {} |
︙ | ︙ | |||
1355 1356 1357 1358 1359 1360 1361 | if {$old != ""} { cd $old } } # Prepare for RCS/CVS diff. Checkout copies of the versions needed. proc prepareRCS {top} { | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 | if {$old != ""} { cd $old } } # Prepare for RCS/CVS diff. Checkout copies of the versions needed. proc prepareRCS {top} { global Pref set revs {} # Search for revision options if {$::diff($top,doptrev1) != ""} { lappend revs $::diff($top,doptrev1) } if {$::diff($top,doptrev2) != ""} { lappend revs $::diff($top,doptrev2) } switch [llength $revs] { 0 { # Compare local file with latest version. set ::diff($top,leftFile) [tmpFile] set ::diff($top,rightLabel) $::diff($top,RCSFile) set ::diff($top,rightFile) $::diff($top,RCSFile) if {$::diff($top,mode) eq "CVS"} { set ::diff($top,leftLabel) "$::diff($top,RCSFile) (CVS)" execCvsUpdate $::diff($top,RCSFile) $::diff($top,leftFile) } else { set ::diff($top,leftLabel) "$::diff($top,RCSFile) (RCS)" catch {exec co -p [file nativename $::diff($top,RCSFile)] \ > $::diff($top,leftFile)} } } 1 { # Compare local file with specified version. set r [lindex $revs 0] set ::diff($top,leftFile) [tmpFile] set ::diff($top,rightLabel) $::diff($top,RCSFile) set ::diff($top,rightFile) $::diff($top,RCSFile) if {$::diff($top,mode) eq "CVS"} { set ::diff($top,leftLabel) "$::diff($top,RCSFile) (CVS $r)" execCvsUpdate $::diff($top,RCSFile) $::diff($top,leftFile) -r $r } else { set ::diff($top,leftLabel) "$::diff($top,RCSFile) (RCS $r)" catch {exec co -p$r [file nativename $::diff($top,RCSFile)] \ > $::diff($top,leftFile)} } } default { # Compare the two specified versions. set r1 [lindex $revs 0] set r2 [lindex $revs 1] set ::diff($top,leftFile) [tmpFile] set ::diff($top,rightFile) [tmpFile] if {$::diff($top,mode) eq "CVS"} { set ::diff($top,leftLabel) "$::diff($top,RCSFile) (CVS $r1)" set ::diff($top,rightLabel) "$::diff($top,RCSFile) (CVS $r2)" execCvsUpdate $::diff($top,RCSFile) $::diff($top,leftFile) -r $r1 execCvsUpdate $::diff($top,RCSFile) $::diff($top,rightFile) -r $r2 } else { set ::diff($top,leftLabel) "$::diff($top,RCSFile) (RCS $r1)" set ::diff($top,rightLabel) "$::diff($top,RCSFile) (RCS $r2)" catch {exec co -p$r1 [file nativename $::diff($top,RCSFile)] \ > $::diff($top,leftFile)} catch {exec co -p$r2 [file nativename $::diff($top,RCSFile)] \ > $::diff($top,rightFile)} } } } # Make sure labels are updated before processing starts update idletasks } # Clean up after a RCS/CVS/CT diff. proc cleanupRCS {top} { global Pref clearTmp $::diff($top,rightFile) $::diff($top,leftFile) set ::diff($top,rightFile) $::diff($top,RCSFile) set ::diff($top,leftFile) $::diff($top,RCSFile) } # Prepare for ClearCase diff. Checkout copies of the versions needed. proc prepareClearCase {top} { global Pref # Compare local file with latest version. set ::diff($top,leftFile) [tmpFile] set ::diff($top,rightLabel) $::diff($top,RCSFile) set ::diff($top,rightFile) $::diff($top,RCSFile) set ::diff($top,leftLabel) "$::diff($top,RCSFile) (CT)" if {[catch {exec cleartool ls $::diff($top,RCSFile)} info]} { puts "Cleartool error: $info" return } set prevV {} if {![regexp {@@(\S+)\s+from (\S+)\s+Rule} $info -> thisV prevV]} { regexp {@@(\S+)} $info -> thisV # Maybe do something fancy here? set prevV $thisV } if {[catch {exec cleartool get -to $::diff($top,leftFile) [file nativename $::diff($top,RCSFile)@@$prevV]} msg]} { puts "Cleartool error: $msg" return } } # Prepare for a diff by creating needed temporary files proc prepareFiles {top} { |
︙ | ︙ | |||
1502 1503 1504 1505 1506 1507 1508 | set ::diff($top,rightFile) $::diff($top,rightLabel) } } } # Main diff function. proc doDiff {top} { | | | | | | | | > > > > > > | | | | | | | | > > > > > > > > > > > > | > > > > > > > | | | | | | | | | | | 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 | set ::diff($top,rightFile) $::diff($top,rightLabel) } } } # Main diff function. proc doDiff {top} { global Pref global doingLine1 doingLine2 if {$::diff($top,mode) eq "" && ($::diff($top,leftOK) == 0 || $::diff($top,rightOK) == 0)} { disableRedo $top return } else { enableRedo $top } busyCursor $top # Clear up everything before starting processing foreach item {wLine1 wDiff1 wLine2 wDiff2} { set w $::widgets($top,$item) $w configure -state normal $w delete 1.0 end } set ::diff($top,changes) {} set ::diff($top,mapMax) 0 set ::HighLightCount 0 highLightChange $top -1 drawMap $top -1 # Display a star during diff execution, to know when the internal # processing starts, and when the label is "valid". set ::widgets($top,eqLabel) "*" update idletasks if {$::diff($top,mode) eq "patch"} { displayPatch $top drawMap $top -1 foreach item {wLine1 wLine2} { set w $::widgets($top,$item) $w configure -state disabled } update idletasks $::widgets($top,wLine2) see 1.0 normalCursor $top return } else { prepareFiles $top } # Run diff and parse the result. set opts $Pref(ignore) if {[info exists ::diff($top,aligns)] && \ [llength $::diff($top,aligns)] > 0} { lappend opts -align $::diff($top,aligns) } set range {} if {[info exists ::diff($top,range)] && \ [llength $::diff($top,range)] == 4} { set range $::diff($top,range) lappend opts -range $range } set differr [catch {eval DiffUtil::diffFiles $opts \ \$::diff($top,leftFile) \$::diff($top,rightFile)} diffres] # In conflict mode we can use the diff information collected when # parsing the conflict file. This makes sure the blocks in the conflict # file become change-blocks during merge. if {$::diff($top,mode) eq "conflictPure"} { set diffres $::diff($top,conflictDiff) } if {$differr != 0} { $::widgets($top,wDiff1) insert end $diffres normalCursor $top return } if {[llength $diffres] == 0} { set ::widgets($top,eqLabel) "=" } else { set ::widgets($top,eqLabel) " " } # Update the equal label immediately for better feedback update idletasks set firstview 1 set ch1 [open $::diff($top,leftFile)] set ch2 [open $::diff($top,rightFile)] if {$::tcl_platform(platform) eq "windows" && $Pref(crlf)} { fconfigure $ch1 -translation crlf fconfigure $ch2 -translation crlf } set doingLine1 1 set doingLine2 1 # If there is a range, skip lines up to the range if {[llength $range] != 0} { foreach {start1 end1 start2 end2} $range break while {$doingLine1 < $start1 && [gets $ch1 line] >= 0} { incr doingLine1 } while {$doingLine2 < $start2 && [gets $ch2 line] >= 0} { incr doingLine2 } } set t 0 foreach i $diffres { foreach {line1 n1 line2 n2} $i break doText $top $ch1 $ch2 $n1 $n2 $line1 $line2 if {$::diff($top,limitlines) && \ ($::diff($top,mapMax) > $::diff($top,limitlines))} { break } bindHighlight $top incr ::HighLightCount # Get one update when the screen has been filled. # Show the first diff. if {$firstview && $::diff($top,mapMax) > 100} { set firstview 0 showDiff $top 0 update idletasks } if {0 && [incr t] >= 10} { update idletasks $::widgets($top,wLine2) see end update idletasks set t 0 } } # If there is a range, just display the range if {[llength $range] != 0} { foreach {start1 end1 start2 end2} $range break } else { set end1 0 set end2 0 } doText $top $ch1 $ch2 0 0 $end1 $end2 # Make sure all text widgets have the same number of lines. # The common y scroll doesn't work well if not. set max 0.0 foreach item {wLine1 wDiff1 wLine2 wDiff2} { set w $::widgets($top,$item) if {[$w index end] > $max} { set max [$w index end] } } foreach item {wLine1 wDiff1 wLine2 wDiff2} { set w $::widgets($top,$item) set d [expr {int($max) - int([$w index end])}] for {set t 0} {$t < $d} {incr t} { $w insert end \n } } close $ch1 close $ch2 drawMap $top -1 foreach item {wLine1 wLine2} { set w $::widgets($top,$item) $w configure -state disabled } update idletasks $::widgets($top,wLine2) see 1.0 normalCursor $top showDiff $top 0 if {$::widgets($top,eqLabel) eq "!"} { set ::widgets($top,eqLabel) " " } cleanupFiles $top if {[string match "conflict*" $::diff($top,mode)]} { if {$::widgets($top,eqLabel) != "="} { makeMergeWin $top } } if {$::diff($top,printFile) != ""} { after idle "doPrint $top 1 ; cleanupAndExit all" } } # This is the entrypoint to do a diff via DDE or Send proc remoteDiff {file1 file2} { newDiff $file1 $file2 |
︙ | ︙ | |||
1690 1691 1692 1693 1694 1695 1696 | } } # Highlight a diff proc highLightChange {top n} { if {[info exists ::diff($top,currHighLight)] && \ $::diff($top,currHighLight) >= 0} { | | | | | | 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 | } } # Highlight a diff proc highLightChange {top n} { if {[info exists ::diff($top,currHighLight)] && \ $::diff($top,currHighLight) >= 0} { $::widgets($top,wLine1) tag configure hl$::diff($top,currHighLight) \ -background {} $::widgets($top,wLine2) tag configure hl$::diff($top,currHighLight) \ -background {} } set ::diff($top,currHighLight) $n if {$::diff($top,currHighLight) < 0} { set ::diff($top,currHighLight) -1 } elseif {$::diff($top,currHighLight) >= [llength $::diff($top,changes)]} { set ::diff($top,currHighLight) [llength $::diff($top,changes)] } else { $::widgets($top,wLine1) tag configure hl$::diff($top,currHighLight) \ -background yellow $::widgets($top,wLine2) tag configure hl$::diff($top,currHighLight) \ -background yellow } } # Highlight a diff and scroll windows to it. proc showDiff {top num} { highLightChange $top $num |
︙ | ︙ | |||
1729 1730 1731 1732 1733 1734 1735 | set line2 [expr {$line1 + [lindex $change 1]}] incr line1 set line1 $line1.0 set line2 $line2.0 } foreach item {wLine1 wDiff1 wLine2 wDiff2} { | | | 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 | set line2 [expr {$line1 + [lindex $change 1]}] incr line1 set line1 $line1.0 set line2 $line2.0 } foreach item {wLine1 wDiff1 wLine2 wDiff2} { set w $::widgets($top,$item) seeText $w $line1 $line2 } } ##################################### # File dialog stuff ##################################### |
︙ | ︙ | |||
1755 1756 1757 1758 1759 1760 1761 | } } } return [eval tk_getOpenFile $args] } proc doOpenLeft {top {forget 0}} { | < < | | | | | | < | | | | | | < | < | | | | | | | | < | | | | < | | | | < | | 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 | } } } return [eval tk_getOpenFile $args] } proc doOpenLeft {top {forget 0}} { if {!$forget && [info exists diff($top,leftDir)]} { set initDir $::diff($top,leftDir) } elseif {[info exists diff($top,rightDir)]} { set initDir $::diff($top,rightDir) } else { set initDir [pwd] } set apa [myOpenFile -title "Select left file" -initialdir $initDir \ -parent $top] if {$apa != ""} { set ::diff($top,leftDir) [file dirname $apa] set ::diff($top,leftFile) $apa set ::diff($top,leftLabel) $apa set ::diff($top,leftOK) 1 return 1 } return 0 } proc doOpenRight {top {forget 0}} { if {!$forget && [info exists diff($top,rightDir)]} { set initDir $::diff($top,rightDir) } elseif {[info exists diff($top,leftDir)]} { set initDir $::diff($top,leftDir) } else { set initDir [pwd] } set apa [myOpenFile -title "Select right file" -initialdir $initDir \ -parent $top] if {$apa != ""} { set ::diff($top,rightDir) [file dirname $apa] set ::diff($top,rightFile) $apa set ::diff($top,rightLabel) $apa set ::diff($top,rightOK) 1 return 1 } return 0 } proc openLeft {top} { if {[doOpenLeft $top]} { set ::diff($top,mode) "" doDiff $top } } proc openRight {top} { if {[doOpenRight $top]} { set ::diff($top,mode) "" doDiff $top } } proc openConflict {top} { global Pref if {[doOpenRight $top]} { set ::diff($top,mode) "conflict" set Pref(ignore) " " set ::diff($top,conflictFile) $::diff($top,rightFile) set ::diff($top,mergeFile) "" doDiff $top } } proc openPatch {top} { global Pref if {[doOpenLeft $top]} { set ::diff($top,mode) "patch" set Pref(ignore) " " set ::diff($top,patchFile) $::diff($top,leftFile) doDiff $top } } proc openRCS {top} { if {[doOpenRight $top]} { set ::diff($top,mode) "RCS" set ::diff($top,RCSFile) $::diff($top,rightFile) set ::diff($top,leftLabel) "RCS" set ::diff($top,leftOK) 0 doDiff $top } } proc openCVS {top} { if {[doOpenRight $top]} { set ::diff($top,mode) "CVS" set ::diff($top,RCSFile) $::diff($top,rightFile) set ::diff($top,leftLabel) "CVS" set ::diff($top,leftOK) 0 doDiff $top } } proc openBoth {top forget} { if {[doOpenLeft $top]} { if {[doOpenRight $top $forget]} { set ::diff($top,mode) "" doDiff $top } } } ##################################### # Map stuff |
︙ | ︙ | |||
1907 1908 1909 1910 1911 1912 1913 | ###################################### # Merge stuff ##################################### # Get all data from the files to merge proc collectMergeData {top} { | < | | | | | 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 | ###################################### # Merge stuff ##################################### # Get all data from the files to merge proc collectMergeData {top} { # FIXA separate merge variables per top global mergeSelection global leftMergeData rightMergeData set leftMergeData {} set rightMergeData {} if {![info exists ::diff($top,changes)]} { set ::diff($top,changes) {} } if {$::diff($top,mode) eq "RCS" || $::diff($top,mode) eq "CVS"} { prepareRCS $top } elseif {[string match "conflict*" $::diff($top,mode)]} { prepareConflict $top } set ch1 [open $::diff($top,leftFile) r] set ch2 [open $::diff($top,rightFile) r] set doingLine1 1 set doingLine2 1 set changeNo 0 foreach change $::diff($top,changes) { foreach {start length type line1 n1 line2 n2} $change break set data1 {} set data2 {} |
︙ | ︙ | |||
1980 1981 1982 1983 1984 1985 1986 | } lappend leftMergeData $data1 lappend rightMergeData $data2 close $ch1 close $ch2 | | | | 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 | } lappend leftMergeData $data1 lappend rightMergeData $data2 close $ch1 close $ch2 if {$::diff($top,mode) eq "RCS" || $::diff($top,mode) eq "CVS"} { cleanupRCS $top } elseif {[string match "conflict*" $::diff($top,mode)]} { cleanupConflict $top } } # Fill up the merge window with the initial version of merged files. proc fillMergeWindow {top} { global mergeSelection leftMergeData rightMergeData curMergeSel curMerge |
︙ | ︙ | |||
2084 2085 2086 2087 2088 2089 2090 | } elseif {$mergeSelection($no) == 2} { $w insert merges$no $diffRight merge$no } } # Save the merge result. proc saveMerge {top} { | < < | | | | | | | | | 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 | } elseif {$mergeSelection($no) == 2} { $w insert merges$no $diffRight merge$no } } # Save the merge result. proc saveMerge {top} { set w $top.merge.t if {$::diff($top,mergeFile) eq ""} { set apa no if {[string match "conflict*" $::diff($top,mode)]} { set apa [tk_messageBox -parent $top.merge -icon question \ -title "Save merge file" -type yesno -message \ "Do you want to overwrite the original conflict file?"] } if {$apa == "yes"} { set ::diff($top,mergeFile) $::diff($top,conflictFile) } else { # Browse if {[info exists diff($top,rightDir)]} { set initDir $::diff($top,rightDir) } elseif {[info exists diff($top,leftDir)]} { set initDir $::diff($top,leftDir) } else { set initDir [pwd] } set apa [tk_getSaveFile -title "Save merge file" -initialdir $initDir \ -parent $top.merge] if {$apa eq ""} return set ::diff($top,mergeFile) $apa } } set ch [open $::diff($top,mergeFile) "w"] puts -nonewline $ch [$w get 1.0 end-1char] close $ch tk_messageBox -parent $top.merge -icon info -type ok -title "Diff" \ -message "Saved merge to file $::diff($top,mergeFile)." } # Close merge window and clean up. proc closeMerge {top} { global mergeSelection leftMergeData rightMergeData destroy $top.merge |
︙ | ︙ | |||
2292 2293 2294 2295 2296 2297 2298 | } else { set tmpFile2 [file nativename ~/eskil.ps] } set lines1 {} set lines2 {} | | | | | | 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 | } else { set tmpFile2 [file nativename ~/eskil.ps] } set lines1 {} set lines2 {} set tdump1 [$::widgets($top,wDiff1) dump -tag -text 1.0 end] set tdump2 [$::widgets($top,wDiff2) dump -tag -text 1.0 end] set lineNo1 [processLineno $::widgets($top,wLine1)] set lineNo2 [processLineno $::widgets($top,wLine2)] foreach tdump [list $tdump1 $tdump2] \ lineName {lines1 lines2} wrapName {wrap1 wrap2} \ lineNo [list $lineNo1 $lineNo2] { set lines {} set wraps {} set line [lindex $lineNo 0] |
︙ | ︙ | |||
2563 2564 2565 2566 2567 2568 2569 | } ################ # Align function ################ proc enableAlign {top} { | | | | 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 | } ################ # Align function ################ proc enableAlign {top} { eval $::widgets($top,enableAlignCmd) } proc disableAlign {top} { eval $::widgets($top,disableAlignCmd) } proc clearAlign {top} { set ::diff($top,aligns) {} disableAlign $top } |
︙ | ︙ | |||
2605 2606 2607 2608 2609 2610 2611 | } } # Called by popup menus over row numbers to add command for alignment. # Returns 1 if nothing was added. proc alignMenu {m top n x y} { # Get the row that was clicked | | | | 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 | } } # Called by popup menus over row numbers to add command for alignment. # Returns 1 if nothing was added. proc alignMenu {m top n x y} { # Get the row that was clicked set w $::widgets($top,wLine$n) set index [$w index @$x,$y] set row [lindex [split $index "."] 0] set data [$w get $row.0 $row.end] if {![regexp {\d+} $data line]} { return 1 } set text [$::widgets($top,wDiff$n) get $row.0 $row.end] set other [expr {$n == 1 ? 2 : 1}] if {![info exists ::diff($top,align$other)]} { set label "Mark line for alignment" } else { set label "Align with line $::diff($top,align$other) on other side" } |
︙ | ︙ | |||
2636 2637 2638 2639 2640 2641 2642 | proc hlSelect {top hl} { highLightChange $top $hl } proc hlSeparate {top n hl} { set ::diff($top,separate$n) $hl | | | > > > > > > > > > > > > > > > > > | | | | | | | | | | | 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 | proc hlSelect {top hl} { highLightChange $top $hl } proc hlSeparate {top n hl} { set ::diff($top,separate$n) $hl set wd $::widgets($top,wDiff$n) set wl $::widgets($top,wLine$n) if {$hl eq ""} { set range [$wd tag ranges sel] } else { set range [$wl tag ranges hl$::diff($top,separate$n)] } set text [eval $wd get $range] set ::diff($top,separatetext$n) $text # Get the lines involved in the display set from [lindex $range 0] set to [lindex $range 1] foreach {froml fromi} [split $from "."] break foreach {tol toi} [split $to "."] break if {$toi == 0} {incr tol -1} # Get the corresponding lines in the file set t [$wl get $froml.0 $tol.end] set lines [lsort -integer [regexp -all -inline {\d+} $t]] set froml [lindex $lines 0] set tol [lindex $lines end] set ::diff($top,separatelines$n) [list $froml $tol] if {[info exists ::diff($top,separate1)] && \ [info exists ::diff($top,separate2)]} { if {1} { cloneDiff $top [concat $::diff($top,separatelines1) \ $::diff($top,separatelines2)] } else { set f1 [tmpFile] set f2 [tmpFile] set ch [open $f1 w] puts $ch $::diff($top,separatetext1) close $ch set ch [open $f2 w] puts $ch $::diff($top,separatetext2) close $ch newDiff $f1 $f2 } unset ::diff($top,separate1) unset ::diff($top,separate2) } } proc hlPopup {top n hl X Y x y} { if {[info exists ::diff($top,nopopup)] && $::diff($top,nopopup)} return |
︙ | ︙ | |||
2711 2712 2713 2714 2715 2716 2717 | tk_popup .lpm $X $Y after idle [list after 1 [list set ::diff($top,nopopup) 0]] } proc bindHighlight {top} { set tag hl$::HighLightCount foreach n {1 2} { | | | | 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 | tk_popup .lpm $X $Y after idle [list after 1 [list set ::diff($top,nopopup) 0]] } proc bindHighlight {top} { set tag hl$::HighLightCount foreach n {1 2} { $::widgets($top,wLine$n) tag bind $tag <ButtonPress-3> \ "hlPopup $top $n $::HighLightCount %X %Y %x %y ; break" $::widgets($top,wLine$n) tag bind $tag <ButtonPress-1> \ "hlSelect $top $::HighLightCount" } } ######### # Zooming ######### |
︙ | ︙ | |||
2737 2738 2739 2740 2741 2742 2743 | if {[lsearch [$w tag names $index] sel] >= 0} { regexp {(\d+)\D*$} $w -> n hlPopup $top $n "" $X $Y $x $y return } # Extract the data | | | | | 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 | if {[lsearch [$w tag names $index] sel] >= 0} { regexp {(\d+)\D*$} $w -> n hlPopup $top $n "" $X $Y $x $y return } # Extract the data set data(1) [$::widgets($top,wDiff1) dump -tag -text $row.0 $row.end] set data(2) [$::widgets($top,wDiff2) dump -tag -text $row.0 $row.end] if {[llength $data(1)] == 0 && [llength $data(2)] == 0} return set font [$::widgets($top,wDiff1) cget -font] set wx $X set wy [expr {$Y + 4}] destroy $top.balloon toplevel $top.balloon -bg black wm withdraw $top.balloon wm overrideredirect $top.balloon 1 |
︙ | ︙ | |||
2830 2831 2832 2833 2834 2835 2836 | global Pref font configure myfont -size $Pref(fontsize) -family $Pref(fontfamily) } # Change color settings proc applyColor {} { | | | | | 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 | global Pref font configure myfont -size $Pref(fontsize) -family $Pref(fontfamily) } # Change color settings proc applyColor {} { global dirdiff Pref foreach top $::diff(diffWindows) { if {$top eq ".clipdiff"} continue if {$top != ".dirdiff"} { foreach item {wLine1 wDiff1 wLine2 wDiff2} { set w $::widgets($top,$item) $w tag configure new1 -foreground $Pref(colornew1) \ -background $Pref(bgnew1) $w tag configure change -foreground $Pref(colorchange) \ -background $Pref(bgchange) $w tag configure new2 -foreground $Pref(colornew2) \ -background $Pref(bgnew2) |
︙ | ︙ | |||
2869 2870 2871 2872 2873 2874 2875 | } # Scroll text windows proc scrollText {top n what} { # Do not scroll if focus is in a text window. # This is for scroll bindings in the toplevel. if {[winfo class [focus]] != "Text"} { | | | 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 | } # Scroll text windows proc scrollText {top n what} { # Do not scroll if focus is in a text window. # This is for scroll bindings in the toplevel. if {[winfo class [focus]] != "Text"} { $::widgets($top,wDiff1) yview scroll $n $what } } # Experiment using snit if {[catch {package require snit}]} { namespace eval snit { proc widgetadaptor {args} {} |
︙ | ︙ | |||
2933 2934 2935 2936 2937 2938 2939 | uplevel \#0 "trace variable $var w \ {after idle {$w xview end} ;#}" } } # Fill in default data for a diff window proc initDiffData {top} { | < | | | | | | | | < < | < | | | | | | | | | > > > > > > > > > > > > > > > > > > > | 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 | uplevel \#0 "trace variable $var w \ {after idle {$w xview end} ;#}" } } # Fill in default data for a diff window proc initDiffData {top} { set ::diff($top,leftOK) 0 set ::diff($top,rightOK) 0 set ::diff($top,mode) "" set ::diff($top,printFile) "" set ::diff($top,mergeFile) "" set ::diff($top,conflictFile) "" set ::diff($top,limitlines) 0 } # Create a new diff window and diff two files proc newDiff {file1 file2 {range {}}} { set top [makeDiffWin] update set ::diff($top,leftDir) [file dirname $file1] set ::diff($top,leftFile) $file1 set ::diff($top,leftLabel) $file1 set ::diff($top,leftOK) 1 set ::diff($top,rightDir) [file dirname $file2] set ::diff($top,rightFile) $file2 set ::diff($top,rightLabel) $file2 set ::diff($top,rightOK) 1 set ::diff($top,mode) "" set ::diff($top,range) $range wm deiconify $top raise $top update doDiff $top } # Create a new diff window equal to another, except for possibly a range proc cloneDiff {other {range {}}} { set top [makeDiffWin] update foreach item [array names ::diff $other,*] { regsub {^[^,]*,} $item {} item set ::diff($top,$item) $::diff($other,$item) } if {[llength $range] != 0} { set ::diff($top,range) $range } wm deiconify $top raise $top update doDiff $top } # A thing to easily get to debug mode |
︙ | ︙ | |||
3134 3135 3136 3137 3138 3139 3140 | -command makeDirDiffWin $top.mt.m add command -label "Clip Diff" -underline 0 \ -command makeClipDiffWin $top.mt.m add command -label "Merge" -underline 0 \ -command [list makeMergeWin $top] -state disabled $top.mt.m add command -label "Clear Align" \ -command [list clearAlign $top] -state disabled | | | | 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 | -command makeDirDiffWin $top.mt.m add command -label "Clip Diff" -underline 0 \ -command makeClipDiffWin $top.mt.m add command -label "Merge" -underline 0 \ -command [list makeMergeWin $top] -state disabled $top.mt.m add command -label "Clear Align" \ -command [list clearAlign $top] -state disabled set ::widgets($top,enableAlignCmd) [list \ $top.mt.m entryconfigure "Clear Align" -state normal] set ::widgets($top,disableAlignCmd) [list \ $top.mt.m entryconfigure "Clear Align" -state disabled] if {$::tcl_platform(platform) eq "windows"} { if {![catch {package require registry}]} { $top.mt.m add separator $top.mt.m add command -label "Setup Registry" -underline 6 \ -command makeRegistryWin |
︙ | ︙ | |||
3194 3195 3196 3197 3198 3199 3200 | -highlightthickness 0 frame $top.ft1.f -width 2 -height 2 -bg lightgray pack $top.ft1.tl -side left -fill y pack $top.ft1.f -side left -fill y pack $top.ft1.tt -side right -fill both -expand 1 scrollbar $top.sby -orient vertical scrollbar $top.sbx1 -orient horizontal -command [list $top.ft1.tt xview] | | | | | | | | | | 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 | -highlightthickness 0 frame $top.ft1.f -width 2 -height 2 -bg lightgray pack $top.ft1.tl -side left -fill y pack $top.ft1.f -side left -fill y pack $top.ft1.tt -side right -fill both -expand 1 scrollbar $top.sby -orient vertical scrollbar $top.sbx1 -orient horizontal -command [list $top.ft1.tt xview] set ::widgets($top,wLine1) $top.ft1.tl set ::widgets($top,wDiff1) $top.ft1.tt frame $top.ft2 -borderwidth 2 -relief sunken text $top.ft2.tl -height $Pref(lines) -width 5 -wrap none \ -font myfont -borderwidth 0 -padx 0 -highlightthickness 0 \ -takefocus 0 text $top.ft2.tt -height $Pref(lines) -width $Pref(linewidth) -wrap none \ -xscrollcommand [list $top.sbx2 set] \ -font myfont -borderwidth 0 -padx 1 \ -highlightthickness 0 frame $top.ft2.f -width 2 -height 2 -bg lightgray pack $top.ft2.tl -side left -fill y pack $top.ft2.f -side left -fill y pack $top.ft2.tt -side right -fill both -expand 1 scrollbar $top.sbx2 -orient horizontal -command [list $top.ft2.tt xview] set ::widgets($top,wLine2) $top.ft2.tl set ::widgets($top,wDiff2) $top.ft2.tt commonYScroll $top.sby $top.ft1.tl $top.ft1.tt $top.ft2.tl $top.ft2.tt # Set up a tag for incremental search bindings if {[info procs textSearch::enableSearch] != ""} { textSearch::enableSearch $top.ft1.tt -label ::widgets($top,isearchLabel) textSearch::enableSearch $top.ft2.tt -label ::widgets($top,isearchLabel) } label $top.le -textvariable ::widgets($top,eqLabel) -width 1 addBalloon $top.le "* means external diff is running.\n= means files do\ not differ.\nBlank means files differ." label $top.ls -width 1 -pady 0 -padx 0 \ -textvariable ::widgets($top,isearchLabel) addBalloon $top.ls "Incremental search indicator" canvas $top.c -width 6 -bd 0 -selectborderwidth 0 -highlightthickness 0 applyColor $top.ft1.tt tag configure last -underline 1 $top.ft2.tt tag configure last -underline 1 |
︙ | ︙ | |||
3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 | $top.md.m add command -label "_stats" -command {parray _stats} $top.md.m add command -label "Nuisance" -command [list makeNuisance \ $top "It looks like you are trying out the debug menu."] pack $top.md -in $top.f -side left -padx 20 -anchor n } initDiffData $top } # Set new preferences. proc applyPref {} { global Pref TmpPref array set Pref [array get TmpPref] | > | 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 | $top.md.m add command -label "_stats" -command {parray _stats} $top.md.m add command -label "Nuisance" -command [list makeNuisance \ $top "It looks like you are trying out the debug menu."] pack $top.md -in $top.f -side left -padx 20 -anchor n } initDiffData $top return $top } # Set new preferences. proc applyPref {} { global Pref TmpPref array set Pref [array get TmpPref] |
︙ | ︙ | |||
4204 4205 4206 4207 4208 4209 4210 | bind $top.t1 <Button-3> "rightClick $top.t1 %x %y %X %Y" bind $top.t2 <Button-3> "rightClick $top.t2 %x %y %X %Y" set dirdiff(wLeft) $top.t1 set dirdiff(wRight) $top.t2 set dirdiff(wY) $top.sby # Interact better with diff by setting these | | | < < | | < < | | | 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 | bind $top.t1 <Button-3> "rightClick $top.t1 %x %y %X %Y" bind $top.t2 <Button-3> "rightClick $top.t2 %x %y %X %Y" set dirdiff(wLeft) $top.t1 set dirdiff(wRight) $top.t2 set dirdiff(wY) $top.sby # Interact better with diff by setting these set ::widgets($top,wDiff1) $top.t1 set ::widgets($top,wDiff2) $top.t2 applyColor grid $top.fm - - - - -sticky we grid $top.fe1 x x $top.fe2 -sticky we grid $top.t1 $top.c $top.sby $top.t2 -sticky news grid $top.sbx1 x x $top.sbx2 -sticky we grid rowconfigure $top 2 -weight 1 grid columnconfigure $top {0 3} -weight 1 } ##################################### # Clip diff section ##################################### proc doClipDiff {} { set f1 [tmpFile] set f2 [tmpFile] set ch [open $f1 w] puts $ch [string trimright [$::diff(wClip1) get 1.0 end] \n] close $ch set ch [open $f2 w] puts $ch [string trimright [$::diff(wClip2) get 1.0 end] \n] close $ch newDiff $f1 $f2 } proc makeClipDiffWin {} { set top .clipdiff if {[winfo exists $top] && [winfo toplevel $top] eq $top} { raise $top focus -force $top return } destroy $top toplevel $top lappend diff(diffWindows) $top wm title $top "Clip Diff" wm protocol $top WM_DELETE_WINDOW "cleanupAndExit $top" set t1 [Scroll both \ text $top.t1 -width 60 -height 35 -font myfont] set t2 [Scroll both \ text $top.t2 -width 60 -height 35 -font myfont] set ::diff(wClip1) $t1 set ::diff(wClip2) $t2 bind $t1 <Control-o> [list focus $t2] bind $t2 <Control-o> [list focus $t1] frame $top.f menubutton $top.f.mf -menu $top.f.mf.m -text "File" -underline 0 menu $top.f.mf.m |
︙ | ︙ | |||
4519 4520 4521 4522 4523 4524 4525 | -print <file> : Generate postscript and exit. -limit <lines> : Do not process more than <lines> lines.} } proc parseCommandLine {} { | | | 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 | -print <file> : Generate postscript and exit. -limit <lines> : Do not process more than <lines> lines.} } proc parseCommandLine {} { global dirdiff Pref if {$::eskil(argc) == 0} { makeDiffWin return } set noautodiff 0 |
︙ | ︙ | |||
4657 4658 4659 4660 4661 4662 4663 | # Ok, we have a normal diff makeDiffWin update set top [lindex $::diff(diffWindows) end] # Copy the previously collected options foreach {item val} [array get opts] { | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 | # Ok, we have a normal diff makeDiffWin update set top [lindex $::diff(diffWindows) end] # Copy the previously collected options foreach {item val} [array get opts] { set ::diff($top,$item) $val } if {$len == 1} { set fullname [file join [pwd] [lindex $files 0]] set fulldir [file dirname $fullname] if {$::diff($top,mode) eq "conflict"} { set ::diff($top,conflictFile) $fullname set ::diff($top,rightDir) $fulldir set ::diff($top,rightOK) 1 set ::diff($top,rightLabel) $fullname set ::diff($top,leftLabel) $fullname after idle [list doDiff $top] return } if {!$autobrowse} { # Check for revision control # RCS if {[llength [glob -nocomplain [file join $fulldir RCS]]]} { set ::diff($top,mode) "RCS" set ::diff($top,rightDir) $fulldir set ::diff($top,RCSFile) $fullname set ::diff($top,rightLabel) $fullname set ::diff($top,rightFile) $fullname set ::diff($top,rightOK) 1 set ::diff($top,leftLabel) "RCS" if {$noautodiff} { enableRedo $top } else { after idle [list doDiff $top] } return } # CVS if {[llength [glob -nocomplain [file join $fulldir CVS]]]} { set ::diff($top,mode) "CVS" set ::diff($top,rightDir) $fulldir set ::diff($top,RCSFile) $fullname set ::diff($top,rightLabel) $fullname set ::diff($top,rightFile) $fullname set ::diff($top,rightOK) 1 set ::diff($top,leftLabel) "CVS" if {$noautodiff} { enableRedo $top } else { after idle [list doDiff $top] } return } # ClearCase if {[auto_execok cleartool] != ""} { if {![catch {exec cleartool pwv -s} view] && \ $view != "** NONE **"} { set ::diff($top,mode) "CT" set ::diff($top,rightDir) $fulldir set ::diff($top,RCSFile) $fullname set ::diff($top,rightLabel) $fullname set ::diff($top,rightFile) $fullname set ::diff($top,rightOK) 1 set ::diff($top,leftLabel) "CT" if {$noautodiff} { enableRedo $top } else { after idle [list doDiff $top] } return } } } # No revision control. Is it a patch file? set ::diff($top,leftDir) $fulldir set ::diff($top,leftFile) $fullname set ::diff($top,leftLabel) $fullname set ::diff($top,leftOK) 1 if {[regexp {\.(diff|patch)$} $fullname]} { set ::diff($top,mode) "patch" set ::diff($top,patchFile) $fullname set autobrowse 0 if {$noautodiff} { enableRedo $top } else { after idle [list doDiff $top] } return } } elseif {$len >= 2} { set fullname [file join [pwd] [lindex $files 0]] set fulldir [file dirname $fullname] set ::diff($top,leftDir) $fulldir set ::diff($top,leftFile) $fullname set ::diff($top,leftLabel) $fullname set ::diff($top,leftOK) 1 set fullname [file join [pwd] [lindex $files 1]] set fulldir [file dirname $fullname] set ::diff($top,rightDir) $fulldir set ::diff($top,rightFile) $fullname set ::diff($top,rightLabel) $fullname set ::diff($top,rightOK) 1 if {$noautodiff} { enableRedo $top } else { after idle [list doDiff $top] } } if {$autobrowse && (!$::diff($top,leftOK) || !$::diff($top,rightOK))} { if {!$::diff($top,leftOK) && !$::diff($top,rightOK)} { openBoth $top 0 } elseif {!$::diff($top,leftOK)} { openLeft $top } elseif {!$::diff($top,rightOK)} { openRight $top } # If we cancel the second file and detect CVS, ask about it. if {$::diff($top,leftOK) && !$::diff($top,rightOK) && \ [llength [glob -nocomplain [file join $fulldir CVS]]]} { if {[tk_messageBox -title Diff -icon question \ -message "Do CVS diff?" -type yesno] eq "yes"} { set fulldir $::diff($top,leftDir) set fullname $::diff($top,leftFile) set ::diff($top,leftOK) 0 set ::diff($top,mode) "CVS" set ::diff($top,rightDir) $fulldir set ::diff($top,RCSFile) $fullname set ::diff($top,rightLabel) $fullname set ::diff($top,rightFile) $fullname set ::diff($top,rightOK) 1 set ::diff($top,leftLabel) "CVS" after idle [list doDiff $top] } } } } proc saveOptions {top} { global Pref # Check if the window size has changed set w $::widgets($top,wDiff1) if {[winfo reqwidth $w] != [winfo width $w] || \ [winfo reqheight $w] != [winfo height $w]} { set dx [expr {[winfo width $w] - [winfo reqwidth $w]}] set dy [expr {[winfo height $w] - [winfo reqheight $w]}] set cx [font measure myfont 0] set cy [font metrics myfont -linespace] set neww [expr {[$w cget -width] + $dx / $cx}] |
︙ | ︙ |