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