aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'g_octave')
-rw-r--r--g_octave/ebuild.py294
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()