|
| 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