summaryrefslogtreecommitdiffstats
path: root/modules/port.py
diff options
context:
space:
mode:
Diffstat (limited to 'modules/port.py')
-rw-r--r--modules/port.py100
1 files changed, 98 insertions, 2 deletions
diff --git a/modules/port.py b/modules/port.py
index fe3083d..d6edcdb 100644
--- a/modules/port.py
+++ b/modules/port.py
@@ -18,9 +18,104 @@
from base.module import Module
-class Port(Module):
- def __init__(self):
+class Port(Module):
+ @property
+ def sourceball(self):
+ raise NotImplementedError
+
+ @property
+ def revision_control(self):
+ raise NotImplementedError
+
+ @property
+ def builder(self):
+ raise NotImplementedError
+
+ @property
+ def fetcher(self):
+ raise NotImplementedError
+
+ def __init__(self, package=None):
self._to_close = list()
+ if not package:
+ package = getcwd()
+ self.pkg = DirFactory(package)
+ self.hackage = Hackage()
+
+ def add_sourceball(self, sourceball):
+ '''copies a tarball into the package
+
+ tarball is a path to some tarball
+ '''
+ with pwd(self.pkg.dir):
+ pkg_src = self.sourceball('', sourceball)
+ pkg_src.set_buildsystem(self.builder._type)
+ name = pkg_src.name
+ self.pkg.add_source(name)
+ return self.close_later(pkg_src)
+
+ def add_vcs(self, url, tgt, *args):
+ '''creates a darcs variant of a cabal package using darcs source
+
+ url is a url to some darcs repo
+ tgt is the local name of the darcs repo
+ '''
+ with pwd(self.pkg.dir):
+ pkg_src = self.revision_control(tgt, url, *args)
+ pkg_src.set_buildsystem(self.builder._type)
+ name = pkg_src.name
+ self.pkg.add_source(name)
+ return self.close_later(pkg_src)
+
+ def install_sourceball(self, tarball, target='home', *args):
+ '''given a tarball, copy it in and install it
+ '''
+ pkg_src = self.add_sourceball(tarball)
+ self.builder(pkg_src).install_source(target, *args)
+
+ def add_from_release(self, pkg, ver):
+ '''get a specific package from hackage
+
+ pkg is the name of the package desired
+ ver is the version wanted
+ '''
+ sb_loc = self.fetcher().url(pkg, ver)
+ sb = self.add_sourceball(sb_loc)
+ sb.cfg['release_name'] = pkg
+ return sb
+
+ def add_latest(self, pkg):
+ '''get the latest version of a package from hackage
+
+ pkg is the package desired
+ '''
+ ver = self.fetcher().latest_version(pkg)
+ return self.add_from_release(pkg, ver)
+
+ def install_from_release(self, pkg, ver, target='home', *args):
+ '''get and install a specific package from hackage
+
+ pkg is the desired package
+ ver is the version wanted
+ target is the location to install to, either 'home' or 'root'
+ '''
+ sb_loc = self.fetcher().url(pkg, ver)
+ self.install_sourceball(sb_loc, target, *args)
+
+ def install_latest(self, pkg, target='home', *args):
+ '''get and install the latest version of a package from hackage'''
+ ver = self.hackage.latest_version(pkg)
+ self.install_from_hackage(pkg, ver, target, *args)
+
+ def add_upstream(self, pkg, tgt=None, *args):
+ if not tgt:
+ tgt = pkg
+ return self.add_darcs(self.fetcher().vcs_url(pkg), tgt, *args)
+
+ def install_upstream(self, pkg, tgt=None, target='home', *args):
+ pkg_src = self.add_upstream(pkg, tgt, *args)
+ self.builder(pkg_src).install_source(target)
+
def close_later(self, directory):
if directory not in self._to_close:
@@ -30,3 +125,4 @@ class Port(Module):
def close(self):
for directory in self._to_close:
directory.close()
+ self.pkg.close()