diff options
Diffstat (limited to 'pomu/source/file.py')
-rw-r--r-- | pomu/source/file.py | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/pomu/source/file.py b/pomu/source/file.py new file mode 100644 index 0000000..8b1a650 --- /dev/null +++ b/pomu/source/file.py @@ -0,0 +1,71 @@ +""" +A package source module to import packages from filesystem locations (ebuilds) +""" + +import os + +from os import path +from shutil import copy2 +from tempfile import mkdtemp + +from pomu.package import Package +from pomu.source import dispatcher +from pomu.source.portage import cpv_split, ver_str +from pomu.util.query import query +from pomu.util.result import Result + +class LocalEbuild(): + """A class to represent a local ebuild""" + __name__ = 'fs' + + # slots? + def __init__(self, category, name, version, path): + self.category = category + self.name = name + self.version = version + self.path = path + + def fetch(self): + root = mkdtemp() + pkgpath = path.join(root, self.category, self.name) + os.makedirs(pkgpath) + copy2(self.path, pkgpath) + return Package(self, self.name, root, self.category, self.version) + + @staticmethod + def from_data_file(path): + with open(path, 'r') as f: + return LocalEbuildSource.parse_ebuild_path(f.readline()).unwrap() + + def write_meta(self, pkgdir): + with open(path.join(pkgdir, 'FS_ORIG_PATH'), 'w') as f: + f.write(self.path + '\n') + + def __str__(self): + return '{}/{}-{} (from {})'.format(self.category, self.name, self.version, self.path) + +@dispatcher.source +class LocalEbuildSource(): + """The source module responsible for importing local ebuilds""" + @dispatcher.handler(priority=5) + def parse_ebuild_path(uri): + if not path.isfile(uri) or not path.endswith('.ebuild'): + return Result.Err() + uri = path.abspath(uri) + dirn, basen = path.split(uri) + basen = basen[:-7] + _, name, v1, v2, v3 = cpv_split(basen) + ver = ver_str(v1, v2, v3) + parent = dirn.split('/')[-1] + # we need to query the impure world + # TODO: write a global option which would set the impure values non-interactively + if not ver: + ver = query('version', 'Please specify package version for {}'.format(basen)).expect() + category = query('category', 'Please enter category for {}'.format(basen), parent).expect() + return Result.Ok(LocalEbuild(category, name, ver, uri)) + + @dispatcher.handler() + def parse_full(uri): + if not uri.startswith('fs:'): + return Result.Err() + return LocalEbuildSource.parse_ebuild_path(uri) |