aboutsummaryrefslogtreecommitdiff
blob: 29f5e9a37eea38d507b6388871a928a4e143de55 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# -*- coding: utf-8 -*-

"""
    client.py
    ~~~~~~~~~

    This module implements a interface between g-octave and the octave-forge
    Subversion repository.

    :copyright: (c) 2010 by Rafael Goncalves Martins
    :license: GPL-2, see LICENSE for more details.
"""

import os
import pysvn
import shutil
import subprocess
import sys
import urllib2


class SvnClient:
    
    url = 'https://octave.svn.sourceforge.net/svnroot/octave/trunk/octave-forge/'
    categories = ['main', 'extra', 'language', 'nonfree']
    exclude = ['CONTENTS', 'INDEX', 'Makefile', 'base']
    
    def __init__(self, verbose=False):
        self._verbose = verbose
        self._client = pysvn.Client()
        self.packages = {}
        for category in self.categories:
            self.packages[category] = self._list_packages(category)
    
    def _list_packages(self, category):
        try:
            if self._verbose:
                print 'Listing packages from: ' + category
            pkg_list = self._client.list(
                self.url + '/' + category + '/',
                depth = pysvn.depth.immediates
            )
        except pysvn.ClientError, err:
            print >> sys.stderr, 'Error: ' + str(err)
        tmp_list = []
        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

    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]:
                current_dir = os.path.join(dest, category, pkg)
                os.makedirs(current_dir)
                try:
                    if self._verbose:
                        print 'Fetching DESCRIPTION from: %s/%s' % (category, pkg)
                    fp = urllib2.urlopen(
                        self.url + '/' + category + '/' + pkg + '/DESCRIPTION'
                    )
                    with open(os.path.join(current_dir, 'DESCRIPTION'), 'w') as fp_:
                        shutil.copyfileobj(fp, fp_)
                except urllib2.URLError:
                    pass
            

    def checkout_package(self, category, name, dest, stable=True):
        if stable:
            # get DESCRIPTION revision
            try:
                info = self._client.info2(
                    self.url + '/' + category + '/' + name + '/DESCRIPTION'
                )
            except pysvn.ClientError, err:
                return False
            revision = info[0][1].last_changed_rev
        try:
            self._client.checkout(
                self.url + '/' + category + '/' + name + '/',
                dest,
                revision = stable and revision or \
                    pysvn.Revision(pysvn.opt_revision_kind.head)
            )
        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)