diff options
Diffstat (limited to 'g_octave/ebuild.py')
-rw-r--r-- | g_octave/ebuild.py | 294 |
1 files changed, 113 insertions, 181 deletions
diff --git a/g_octave/ebuild.py b/g_octave/ebuild.py index edacc2d..371c9d4 100644 --- a/g_octave/ebuild.py +++ b/g_octave/ebuild.py @@ -20,7 +20,7 @@ __all__ = [ from .config import Config from .description import * -from .description_tree import * +from .description_tree import DescriptionTree from .exception import EbuildException from .compat import open @@ -39,91 +39,16 @@ out = portage.output.EOutput() # validating keywords (based on the keywords from the sci-mathematics/octave package) re_keywords = re.compile(r'(~)?(alpha|amd64|hppa|ppc64|ppc|sparc|x86)') -class Ebuild: - - def __init__(self, pkg_atom, force=False, scm=False, pkg_manager=None): - - self.__scm = scm - self.__force = force - self.__pkg_manager = pkg_manager - self.__dbtree = DescriptionTree() - - atom = re_pkg_atom.match(pkg_atom) - if atom == None: - self.pkgname = pkg_atom - self.version = self.__dbtree.latest_version(self.pkgname) - else: - self.pkgname = atom.group(1) - self.version = atom.group(2) - - self.__desc = self.__dbtree.get('%s-%s' % (self.pkgname, self.version)) - if self.__scm: - self.version = '9999' - if self.__desc is not None: - self.__desc = SvnDescription(self.__desc.CAT, self.pkgname) - else: - raise EbuildException('Failed to find the octave-forge category of this package.') - - if self.__desc == None: - raise EbuildException('Package not found: %s' % pkg_atom) - - - def description(self): - - return self.__desc - - - def create(self, display_info=True, accept_keywords=None, manifest=True, nodeps=False): - - my_ebuild = os.path.join( - config.overlay, - 'g-octave', - '%s' % self.pkgname, - '%s-%s.ebuild' % (self.pkgname, self.version) - ) - - if not os.path.exists(my_ebuild) or self.__force: - - if display_info: - out.einfo('Creating ebuild: g-octave/%s-%s.ebuild' % (self.pkgname, self.version)) - - try: - my_atom, my_catpkg = self.__create(accept_keywords, manifest) - except Exception as error: - if display_info: - out.eerror('Failed to create: g-octave/%s-%s.ebuild' % (self.pkgname, self.version)) - raise EbuildException(error) - else: - if not nodeps: - self.__resolve_dependencies() - return my_atom, my_catpkg - - else: - return ( - '=g-octave/%s-%s' % (self.pkgname, self.version), - 'g-octave/%s' % self.pkgname, - ) - - def __create(self, accept_keywords=None, manifest=True): - - ebuild_path = os.path.join(config.overlay, 'g-octave', self.pkgname) - ebuild_file = os.path.join(ebuild_path, '%s-%s.ebuild' % (self.pkgname, self.version)) - metadata_file = os.path.join(ebuild_path, 'metadata.xml') - - if not os.path.exists(ebuild_path): - os.makedirs(ebuild_path, 0o755) - - ebuild = """\ +EBUILD_TEMPLATE = """\ # Copyright 1999-2010 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # This ebuild was generated by g-octave EAPI="3" - G_OCTAVE_CAT="%(category)s" -inherit g-octave%(eutils)s +inherit g-octave DESCRIPTION="%(description)s" HOMEPAGE="%(url)s" @@ -134,99 +59,117 @@ KEYWORDS="%(keywords)s" IUSE="" DEPEND="%(depend)s" -RDEPEND="${DEPEND} -\t%(rdepend)s" +RDEPEND="${DEPEND}" + +PATCHES=( %(patches)s ) """ - metadata = """\ +METADATA_TEMPLATE = """\ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd"> <pkgmetadata> -\t<herd>no-herd</herd> -\t<maintainer> -\t\t<email>%(username)s@%(hostname)s</email> -\t</maintainer> -\t<longdescription lang="en"> -\t\tThe files on this directory was created by g-octave. -\t</longdescription> + <herd>no-herd</herd> + <maintainer> + <email>%(username)s@%(hostname)s</email> + </maintainer> + <longdescription lang="en"> + The files on this directory was created by g-octave. + </longdescription> </pkgmetadata> """ + + +class Ebuild: + + def __init__(self, pkg_atom, force=False, scm=False, pkg_manager=None): - description = len(self.__desc.description) > 70 and \ - self.__desc.description[:70]+'...' or self.__desc.description - - if accept_keywords is None: - accept_keywords = portage.settings['ACCEPT_KEYWORDS'] - - category = self.__desc.CAT - - vars = { - 'eutils': '', - 'description': description, - 'url': self.__desc.url, - 'license': self.__desc.license_gentoo, - 'keywords': self.__keywords(accept_keywords), - 'category': category, - 'depend': '', - 'rdepend': '', - } - - vars['depend'] = self.__depends(self.__desc.buildrequires) + self._scm = scm + self._force = force + self._pkg_manager = pkg_manager + self._tree = DescriptionTree() - systemrequirements = self.__depends(self.__desc.systemrequirements) - if systemrequirements != '': - vars['depend'] += "\n\t"+systemrequirements + atom = re_pkg_atom.match(pkg_atom) + if atom is None: + pkg_name = pkg_atom + version = self._tree.latest_version(pkg_name) + else: + pkg_name = atom.group(1) + version = atom.group(2) - vars['rdepend'] = self.__depends(self.__desc.depends) + self.description = self._tree.get(pkg_name + '-' + version) + if self._scm: + if self.description is not None: + self.description = SvnDescription(self.description.CAT, self.description.PN) + else: + raise EbuildException('Failed to find the octave-forge category of this package.') - patches = self.__search_patches() + if self.description is None: + raise EbuildException('Package not found: %s' % pkg_atom) + + def create(self, display_info=True, accept_keywords=None, manifest=True, nodeps=False): + ebuild_dir = os.path.join(config.overlay, 'g-octave', self.description.PN) + ebuild_file = os.path.join(ebuild_dir, self.description.P + '.ebuild') + metadata_file = os.path.join(ebuild_dir, 'metadata.xml') - if len(patches) > 0: - - # WOW, we have patches :( - - patchesdir = os.path.join(config.db, 'patches') - filesdir = os.path.join(config.overlay, 'g-octave', self.pkgname, 'files') - if not os.path.exists(filesdir): - os.makedirs(filesdir, 0o755) - - patch_string = '' - for patch in patches: - patch_string += "\n\tepatch \"${FILESDIR}/%s\"" % patch - shutil.copy2(os.path.join(patchesdir, patch), filesdir) - - ebuild += "\nsrc_prepare() {%s\n\tg-octave_src_prepare\n}\n" % patch_string - vars['eutils'] = ' eutils' - - with open(ebuild_file, 'w') as fp: - fp.write(ebuild % vars) + if self._force and os.path.exists(ebuild_dir): + shutil.rmtree(ebuild_dir) - if not os.path.exists(metadata_file): + if not os.path.exists(ebuild_file) or self._force: + if display_info: + out.einfo('Creating ebuild: g-octave/' + self.description.P + '.ebuild') try: - hostname = os.uname()[1] - except: - hostname = 'localhost' - with open(metadata_file, 'w') as fp: - fp.write(metadata % { - 'username': getpass.getuser(), - 'hostname': hostname, - }) - - if manifest: - proc = self.__pkg_manager.create_manifest(ebuild_file) - - if proc != os.EX_OK: - raise EbuildException('Failed to create Manifest file!') + if not os.path.exists(ebuild_dir): + os.makedirs(ebuild_dir, 0o755) + with open(ebuild_file, 'w') as fp: + fp.write(EBUILD_TEMPLATE % self._evaluate_ebuild_vars(accept_keywords)) + if not os.path.exists(metadata_file): + with open(metadata_file, 'w') as fp: + fp.write(METADATA_TEMPLATE % self._evaluate_metadata_vars()) + if manifest: + if self._pkg_manager.create_manifest(ebuild_file) != os.EX_OK: + raise EbuildException('Failed to create Manifest file!') + except Exception as error: + if display_info: + out.eerror('Failed to create: g-octave/' + self.description.P + '.ebuild') + raise EbuildException(error) + else: + if not nodeps: + self._resolve_dependencies() + + def _evaluate_ebuild_vars(self, accept_keywords=None): + if accept_keywords is None: + accept_keywords = portage.settings['ACCEPT_KEYWORDS'] - return ( - '=g-octave/%s-%s' % (self.pkgname, self.version), - 'g-octave/%s' % self.pkgname, + depend = self.description.depends + self.description.buildrequires + \ + self.description.systemrequirements + + ebuild_vars = dict( + description = self.description.description[:70], + url = self.description.url, + license = self.description.license_gentoo, + keywords = self._evaluate_keywords(accept_keywords), + category = self.description.CAT, + depend = self._stringify_list(depend), + patches = self._stringify_list(self._search_patches()) ) - - def __keywords(self, accept_keywords): + if len(self.description.description) > 70: + ebuild_vars['description'] += '...' - if self.__scm: + return ebuild_vars + + def _evaluate_metadata_vars(self): + try: + hostname = os.uname()[1] + except: + hostname = 'localhost' + return dict( + username = getpass.getuser(), + hostname = hostname + ) + + def _evaluate_keywords(self, accept_keywords): + if self._scm: return '' keywords = [i.strip() for i in accept_keywords.split(' ')] @@ -251,64 +194,53 @@ RDEPEND="${DEPEND} return ' '.join(final) - - def __depends(self, mylist): - - if mylist != None: - return "\n\t".join(mylist) - + def _stringify_list(self, my_list): + if my_list is not None: + return "\n\t".join(my_list) return '' - - - def __search_patches(self): + + def _search_patches(self): patches_dir = os.path.join(config.db, 'patches') + files_dir = os.path.join(config.overlay, 'g-octave', self.description.PN, 'files') if not os.path.exists(patches_dir): return [] tmp = [] - for patch in os.listdir(patches_dir): - if re.match(r'^([0-9]{3})_%s-%s' % (self.pkgname, self.version), patch): - tmp.append(patch) - + if re.match(r'^([0-9]{3})_' + self.description.P, patch): + if not os.path.exists(files_dir): + os.makedirs(files_dir, 0o755) + shutil.copy2(os.path.join(patches_dir, patch), files_dir) + tmp.append('"${FILESDIR}/' + patch + '"') tmp.sort() - return tmp - - def __resolve_dependencies(self): + def _resolve_dependencies(self): to_install = [] - - for pkg, comp, version in self.__desc.self_depends: + for pkg, comp, version in self.description.self_depends: # no version required, get the latest available if version == None: - to_install.append('%s-%s' % (pkg, self.__dbtree.latest_version(pkg))) + to_install.append('%s-%s' % (pkg, self._tree.latest_version(pkg))) continue # here we need to calculate the better version to install - versions = self.__dbtree.package_versions(pkg) + versions = self._tree.package_versions(pkg) allowed_versions = [] - for _version in versions: comparation = vercmp(_version, version) if eval('%s %s 0' % (comparation, comp)): allowed_versions.append(_version) - to_install.append('%s-%s' % (pkg, self.__dbtree.version_compare(allowed_versions))) + to_install.append('%s-%s' % (pkg, self._tree.version_compare(allowed_versions))) if len(allowed_versions) == 0: raise EbuildException('Can\'t resolve a dependency: %s' % pkg) # creating the ebuilds for the dependencies, recursivelly for ebuild in to_install: - Ebuild( - ebuild, - force = self.__force, - pkg_manager = self.__pkg_manager, - scm = self.__scm - ).create() + Ebuild(ebuild, force=self._force, pkg_manager=self._pkg_manager, scm=self._scm).create() |