summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorRichard Maw <richard.maw@codethink.co.uk>2013-03-08 13:23:34 +0000
committerRichard Maw <richard.maw@codethink.co.uk>2013-03-08 13:23:34 +0000
commitc37d0d7a50581e8daeea5aa3e60b6aa7a07e0616 (patch)
treeada9514e87d390c7f8aea67b91aab4d11210986a /scripts
parenta58f689f69a5bcdc7b01d4c57d18d31dd200fc9e (diff)
parent1e0de95d6dc51a4b12b8b8e5194225a6fcd4a5e6 (diff)
downloadmorph-c37d0d7a50581e8daeea5aa3e60b6aa7a07e0616.tar.gz
Merge branch 'jonathan/update-find-artifacts' of ssh://trove.baserock.org/baserock/baserock/morph into staging
This included a fixup for the copyright years and the call to call_in_artifact_directory being a shade too long.
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/find-artifacts96
1 files changed, 20 insertions, 76 deletions
diff --git a/scripts/find-artifacts b/scripts/find-artifacts
index bd2c02c8..bf6425ea 100755
--- a/scripts/find-artifacts
+++ b/scripts/find-artifacts
@@ -1,6 +1,6 @@
#!/usr/bin/env python
#
-# Copyright (C) 2011-2012 Codethink Limited
+# Copyright (C) 2011-2013 Codethink Limited
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -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,7 @@ 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()