Skip to content
Snippets Groups Projects
tools.py 3.17 KiB
Newer Older
  • Learn to ignore specific revisions
  • #
    # Copyright (c) 2016 Google, Inc
    #
    # SPDX-License-Identifier:      GPL-2.0+
    #
    
    import os
    import shutil
    import tempfile
    
    import tout
    
    outdir = None
    indirs = None
    preserve_outdir = False
    
    def PrepareOutputDir(dirname, preserve=False):
        """Select an output directory, ensuring it exists.
    
        This either creates a temporary directory or checks that the one supplied
        by the user is valid. For a temporary directory, it makes a note to
        remove it later if required.
    
        Args:
            dirname: a string, name of the output directory to use to store
                    intermediate and output files. If is None - create a temporary
                    directory.
            preserve: a Boolean. If outdir above is None and preserve is False, the
                    created temporary directory will be destroyed on exit.
    
        Raises:
            OSError: If it cannot create the output directory.
        """
        global outdir, preserve_outdir
    
        preserve_outdir = dirname or preserve
        if dirname:
            outdir = dirname
            if not os.path.isdir(outdir):
                try:
                    os.makedirs(outdir)
                except OSError as err:
                    raise CmdError("Cannot make output directory '%s': '%s'" %
                                    (outdir, err.strerror))
            tout.Debug("Using output directory '%s'" % outdir)
        else:
            outdir = tempfile.mkdtemp(prefix='binman.')
            tout.Debug("Using temporary directory '%s'" % outdir)
    
    def _RemoveOutputDir():
        global outdir
    
        shutil.rmtree(outdir)
        tout.Debug("Deleted temporary directory '%s'" % outdir)
        outdir = None
    
    def FinaliseOutputDir():
        global outdir, preserve_outdir
    
        """Tidy up: delete output directory if temporary and not preserved."""
        if outdir and not preserve_outdir:
            _RemoveOutputDir()
    
    def GetOutputFilename(fname):
        """Return a filename within the output directory.
    
        Args:
            fname: Filename to use for new file
    
        Returns:
            The full path of the filename, within the output directory
        """
        return os.path.join(outdir, fname)
    
    def _FinaliseForTest():
        """Remove the output directory (for use by tests)"""
        global outdir
    
        if outdir:
            _RemoveOutputDir()
    
    def SetInputDirs(dirname):
        """Add a list of input directories, where input files are kept.
    
        Args:
            dirname: a list of paths to input directories to use for obtaining
                    files needed by binman to place in the image.
        """
        global indir
    
        indir = dirname
        tout.Debug("Using input directories %s" % indir)
    
    def GetInputFilename(fname):
        """Return a filename for use as input.
    
        Args:
            fname: Filename to use for new file
    
        Returns:
            The full path of the filename, within the input directory
        """
        if not indir:
            return fname
        for dirname in indir:
            pathname = os.path.join(dirname, fname)
            if os.path.exists(pathname):
                return pathname
    
        raise ValueError("Filename '%s' not found in input path (%s)" %
                         (fname, ','.join(indir)))
    
    def Align(pos, align):
        if align:
            mask = align - 1
            pos = (pos + mask) & ~mask
        return pos
    
    def NotPowerOfTwo(num):
        return num and (num & (num - 1))