From 9d06b341952ff641d4e82734c3df302e464f4ce5 Mon Sep 17 00:00:00 2001 From: "Yaakov M. Nemoy" Date: Tue, 3 Feb 2009 18:54:48 +0100 Subject: Refactors HaskellPort and Port to be more generic --- modules/darcs.py | 4 +- modules/hackage.py | 2 +- modules/haskellport.py | 88 ++----------------------------------------- modules/port.py | 100 ++++++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 105 insertions(+), 89 deletions(-) diff --git a/modules/darcs.py b/modules/darcs.py index 68bea98..4d2038f 100644 --- a/modules/darcs.py +++ b/modules/darcs.py @@ -51,7 +51,7 @@ class Darcs(RevisionControl): with pwd(self.branches_dir): self.get(self.dir, 'orig') self.set_current_src() - + def get(self, src, tgt, *args): '''sets up a branch given arguments, taken from a source with a target @@ -112,7 +112,7 @@ class Darcs(RevisionControl): if len(args) >= 2 and args[0] == 'new': branch_name = args[1] args = args[2:] - else: + else: branch_name = '' if len(args) == 1 and args[0] == 'head': log.debug('doing head') diff --git a/modules/hackage.py b/modules/hackage.py index a38ccab..861f55e 100644 --- a/modules/hackage.py +++ b/modules/hackage.py @@ -42,5 +42,5 @@ class Hackage(Fetcher): return 'http://hackage.haskell.org/packages/archive/' + \ pkg + '/' + ver + '/' + pkg + '-' + ver + '.tar.gz' - def darcs_url(self, pkg): + def vcs_url(self, pkg): return 'http://darcs.haskell.org/' + pkg diff --git a/modules/haskellport.py b/modules/haskellport.py index 3ca6555..1121dab 100644 --- a/modules/haskellport.py +++ b/modules/haskellport.py @@ -30,38 +30,11 @@ from modules.port import Port from modules.sourceball import SourceBall class HaskellPort(Port): - def __init__(self, package=None): - super(HaskellPort, self).__init__() - 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 = SourceBall('', sourceball) - pkg_src.set_buildsystem('cabal') - name = pkg_src.name - self.pkg.add_source(name) - return self.close_later(pkg_src) + sourceball = SourceBall + revision_control = Darcs + builder = Cabal + fetcher = Hackage - def add_darcs(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 = Darcs(tgt, url, *args) - pkg_src.set_buildsystem('cabal') - name = pkg_src.name - self.pkg.add_source(name) - return self.close_later(pkg_src) - def install_tag(self, tag): '''assuming a package that supports tagging, install a specific tag @@ -71,56 +44,3 @@ class HaskellPort(Port): with self.package.tag(tag): self.install() - def install_sourceball(self, tarball, target='home', *args): - '''given a tarball, copy it in and install it - ''' - pkg_src = self.add_sourceball(tarball) - Cabal(pkg_src).install_source(target, *args) - - def add_from_hackage(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.hackage.url(pkg, ver) - sb = self.add_sourceball(sb_loc) - sb.cfg['hackage_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.hackage.latest_version(pkg) - return self.add_from_hackage(pkg, ver) - - def install_from_hackage(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.hackage.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.hackage.darcs_url(pkg), tgt, *args) - - def install_upstream(self, pkg, tgt=None, target='home', *args): - pkg_src = self.add_upstream(pkg, tgt, *args) - Cabal(pkg_src).install_source(target) - - - def close(self): - super(HaskellPort, self).close() - self.pkg.close() 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() -- cgit