1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
|
set filerev [file nativename $filename@@[file join $stream $rev]]
if {[catch {exec cleartool get -to $outfile $filerev} msg]} {
tk_messageBox -icon error -title "Cleartool error" -message $msg
return
}
}
# 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,RevFile)
set ::diff($top,rightFile) $::diff($top,RevFile)
set type $::diff($top,modetype)
set ::diff($top,leftLabel) "$::diff($top,RevFile) ($type)"
if {$type eq "CVS"} {
getCvsRev $::diff($top,RevFile) $::diff($top,leftFile)
} else {
getRcsRev $::diff($top,RevFile) $::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,RevFile)
set ::diff($top,rightFile) $::diff($top,RevFile)
set type $::diff($top,modetype)
set ::diff($top,leftLabel) "$::diff($top,RevFile) ($type $r)"
if {$type eq "CVS"} {
getCvsRev $::diff($top,RevFile) $::diff($top,leftFile) $r
} else {
getRcsRev $::diff($top,RevFile) $::diff($top,leftFile) $r
}
}
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]
set type $::diff($top,modetype)
set ::diff($top,leftLabel) "$::diff($top,RevFile) ($type $r1)"
set ::diff($top,rightLabel) "$::diff($top,RevFile) ($type $r2)"
if {$type eq "CVS"} {
getCvsRev $::diff($top,RevFile) $::diff($top,leftFile) $r1
getCvsRev $::diff($top,RevFile) $::diff($top,rightFile) $r2
} else {
getRcsRev $::diff($top,RevFile) $::diff($top,leftFile) $r1
getRcsRev $::diff($top,RevFile) $::diff($top,rightFile) $r2
}
}
}
# Make sure labels are updated before processing starts
update idletasks
}
# Clean up after a RCS/CVS/CT diff.
proc cleanupRev {top} {
global Pref
clearTmp $::diff($top,rightFile) $::diff($top,leftFile)
set ::diff($top,rightFile) $::diff($top,RevFile)
set ::diff($top,leftFile) $::diff($top,RevFile)
}
# Prepare for ClearCase diff. Checkout copies of the versions needed.
proc prepareClearCase {top} {
global Pref
# Figure out stream and current version
if {[catch {exec cleartool ls $::diff($top,RevFile)} info]} {
puts "Cleartool error: $info"
return
}
set currV {}
if {![regexp {@@(\S+)\s+from (\S+)\s+Rule} $info -> dummy currV]} {
regexp {@@(\S+)} $info -> currV
}
set stream [file dirname $currV]
set latest [file tail $currV]
# Search for revision options
set revs {}
if {$::diff($top,doptrev1) != ""} {
lappend revs $::diff($top,doptrev1)
}
if {$::diff($top,doptrev2) != ""} {
lappend revs $::diff($top,doptrev2)
}
foreach rev $revs {
if {![string is digit -strict $rev] || $rev < 0 || $rev > $latest} {
puts "Bad revision '$rev'"
return
}
}
if {[llength $revs] == 0} {
lappend revs $latest
}
switch [llength $revs] {
1 {
# Compare local file with specified version.
set r [lindex $revs 0]
set ::diff($top,leftFile) [tmpFile]
set ::diff($top,rightLabel) $::diff($top,RevFile)
set ::diff($top,rightFile) $::diff($top,RevFile)
set ::diff($top,leftLabel) "$::diff($top,RevFile) (CT $r)"
getCtRev $::diff($top,RevFile) $::diff($top,leftFile) $stream $r
}
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]
set ::diff($top,leftLabel) "$::diff($top,RevFile) (CT $r1)"
set ::diff($top,rightLabel) "$::diff($top,RevFile) (CT $r2)"
getCtRev $::diff($top,RevFile) $::diff($top,leftFile) $stream $r1
getCtRev $::diff($top,RevFile) $::diff($top,rightFile) $stream $r2
}
}
}
# Prepare for a diff by creating needed temporary files
proc prepareFiles {top} {
set ::diff($top,cleanup) ""
if {$::diff($top,mode) eq "rev"} {
if {$::diff($top,modetype) eq "RCS" || $::diff($top,modetype) eq "CVS"} {
prepareRCS $top
set ::diff($top,cleanup) "rev"
} elseif {$::diff($top,modetype) eq "CT"} {
prepareClearCase $top
set ::diff($top,cleanup) "rev"
}
} elseif {"conflict" eq $::diff($top,mode)} {
prepareConflict $top
set ::diff($top,cleanup) "conflict"
}
}
# Clean up after a diff
proc cleanupFiles {top} {
|
|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
<
|
|
|
|
|
<
<
<
<
<
<
|
|
|
>
|
>
>
>
>
>
>
>
>
>
|
>
|
|
<
<
|
|
>
>
|
|
>
|
|
<
|
|
|
|
|
<
|
|
|
|
|
|
|
|
|
>
>
>
>
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
|
|
<
<
<
<
|
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
|
set filerev [file nativename $filename@@[file join $stream $rev]]
if {[catch {exec cleartool get -to $outfile $filerev} msg]} {
tk_messageBox -icon error -title "Cleartool error" -message $msg
return
}
}
# Prepare for RCS/CVS/CT diff. Checkout copies of the versions needed.
proc prepareRev {top} {
global Pref
set type $::diff($top,modetype)
if {$type eq "CT"} {
# Figure out stream and current version
if {[catch {exec cleartool ls $::diff($top,RevFile)} info]} {
tk_messageBox -icon error -title "Cleartool error" -message $info
return
}
set currV {}
if {![regexp {@@(\S+)\s+from (\S+)\s+Rule} $info -> dummy currV]} {
regexp {@@(\S+)} $info -> currV
}
set stream [file dirname $currV]
set latest [file tail $currV]
}
set revs {}
# Search for revision options
if {$::diff($top,doptrev1) != ""} {
lappend revs $::diff($top,doptrev1)
}
if {$::diff($top,doptrev2) != ""} {
lappend revs $::diff($top,doptrev2)
}
if {$type eq "CT"} {
foreach rev $revs {
if {![string is digit -strict $rev] || $rev < 0 || $rev > $latest} {
tk_messageBox -icon error -title "Cleartool error" \
-message "Bad revision '$rev'"
return
}
}
}
if {[llength $revs] < 2} {
# Compare local file with specified version.
if {[llength $revs] == 0} {
set r ""
if {$type eq "CT"} {
set r $latest
}
set tag "($type)"
} else {
set r [lindex $revs 0]
set tag "($type $r)"
}
set ::diff($top,leftFile) [tmpFile]
set ::diff($top,leftLabel) "$::diff($top,RevFile) $tag"
set ::diff($top,rightLabel) $::diff($top,RevFile)
set ::diff($top,rightFile) $::diff($top,RevFile)
if {$type eq "CVS"} {
getCvsRev $::diff($top,RevFile) $::diff($top,leftFile) $r
} elseif {$type eq "RCS"} {
getRcsRev $::diff($top,RevFile) $::diff($top,leftFile) $r
} else {
getCtRev $::diff($top,RevFile) $::diff($top,leftFile) \
$stream $r
}
} else {
# 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]
set ::diff($top,leftLabel) "$::diff($top,RevFile) ($type $r1)"
set ::diff($top,rightLabel) "$::diff($top,RevFile) ($type $r2)"
if {$type eq "CVS"} {
getCvsRev $::diff($top,RevFile) $::diff($top,leftFile) $r1
getCvsRev $::diff($top,RevFile) $::diff($top,rightFile) $r2
} elseif {$type eq "RCS"} {
getRcsRev $::diff($top,RevFile) $::diff($top,leftFile) $r1
getRcsRev $::diff($top,RevFile) $::diff($top,rightFile) $r2
} else {
getCtRev $::diff($top,RevFile) $::diff($top,leftFile) \
$stream $r1
getCtRev $::diff($top,RevFile) $::diff($top,rightFile) \
$stream $r2
}
}
# Make sure labels are updated before processing starts
update idletasks
}
# Clean up after a RCS/CVS/CT diff.
proc cleanupRev {top} {
global Pref
clearTmp $::diff($top,rightFile) $::diff($top,leftFile)
set ::diff($top,rightFile) $::diff($top,RevFile)
set ::diff($top,leftFile) $::diff($top,RevFile)
}
#####################################
# Main diff
#####################################
# Prepare for a diff by creating needed temporary files
proc prepareFiles {top} {
set ::diff($top,cleanup) ""
if {$::diff($top,mode) eq "rev"} {
prepareRev $top
set ::diff($top,cleanup) "rev"
} elseif {$::diff($top,mode) eq "conflict"} {
prepareConflict $top
set ::diff($top,cleanup) "conflict"
}
}
# Clean up after a diff
proc cleanupFiles {top} {
|
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
|
}
}
}
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]
|
|
|
|
|
|
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
|
}
}
}
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]
|
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
|
# Save the merge result.
proc saveMerge {top} {
set w $top.merge.t
if {$::diff($top,mergeFile) eq ""} {
set apa no
if {"conflict" eq $::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]
|
|
|
|
|
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
|
# Save the merge result.
proc saveMerge {top} {
set w $top.merge.t
if {$::diff($top,mergeFile) eq ""} {
set apa no
if {$::diff($top,mode) eq "conflict"} {
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]
|