diff options
Diffstat (limited to 'utils/grumpy_sync.py')
-rwxr-xr-x | utils/grumpy_sync.py | 54 |
1 files changed, 37 insertions, 17 deletions
diff --git a/utils/grumpy_sync.py b/utils/grumpy_sync.py index 3de226f..b632580 100755 --- a/utils/grumpy_sync.py +++ b/utils/grumpy_sync.py @@ -20,7 +20,7 @@ from grumpy.database import session from grumpy.models import (Base, Category, Developer, Ebuild, Herd, \ Package, Setting) -def main(path): +def main(path, initial_sync): # pkgcore part to fetch all the ebuild information conf = load_config() eclass_cache = conf.eclass_cache['eclass stack'] @@ -28,6 +28,40 @@ def main(path): repo = repository.UnconfiguredTree(path, cache=cache, \ eclass_cache=eclass_cache) + def parse_moves(): + movedir = os.path.join(path, 'profiles', 'updates') + if not os.path.isdir(movedir): + print "Missing package moves directory: '%s'" % movedir + return {} + + # Sort update files according to date + get_key = lambda name: tuple(reversed(name.split('-'))) + + moves = {} + if initial_sync: + # We take the latest move file, and store its contents in db + update_file = sorted(os.listdir(movedir), key=get_key)[-1] + update_path = os.path.join(movedir, update_file) + for line in iter_read_bash(update_path): + line = line.split() + if line[0] == 'move': + moves[line[1]] = line[2] + # Fetch existing setting data from database... + updates = Setting.query.filter_by(name='updates_info').first() + if updates: + # ...and delete if it exists + session.delete(updates) + session.flush() + data = dict(moves=moves, mtime=int(os.stat(update_path).st_mtime)) + session.add(Setting('updates_info', data)) + session.commit() + # Initial sync does not need to deal with moves + return {} + # Not an initial sync... + raise NotImplementedError + + pkg_moves = parse_moves() + def extract_version(pkg, cpv): """...""" return cpv[len(pkg)+1:-7] @@ -152,20 +186,6 @@ def main(path): session.commit() - # Handle package moves - dir = os.path.join(path, 'profiles', 'updates') - moves = {} - if os.path.isdir(dir): - def get_key(fname): - return tuple(reversed(fname.split('-'))) - - for update_file in sorted(os.listdir(dir), key=get_key): - for line in iter_read_bash(os.path.join(dir, update_file)): - line = line.split() - if line[0] != 'move': - continue - moves[line[1]] = line[2] - # Compare list of categories in portage vs database cat_sql = [c.cat for c in Category.query.all()] cats = repo.categories.keys() @@ -187,7 +207,7 @@ def main(path): for pkg in [i for i in old if i not in new]: # Handle package move or deletion - if "%s/%s" % (cat, pkg) in moves.keys(): + if pkg_moves and "%s/%s" % (cat, pkg) in pkg_moves.keys(): print "DEBUG: package has been moved:", pkg raise NotImplementedError else: @@ -208,4 +228,4 @@ if __name__ == '__main__': if len(args) != 1: parser.error("please provide path to portagedir as first argument") sys.exit(1) - main(args[0]) + main(args[0], opts.initial) |