Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/setup_new_wiki.py
blob: b52c24ad15a1df0e34c76b51a8ab788de3ef4667 (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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#!/usr/bin/env python
#
# Copyright (C) 2011, One Laptop Per Child
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
#
import sys
import os
import shutil
import zipfile
from fnmatch import fnmatch
from sugar.activity import bundlebuilder

INCLUDE_DIRS = ['activity', 'binarylibs', 'icons', 'locale', 'bin',
                'mwlib', 'po', 'seek-bzip2', 'static', 'tools2']
IGNORE_FILES = ['.gitignore', 'MANIFEST', '*.pyc', '*~', '*.bak', 'pseudo.po']


class WikiXOPackager(bundlebuilder.XOPackager):

    def __init__(self, builder, data_file):
        bundlebuilder.XOPackager.__init__(self, builder)
        self.data_file = data_file

    def package(self):
        bundle_zip = zipfile.ZipFile(self.package_path, 'w',
                                     zipfile.ZIP_DEFLATED)

        for f in self.list_files(self.config.source_dir, True):
            if os.path.exists(os.path.join(self.config.source_dir, f)):
                bundle_zip.write(os.path.join(self.config.source_dir, f),
                                 os.path.join(self.config.bundle_root_dir, f))

        if self.data_file is not None:
            # Add the data files
            needed_sufix = ['.processed.bz2', '.processed.bz2t']
            for sufix in needed_sufix:
                data_file = self.data_file + sufix
                print "Add %s" % data_file
                bundle_zip.write(data_file,
                                 os.path.join(self.config.bundle_root_dir,
                                              data_file))

            data_path = os.path.dirname(self.data_file)

            index_file = os.path.join(data_path, 'search.db')
            print "Add %s" % index_file
            bundle_zip.write(index_file,
                         os.path.join(self.config.bundle_root_dir, index_file))

            # add images
            images_path = os.path.join(data_path, 'images')
            if os.path.exists(images_path):
                print "Adding images"
                for f in self.list_files(images_path):
                    bundle_zip.write(os.path.join(images_path, f),
                        os.path.join(self.config.bundle_root_dir,
                            images_path, f))

        bundle_zip.close()

    def list_files(self, base_dir, filter_directories=False):
        if filter_directories:
            include_dirs = INCLUDE_DIRS
        else:
            include_dirs = None

        ignore_files = IGNORE_FILES
        result = []

        base_dir = os.path.abspath(base_dir)

        for root, dirs, files in os.walk(base_dir):

            if ignore_files:
                for pattern in ignore_files:
                    files = [f for f in files if not fnmatch(f, pattern)]

            rel_path = root[len(base_dir) + 1:]
            for f in files:
                result.append(os.path.join(rel_path, f))

            if root == base_dir:
                n = 0
                while n < len(dirs):
                    directory = dirs[n]
                    if include_dirs is not None and \
                        not directory in include_dirs:
                        print "** Ignoring directory", directory
                        dirs.remove(directory)
                    else:
                        n = n + 1
        return result


if __name__ == '__main__':

    if len(sys.argv) < 2:
        data_file = None
        lang = 'base'
    else:
        data_file = sys.argv[1]

        lang = data_file[:data_file.find('/')]

    print "Lang:", lang
    # copy activty/activity.info.lang as activty/activity.info
    f = 'activity/activity.info.' + lang
    if os.path.exists(f):
        shutil.copyfile(f, 'activity/activity.info')

    config = bundlebuilder.Config()
    packager = WikiXOPackager(bundlebuilder.Builder(config), data_file)
    packager.package()