# Copyright 2007 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 import subprocess from portage import os from portage import _unicode_decode from portage._sets.base import PackageSet from portage._sets import SetConfigError __all__ = ["CommandOutputSet"] class CommandOutputSet(PackageSet): """This class creates a PackageSet from the output of a shell command. The shell command should produce one atom per line, that is: >>> atom1 atom2 ... atomN Args: name: A string that identifies the set. command: A string or sequence identifying the command to run (see the subprocess.Popen documentaion for the format) """ _operations = ["merge", "unmerge"] def __init__(self, command): super(CommandOutputSet, self).__init__() self._command = command self.description = "Package set generated from output of '%s'" % self._command def load(self): pipe = subprocess.Popen(self._command, stdout=subprocess.PIPE, shell=True) stdout, stderr = pipe.communicate() if pipe.wait() == os.EX_OK: self._setAtoms(_unicode_decode(stdout).splitlines()) def singleBuilder(self, options, settings, trees): if not "command" in options: raise SetConfigError("no command specified") return CommandOutputSet(options["command"]) singleBuilder = classmethod(singleBuilder)