aboutsummaryrefslogtreecommitdiff
path: root/contrib/bluegnu2.0.3/bluegnutkUtils.itcl
blob: 0ed485efb1df94231910619af51e3fd3bc24c499 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
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
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
#
#
#

# puts "MAIA TK Utilities"

set szView [file tail $env(CLEARCASE_ROOT)]
set szXipc $env(XIPCINSTANCE)

proc run {} {
    global env
    global szCommand wRun input wLog wRun
    global szView szXipc

    set env(CLEARCASE_ROOT) /view/$szView
    set env(XIPCINSTANCE) $szXipc

    set szCmd "xterm -sl 50000 -sb"
    if {[string length $szCommand] == 0} {
	set szCommand "$szCmd"
    } else {
	append szCmd " -e $szCommand"
    }
    if [catch {eval exec "$szCmd &"} input] {
	$wLog insert end $input
	bell
    } else {
	#fileevent $input readable log
	$wLog insert end "$env(PS1)$szCommand &\n"
	$wLog see end
	#$wRun config -text Stop -command stop
    }
}

proc log {} {
    global input wLog

    if [eof $input] {
	stop
    } else {
	gets $input szLine
	$wLog insert end "$szLine\n"
	$wLog see end
    }
}


proc stop {} {
    global input wRun

    catch {close $input}
    $wRun config -text "Run it" -command run
}

proc cmdUpdate {name1 name2 ops} {
    global szCommand szTarget szView szXipc \
	    szTestScript szTestcase szArguments
    global iSelect
    global lTestScripts lTestcaseIDs lArguments

    switch $name1 {
	szArguments {
	    set lArguments($iSelect) $szArguments
	}
	szTestcase {
	    set lTestcaseIDs($iSelect) $szTestcase
	}
    }

    set szCommand "bluegnu "
    if {[string compare $szTarget ""] != 0} {
	append szCommand "\"--target=$szTarget"
	if {[string compare $szView ""] != 0} {
	    append szCommand " view=$szView"
	}
	if {[string compare $szXipc ""] != 0} {
	    append szCommand " XIPCINSTANCE=$szXipc"
	}
	append szCommand "\" "
    }
    foreach i [lsort -integer [array names lTestScripts]] {
	# puts "test script index = $i"
	append szCommand "\"$lTestScripts($i)"
	if {[string compare $lTestcaseIDs($i) ""] !=0} {
	    append szCommand "\[$lTestcaseIDs($i)\]"
	}
	if {[string compare $lArguments($i) ""] != 0} {
	    #puts "szArguments: >$lArguments($i)<"
	    append szCommand "=$lArguments($i)"
	}
	append szCommand "\" "
    }
    #puts "szCommand: >$szCommand<"
}

proc setPWD {dir} {
    global szPWD wPWDmenu wPWDentry env
    #puts "setPWD $dir:"
    set szPWD $dir
    #puts "szPWD:: $szPWD"
    cd $szPWD
    catch {setTS "."}
    if {[string compare $szPWD "/"] != 0} {
	set szPWD "[exec /bin/sh -c pwd]/"
	regsub "/tmp_mnt" $szPWD "" szPWD
    }
    #puts "szPWD>: $szPWD"
    $wPWDentry insert [$wPWDentry index end] \
	    [string range $szPWD [$wPWDentry index end] end]
    #update idletasks
    $wPWDentry icursor end

    if {[$wPWDmenu index end] > 1} {
	$wPWDmenu delete 2 end
    }
    foreach F [lsort [glob *]] {
	if [file isdirectory $F] {
	    set szFile [file tail $F]
	    $wPWDmenu add command -label $szFile -command "setPWD $szFile"
	}
    }
}

proc setPWDoverwrite {name1 name2 ops} {
    global wPWDmenu env
    catch {upvar #0 $name1 szPWD} szErrMsg

    if {[file isdirectory $szPWD]} {
	trace vdelete szPWD w setPWDoverwrite
	setPWD $szPWD
	trace variable szPWD w setPWDoverwrite
    } else {
	set szDir {}
	foreach F [glob -nocomplain "${szPWD}*"] {
	    if [file isdirectory $F] {
		lappend szDir $F
	    }
	}
	# puts "szDir: >$szDir< [llength $szDir]"
	if {[llength $szDir] == 1} {
	    set szPWD $szDir
	    setPWD $szPWD
	} elseif {[llength $szDir] == 0} {
	    bell
	}
    }
}

proc checkDir {szDir} {
    regsub "^.*/home" $szDir "/home" szDir
    return $szDir
}

proc setTS {dir} {
    global szTS szTSdir wTSmenu wTSentry env wLR

    trace vdelete szTS w setTSoverwrite
    $wTSentry configure -state normal
    #puts "setTS $dir: [checkDir [exec /bin/sh -c pwd]]"
    if {[string compare $dir ".."] == 0} {
	# puts "##szTS: >$szTS<1"
	set szTStmp [file dirname $szTS]
	# puts "##szTS: >[set szTStmp [file dirname $szTS]]<2"
	$wTSentry delete 0 end
	# puts "##szTS: >$szTS<3"
	$wTSentry insert end "$szTStmp/"
    } elseif {[string compare $dir "."] == 0} {
	set szTStmp "."
	$wTSentry delete 0 end
	$wTSentry insert end "$szTStmp/"
	catch {listRemoved} szErrMsg
	#puts "err: $szErrMsg"
    } else {
	$wTSentry insert end "$dir/"
    }
    set szTmp [$wTSentry get]
    # puts "####### TS: >[set szTmp [$wTSentry get]]<"
    #puts "######szTS: >$szTS<"
    catch {insertTests $wLR}

#     update idletasks
#     $wTSentry icursor end

    # puts "TS menu index: [$wTSmenu index end]"
    if {[$wTSmenu index end] != "none"} {
	$wTSmenu delete 0 end
    }
    if {[string compare $szTmp "./"] != 0} {
	$wTSmenu add command -label .. \
		-command "setTS .."
    }
    foreach F [lsort [glob -nocomplain ${szTmp}*]] {
	if [file isdirectory $F] {
	    set szFile [file tail $F]
	    $wTSmenu add command -label $szFile \
		    -command "setTS $szFile"
	}
    }
    $wTSentry configure -state disabled
    trace variable szTS w setTSoverwrite
    # puts "TS menu end"
}

proc setEXPECT {dir} {
    global szExpect wEXPECTentry env
    # puts "Set env(EXPECT) to $dir"

    trace vdelete szExpect w setExpectOverwrite
    $wEXPECTentry configure -state normal
    $wEXPECTentry delete 0 end
    $wEXPECTentry insert end "$dir"
    set szExpect $dir
    $wEXPECTentry configure -state disabled
    trace variable szExpect w setExpectOverwrite
}

proc setTSoverwrite {name1 name2 ops} {
    global wTSmenu env
    catch {upvar #0 $name1 szTS} szErrMsg

    # puts "szTS >$szTS<"
    #setTS $szTS
}

proc setExpectOverwrite {name1 name2 ops} {
    #global wEmenu env
    catch {upvar #0 $name1 szExpect} szErrMsg
}

proc setExpect {name1 name2 ops} {
    global szExpect env

    if {[string length $szExpect] == 0} {
	catch {unset env(EXPECT)}
    } else {
	set env(EXPECT) $szExpect
    }
}

proc scrollSet {wScroll geoCmd offset size} {
    if {$offset != 0.0 || $size != 1.0} {
	eval $geoCmd; # make sure it is visible
	$wScroll set $offset $size
    } else {
	set manager [lindex $geoCmd 0]
	$manager forget $wScroll; # hide it
    }
}

proc scrolledListBox {w args} {
    frame $w -width 200
    grid rowconfigure $w 0 -weight 1
    grid columnconfigure $w 0 -weight 1
    listbox $w.list \
	    -xscrollcommand [list scrollSet $w.xscroll \
	    [list grid $w.xscroll -row 1 -column 0 -sticky we]] \
	    -yscrollcommand [list scrollSet $w.yscroll \
	    [list grid $w.yscroll -row 0 -column 1 -sticky ns]]
    eval {$w.list configure} $args
    scrollbar $w.xscroll -orient horizontal \
	    -command [list $w.list xview]
    scrollbar $w.yscroll -orient vertical \
	    -command [list $w.list yview]
    grid $w.list $w.yscroll -sticky news
    grid $w.xscroll -sticky news
    return $w.list
}

proc listTransferSelected {w wL} {
    global szTS wLR
    global lTestScripts lTestcaseIDs lArguments

    set i [lindex [$w curselection] 0]
    set szTest [$w get $i]
    set szTestScript [file join $szTS $szTest]
    # puts "selected: >$szTest<"
    set i [$wL index end]
    set lTestScripts($i) $szTestScript
    set lTestcaseIDs($i) ""
    set lArguments($i) [getArguments $szTestScript]
    # puts "set lArguments($i) $lArguments($i)"
    $wL insert end $szTestScript
    cmdUpdate lArguments {} u
}

proc listRemoved {} {
    global lTestScripts lTestcaseIDs lArguments
    global wLL szCommand

    if [catch {set jMax [$wLL index end]}] return
    for {set i $jMax} {$i > 0} {incr i -1} {
	catch {unset lTestScripts($i)}
	catch {unset lTestcaseIDs($i)}
	catch {unset lArguments($i)}
	$wLL delete $i
    }
    set szCommand ""
}

proc listTransferRemoved {w wL} {
    global lTestScripts lTestcaseIDs lArguments

    set jMax [$w index end]
    foreach i [lsort -integer -decreasing [$w curselection]] {
	# puts "i = $i; jMax = $jMax"
	if {$i + 1 < $jMax} {
	    for {set j $i} {$j < $jMax - 1} {incr j} {
		set k [expr $j + 1]
		# puts "j = $j; k = $k"
		set lTestScripts($j) $lTestScripts($k)
		set lTestcaseIDs($j) $lTestcaseIDs($k)
		set lArguments($j) $lArguments($k)
		unset lTestScripts($k)
		unset lTestcaseIDs($k)
		unset lArguments($k)
	    }
	} else {
	    unset lTestScripts($i)
	    unset lTestcaseIDs($i)
	    unset lArguments($i)
	}
	cmdUpdate lArguments {} u
	$w delete $i
    }
}

proc listTransferData {w} {
    global iSelect szArguments wArguments szTestcase wTestcase
    global lTestcaseIDs lArguments

    if {! [catch {set iSelect [lindex [$w curselection] 0]}]} {
	if {[llength iSelect] == 1} {
	    selection own -command [list lostSelection $w] $w
	    # trace vdelete szArguments w cmdUpdate
	    set szArguments $lArguments($iSelect)
	    $wArguments configure -state normal
	    # trace variable szArguments w cmdUpdate
	    # trace vdelete szTestcase w cmdUpdate
	    set szTestcase $lTestcaseIDs($iSelect)
	    $wTestcase configure -state normal
	    # trace variable szTestcase w cmdUpdate
	    cmdUpdate lArguments {} u
	}
    }
}

proc lostSelection {w} {
    global wArguments wTestcase
    global iSelect szArguments szTestcase

    set i [$w index active]
    # $w selection clear $i
    # trace vdelete szArguments w cmdUpdate
    # trace vdelete szTestcase w cmdUpdate
    # set szArguments ""
    # set szTestcase "" 
    # trace variable szArguments w cmdUpdate
    # trace variable szTestcase w cmdUpdate
    $wArguments configure -state disabled
    $wTestcase configure -state disabled
}

proc getArguments {ts} {
    if [file exists $ts] {
	set F [open $ts r]
	set bArg 0
	set szArgs ""
	while {[gets $F szLine] >= 0} {
	    switch -regexp $szLine {
		"Mandatory Arguments:" -
		"Optional Arguments:" {
		    set bArg 1
		    continue
		}
		{^# *$} {
		    set bArg 0
		    continue
		}
		{^processTestScriptArgs} {
		    break
		}
		default {
		    if {$bArg} {
			set bRepl [regsub {^# *} $szLine {} szArg]
			if {! $bRepl} {
			    set bRepl [regsub "^\[ \t ]*set *" \
				    $szLine {} szArg]
			    if {$bRepl} {
				regsub " " $szArg "=" szArg
				regsub -all {"} $szArg "" szArg
				regsub -all "\{" $szArg "" szArg
				regsub -all "\}" $szArg "" szArg
			    }
			}
			if {$bRepl} {
			    regsub { *; *#.*$} $szArg {} szArg
			    if {[string first " " $szArg] >= 0} {
				append szArgs "\{[string trim $szArg]\} "
			    } else {
				append szArgs "[string trim $szArg] "
			    }
			}
		    }
		}
	    }
	}
	close $F
	return [string trim $szArgs]
    }
    return ""
}

proc insertTests {w} {
    global szTS

    $w delete 0 end
    foreach F [lsort [glob -nocomplain ${szTS}/*]] {
	if {! [file isdirectory $F]} {
	    switch -regexp $F {
		{~$} -
		{[.]sql$} -
		{[.]err$} -
		{[.]log$} -
		{[.]out$} -
		{[.]txt$} -
		{tclIndex$} {
		    # Nothing to be done, will not be added to list
		}
		default {
		    set szFile [file tail $F]
		    $w insert end "$szFile"
		}
	    }
	}
    }
}