From c2aa4f81e38f0b81ea04648cd77463bd945b7c20 Mon Sep 17 00:00:00 2001 From: Mykyta Holubakha Date: Tue, 6 Jun 2017 02:23:12 +0300 Subject: Add repository and package abstractions --- pomu/package.py | 23 +++++++++++++++++++++++ pomu/repo/repo.py | 36 +++++++++++++++++++++++++++++++++++- pomu/util/string.py | 10 ++++++++++ 3 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 pomu/package.py create mode 100644 pomu/util/string.py 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 -- cgit v1.2.3-65-gdbad