From 1e0de95d6dc51a4b12b8b8e5194225a6fcd4a5e6 Mon Sep 17 00:00:00 2001 From: Jonathan Maw Date: Fri, 8 Mar 2013 11:33:05 +0000 Subject: Update find-artifacts script to use call_in_artifact_directory --- scripts/find-artifacts | 93 ++++++++++---------------------------------------- 1 file changed, 18 insertions(+), 75 deletions(-) (limited to 'scripts') diff --git a/scripts/find-artifacts b/scripts/find-artifacts index bd2c02c8..d6c978f7 100755 --- a/scripts/find-artifacts +++ b/scripts/find-artifacts @@ -31,86 +31,27 @@ path = os.path.dirname(os.path.dirname(__file__)) sys.path.append(path) import morphlib -# MountableImage yanked from the TrebuchetPlugin and modified slightly -class MountableImage(object): - '''Mountable image (deals with decompression). - - Note, this is a read-only mount in the sense that the decompressed - image is not then recompressed after, instead any changes are discarded. - - ''' - def __init__(self, app, artifact_path): - self.app = app - self.artifact_path = artifact_path - - def setup(self, path): - (tempfd, self.temp_path) = \ - tempfile.mkstemp(dir=self.app.settings['tempdir']) - - try: - with os.fdopen(tempfd, "wb") as outfh: - infh = gzip.open(path, "rb") - morphlib.util.copyfileobj(infh, outfh) - infh.close() - except: - os.unlink(self.temp_path) - raise - part = morphlib.fsutils.setup_device_mapping(self.app.runcmd, - self.temp_path) - mount_point = tempfile.mkdtemp(dir=self.app.settings['tempdir']) - morphlib.fsutils.mount(self.app.runcmd, part, mount_point) - self.mount_point = mount_point - return mount_point - - def cleanup(self, path, mount_point): - try: - morphlib.fsutils.unmount(self.app.runcmd, mount_point) - except: - pass - try: - morphlib.fsutils.undo_device_mapping(self.app.runcmd, path) - except: - pass - try: - os.rmdir(mount_point) - os.unlink(path) - except: - pass - - def __enter__(self): - return self.setup(self.artifact_path) - - def __exit__(self, exctype, excvalue, exctraceback): - self.cleanup(self.temp_path, self.mount_point) - - -class FindArtifacts(cliapp.Application): - - def add_settings(self): - self.settings.string(['cachedir'], 'The directory morph writes its ' - 'cache to') - self.settings.string(['tempdir'], 'A temporary directory to mount the ' - 'system image in') +class FindArtifacts(morphlib.app.Morph): def process_args(self, args): artifacts_dir = os.path.join(self.settings['cachedir'], 'artifacts') # args[0] is the path to the built image. - # Mount the image - mount_point = None - with MountableImage(self, args[0]) as mount_point: - # For each meta file: - metadir = os.path.join(mount_point, 'factory-run', 'baserock') - metaglob = os.path.join(metadir, '*.meta') - for metafile in glob.iglob(metaglob): - metafilepath = os.path.join(metadir, metafile) - # Read the file as JSON and extract the kind and cache-key - with open(metafilepath) as openedmetafile: - metajson = json.load(openedmetafile) - cache_key = metajson['cache-key'] - - # Grab every file in the artifact cache which matches the - # cache-key + artifact = args[0] + + def find_artifacts(dirname): + metadirs = [ + os.path.join(dirname, 'factory', 'baserock'), + os.path.join(dirname, 'baserock') + ] + existing_metadirs = [x for x in metadirs if os.path.isdir(x)] + if not existing_metadirs: + raise NotASystemArtifactError(artifact) + metadir = existing_metadirs[0] + for basename in glob.glob(os.path.join(metadir, '*.meta')): + metafile = os.path.join(metadir, basename) + metadata = json.load(open(metafile)) + cache_key = metadata['cache-key'] artifact_glob = os.path.join(artifacts_dir, cache_key) + '*' found_artifacts = glob.glob(artifact_glob) if not found_artifacts: @@ -120,4 +61,6 @@ class FindArtifacts(cliapp.Application): for cached_file in found_artifacts: self.output.write(cached_file + "\n") + morphlib.bins.call_in_artifact_directory(self, artifact, find_artifacts) + FindArtifacts().run() -- cgit v1.2.1