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