diff options
Diffstat (limited to 'morphlib/bins.py')
-rw-r--r-- | morphlib/bins.py | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/morphlib/bins.py b/morphlib/bins.py index 622aa165..ba5f713f 100644 --- a/morphlib/bins.py +++ b/morphlib/bins.py @@ -1,4 +1,4 @@ -# 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 @@ -21,6 +21,7 @@ Binaries are chunks, strata, and system images. ''' +import cliapp import logging import os import re @@ -29,6 +30,11 @@ import stat import shutil import tarfile +import morphlib + +from morphlib.extractedtarball import ExtractedTarball +from morphlib.mountableimage import MountableImage + # Work around http://bugs.python.org/issue16477 def safe_makefile(self, tarinfo, targetpath): @@ -211,3 +217,24 @@ def unpack_binary_from_file(f, dirname): # pragma: no cover def unpack_binary(filename, dirname): with open(filename, "rb") as f: unpack_binary_from_file(f, dirname) + + +class ArtifactNotMountableError(cliapp.AppException): # pragma: no cover + + def __init__(self, filename): + cliapp.AppException.__init__( + self, 'Artifact %s cannot be extracted or mounted' % filename) + + +def call_in_artifact_directory(app, filename, callback): # pragma: no cover + '''Call a function in a directory the artifact is extracted/mounted in.''' + + try: + with ExtractedTarball(app, filename) as dirname: + callback(dirname) + except tarfile.TarError: + try: + with MountableImage(app, filename) as dirname: + callback(dirname) + except (IOError, OSError): + raise ArtifactNotMountableError(filename) |