aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'pomu/source/file.py')
-rw-r--r--pomu/source/file.py71
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)