__init__.py revision 1544
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger#!/usr/bin/python
b66a6512eb6dea6cf5339eaa857a81d1b89cb4deJulian Kornberger#
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger# CDDL HEADER START
b66a6512eb6dea6cf5339eaa857a81d1b89cb4deJulian Kornberger#
ee5342a8882c2fc7631fcffb5497e6597747887cTim Reddehase# The contents of this file are subject to the terms of the
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa# Common Development and Distribution License (the "License").
b66a6512eb6dea6cf5339eaa857a81d1b89cb4deJulian Kornberger# You may not use this file except in compliance with the License.
9cfb01db247ca04bb4b5b337bbd77c66b7150e53Julian Kornberger#
f4b865988759de2bcc51ffd55897191c74e53ba2Eugen Kuksa# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa# or http://www.opensolaris.org/os/licensing.
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa# See the License for the specific language governing permissions
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa# and limitations under the License.
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa#
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa# When distributing Covered Code, include this CDDL HEADER in each
03dee28977299b4b40210d9b7842bf85c136ab7d=# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
03dee28977299b4b40210d9b7842bf85c136ab7d=# If applicable, add the following below this CDDL HEADER, with the
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger# fields enclosed by brackets "[]" replaced with your own identifying
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa# information: Portions Copyright [yyyy] [name of copyright owner]
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa#
76f22aa7c18383199da116500929b79945677076Eugen Kuksa# CDDL HEADER END
5377dc644918632ef318825466e4f3cd861e27ecEugen Kuksa#
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger#
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger# Use is subject to license terms.
498a5ce047b7c0873d84f6e7f45f3443e5072b70Eugen Kuksa#
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger"""
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornbergerpackage containing packaging action (file type) modules
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger
532f6901b468d49af265ef939b52bbc6c8f1ab85Eugen KuksaThis package contains modules describing packaging actions, or file types. The
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksaactions are dynamically discovered, so that new modules can be placed in this
532f6901b468d49af265ef939b52bbc6c8f1ab85Eugen Kuksapackage directory and they'll just be picked up. The current package contents
532f6901b468d49af265ef939b52bbc6c8f1ab85Eugen Kuksacan be seen in the section "PACKAGE CONTENTS", below.
9f9aab3a5e6a6beca675c7f90f9af56a3636f000Eugen Kuksa
f4b865988759de2bcc51ffd55897191c74e53ba2Eugen KuksaThis package has one data member: "types". This is a dictionary which maps the
9e3e0144c09a30bdb6211168a35dacbf0cb130d8Eugen Kuksaaction names to the classes that represent them.
9e3e0144c09a30bdb6211168a35dacbf0cb130d8Eugen Kuksa
9e3e0144c09a30bdb6211168a35dacbf0cb130d8Eugen KuksaThis package also has one function: "fromstr", which creates an action instance
9e3e0144c09a30bdb6211168a35dacbf0cb130d8Eugen Kuksabased on a str() representation of an action.
9f9aab3a5e6a6beca675c7f90f9af56a3636f000Eugen Kuksa"""
9f9aab3a5e6a6beca675c7f90f9af56a3636f000Eugen Kuksa
9f9aab3a5e6a6beca675c7f90f9af56a3636f000Eugen Kuksaimport inspect
9f9aab3a5e6a6beca675c7f90f9af56a3636f000Eugen Kuksaimport os
9f9aab3a5e6a6beca675c7f90f9af56a3636f000Eugen Kuksa
9f9aab3a5e6a6beca675c7f90f9af56a3636f000Eugen Kuksa# All modules in this package (all python files except __init__.py with their
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa# extensions stripped off).
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa__all__ = [
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa f[:-3]
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa for f in os.listdir(__path__[0])
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa if f.endswith(".py") and f != "__init__.py"
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa]
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa# A dictionary of all the types in this package, mapping to the classes that
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa# define them.
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksatypes = {}
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksafor modname in __all__:
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa module = __import__("%s.%s" % (__name__, modname),
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa globals(), locals(), [modname])
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa nvlist = inspect.getmembers(module, inspect.isclass)
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa # Pull the class objects out of nvlist, keeping only those that are
f4b865988759de2bcc51ffd55897191c74e53ba2Eugen Kuksa # actually defined in this package.
f4b865988759de2bcc51ffd55897191c74e53ba2Eugen Kuksa classes = [
a847d9812b328c048773e705606b10875a929034Eugen Kuksa c[1]
a847d9812b328c048773e705606b10875a929034Eugen Kuksa for c in nvlist
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa if '.'.join(c[1].__module__.split('.')[:-1]) == __name__
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa ]
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa for cls in classes:
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa types[cls.name] = cls
a847d9812b328c048773e705606b10875a929034Eugen Kuksa
a847d9812b328c048773e705606b10875a929034Eugen Kuksa# Clean up after ourselves
a847d9812b328c048773e705606b10875a929034Eugen Kuksadel f, modname, module, nvlist, classes, c, cls
a847d9812b328c048773e705606b10875a929034Eugen Kuksa
a847d9812b328c048773e705606b10875a929034Eugen Kuksaclass ActionError(Exception):
a847d9812b328c048773e705606b10875a929034Eugen Kuksa """Base exception class for Action errors."""
a847d9812b328c048773e705606b10875a929034Eugen Kuksa
a847d9812b328c048773e705606b10875a929034Eugen Kuksa def __unicode__(self):
8ec575832389c2588f0b5ca1f1dd2cc42d62eb12= # To workaround python issues 6108 and 2517, this provides a
8ec575832389c2588f0b5ca1f1dd2cc42d62eb12= # a standard wrapper for this class' exceptions so that they
8ec575832389c2588f0b5ca1f1dd2cc42d62eb12= # have a chance of being stringified correctly.
a847d9812b328c048773e705606b10875a929034Eugen Kuksa return str(self)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
8ec575832389c2588f0b5ca1f1dd2cc42d62eb12= def __str__(self):
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa raise NotImplementedError()
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksaclass UnknownActionError(ActionError):
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa def __init__(self, *args):
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa self.actionstr = args[0]
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa self.type = args[1]
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa def __str__(self):
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa if hasattr(self, "fmri") and self.fmri is not None:
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa return _("unknown action type '%(type)s' in package "
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa "'%(fmri)s' in action '%(action)s'") % {
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa "type": self.type, "fmri": self.fmri,
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa "action": self.actionstr }
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa return _("unknown action type '%(type)s' in action "
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa "'%(action)s'") % { "type": self.type,
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa "action": self.actionstr }
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksaclass MalformedActionError(ActionError):
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa def __init__(self, *args):
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa self.actionstr = args[0]
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa self.position = args[1]
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa self.errorstr = args[2]
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa def __str__(self):
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa marker = " " * (4 + self.position) + "^"
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa if hasattr(self, "fmri") and self.fmri is not None:
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa return _("Malformed action in package '%(fmri)s' at "
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa "position: %(pos)d:\n %(action)s\n"
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa "%(marker)s") % { "fmri": self.fmri,
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa "pos": self.position, "action": self.actionstr,
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksa "marker": marker }
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksa return _("Malformed action at position: %(pos)d:\n "
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa "%(action)s\n%(marker)s") % { "pos": self.position,
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa "action": self.actionstr, "marker": marker }
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksaclass ActionDataError(ActionError):
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa """Used to indicate that a file-related error occuring during action
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa initialization."""
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa def __init__(self, *args, **kwargs):
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa self.error = args[0]
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa self.path = kwargs.get("path", None)
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa def __str__(self):
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa return str(self.error)
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksa
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksa
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksaclass InvalidActionError(ActionError):
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksa """Used to indicate that attributes provided were invalid, or required
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksa attributes were missing for an action."""
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksa
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa def __init__(self, *args):
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa self.actionstr = args[0]
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa self.errorstr = args[1]
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa def __str__(self):
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa if hasattr(self, "fmri") and self.fmri is not None:
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa return _("invalid action in package %(fmri)s: "
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa "%(action)s: %(error)s") % { "fmri": self.fmri,
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa "action": self.actionstr, "error": self.errorstr }
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa return _("invalid action, '%(action)s': %(error)s") % {
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa "action": self.actionstr, "error": self.errorstr }
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
82943dcc7f878756736a3f21a8100b389b94ba46Eugen Kuksa
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksafrom _actions import _fromstr
391f72f778a8c9e1cbaed1860f4a4754d6881c8aEugen Kuksa
391f72f778a8c9e1cbaed1860f4a4754d6881c8aEugen Kuksadef attrsfromstr(string):
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa """Create an attribute dict given a string w/ key=value pairs.
391f72f778a8c9e1cbaed1860f4a4754d6881c8aEugen Kuksa
82943dcc7f878756736a3f21a8100b389b94ba46Eugen Kuksa Raises MalformedActionError if the attributes have syntactic problems.
82943dcc7f878756736a3f21a8100b389b94ba46Eugen Kuksa """
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa return _fromstr("bogus %s" % string)[2]
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksadef fromstr(string, data=None):
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa """Create an action instance based on a str() representation of an
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa action.
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa Raises UnknownActionError if the action type is unknown.
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa Raises MalformedActionError if the action has other syntactic problems.
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa """
93ff918a7a1656d812f27a767a976ea33da0921fJulian Kornberger
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa atype, ahash, attr_dict = _fromstr(string)
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa if atype not in types:
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa raise UnknownActionError(string, atype)
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger action = types[atype](data=data, **attr_dict)
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger ka = action.key_attr
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger if ka is not None and (ka not in action.attrs or
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger action.attrs[ka] is None):
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger raise InvalidActionError(string, _("required attribute '%s' "
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger "was not provided.") % ka)
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger if ahash:
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger action.hash = ahash
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger return action
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornbergerdef internalizelist(atype, args, ahash=None, basedirs=None):
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa """Create an action instance based on a sequence of "key=value" strings.
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa This function also translates external representations of actions with
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa payloads (like file and license which can use NOHASH or file paths to
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa point to the payload) to an internal representation which sets the
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa data field of the action returned.
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa The "atype" parameter is the type of action to be built.
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa The "args" parameter is the sequence of "key=value" strings.
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa The "ahash" parameter is used to set the hash value for the action.
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa The "basedirs" parameter is the list of directories to look in to find
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa any payload for the action.
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa Raises MalformedActionError if the attribute strings are malformed.
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa """
if atype not in types:
raise UnknownActionError(("%s %s" % (atype,
" ".join(args))).strip(), atype)
data = None
if atype in ("file", "license"):
data = args.pop(0)
attrs = {}
try:
for a, v in [kv.split("=", 1) for kv in args]:
if v == '' or a == '':
kvi = args.index(kv) + 1
p1 = " ".join(args[:kvi])
p2 = " ".join(args[kvi:])
raise MalformedActionError(
"%s %s %s" % (atype, p1, p2), len(p1) + 1,
"attribute '%s'" % kv)
# This is by far the common case-- an attribute with
# a single value.
if a not in attrs:
attrs[a] = v
else:
av = attrs[a]
if isinstance(av, list):
attrs[a].append(v)
else:
attrs[a] = [ av, v ]
except ValueError:
# We're only here if the for: statement above throws a
# MalformedActionError. That can happen if split yields a
# single element, which is possible if e.g. an attribute lacks
# an =.
kvi = args.index(kv) + 1
p1 = " ".join(args[:kvi])
p2 = " ".join(args[kvi:])
raise MalformedActionError("%s %s %s" % (atype, p1, p2),
len(p1) + 2, "attribute '%s'" % kv)
action = types[atype](data=None, **attrs)
ka = action.key_attr
if ka is not None and (ka not in action.attrs or
action.attrs[ka] is None):
raise InvalidActionError(("%s %s" % (atype,
" ".join(args))).strip(), _("required attribute, "
"'%s', was not provided.") % ka)
if ahash:
action.hash = ahash
local_path = set_action_data(data, action, basedirs)
return action, local_path
def internalizestr(string, basedirs=None, load_data=True):
"""Create an action instance based on a sequence of strings.
This function also translates external representations of actions with
payloads (like file and license which can use NOHASH or file paths to
point to the payload) to an internal representation which sets the
data field of the action returned.
In general, each string should be in the form of "key=value". The
exception is a payload for certain actions which should be the first
item in the sequence.
Raises MalformedActionError if the attribute strings are malformed.
"""
string = string.strip()
args = string.split()
atype = args.pop(0)
if atype not in types:
raise UnknownActionError(("%s %s" % (atype,
" ".join(args))).strip(), atype)
action = fromstr(string)
if atype not in ("file", "license") or not load_data:
return action, None
local_path = set_action_data(args[0], action, basedirs)
return action, local_path
def set_action_data(payload, action, basedirs):
"""Sets the data field of an action using the information in the
payload and returns the actual path used to set the data.
The "payload" parameter is the representation of the data to assign to
the action's data field. It can either be NOHASH or a path to the file.
The "action" parameter is the action to modify.
The "basedirs" parameter contains the directories to examine to find
the payload in."""
if not payload:
return None
if payload == "NOHASH":
filepath = os.path.sep + action.attrs["path"]
else:
filepath = payload
if basedirs:
path = filepath.lstrip(os.path.sep)
# look for file in specified dirs
for d in basedirs:
data = os.path.join(d, path)
if os.path.isfile(data):
break
else:
data = filepath
action.set_data(data)
return data