142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
|
close $ch1
close $ch2
}
}
return $eq
}
# Returns the contents of a directory as a sorted list of full file paths.
proc DirContents {dir} {
if {$::tcl_platform(platform) eq "windows"} {
# .-files are not treated specially on windows. * is enough to get all
set files [glob -directory $dir -nocomplain *]
} else {
set files [glob -directory $dir -nocomplain * {.[a-zA-Z]*}]
}
if {$::Pref(dir,onlyrev)} {
# FIXA: move to rev and make general for other systems
set entries [file join $dir CVS Entries]
if {[file exists $entries]} {
set ch [open $entries r]
set data [read $ch]
close $ch
foreach line [split $data \n] {
set name [lindex [split $line /] 1]
set controlled($name) 1
}
set files2 {}
foreach file $files {
if {[info exists controlled($file)]} {
lappend files2 $file
}
}
set files $files2
}
}
set files2 {}
foreach file $files {
set full $file
set tail [file tail $file]
# Apply filters
if {[FileIsDirectory $full]} {
if {[llength $::Pref(dir,incdirs)] == 0} {
set allowed 1
} else {
set allowed 0
foreach pat $::Pref(dir,incdirs) {
if {[string match $pat $tail]} {
set allowed 1
|
|
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
|
|
|
|
|
|
<
>
|
|
|
|
<
<
>
>
|
>
|
|
<
|
|
|
|
>
|
|
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
|
close $ch1
close $ch2
}
}
return $eq
}
# Returns the contents of a directory as a sorted list of file dicts
# By collecting as much as possible in one place, this prepares for a
# future expansion into revision control support in dirdiff.
proc DirContentsDRaw {dir} {
if {$::tcl_platform(platform) eq "windows"} {
# .-files are not treated specially on windows. * is enough to get all
set files [glob -directory $dir -nocomplain *]
} else {
set files [glob -directory $dir -nocomplain * {.[a-zA-Z]*}]
}
set result {}
foreach file [lsort -dictionary $files] {
set fD [dict create "full" $file]
dict set fD tail [file tail $file]
dict set fD dir [FileIsDirectory $file]
if {[catch {file stat $file stat}]} {
dict set fD size ""
dict set fD mtime ""
dict set fD type ""
} else {
dict set fD size $stat(size)
dict set fD mtime $stat(mtime)
dict set fD type $stat(type)
}
lappend result $fD
}
return $result
}
# Returns the contents of a directory as a sorted list of dicts, after applying
# filter preferences.
proc DirContentsD {dir} {
set filesD [DirContentsDRaw $dir]
if {$::Pref(dir,onlyrev)} {
# FIXA: move to rev and make general for other systems
# FIXA: obsolete, not updated since before dictinaries were used
#set entries [file join $dir CVS Entries]
#if {[file exists $entries]} {
# set ch [open $entries r]
# set data [read $ch]
# close $ch
# foreach line [split $data \n] {
# set name [lindex [split $line /] 1]
# set controlled($name) 1
# }
# set files2 {}
# foreach file $files {
# if {[info exists controlled($file)]} {
# lappend files2 $file
# }
# }
# set files $files2
#}
}
set filesD2 {}
foreach fileD $filesD {
set full [dict get $fileD full]
set tail [dict get $fileD tail]
set isDir [dict get $fileD "dir"]
# Apply filters
if {$isDir} {
if {[llength $::Pref(dir,incdirs)] == 0} {
set allowed 1
} else {
set allowed 0
foreach pat $::Pref(dir,incdirs) {
if {[string match $pat $tail]} {
set allowed 1
|
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
|
set allowed 0
break
}
}
}
if {!$allowed} continue
}
lappend files2 $full
}
return [Fsort $files2]
}
# Bring up an editor to display a file.
proc EditFile {file} {
locateEditor ::util(editor)
exec $::util(editor) $file &
}
|
|
|
|
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
|
set allowed 0
break
}
}
}
if {!$allowed} continue
}
lappend filesD2 $fileD
}
return $filesD2
}
# Bring up an editor to display a file.
proc EditFile {file} {
locateEditor ::util(editor)
exec $::util(editor) $file &
}
|
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
885
886
887
888
889
|
$w.bl configure -state disabled
}
}
# Compare two directories.
method CompareDirs {dir1 dir2 node} {
if {$dir1 eq ""} {
set files1 {}
} else {
set files1 [DirContents $dir1]
}
if {$dir2 eq ""} {
set files2 {}
} else {
set files2 [DirContents $dir2]
}
set len1 [llength $files1]
set len2 [llength $files2]
set p1 0
set p2 0
set status_change 0
set status_unknown 0
while 1 {
if {$p1 < $len1 && $p2 < $len2} {
set df1 [lindex $files1 $p1]
set f1 [file tail $df1]
set df2 [lindex $files2 $p2]
set f2 [file tail $df2]
set apa [FStrCmp $f1 $f2]
if {$apa == 0} {
# Equal names, separate them if not the same type
set apa [expr {- [FileIsDirectory $df1] \
+ [FileIsDirectory $df2]}]
}
switch -- $apa {
0 {
set sts [$self ListFiles $df1 $df2 $node]
incr p1
incr p2
|
|
|
|
|
|
|
|
>
|
|
>
|
|
|
|
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
|
$w.bl configure -state disabled
}
}
# Compare two directories.
method CompareDirs {dir1 dir2 node} {
if {$dir1 eq ""} {
set filesD1 {}
} else {
set filesD1 [DirContentsD $dir1]
}
if {$dir2 eq ""} {
set filesD2 {}
} else {
set filesD2 [DirContentsD $dir2]
}
set len1 [llength $filesD1]
set len2 [llength $filesD2]
set p1 0
set p2 0
set status_change 0
set status_unknown 0
while 1 {
if {$p1 < $len1 && $p2 < $len2} {
set fD1 [lindex $filesD1 $p1]
set df1 [dict get $fD1 full]
set f1 [dict get $fD1 tail]
set fD2 [lindex $filesD2 $p1]
set df2 [dict get $fD2 full]
set f2 [dict get $fD1 tail]
set apa [FStrCmp $f1 $f2]
if {$apa == 0} {
# Equal names, separate them if not the same type
set apa [expr {- [dict get $fD1 dir] \
+ [dict get $fD2 dir]}]
}
switch -- $apa {
0 {
set sts [$self ListFiles $df1 $df2 $node]
incr p1
incr p2
|
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
|
1 {
$self ListFiles "" $df2 $node
incr p2
set status_change 1
}
}
} elseif {$p1 < $len1 && $p2 >= $len2} {
set df1 [lindex $files1 $p1]
$self ListFiles $df1 "" $node
incr p1
set status_change 1
} elseif {$p1 >= $len1 && $p2 < $len2} {
set df2 [lindex $files2 $p2]
$self ListFiles "" $df2 $node
incr p2
set status_change 1
} else {
break
}
}
|
|
>
|
>
|
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
|
1 {
$self ListFiles "" $df2 $node
incr p2
set status_change 1
}
}
} elseif {$p1 < $len1 && $p2 >= $len2} {
set fD1 [lindex $filesD1 $p1]
set df1 [dict get $fD1 full]
$self ListFiles $df1 "" $node
incr p1
set status_change 1
} elseif {$p1 >= $len1 && $p2 < $len2} {
set fD2 [lindex $filesD2 $p1]
set df2 [dict get $fD2 full]
$self ListFiles "" $df2 $node
incr p2
set status_change 1
} else {
break
}
}
|