| 1 |  | 
|---|
| 2 | # -*- coding: iso-8859-1 -*- | 
|---|
| 3 |  | 
|---|
| 4 | import os | 
|---|
| 5 | import sys | 
|---|
| 6 | import string | 
|---|
| 7 | import popen2 | 
|---|
| 8 | import stat | 
|---|
| 9 | import re | 
|---|
| 10 | import time | 
|---|
| 11 | from os import path | 
|---|
| 12 | import getopt | 
|---|
| 13 | import tempfile | 
|---|
| 14 | import signal | 
|---|
| 15 | import cmt | 
|---|
| 16 |  | 
|---|
| 17 | tempprefix = '' | 
|---|
| 18 | tempfile1 = '' | 
|---|
| 19 | tempfile2 = '' | 
|---|
| 20 | tempcopydir = '' | 
|---|
| 21 | tempcmtusercontext = '' | 
|---|
| 22 | patch_requirements = '' | 
|---|
| 23 |  | 
|---|
| 24 | release = '' | 
|---|
| 25 | cyclefile = '' | 
|---|
| 26 | patch_dir = '' | 
|---|
| 27 | minimal = False | 
|---|
| 28 | pacman_only = False | 
|---|
| 29 | platform = '' | 
|---|
| 30 | platform_suffix = '' | 
|---|
| 31 | override = False | 
|---|
| 32 | do_source_kit = False | 
|---|
| 33 | url = '' | 
|---|
| 34 |  | 
|---|
| 35 | pacman_base = '' | 
|---|
| 36 | cache_dir = '' | 
|---|
| 37 | kits_dir = '' | 
|---|
| 38 |  | 
|---|
| 39 | patch_requirements = '' | 
|---|
| 40 |  | 
|---|
| 41 | here = '' | 
|---|
| 42 |  | 
|---|
| 43 | cmt = cmt.CMT () | 
|---|
| 44 |  | 
|---|
| 45 | def get_project (cmtpath): | 
|---|
| 46 | if cmtpath != '': | 
|---|
| 47 | rr = os.path.basename (cmtpath) | 
|---|
| 48 | pr = os.path.dirname (cmtpath) | 
|---|
| 49 | pr = os.path.basename (pr) | 
|---|
| 50 | return os.path.join (pr, rr) | 
|---|
| 51 |  | 
|---|
| 52 | def cleanup (): | 
|---|
| 53 | print 'Cleanup' | 
|---|
| 54 | cmt.removedirs (tempprefix) | 
|---|
| 55 |  | 
|---|
| 56 | def build_pacman (url, package, version, cmtpath, project_id, is_internal): | 
|---|
| 57 | #print url, package, version, cmtpath, project_id, is_internal | 
|---|
| 58 |  | 
|---|
| 59 | source = '../kits' | 
|---|
| 60 |  | 
|---|
| 61 | # External packages (those with export_paths) are split into two kits: | 
|---|
| 62 | # o The internal part, which follows the naming convention for internal packages | 
|---|
| 63 | # o The external part, which only refers to the package version (no mention of | 
|---|
| 64 | #   the project) | 
|---|
| 65 |  | 
|---|
| 66 | # Naming cnvention: | 
|---|
| 67 | #  external packages : <package>-<version>-<platform> | 
|---|
| 68 | #  internal packages : <projectid>/<package>-<platform> | 
|---|
| 69 |  | 
|---|
| 70 | if not is_internal: | 
|---|
| 71 | # first build the pacman file for the external stuff | 
|---|
| 72 |  | 
|---|
| 73 | if native_version == None: | 
|---|
| 74 | #vv=`echo ${version} | sed -e 's#'^${package}-'##'` | 
|---|
| 75 | vv = '' | 
|---|
| 76 | else: | 
|---|
| 77 | vv = native_version | 
|---|
| 78 | download_filename="${package}-${vv}${platform_suffix}" | 
|---|
| 79 | download_filename = package + '-' + vv + platform_suffix | 
|---|
| 80 |  | 
|---|
| 81 | pacman_filename = download_filename + '.pacman' | 
|---|
| 82 |  | 
|---|
| 83 | print 'build_pacman> Create pacman file for external stuff ' + pacman_filename | 
|---|
| 84 |  | 
|---|
| 85 | pacman_file_version = get_pacman_file_version (os.path.join (cache_dir, pacman_filename)) | 
|---|
| 86 |  | 
|---|
| 87 | #if test -f ${cache_dir}/${pacman_filename};  then | 
|---|
| 88 | # mv ${cache_dir}/${pacman_filename} ${cache_dir}/${pacman_filename}.bak | 
|---|
| 89 | # if test ! $? = 0; then | 
|---|
| 90 | #   print 'create_kit> failed to rename ' + cache_dir + '/' + pacman_filename + ' to ' + cache_dir + '/' + pacman_filename' + '.bak' | 
|---|
| 91 | # exit 1 | 
|---|
| 92 |  | 
|---|
| 93 | # write pacman file | 
|---|
| 94 |  | 
|---|
| 95 |  | 
|---|
| 96 |  | 
|---|
| 97 | # end build_pacman | 
|---|
| 98 |  | 
|---|
| 99 | def usage (): | 
|---|
| 100 | print "Make a distribution kit for a CMT package" | 
|---|
| 101 | print "Usage: create_kit.sh [ <option> ... ] <pacman-cache>" | 
|---|
| 102 | print " where option can be:" | 
|---|
| 103 | print "  -r|--release <release-id>  : specify the release id" | 
|---|
| 104 | print "  -c|--cycles <cycles-file>  : specify the cycles file" | 
|---|
| 105 | print "  -P|--patches <patch-dir>   : specify a directory for patches " | 
|---|
| 106 | print "  -m|--minimal               : only store CMT files into the tar ball" | 
|---|
| 107 | print "  -O|--pacman_only           : do not generate the tar ball" | 
|---|
| 108 | print "  -p|--platform <platform>   : specify a platform suffix" | 
|---|
| 109 | print "  -o|--override              : override the existing tar balls" | 
|---|
| 110 | print "  -s|--source                : generate the source kit" | 
|---|
| 111 | print "Typical/example usage:" | 
|---|
| 112 | print "  cmt broadcast create_kit.sh -release 6.3.0 -cycles ${DEP}/cycles.txt /tmp " | 
|---|
| 113 | # end usage | 
|---|
| 114 |  | 
|---|
| 115 | #---------------------------------------------------- | 
|---|
| 116 | # Main | 
|---|
| 117 | #---------------------------------------------------- | 
|---|
| 118 | def main (): | 
|---|
| 119 |  | 
|---|
| 120 | print time.strftime ('%c') | 
|---|
| 121 |  | 
|---|
| 122 | pwd = os.getcwd () | 
|---|
| 123 |  | 
|---|
| 124 | try: | 
|---|
| 125 | opts, args = getopt.getopt (sys.argv[1:] , 'r:c:P:mOp:osu:', ['release=', 'cycles=', 'patches=', 'minimal', 'pacman_only', 'platform=', 'override', 'source', 'url=']) | 
|---|
| 126 |  | 
|---|
| 127 | except getopt.GetoptError: | 
|---|
| 128 | # print help information and exit: | 
|---|
| 129 | usage() | 
|---|
| 130 | sys.exit(2) | 
|---|
| 131 |  | 
|---|
| 132 | for o,a in opts: | 
|---|
| 133 | if o in ('-r', '--release'): | 
|---|
| 134 | release = a | 
|---|
| 135 | if o in ('-c', '--cycles'): | 
|---|
| 136 | cyclefile = a | 
|---|
| 137 | if o in ('-P', '--patches'): | 
|---|
| 138 | patch_dir = a | 
|---|
| 139 | if o in ('-m', '--minimal'): | 
|---|
| 140 | minimal = True | 
|---|
| 141 | if o in ('-O', '--pacman_only'): | 
|---|
| 142 | pacman_only = True | 
|---|
| 143 | if o in ('-p', '--platform'): | 
|---|
| 144 | platform = a | 
|---|
| 145 | if o in ('-o', '--override'): | 
|---|
| 146 | override = True | 
|---|
| 147 | if o in ('-s', '--source'): | 
|---|
| 148 | do_source_kit = True | 
|---|
| 149 | if o in ('-u', '--url'): | 
|---|
| 150 | url = a | 
|---|
| 151 |  | 
|---|
| 152 | for a in args: | 
|---|
| 153 | pacman_base = os.path.normpath (a) | 
|---|
| 154 | cache_dir = os.path.join (pacman_base, os.path.normpath ('cache')) | 
|---|
| 155 | kits_dir = os.path.join (pacman_base, os.path.normpath ('kits')) | 
|---|
| 156 |  | 
|---|
| 157 | #--------------- | 
|---|
| 158 | # Prepare the target pacman cache | 
|---|
| 159 | # | 
|---|
| 160 |  | 
|---|
| 161 | if not os.path.isdir (cache_dir): | 
|---|
| 162 | print 'Creating ' + cache_dir | 
|---|
| 163 | os.makedirs (cache_dir) | 
|---|
| 164 |  | 
|---|
| 165 | if not os.path.isdir (kits_dir): | 
|---|
| 166 | print 'Creating ' + kits_dir | 
|---|
| 167 | os.makedirs (kits_dir) | 
|---|
| 168 |  | 
|---|
| 169 | here = os.path.dirname (sys.argv[0]) | 
|---|
| 170 | if here == '': | 
|---|
| 171 | here = os.getcwd () | 
|---|
| 172 |  | 
|---|
| 173 | print 'here=' + here | 
|---|
| 174 |  | 
|---|
| 175 | #--------------- | 
|---|
| 176 | # Prepare temporary file management | 
|---|
| 177 | # | 
|---|
| 178 |  | 
|---|
| 179 | #signal.signal (0, cleanup) | 
|---|
| 180 | #signal.signal (1, cleanup) | 
|---|
| 181 | #signal.signal (2, cleanup) | 
|---|
| 182 | #signal.signal (15, cleanup) | 
|---|
| 183 |  | 
|---|
| 184 | tempprefix = 'CMT' + str(os.getpid ()) | 
|---|
| 185 | print 'tempprefix=' + tempprefix | 
|---|
| 186 |  | 
|---|
| 187 | tempfile1 = os.path.join (tempprefix, 't') | 
|---|
| 188 | tempfile2 = os.path.join (tempprefix, 'u') | 
|---|
| 189 | tempcopydir = os.path.join (tempprefix, 'c') | 
|---|
| 190 | tempcmtusercontext = os.path.join (tempprefix, 'd') | 
|---|
| 191 |  | 
|---|
| 192 | cleanup () | 
|---|
| 193 |  | 
|---|
| 194 | os.makedirs (tempprefix) | 
|---|
| 195 |  | 
|---|
| 196 | #--------------- | 
|---|
| 197 | # Prepare the CMT and package context | 
|---|
| 198 | # | 
|---|
| 199 |  | 
|---|
| 200 | h = cmt.do ('show pwd') | 
|---|
| 201 | root = os.path.dirname (h) | 
|---|
| 202 |  | 
|---|
| 203 | cmtversion = cmt.do ('version') | 
|---|
| 204 |  | 
|---|
| 205 | version = cmt.macro_value ('version') | 
|---|
| 206 | if version == 'v*': | 
|---|
| 207 | version = 'v1' | 
|---|
| 208 |  | 
|---|
| 209 | print 'cmtversion=' + cmtversion | 
|---|
| 210 | print 'version' + version | 
|---|
| 211 |  | 
|---|
| 212 | package = cmt.macro_value ('package') | 
|---|
| 213 | if package != '': | 
|---|
| 214 | package = os.path.normpath (package) | 
|---|
| 215 |  | 
|---|
| 216 | cmtpath = cmt.macro_value (package + '_cmtpath') | 
|---|
| 217 | if cmtpath != '': | 
|---|
| 218 | cmtpath = os.path.normpath (cmtpath) | 
|---|
| 219 |  | 
|---|
| 220 | offset = cmt.macro_value (package + '_offset') | 
|---|
| 221 | if offset != '': | 
|---|
| 222 | offset = os.path.normpath (offset) | 
|---|
| 223 |  | 
|---|
| 224 | print 'package=' + package | 
|---|
| 225 | print 'cmtpath=' + cmtpath | 
|---|
| 226 | print 'offset=' + offset | 
|---|
| 227 |  | 
|---|
| 228 | project = cmt.macro_value (package + '_project') | 
|---|
| 229 | print 'package_project=' + project | 
|---|
| 230 |  | 
|---|
| 231 | release = cmt.macro_value (package + '_project_release') | 
|---|
| 232 | print 'package_project_release=' + release | 
|---|
| 233 |  | 
|---|
| 234 | print 'CMTPATH=' + cmt.macro_value ('CMTPATH') | 
|---|
| 235 |  | 
|---|
| 236 | if cmtpath == '': | 
|---|
| 237 | cmtpath = os.path.normpath (cmt.macro_value (package + '_root')) | 
|---|
| 238 | cmtpath = os.path.dirname (cmtpath) | 
|---|
| 239 | cmtpath = os.path.dirname (cmtpath) | 
|---|
| 240 |  | 
|---|
| 241 | print '# Working on ' + package + ' ' + version + ' ' + offset + ' in ' + cmtpath + ' project ' + project + ' ' + release | 
|---|
| 242 |  | 
|---|
| 243 | cleanup () | 
|---|
| 244 | sys.exit (0) | 
|---|
| 245 |  | 
|---|
| 246 | #--------------- | 
|---|
| 247 | # Prepare the patch structure | 
|---|
| 248 | # | 
|---|
| 249 |  | 
|---|
| 250 | if options.patch_dir != None: | 
|---|
| 251 | if os.path.isdir (os.path.join (options.patch_dir, project_id)): | 
|---|
| 252 | print 'create_kit> ' + options.patch_dir + '/' + project_id | 
|---|
| 253 | os.makedirs (tempcmtusercontext) | 
|---|
| 254 | os.putenv ('CMTUSERCONTEXT', tempcmtusercontext) | 
|---|
| 255 | patch_requirements = os.path.join (tempcmtusercontext, os.path.normpath ('requirements')) | 
|---|
| 256 | f = open (patch_requirements, 'w+') | 
|---|
| 257 |  | 
|---|
| 258 | #--------------- | 
|---|
| 259 | # Prepare the detection of external packages | 
|---|
| 260 | # | 
|---|
| 261 |  | 
|---|
| 262 | native_version = cmt.macro_value (package + '_native_version') | 
|---|
| 263 | export_paths = cmt.macro_value (package + '_export_paths') | 
|---|
| 264 |  | 
|---|
| 265 | is_internal = export_paths == None | 
|---|
| 266 |  | 
|---|
| 267 | if options.do_source_kit: | 
|---|
| 268 | is_internal = True | 
|---|
| 269 |  | 
|---|
| 270 | #--------------- | 
|---|
| 271 | # Prepare the temporary copies | 
|---|
| 272 | # | 
|---|
| 273 |  | 
|---|
| 274 | os.makedirs (tempcopydir) | 
|---|
| 275 | copycmd = 'ln -s' | 
|---|
| 276 |  | 
|---|
| 277 | #--------------- | 
|---|
| 278 | # Generate the pacman file | 
|---|
| 279 | # | 
|---|
| 280 |  | 
|---|
| 281 | build_pacman (options.url, package, version, cmtpath, project_id, is_internal) | 
|---|
| 282 |  | 
|---|
| 283 | #--------------- | 
|---|
| 284 | # | 
|---|
| 285 | # | 
|---|
| 286 |  | 
|---|
| 287 | cleanup () | 
|---|
| 288 |  | 
|---|
| 289 | if __name__ == '__main__': | 
|---|
| 290 | main() | 
|---|
| 291 |  | 
|---|