aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael G. Martins <rafael@rafaelmartins.eng.br>2010-06-18 22:01:27 -0300
committerRafael G. Martins <rafael@rafaelmartins.eng.br>2010-06-18 22:01:27 -0300
commit06790dd953b2abdcaf3e2cc83dd931dc8ef9f8bb (patch)
treecf0dfcd847664ca986997f2d3cf02e1db6d138e0 /g_octave
parentinitial import of stuff to deal with the SVN repo. Don't use it yethg diff (diff)
downloadg-octave-06790dd953b2abdcaf3e2cc83dd931dc8ef9f8bb.tar.gz
g-octave-06790dd953b2abdcaf3e2cc83dd931dc8ef9f8bb.tar.bz2
g-octave-06790dd953b2abdcaf3e2cc83dd931dc8ef9f8bb.zip
more work in the SVN stuff. not works properly yet
Diffstat (limited to 'g_octave')
-rw-r--r--g_octave/svn/client.py39
-rw-r--r--g_octave/svn/revisions.py22
-rw-r--r--g_octave/svn/utils.py22
3 files changed, 64 insertions, 19 deletions
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