home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 May / maximum-cd-2010-05.iso / DiscContents / boxee-0.9.20.10711.exe / system / python / Lib / plat-mac / buildtools.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-07-20  |  10.8 KB  |  428 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.4)
  3.  
  4. '''tools for BuildApplet and BuildApplication'''
  5. import sys
  6. import os
  7. import string
  8. import imp
  9. import marshal
  10. from Carbon import Res
  11. import Carbon.Files as Carbon
  12. import Carbon.File as Carbon
  13. import MacOS
  14. import macostools
  15. import macresource
  16. import EasyDialogs
  17. import shutil
  18. BuildError = 'BuildError'
  19. MAGIC = imp.get_magic()
  20. TEMPLATE = 'PythonInterpreter'
  21. RESTYPE = 'PYC '
  22. RESNAME = '__main__'
  23. OWNERNAME = 'owner resource'
  24. DEFAULT_APPLET_CREATOR = 'Pyta'
  25. READ = 1
  26. WRITE = 2
  27. RESOURCE_FORK_NAME = Carbon.File.FSGetResourceForkName()
  28.  
  29. def findtemplate(template = None):
  30.     '''Locate the applet template along sys.path'''
  31.     if MacOS.runtimemodel == 'macho':
  32.         return None
  33.     
  34.     if not template:
  35.         template = TEMPLATE
  36.     
  37.     for p in sys.path:
  38.         file = os.path.join(p, template)
  39.         
  40.         try:
  41.             (file, d1, d2) = Carbon.File.FSResolveAliasFile(file, 1)
  42.         continue
  43.         except (Carbon.File.Error, ValueError):
  44.             continue
  45.             continue
  46.         
  47.  
  48.     else:
  49.         raise BuildError, 'Template %r not found on sys.path' % (template,)
  50.     file = file.as_pathname()
  51.     return file
  52.  
  53.  
  54. def process(template, filename, destname, copy_codefragment = 0, rsrcname = None, others = [], raw = 0, progress = 'default', destroot = ''):
  55.     if progress == 'default':
  56.         progress = EasyDialogs.ProgressBar('Processing %s...' % os.path.split(filename)[1], 120)
  57.         progress.label('Compiling...')
  58.         progress.inc(0)
  59.     
  60.     if '#' in os.path.split(filename)[1]:
  61.         raise BuildError, 'BuildApplet could destroy your sourcefile on OSX, please rename: %s' % filename
  62.     
  63.     fp = open(filename, 'rU')
  64.     text = fp.read()
  65.     fp.close()
  66.     
  67.     try:
  68.         code = compile(text + '\n', filename, 'exec')
  69.     except SyntaxError:
  70.         arg = None
  71.         raise BuildError, 'Syntax error in script %s: %s' % (filename, arg)
  72.     except EOFError:
  73.         raise BuildError, 'End-of-file in script %s' % (filename,)
  74.  
  75.     if string.lower(filename[-3:]) == '.py':
  76.         basename = filename[:-3]
  77.         if MacOS.runtimemodel != 'macho' and not destname:
  78.             destname = basename
  79.         
  80.     else:
  81.         basename = filename
  82.     if not destname:
  83.         if MacOS.runtimemodel == 'macho':
  84.             destname = basename + '.app'
  85.         else:
  86.             destname = basename + '.applet'
  87.     
  88.     if not rsrcname:
  89.         rsrcname = basename + '.rsrc'
  90.     
  91.     
  92.     try:
  93.         os.remove(destname)
  94.     except os.error:
  95.         pass
  96.  
  97.     process_common(template, progress, code, rsrcname, destname, 0, copy_codefragment, raw, others, filename, destroot)
  98.  
  99.  
  100. def update(template, filename, output):
  101.     if MacOS.runtimemodel == 'macho':
  102.         raise BuildError, 'No updating yet for MachO applets'
  103.     
  104.     if progress:
  105.         progress = EasyDialogs.ProgressBar('Updating %s...' % os.path.split(filename)[1], 120)
  106.     else:
  107.         progress = None
  108.     if not output:
  109.         output = filename + ' (updated)'
  110.     
  111.     
  112.     try:
  113.         os.remove(output)
  114.     except os.error:
  115.         pass
  116.  
  117.     process_common(template, progress, None, filename, output, 1, 1)
  118.  
  119.  
  120. def process_common(template, progress, code, rsrcname, destname, is_update, copy_codefragment, raw = 0, others = [], filename = None, destroot = ''):
  121.     if MacOS.runtimemodel == 'macho':
  122.         return process_common_macho(template, progress, code, rsrcname, destname, is_update, raw, others, filename, destroot)
  123.     
  124.     if others:
  125.         raise BuildError, 'Extra files only allowed for MachoPython applets'
  126.     
  127.     (template_fsr, d1, d2) = Carbon.File.FSResolveAliasFile(template, 1)
  128.     template = template_fsr.as_pathname()
  129.     if progress:
  130.         progress.label('Copy data fork...')
  131.         progress.set(10)
  132.     
  133.     if copy_codefragment:
  134.         tmpl = open(template, 'rb')
  135.         dest = open(destname, 'wb')
  136.         data = tmpl.read()
  137.         if data:
  138.             dest.write(data)
  139.         
  140.         dest.close()
  141.         tmpl.close()
  142.         del dest
  143.         del tmpl
  144.     
  145.     if progress:
  146.         progress.label('Copy resources...')
  147.         progress.set(20)
  148.     
  149.     
  150.     try:
  151.         output = Res.FSOpenResourceFile(destname, RESOURCE_FORK_NAME, WRITE)
  152.     except MacOS.Error:
  153.         (destdir, destfile) = os.path.split(destname)
  154.         Res.FSCreateResourceFile(destdir, unicode(destfile), RESOURCE_FORK_NAME)
  155.         output = Res.FSOpenResourceFile(destname, RESOURCE_FORK_NAME, WRITE)
  156.  
  157.     typesfound = []
  158.     ownertype = None
  159.     
  160.     try:
  161.         input = Res.FSOpenResourceFile(rsrcname, RESOURCE_FORK_NAME, READ)
  162.     except (MacOS.Error, ValueError):
  163.         if progress:
  164.             progress.inc(50)
  165.         
  166.     except:
  167.         progress
  168.  
  169.     if is_update:
  170.         skip_oldfile = [
  171.             'cfrg']
  172.     else:
  173.         skip_oldfile = []
  174.     (typesfound, ownertype) = copyres(input, output, skip_oldfile, 0, progress)
  175.     Res.CloseResFile(input)
  176.     skiptypes = []
  177.     if 'vers' in typesfound:
  178.         skiptypes.append('vers')
  179.     
  180.     if 'SIZE' in typesfound:
  181.         skiptypes.append('SIZE')
  182.     
  183.     if 'BNDL' in typesfound:
  184.         skiptypes = skiptypes + [
  185.             'BNDL',
  186.             'FREF',
  187.             'icl4',
  188.             'icl8',
  189.             'ics4',
  190.             'ics8',
  191.             'ICN#',
  192.             'ics#']
  193.     
  194.     if not copy_codefragment:
  195.         skiptypes.append('cfrg')
  196.     
  197.     input = Res.FSOpenResourceFile(template, RESOURCE_FORK_NAME, READ)
  198.     (dummy, tmplowner) = copyres(input, output, skiptypes, 1, progress)
  199.     Res.CloseResFile(input)
  200.     Res.UseResFile(output)
  201.     if ownertype == None:
  202.         newres = Res.Resource('\x00')
  203.         newres.AddResource(DEFAULT_APPLET_CREATOR, 0, 'Owner resource')
  204.         ownertype = DEFAULT_APPLET_CREATOR
  205.     
  206.     if code:
  207.         
  208.         try:
  209.             res = Res.Get1NamedResource(RESTYPE, RESNAME)
  210.             res.RemoveResource()
  211.         except Res.Error:
  212.             pass
  213.  
  214.         if progress:
  215.             progress.label('Write PYC resource...')
  216.             progress.set(120)
  217.         
  218.         data = marshal.dumps(code)
  219.         del code
  220.         data = MAGIC + '\x00\x00\x00\x00' + data
  221.         id = 0
  222.         while id < 128:
  223.             id = Res.Unique1ID(RESTYPE)
  224.         res = Res.Resource(data)
  225.         res.AddResource(RESTYPE, id, RESNAME)
  226.         attrs = res.GetResAttrs()
  227.         attrs = attrs | 4
  228.         res.SetResAttrs(attrs)
  229.         res.WriteResource()
  230.         res.ReleaseResource()
  231.     
  232.     Res.CloseResFile(output)
  233.     dest_fss = Carbon.File.FSSpec(destname)
  234.     dest_finfo = dest_fss.FSpGetFInfo()
  235.     dest_finfo.Creator = ownertype
  236.     dest_finfo.Type = 'APPL'
  237.     dest_finfo.Flags = dest_finfo.Flags | Carbon.Files.kHasBundle | Carbon.Files.kIsShared
  238.     dest_finfo.Flags = dest_finfo.Flags & ~(Carbon.Files.kHasBeenInited)
  239.     dest_fss.FSpSetFInfo(dest_finfo)
  240.     macostools.touched(destname)
  241.     if progress:
  242.         progress.label('Done.')
  243.         progress.inc(0)
  244.     
  245.  
  246.  
  247. def process_common_macho(template, progress, code, rsrcname, destname, is_update, raw = 0, others = [], filename = None, destroot = ''):
  248.     if filename is None:
  249.         raise BuildError, 'Need source filename on MacOSX'
  250.     
  251.     if destname[-4:] != '.app':
  252.         destname = destname + '.app'
  253.     
  254.     (destdir, shortname) = os.path.split(destname)
  255.     if shortname[-4:] == '.app':
  256.         shortname = shortname[:-4]
  257.     
  258.     plistname = None
  259.     icnsname = None
  260.     if rsrcname and rsrcname[-5:] == '.rsrc':
  261.         tmp = rsrcname[:-5]
  262.         plistname = tmp + '.plist'
  263.         if os.path.exists(plistname):
  264.             icnsname = tmp + '.icns'
  265.             if not os.path.exists(icnsname):
  266.                 icnsname = None
  267.             
  268.         else:
  269.             plistname = None
  270.     
  271.     if not icnsname:
  272.         dft_icnsname = os.path.join(sys.prefix, 'Resources/Python.app/Contents/Resources/PythonApplet.icns')
  273.         if os.path.exists(dft_icnsname):
  274.             icnsname = dft_icnsname
  275.         else:
  276.             import __main__
  277.             dft_icnsname = os.path.join(os.path.dirname(__main__.__file__), 'PythonApplet.icns')
  278.             if os.paht.exists(dft_icnsname):
  279.                 icnsname = dft_icnsname
  280.             
  281.     
  282.     if not os.path.exists(rsrcname):
  283.         rsrcname = None
  284.     
  285.     if progress:
  286.         progress.label('Creating bundle...')
  287.     
  288.     import bundlebuilder
  289.     builder = bundlebuilder.AppBuilder(verbosity = 0)
  290.     builder.mainprogram = filename
  291.     builder.builddir = destdir
  292.     builder.name = shortname
  293.     builder.destroot = destroot
  294.     if rsrcname:
  295.         realrsrcname = macresource.resource_pathname(rsrcname)
  296.         builder.files.append((realrsrcname, os.path.join('Contents/Resources', os.path.basename(rsrcname))))
  297.     
  298.     for o in others:
  299.         if type(o) == str:
  300.             builder.resources.append(o)
  301.             continue
  302.         builder.files.append(o)
  303.     
  304.     if plistname:
  305.         import plistlib
  306.         builder.plist = plistlib.Plist.fromFile(plistname)
  307.     
  308.     if icnsname:
  309.         builder.iconfile = icnsname
  310.     
  311.     if not raw:
  312.         builder.argv_emulation = 1
  313.     
  314.     builder.setup()
  315.     builder.build()
  316.     if progress:
  317.         progress.label('Done.')
  318.         progress.inc(0)
  319.     
  320.  
  321.  
  322. def copyres(input, output, skiptypes, skipowner, progress = None):
  323.     ctor = None
  324.     alltypes = []
  325.     Res.UseResFile(input)
  326.     ntypes = Res.Count1Types()
  327.     progress_type_inc = 50 / ntypes
  328.     for itype in range(1, 1 + ntypes):
  329.         type = Res.Get1IndType(itype)
  330.         if type in skiptypes:
  331.             continue
  332.         
  333.         alltypes.append(type)
  334.         nresources = Res.Count1Resources(type)
  335.         progress_cur_inc = progress_type_inc / nresources
  336.         for ires in range(1, 1 + nresources):
  337.             res = Res.Get1IndResource(type, ires)
  338.             (id, type, name) = res.GetResInfo()
  339.             lcname = string.lower(name)
  340.             if lcname == OWNERNAME and id == 0:
  341.                 if skipowner:
  342.                     continue
  343.                 else:
  344.                     ctor = type
  345.             
  346.             size = res.size
  347.             attrs = res.GetResAttrs()
  348.             if progress:
  349.                 progress.label('Copy %s %d %s' % (type, id, name))
  350.                 progress.inc(progress_cur_inc)
  351.             
  352.             res.LoadResource()
  353.             res.DetachResource()
  354.             Res.UseResFile(output)
  355.             
  356.             try:
  357.                 res2 = Res.Get1Resource(type, id)
  358.             except MacOS.Error:
  359.                 res2 = None
  360.  
  361.             if res2:
  362.                 if progress:
  363.                     progress.label('Overwrite %s %d %s' % (type, id, name))
  364.                     progress.inc(0)
  365.                 
  366.                 res2.RemoveResource()
  367.             
  368.             res.AddResource(type, id, name)
  369.             res.WriteResource()
  370.             attrs = attrs | res.GetResAttrs()
  371.             res.SetResAttrs(attrs)
  372.             Res.UseResFile(input)
  373.         
  374.     
  375.     return (alltypes, ctor)
  376.  
  377.  
  378. def copyapptree(srctree, dsttree, exceptlist = [], progress = None):
  379.     names = []
  380.     if os.path.exists(dsttree):
  381.         shutil.rmtree(dsttree)
  382.     
  383.     os.mkdir(dsttree)
  384.     todo = os.listdir(srctree)
  385.     while todo:
  386.         this = todo[0]
  387.         todo = todo[1:]
  388.         if this in exceptlist:
  389.             continue
  390.         
  391.         thispath = os.path.join(srctree, this)
  392.         if os.path.isdir(thispath):
  393.             thiscontent = os.listdir(thispath)
  394.             for t in thiscontent:
  395.                 todo.append(os.path.join(this, t))
  396.             
  397.         
  398.         names.append(this)
  399.     for this in names:
  400.         srcpath = os.path.join(srctree, this)
  401.         dstpath = os.path.join(dsttree, this)
  402.         if os.path.isdir(srcpath):
  403.             os.mkdir(dstpath)
  404.             continue
  405.         if os.path.islink(srcpath):
  406.             endpoint = os.readlink(srcpath)
  407.             os.symlink(endpoint, dstpath)
  408.             continue
  409.         if progress:
  410.             progress.label('Copy ' + this)
  411.             progress.inc(0)
  412.         
  413.         shutil.copy2(srcpath, dstpath)
  414.     
  415.  
  416.  
  417. def writepycfile(codeobject, cfile):
  418.     import marshal
  419.     fc = open(cfile, 'wb')
  420.     fc.write('\x00\x00\x00\x00')
  421.     fc.write('\x00\x00\x00\x00')
  422.     marshal.dump(codeobject, fc)
  423.     fc.flush()
  424.     fc.seek(0, 0)
  425.     fc.write(MAGIC)
  426.     fc.close()
  427.  
  428.