legacy/autodmg_cache_builder/autodmg_utility.py (57 lines of code) (raw):

#!/usr/bin/python # Copyright (c) Facebook, Inc. and its affiliates. """Utility functions used by other parts of the AutoDMG build tools.""" import subprocess import os import tempfile import shutil def run(cmd): """Run a command with subprocess, printing output in realtime.""" proc = subprocess.Popen( cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT ) while proc.poll() is None: l = proc.stdout.readline() print l, print proc.stdout.read() return proc.returncode def pkgbuild(root_dir, identifier, version, pkg_output_file): """Build a package from root_dir at pkg_output_file.""" cmd = [ '/usr/bin/pkgbuild', '--root', root_dir, '--identifier', identifier, '--version', version, pkg_output_file] run(cmd) def build_pkg(source, output, receipt, destination, cache_dir, comment=''): """ Construct package using pkgbuild. source - the directory to build a package from output - the name of the package file to build ('.pkg' is appended) receipt - the receipt of the package destination - the directory path to place the payload in cache_dir - the directory to place the built package into comment - A message to print out when building """ if os.path.isdir(source) and os.listdir(source): print comment pkg_name = '%s.pkg' % output # We must copy the contents into a temp folder and build prefix = 'cpe_%s' % receipt.split('.')[-1] temp_dir = tempfile.mkdtemp(prefix=prefix, dir='/tmp') pkg_dir = os.path.join(temp_dir, destination.lstrip('/')) # Copy the contents of the folder into place shutil.copytree(source, pkg_dir) # Build the package output_file = os.path.join(cache_dir, pkg_name) pkgbuild( temp_dir, receipt, '1.0', output_file ) # Clean up after ourselves shutil.rmtree(temp_dir, ignore_errors=True) # Return the path to the package if os.path.isfile(output_file): return output_file # If nothing was built, return empty string return '' def populate_ds_repo(image_path, repo): """Move a built image into the DS repo.""" repo_hfs = os.path.join(repo, 'Masters', 'HFS') image_name = os.path.basename(image_path) if not image_path.endswith('.hfs.dmg') and image_path.endswith('.dmg'): # DS masters must end in '.hfs.dmg' print 'Renaming image to ".hfs.dmg" for DS support' image_name = image_name.split('.dmg')[0] + '.hfs.dmg' repo_target = os.path.join(repo_hfs, image_name) if os.path.isfile(repo_target): # If the target already exists, name it "-OLD" newname = repo_target.split('.hfs.dmg')[0] + '-OLD.hfs.dmg' print "Renaming old image to %s" % newname os.rename(repo_target, newname) # now copy the newly built image over print "Copying new image to DS Repo." print "Image path: %s" % image_path print "Repo target: %s" % repo_target shutil.move(image_path, repo_target)