Statistics
| Revision:

svn-gvsig-desktop / tags / v2_0_0_Build_2031 / build / projects / gvsig-standard / gvsig-standard-installer / src / main / packaging / gvspkg @ 36053

History | View | Annotate | Download (9.06 KB)

1
#!/usr/bin/python
2

    
3
import sys
4
import os
5
import os.path
6
import fnmatch
7
import shutil
8
import zipfile 
9
import stat
10
import getopt
11
from os.path import dirname
12

    
13
RWALL = stat.S_IWOTH | stat.S_IROTH | stat.S_IWUSR | stat.S_IRUSR | stat.S_IWGRP | stat.S_IRGRP 
14

    
15
VERBOSE = False
16
VERSION = os.path.basename(os.getcwd())
17
GVSPKG_ROOT = os.path.abspath("../..")
18
GVSPKG_ROOT = "/home/groups/gvsig-desktop/www/gvSIG-desktop"
19

    
20
def getVersion():
21
    return VERSION
22

    
23
def getPackagesRoot():
24
    return GVSPKG_ROOT
25

    
26
def getPool():
27
    return getPackagesRoot() + "/pool"
28

    
29
def getDist():
30
    return getPackagesRoot() + "/dists/" +getVersion()
31

    
32
def message(msg):
33
    if VERBOSE:
34
        print msg
35

    
36
def msgerror(msg):
37
    print msg
38

    
39
def findfiles(root,filename):
40
    result=list()
41
    for wroot, dirs, files in os.walk(root):
42
        for f in files :
43
            if fnmatch.fnmatch(f,filename):
44
                result.append(wroot+"/"+f)
45
    result.sort()
46
    return result
47

    
48
class IndexList(list):
49

    
50
    def load(self, fname):
51
        message( "Loading index list from '%s'." % fname)
52
        f=file(fname,"r")
53
        lines=f.readlines()
54
        f.close()
55
        for line in lines:
56
          if line[-1] == "\n":
57
            line = line[:-1]
58
          self.append(line)
59

    
60
    def save(self,fname):
61
        message( "Saving index list from '%s'." % fname)
62
        f=file(fname,"w")
63
        for index in self:
64
          f.write("%s\n" % index)
65
        f.close()
66
        try:
67
            os.chmod(fname,RWALL)
68
        except Exception, ex:
69
            msgerror("Can't change permissions of file '%s', error %s" % (fname, str(ex)))
70

    
71
    def build(self, pool, version):
72
        message( "Creating index list for version '%s' from '%s'" % (version, pool) )
73
        packages=dict()
74
        for root, dirs, files in os.walk(pool):
75
            for f in files :
76
                if fnmatch.fnmatch(f,"gvSIG-desktop-"+version+"-*.gvspki"):
77
                    fullpath = root+"/"+f
78
                    if packages.get(dirname(fullpath)) == None:
79
                        packages[dirname(fullpath)]=fullpath
80
                    else:
81
                        s = packages[dirname(fullpath)]
82
                        if s<fullpath :
83
                            packages[dirname(fullpath)]=fullpath
84
        self.extend(packages.values())
85
        self.sort()
86

    
87
def lsi(args):
88
    try:
89
        opts, args = getopt.getopt(args[1:], "l", ["long-format"])
90
    except getopt.GetoptError, err:
91
        # print help information and exit:
92
        print str(err) # will print something like "option -a not recognized"
93
        help(args)
94
        sys.exit(2)
95

    
96
    long_format=False
97
    for opt, arg in opts:
98
        if opt in ("-l", "--long-format"):
99
            long_format = True
100
        else:
101
            assert False, "unhandled option"
102

    
103
    indexes = IndexList()
104
    indexes.build(getPool(), getVersion())
105

    
106
    for index in indexes:
107
        pkg_name = os.path.basename(index)
108
        print pkg_name
109
        if long_format:
110
            show(["show", pkg_name])
111

    
112
def mks(args):
113
    try:
114
        opts, args = getopt.getopt(args[1:], "c", ["clear-list"])
115
    except getopt.GetoptError, err:
116
        # print help information and exit:
117
        print str(err) # will print something like "option -a not recognized"
118
        help(args)
119
        sys.exit(2)
120

    
121
    clear_list=False
122
    for opt, arg in opts:
123
        if opt in ("-c", "--clear-list"):
124
            clear_list = True
125
        else:
126
            assert False, "unhandled option"
127

    
128
    indexes = IndexList()
129

    
130
    packages_txt = getDist() +"/packages.txt"
131
    packages_gvspki = getDist() +"/packages.gvspki"
132
    packages_gvspks = getDist() +"/packages.gvspks"
133

    
134
    message( "Creating 'packages.gvspki' for version '%s'" % getVersion() )
135
    if not os.path.exists(getDist()):
136
        msgerror("Can't locate version folder '%s'." % getVersion())
137
        sys.exit(3)
138
   
139
    if os.path.exists(packages_txt) and not clear_list:
140
        indexes.load(packages_txt)
141
    else:
142
        indexes.build(getPool(), getVersion())
143
        indexes.save(packages_txt)
144

    
145
    message( "Writing 'packages.gvspki' to '%s'" % packages_gvspki )
146
    set = zipfile.ZipFile(packages_gvspki,"w",zipfile.ZIP_STORED)
147
    for index in indexes:
148
        try:
149
            set.write(index, os.path.basename(index))
150
        except Exception, ex:
151
            msgerror("Can't add index '%s', error %s" % (index, str(ex)))
152
    set.close()
153
    try:
154
        os.chmod(packages_gvspki,RWALL)
155
    except Exception, ex:
156
        msgerror("Can't change permissions of file '%s', error %s" % (packages_gvspki, str(ex)))
157

    
158
    message( "Writing 'packages.gvspks' to '%s'" % packages_gvspks )
159
    set = zipfile.ZipFile(packages_gvspks,"w",zipfile.ZIP_STORED)
160
    for index in indexes:
161
        index = index.replace(".gvspki",".gvspkg")
162
        try:
163
            set.write(index, os.path.basename(index))
164
        except Exception, ex:
165
            msgerror("Can't add package '%s', error %s" % (index, str(ex)))
166
    set.close()
167
    try:
168
        os.chmod(packages_gvspks,RWALL)
169
    except Exception, ex:
170
        msgerror("Can't change permissions of file '%s', error %s" % (packages_gvspks, str(ex)))
171
    message( "Created")
172

    
173
def show(args):
174
    index_name=args[1]
175
    message( "Show package.info from '%s'" % index_name)
176
    files = findfiles(getPool(), index_name)
177
    if len(files) != 1:
178
        msgerror("Can't locate package '%s' in pool '%s'." % (index_name, getPool()))
179
        return
180
    index_path = files[0]
181
    outputfolder="/tmp/gvspkg.%s" % os.getpid()
182
    os.mkdir(outputfolder)
183
    os.system('unzip -q %s -d %s' % (index_path,outputfolder))
184

    
185
    files = findfiles(outputfolder, "package.info")
186
    if len(files) != 1:
187
        msgerror("Can't locate package.info in pool '%s'." % (index_name))
188
        return
189

    
190
    package_info = files[0]
191
    f = file(package_info,"r")
192
    s = f.read()
193
    f.close()
194
    shutil.rmtree(outputfolder)
195
    print s
196

    
197
def edit(args):
198
    index_name=args[1]
199
    message( "Show package.info from '%s'" % index_name)
200
    files = findfiles(getPool(), index_name)
201
    if len(files) != 1:
202
        msgerror("Can't locate package '%s' in pool '%s'." % (index_name, getPool()))
203
        return
204
    index_path = files[0]
205
    outputfolder="/tmp/gvspkg.%s" % os.getpid()
206
    os.mkdir(outputfolder)
207
    os.system('unzip -q %s -d %s' % (index_path,outputfolder))
208

    
209
    files = findfiles(outputfolder, "package.info")
210
    if len(files) != 1:
211
        msgerror("Can't locate package.info in pool '%s'." % (index_name))
212
        return
213

    
214
    package_info = files[0]
215
    code = package_info.split("/")[-2]
216
    os.system('vi "%s"' % package_info)
217
    temp_index_name = "/tmp/packages.gvspki.%s" % os.getpid()
218
    temp_index = zipfile.ZipFile(temp_index_name,"w",zipfile.ZIP_STORED)
219
    temp_index.write(package_info, "%s/package.info" % (code))
220
    temp_index.close()
221
    shutil.rmtree(outputfolder)
222
    os.remove(index_path)
223
    shutil.move(temp_index_name,index_path)
224

    
225
def help(args):
226
    print """
227
usage: gvspkg [OPTIONS] COMMANDS
228

    
229
OPTIONS:
230

    
231
-h|--help
232
    Muestra esta ayuda
233

    
234
-v
235
    Activa el modo verbose
236

    
237
--version version
238
    Fija la version con la que van a trabajar los comandos indicados.
239

    
240
-p|--package-root package-root
241
    Fija la carpeta en la que va a buscar el raiz del sistema de paquetes
242
    con el que trabajar
243
    
244
COMMANDS:
245

    
246
lsi [OPTIONS]
247
    Lista los indices disponibles de la version
248

    
249
    OPTIONS:
250

    
251
    -l | --long-format
252
        Muestra para cada paquete la informacion del package.info
253

    
254
mks [OPTIONS]
255
     Crea el fichero packages.gvspki con los indices de la
256
     version.
257

    
258
     OPTIONS:
259

    
260
     -c | --clear-list
261
        Elimina la lista de paquetes a utilizar recreandola a partir
262
        de los paquetes del pool tomando el ultimo build de cada paquete.
263

    
264
show package-index
265
    Muestra el package.info del indice indicado como parametro.
266

    
267
edit package-index
268
    Edita el package.info del indice indicado como parametro.
269

    
270
Por defecto la version la obtiene del nombre de la carpeta 
271
corriente (%s).
272
El directorio root de la estructura de packetes lo buscara en el
273
sitio indicado por la variable de entorno GVPKG_ROOT, y si esta no
274
esta establecida usara "%s"
275
    """ % (VERSION, GVSPKG_ROOT)
276

    
277
def main():
278
    global VERSION
279
    global VERBOSE
280
    global GVSPKG_ROOT
281

    
282
    try:
283
        opts, args = getopt.getopt(sys.argv[1:], "hvr:", ["version=", "package-root=","help"])
284
    except getopt.GetoptError, err:
285
        # print help information and exit:
286
        print str(err) # will print something like "option -a not recognized"
287
        help(None)
288
        sys.exit(2)
289

    
290
    for opt, arg in opts:
291
        if opt in ("-h", "--help"):
292
            help(args)
293
            sys.exit()
294
        elif opt in ("-v"):
295
            VERBOSE = True
296
        elif opt in ("--version"):
297
            VERSION = arg
298
        elif opt in ("-r", "--package-root"):
299
            GVSPKG_ROOT = arg
300
        else:
301
            assert False, "unhandled option"
302
    # 
303
    message("VERSION=%s" % VERSION)
304
    message("GVSPKG_ROOT=%s" % GVSPKG_ROOT)
305

    
306
    command = "help"
307
    if len(args)>0:
308
        command=args[0]
309

    
310
    if command=="lsi" :
311
        lsi(args)
312
    elif command == "mks":
313
        mks(args)
314
    elif command == "edit":
315
        edit(args)
316
    elif command == "show":
317
        show(args)
318
    else:
319
        help(args)
320

    
321

    
322
main()
323