Skip to content

Commit baeab07

Browse files
committed
migrating common TCL procedures to shared/proc.tcl
1 parent 7e9528d commit baeab07

File tree

3 files changed

+230
-435
lines changed

3 files changed

+230
-435
lines changed

shared/proc.tcl

+227
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,227 @@
1+
##############################################################################
2+
## This file is part of 'SLAC Firmware Standard Library'.
3+
## It is subject to the license terms in the LICENSE.txt file found in the
4+
## top-level directory of this distribution and at:
5+
## https://confluence.slac.stanford.edu/display/ppareg/LICENSE.html.
6+
## No part of 'SLAC Firmware Standard Library', including this file,
7+
## may be copied, modified, propagated, or distributed except according to
8+
## the terms contained in the LICENSE.txt file.
9+
##############################################################################
10+
11+
## Custom TLC source function
12+
proc SourceTclFile { filePath } {
13+
if { [file exists ${filePath}] == 1 } {
14+
source ${filePath}
15+
return true;
16+
} else {
17+
return false;
18+
}
19+
}
20+
21+
## Get the number of CPUs available on the Linux box
22+
proc GetCpuNumber { } {
23+
return [exec cat /proc/cpuinfo | grep processor | wc -l]
24+
}
25+
26+
## Function for putting the TCL script into a wait (in units of seconds)
27+
proc sleep {N} {
28+
after [expr {int($N * 1000)}]
29+
}
30+
31+
## Function for comparing two list
32+
proc ListComp { List1 List2 } {
33+
# Refer to https://wiki.tcl.tk/15489 under "[tcl_hack] - 2015-08-14 13:52:07"
34+
set DiffList {}
35+
foreach Item $List1 {
36+
if { [ lsearch -exact $List2 $Item ] == -1 } {
37+
lappend DiffList $Item
38+
}
39+
}
40+
foreach Item $List2 {
41+
if { [ lsearch -exact $List1 $Item ] == -1 } {
42+
if { [ lsearch -exact $DiffList $Item ] == -1 } {
43+
lappend DiffList $Item
44+
}
45+
}
46+
}
47+
return $DiffList
48+
}
49+
50+
proc ::findFiles { baseDir pattern } {
51+
set dirs [ glob -nocomplain -type d [ file join $baseDir * ] ]
52+
set files {}
53+
foreach dir $dirs {
54+
lappend files {*}[ findFiles $dir $pattern ]
55+
}
56+
lappend files {*}[ glob -nocomplain -type f [ file join $baseDir $pattern ] ]
57+
return $files
58+
}
59+
60+
## Build INFO
61+
proc BuildInfo { } {
62+
exec rm -f $::env(PROJ_DIR)/build.info
63+
set fp [open "$::env(PROJ_DIR)/build.info" w+]
64+
puts $fp "PROJECT: $::env(PROJECT)"
65+
puts $fp "FW_VERSION: $::env(PRJ_VERSION)"
66+
puts $fp "BUILD_STRING: $::env(BUILD_STRING)"
67+
puts $fp "GIT_HASH: $::env(GIT_HASH_LONG)"
68+
close $fp
69+
}
70+
71+
## Check if you have write permission
72+
proc CheckWritePermission { } {
73+
set src_rc [catch {exec touch $::env(MODULES)/ruckus/LICENSE.txt}]
74+
if {$src_rc} {
75+
puts "\n\n\n\n\n********************************************************"
76+
puts "********************************************************"
77+
puts "********************************************************"
78+
puts "Unable to touch $::env(MODULES)/ruckus/LICENSE.txt"
79+
puts "Please verify that your Unix session has not expired"
80+
puts "********************************************************"
81+
puts "********************************************************"
82+
puts "********************************************************\n\n\n\n\n"
83+
exit -1
84+
}
85+
}
86+
87+
## Compares the tag release to a user defined value
88+
proc CompareTags { tag lockTag } {
89+
90+
# Blowoff everything except for the major, minor, and patch numbers
91+
scan $tag "%d.%d.%d" major minor patch
92+
scan $lockTag "%d.%d.%d" majorLock minorLock patchLock
93+
94+
###################################################################
95+
# Major Number Checking
96+
###################################################################
97+
# major.X.X < majorLock.X.X
98+
if { [expr { ${major} < ${majorLock} }] } {
99+
set validTag 0
100+
# major.X.X = majorLock.X.X
101+
} elseif { [expr { ${major} == ${majorLock} }] } {
102+
################################################################
103+
# Minor Number Checking
104+
################################################################
105+
# major.minor.X < major.minorLock.X
106+
if { [expr { ${minor} < ${minorLock} }] } {
107+
set validTag 0
108+
# major.minor.X = major.minorLock.X
109+
} elseif { [expr { ${minor} == ${minorLock} }] } {
110+
#############################################################
111+
# Patch Number Checking
112+
#############################################################
113+
# major.minor.patch < major.minor.patchLock
114+
if { [expr { ${patch} < ${patchLock} }] } {
115+
set validTag 0
116+
# major.minor.patch = major.minor.patchLock
117+
} elseif { [expr { ${patch} == ${patchLock} }] } {
118+
set validTag 1
119+
# major.minor.patch > major.minor.patchLock
120+
} else {
121+
set validTag 1
122+
}
123+
################################################################
124+
# major.minor.X > major.minorLock.X
125+
} else {
126+
set validTag 1
127+
}
128+
###################################################################
129+
# major.X.X > majorLock.X.X
130+
} else {
131+
set validTag 1
132+
}
133+
134+
return ${validTag}
135+
}
136+
137+
## Check the git and git-lfs versions
138+
proc CheckGitVersion { } {
139+
######################################
140+
# Define the git/git-lfs version locks
141+
######################################
142+
set gitLockTag {2.9.0}
143+
set gitLfsLockTag {2.1.1}
144+
######################################
145+
146+
# Get the git version
147+
set gitStr [exec git version]
148+
scan $gitStr "%s %s %s" name temp gitTag
149+
150+
# Get the git-lfs version
151+
set gitStr [exec git-lfs version]
152+
scan $gitStr "git-lfs/%s %s" gitLfsTag temp
153+
154+
# Compare the tags
155+
set validGitTag [CompareTags ${gitTag} ${gitLockTag}]
156+
set validGitLfsTag [CompareTags ${gitLfsTag} ${gitLfsLockTag}]
157+
158+
# Check the validGitTag flag
159+
if { ${validGitTag} == 0 } {
160+
puts "\n\n*********************************************************"
161+
puts "Your git version = v${gitTag}"
162+
puts "However, ruckus git version Lock = v${gitLockTag}"
163+
puts "Please update this git version v${gitLockTag} (or later)"
164+
puts "*********************************************************\n\n"
165+
exit -1
166+
}
167+
168+
# Check the validGitLfsTag flag
169+
if { ${validGitLfsTag} == 0 } {
170+
puts "\n\n*********************************************************"
171+
puts "Your git-lfs version = v${gitLfsTag}"
172+
puts "However, ruckus git-lfs version Lock = v${gitLfsLockTag}"
173+
puts "Please update this git-lfs version v${gitLfsLockTag} (or later)"
174+
puts "*********************************************************\n\n"
175+
exit -1
176+
}
177+
}
178+
179+
## Checks the submodule tag release to a user defined value
180+
proc SubmoduleCheck { name lockTag {mustBeExact ""} } {
181+
182+
# Get the submodule status string
183+
set retVar [catch {set submodule [exec git -C $::env(MODULES) submodule status -- ${name}]} _RESULT]
184+
if {$retVar} {
185+
puts "\n\n\n\n\n********************************************************"
186+
puts "SubmoduleCheck(name=$name): ${_RESULT}"
187+
puts "********************************************************\n\n\n\n\n"
188+
return -1
189+
}
190+
191+
# Scan for the hash, name, and tag portions of the string (assumes a 'v' prefix to start with)
192+
if { [scan $submodule "%s %s (v%s)" hash temp tag] != 3 } {
193+
# Check again with 'v' prefix
194+
set prefix ""
195+
scan $submodule "%s %s (%s)" hash temp tag
196+
} else {
197+
set prefix "v"
198+
}
199+
scan $tag "%d.%d.%d%s" major minor patch d
200+
set tag [string map [list $d ""] $tag]
201+
set tag "${major}.${minor}.${patch}"
202+
scan $lockTag "%d.%d.%d" majorLock minorLock patchLock
203+
204+
# Compare the tags
205+
set validTag [CompareTags ${tag} ${lockTag}]
206+
207+
# Check the validTag flag
208+
if { ${validTag} != 1 } {
209+
puts "\n\n*********************************************************"
210+
puts "Your git clone ${name} = ${prefix}${tag}"
211+
puts "However, ${name} Lock = ${prefix}${lockTag}"
212+
puts "Please update this submodule tag to ${prefix}${lockTag} (or later)"
213+
puts "*********************************************************\n\n"
214+
return -1
215+
} elseif { ${major} == ${majorLock} && ${minor} == ${minorLock} && ${patch} == ${patchLock} } {
216+
return 0
217+
} elseif { ${mustBeExact} == "mustBeExact" } {
218+
puts "\n\n*********************************************************"
219+
puts "Your git clone ${name} = ${prefix}${tag}"
220+
puts "However, ${name} Lock = ${prefix}${lockTag}"
221+
puts "Please update this submodule tag to ${prefix}${lockTag}"
222+
puts "*********************************************************\n\n"
223+
return -1
224+
} else {
225+
return 1
226+
}
227+
}

0 commit comments

Comments
 (0)