aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMykyta Holubakha <hilobakho@gmail.com>2017-06-06 02:23:12 +0300
committerMykyta Holubakha <hilobakho@gmail.com>2017-06-06 02:23:12 +0300
commitc2aa4f81e38f0b81ea04648cd77463bd945b7c20 (patch)
tree1f093bb2a8d0b3d2d938066c9bdf424dea86dd3f
parentWe can't (diff)
downloadpomu-c2aa4f81e38f0b81ea04648cd77463bd945b7c20.tar.gz
pomu-c2aa4f81e38f0b81ea04648cd77463bd945b7c20.tar.bz2
pomu-c2aa4f81e38f0b81ea04648cd77463bd945b7c20.zip
Add repository and package abstractions
-rw-r--r--pomu/package.py23
-rw-r--r--pomu/repo/repo.py36
-rw-r--r--pomu/util/string.py10
3 files changed, 68 insertions, 1 deletions
diff --git a/pomu/package.py b/pomu/package.py
new file mode 100644
index 0000000..8f0c2c2
--- /dev/null
+++ b/pomu/package.py
@@ -0,0 +1,23 @@
+"""
+A package is a set of files, situated in a root directory.
+A package can be installed into a repository.
+A package is supposed to be created by a package source from a set of files.
+"""
+
+from os import path
+
+from portage.util.string import strip_prefix
+
+class Package():
+ def __init__(self, name, path):
+ self.name = name
+ self.root = path
+ self.read_files(files)
+
+ #todo: file sets
+ def read_files(self)
+ self.files = []
+ for wd, dirs, files in os.walk(path):
+ wd = strip_prefix(strip_prefix(wd, path), '/')
+ self.files.extend([(wd, f) for f in files])
+
diff --git a/pomu/repo/repo.py b/pomu/repo/repo.py
index 065c990..1e384cd 100644
--- a/pomu/repo/repo.py
+++ b/pomu/repo/repo.py
@@ -1,8 +1,42 @@
"""Subroutines with repositories"""
-from os import path
+from os import path, mkdirs, remove, rmdir
+from shutil import copy2
+from git import Repo
import portage
+class Repository():
+ def __init__(self, path):
+ if not pomu_status(path):
+ raise ValueError('This path is not a valid pomu repository')
+ self.root = root
+
+ repo = property()
+ @repo.getter
+ def repo(self):
+ return Repo(repo_path)
+
+ def merge(self, package):
+ r = self.repo
+ for wd, f in package.files:
+ dst = path.join(self.root, wd)
+ os.makedirs(dst)
+ copy2(path.join(package.root, wd, f), dst)
+ r.index.add(path.join(dst, f))
+ r.index.commit('Merged package ' + package.name)
+ return Result.Ok('Merged package ' + package.name ' successfully')
+
+ def unmerge(self, package):
+ r = self.repo
+ for wd, f in package.files:
+ dst = path.join(self.root, wd)
+ r.index.remove(path.join(package.root, wd, f)
+ try:
+ rmdir(dst)
+ except OSError: pass
+ self.repo.commit('Removed package ' + package.name + ' successfully')
+
+
def portage_repos():
"""Yield the repositories configured for portage"""
rsets = portage.db[portage.root]['vartree'].settings.repositories
diff --git a/pomu/util/string.py b/pomu/util/string.py
new file mode 100644
index 0000000..b7c2334
--- /dev/null
+++ b/pomu/util/string.py
@@ -0,0 +1,10 @@
+"""
+String utils
+"""
+
+def strip_prefix(string, prefix):
+ """Returns a string, stripped from its prefix"""
+ if string.startswith(prefix):
+ return string[len(prefix):]
+ else
+ return string