From 06790dd953b2abdcaf3e2cc83dd931dc8ef9f8bb Mon Sep 17 00:00:00 2001 From: "Rafael G. Martins" Date: Fri, 18 Jun 2010 22:01:27 -0300 Subject: more work in the SVN stuff. not works properly yet --- g_octave/svn/client.py | 39 +++++++++++++++++++++++++++------------ g_octave/svn/revisions.py | 22 +++++++++++++++------- g_octave/svn/utils.py | 22 ++++++++++++++++++++++ 3 files changed, 64 insertions(+), 19 deletions(-) create mode 100644 g_octave/svn/utils.py (limited to 'g_octave') diff --git a/g_octave/svn/client.py b/g_octave/svn/client.py index 29f5e9a..31e689c 100644 --- a/g_octave/svn/client.py +++ b/g_octave/svn/client.py @@ -18,6 +18,9 @@ import subprocess import sys import urllib2 +import revisions + +from g_octave import config class SvnClient: @@ -25,13 +28,31 @@ class SvnClient: categories = ['main', 'extra', 'language', 'nonfree'] exclude = ['CONTENTS', 'INDEX', 'Makefile', 'base'] - def __init__(self, verbose=False): + def __init__(self, create_revisions=True, verbose=False): + conf = config.Config() + json_file = os.path.join(conf.db, 'revisions.json') self._verbose = verbose self._client = pysvn.Client() + self._revisions = revisions.Revisions(json_file) self.packages = {} + if create_revisions and not os.path.exists(json_file): + self.update_revisions() + else: + self.packages = self._revisions.get() + + def update_revisions(self): + updated = [] for category in self.categories: self.packages[category] = self._list_packages(category) - + for category in self.packages: + for package in self.packages[category]: + old_revision = self._revisions.get(category, package) + current_revision = self.packages[category][package] + if current_revision is None or current_revision > old_revision: + self._revisions.set(category, package, current_revision) + updated.append((category, package)) + return updated + def _list_packages(self, category): try: if self._verbose: @@ -42,18 +63,18 @@ class SvnClient: ) except pysvn.ClientError, err: print >> sys.stderr, 'Error: ' + str(err) - tmp_list = [] + tmp = {} for props, lock in pkg_list: filename = props.repos_path.split('/')[-1] if filename not in self.exclude and filename != category: - tmp_list.append(filename) - return tmp_list + tmp[filename] = props.created_rev.number + return tmp def create_description_tree(self, dest, categories=['main', 'extra', 'language']): for category in categories: if category not in self.categories: continue - for pkg in self.packages[category]: + for pkg, revision in self.packages[category]: current_dir = os.path.join(dest, category, pkg) os.makedirs(current_dir) try: @@ -66,7 +87,6 @@ class SvnClient: shutil.copyfileobj(fp, fp_) except urllib2.URLError: pass - def checkout_package(self, category, name, dest, stable=True): if stable: @@ -88,8 +108,3 @@ class SvnClient: except pysvn.ClientError, err: return False return True - - def create_tarball(self, category, name): - tmpdir = '/tmp/tmp-' + name - self.checkout_package(category, name, tmpdir) - shutil.copytree(tmpdir, '/tmp/'+name) diff --git a/g_octave/svn/revisions.py b/g_octave/svn/revisions.py index 4f5e98d..cc4e234 100644 --- a/g_octave/svn/revisions.py +++ b/g_octave/svn/revisions.py @@ -35,20 +35,28 @@ class Revisions(object): return False return True - def __getitem__(self, key): + def get(self, category=None, package=None): revisions = self._load_json() - if key in revisions: - return revisions[key] + if category is None: + return revisions + if category in revisions: + if package is None: + return revisions[category] + if package in revisions[category]: + return revisions[category][package] return None - def __setitem__(self, key, value): + def set(self, category, package, value): revisions = self._load_json() - revisions[key] = value + if category not in revisions: + revisions[category] = {} + revisions[category][package] = value if not self._dump_json(revisions): raise RuntimeError('Failed to save JSON file.') + if __name__ == '__main__': a = Revisions('/tmp/file.json') - a['fuuuu'] = 1234 - print a['fuuuu'] + a.set('main', 'fuuuu', 1234) + print a.get() diff --git a/g_octave/svn/utils.py b/g_octave/svn/utils.py new file mode 100644 index 0000000..a5881ee --- /dev/null +++ b/g_octave/svn/utils.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- + +""" + utils.py + ~~~~~~~~ + + This module implements some helper functions to work with SVN packages. + + :copyright: (c) 2010 by Rafael Goncalves Martins + :license: GPL-2, see LICENSE for more details. +""" + +import sys +import tarfile + +def create_tarball(src_dir, tarball_file, arcname): + try: + tar = tarfile.open(tarball_file, 'w:bz2') + tar.add(src_dir, arcname=arcname, recursive=True, exclude=lambda x: '.svn' in x) + tar.close() + except tarfile.TarError, err: + print >> sys.stderr, 'Failed to create the tarball: %s' % err -- cgit v1.2.3-65-gdbad