Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.installer / src / main / packaging / gvspkg @ 42725

History | View | Annotate | Download (63 KB)

1
#!/usr/bin/python
2
# -*- coding: utf-8 -*-
3
#
4
import sys
5
import os
6
import os.path
7
import fnmatch
8
import shutil
9
import zipfile
10
import stat
11
import getopt
12
from os.path import dirname
13
import shutil
14
from os import system
15
import ConfigParser
16
import StringIO
17
import re
18
import urllib2
19
import time
20

    
21
DEBUG = False
22
DEBUG = False
23
VERBOSE = False
24
SEARCH_VERSIONS = list()
25

    
26
#LINUX_EXEC_EXTENSION=".run" # antes ".bin"
27

    
28
def log(msg):
29
  f=open("/tmp/gvspkg.log","a")
30
  f.write(time.ctime())
31
  f.write(": ")
32
  f.write(msg)
33
  f.write("\n")
34
  f.close()
35

    
36
def message(msg):
37
    if VERBOSE:
38
        print msg
39
        sys.stdout.flush()
40
    log(msg)
41

    
42
def msgerror(msg, err=None):
43
    print "ERROR: ", msg
44
    log("ERROR: "+msg)
45
    if err!=None :
46
      print "ERROR: ", str(err)
47
      sys.stdout.flush()
48
      log("ERROR: "+ str(err))
49

    
50

    
51
def msgwarn(msg):
52
    print "WARNING: ", msg
53
    sys.stdout.flush()
54
    log("WARNING: "+ msg)
55

    
56
def debug(msg):
57
    if DEBUG:
58
        print "DEBUG: ", msg
59
        sys.stdout.flush()
60
        log("DEBUG: "+ msg)
61

    
62
def acquire_file(name):
63
  files = list()
64
  folder = os.getcwd()
65
  while folder not in ( None, "", "/"):
66
    pathname = os.path.join(folder,name)
67
    if os.path.exists(pathname):
68
      files.append(pathname)
69
    folder = os.path.dirname(folder)
70
  return files
71

    
72
def get_gvspkg_bin_folder():
73
    files = list()
74
    if os.environ.get("HOME") != None :
75
        files.append(os.path.join(os.environ['HOME'],".gvspkg.bin"))
76
    files.extend( acquire_file(".gvspkg.bin") )
77
    files.extend( acquire_file("gvspkg.bin") )
78
    if len(files)<1 :
79
      return None
80
    debug( "gvspkg.bin = %s" % files[-1])
81
    return files[-1]
82

    
83
def search_GVSPKG_ROOT():
84
  f = get_gvspkg_bin_folder()
85
  if f==None:
86
    return None
87
  return os.path.dirname(f)
88

    
89
RWALL = stat.S_IWOTH | stat.S_IROTH | stat.S_IWUSR | stat.S_IRUSR | stat.S_IWGRP | stat.S_IRGRP
90
RWXALL = RWALL | stat.S_IXUSR | stat.S_IXOTH | stat.S_IXGRP
91

    
92
VERSION = os.path.basename(os.getcwd())
93
GVSPKG_ROOT = search_GVSPKG_ROOT()
94

    
95
def getVersion():
96
    return VERSION
97

    
98
def getSearchVersions():
99
    vers = list();
100
    vers.extend(SEARCH_VERSIONS)
101
    vers.append(VERSION)
102
    return vers
103

    
104
def getPackagesRoot():
105
    return GVSPKG_ROOT
106

    
107
def getPool():
108
    return getPackagesRoot() + "/pool"
109

    
110
def getWeb():
111
    return getPackagesRoot() + "/web"
112

    
113
def getDist():
114
    return getPackagesRoot() + "/dists/" +getVersion()
115

    
116
def findfiles(root,filename):
117
    result=list()
118
    for wroot, dirs, files in os.walk(root):
119
        for f in files :
120
            if fnmatch.fnmatch(f,filename):
121
                result.append(wroot+"/"+f)
122
    result.sort()
123
    return result
124

    
125
def mychmod(filename, perms):
126
    try:
127
        os.chmod(filename,perms)
128
    except Exception, ex:
129
        msgwarn("Can't change permissions of file '%s', error %s" % (filename, str(ex)))
130

    
131
def makedirs(path):
132
    if not os.path.isdir(path) :
133
      os.makedirs(path)
134

    
135
class Command:
136

    
137
    def __init__(self, args):
138
        self.args = args
139
        self.defaultoptions = None
140

    
141
    def load_options(self,filename):
142
        debug("loading option from %s" % filename)
143
        if not os.path.isfile(filename):
144
            debug("filename %s not found" % filename)
145
            return
146
        f=file(filename,"r")
147
        for line in f.readlines():
148
            line = line.strip()
149
            if line=="" or line.startswith("#"):
150
                continue
151
            if line[-1] == "\n":
152
                line = line[:-1]
153
            n = line.find("=")
154
            if n<0 :
155
                continue
156
            cmd = line[:n]
157
            args = line[n+1:].strip()
158

    
159
            if args != "":
160
              self.defaultoptions[cmd] = self.defaultoptions.get(cmd,[]) +  args.split(" ")
161
            debug("add options: %s=%r" % (cmd, args.split(" ")))
162

    
163
        f.close()
164

    
165
    def load_default_options(self):
166
        if self.defaultoptions != None:
167
            return
168
        self.defaultoptions = dict()
169
        options = list();
170
        if GVSPKG_ROOT != None:
171
          rootoptions = os.path.join(GVSPKG_ROOT,"gvspkg.bin/options")
172
        else:
173
          rootoptions = None
174
        if rootoptions != None and os.path.isfile(rootoptions):
175
            options.append(rootoptions)
176
        else:
177
            options.append("~/.gvspkg.bin/options")
178
        options.extend(acquire_file(".gvspkg.options"))
179
        options.extend(acquire_file("gvspkg.options"))
180
        for optionfile in options:
181
          self.load_options(optionfile)
182

    
183
    def getArgs(self,name):
184
        self.load_default_options()
185
        l = list()
186
        cmd = self.defaultoptions.get(name,None)
187
        if cmd != None:
188
          l.extend(cmd)
189
        l.extend(self.args[1:])
190
        return l
191

    
192
def isDigit(s):
193
    if len(s)>1:
194
        s=s[0]
195
    return s in ("0","1","2","3","4","5","6","7","8","9")
196

    
197

    
198

    
199
class PackageInfo(str):
200
    def __init__(self, filename):
201
        self._ini = None
202
        self.filename = filename[:-7]
203
        self.type = filename[-6:]
204
        s = os.path.basename(self.filename)
205
        s = s.split("-")
206
        #print "## PackageInfo ", repr(s)
207
        self.gvsig = s[0] + "-" + s[1]
208
        self.gvsig_version = s[2]
209
        self.code = s[3]
210
        try:
211
  # gvSIG-desktop-1.12.0-com.iver.cit.gvsig.cad-1.12.0-opencadtools-1418-final-all-all-j1_6.gvspkg
212
  #    0 -  1    -  2   -          3           -  4   - 5          -  6 - 7   - 8 - 9 - 10
213
  # gvSIG-desktop-1.12.0-com.iver.cit.gvsig.cad-1.12.0-1418-final-all-all-j1_6.gvspkg
214
  #    0 -  1    -  2   -          3           -  4   - 5  -  6  - 7 - 8 - 9
215

    
216
            if isDigit(s[5]) :
217
                self.version = s[4]
218
                self.build = s[5]
219
                self.status = s[6]
220
                self.os = s[7]
221
                self.arch = s[8]
222
            else:
223
                self.version = s[4] + "-" + s[5]
224
                self.build = s[6]
225
                self.status = s[7]
226
                self.os = s[8]
227
                self.arch = s[9]
228

    
229
        except Exception:
230
            self.build = "0"
231
            self.status = "unknow"
232
            self.os = "all"
233
            self.arch = "all"
234
        try:
235
            self.build = int(self.build)
236
        except:
237
            pass
238

    
239
    def getCode(self):
240
        return self.code
241

    
242
    def getOS(self):
243
        return self.os
244

    
245
    def getArch(self):
246
        return self.arch
247

    
248
    def getKey(self):
249
        return self.code+"-"+self.os+"-"+self.arch
250

    
251
    def getFullName(self):
252
        return os.path.basename(self.filename)
253

    
254
    def getFullVersion(self):
255
        try:
256
          r = re.compile("([0-9]+)[.]([0-9]+)[.]([0-9]+)-([a-zA-Z0-0]+)$")
257
          m = r.match(self.version)
258
          if m == None:
259
            clasificador="ZZZZZZZZ"
260
            r = re.compile("([0-9]+)[.]([0-9]+)[.]([0-9]+)$")
261
            m = r.match(self.version)
262
          else:
263
            clasificador=m.group(4)
264
          v1=int(m.group(1))
265
          v2=int(m.group(2))
266
          v3=int(m.group(3))
267
          return "%06d.%06d.%06d-%s-%06d" % (v1,v2,v3,clasificador,self.build)
268
        except:
269
          if "-" in self.version :
270
            return "%s-%06d" %(self.version,self.build)
271
          else:
272
            return "%s-ZZZZZZZZ-%06d" %(self.version,self.build)
273

    
274
    def getFilename(self):
275
        return self.filename + "." + self.type
276

    
277
    def hasPki(self):
278
        return os.path.isfile( self.getPkiFilename() )
279

    
280
    def getPkiFilename(self):
281
        return self.filename + ".gvspki"
282

    
283
    def hasPkg(self):
284
        return os.path.isfile( self.getPkgFilename() )
285

    
286
    def getPkgFilename(self):
287
        return self.filename + ".gvspkg"
288

    
289
    def getIniOption(self, name, default=None):
290
      section = "general"
291
      ini = self.getIni()
292
      if ini.has_option(section, name):
293
        x = ini.get(section, name)
294
        x = x.replace("\\:", ":")
295
        return x
296
      return default
297
    
298
    def getDescription(self):
299
      return self.getIniOption("description")
300

    
301
    def getCategories(self):
302
      return self.getIniOption("categories")
303

    
304
    def getName(self):
305
      return self.getIniOption("name")
306

    
307
    def getOwner(self):
308
      ini = self.getIni()
309
      if ini.has_option("general","owner"):
310
        return ini.get("general","owner")
311
      return None
312

    
313
    def getUrl(self):
314
      ini = self.getIni()
315
      if ini.has_option("general","download-url"):
316
        return ini.get("general","download-url")
317
      return None
318

    
319
    def getSourceUrl(self):
320
      ini = self.getIni()
321
      if ini.has_option("general","source-url"):
322
        return ini.get("general","source-url")
323
      return None
324

    
325
    def getDependencies(self):
326
      ini = self.getIni()
327
      if ini.has_option("general","dependencies"):
328
        return ini.get("general","dependencies")
329
      return None
330

    
331
    def getType(self):
332
      ini = self.getIni()
333
      if ini.has_option("general","type"):
334
        return ini.get("general","type")
335
      return None
336

    
337
    def getOfficial(self):
338
      ini = self.getIni()
339
      if ini.has_option("general","official"):
340
        return ini.get("general","official")
341
      return None
342

    
343
    def getIni(self):
344
        if self._ini != None:
345
          return self._ini
346
        index_path = self.getPkiFilename()
347
        outputfolder="/tmp/gvspkg.%s" % os.getpid()
348
        os.mkdir(outputfolder)
349
        os.system('unzip -q %s -d %s' % (index_path,outputfolder))
350

    
351
        files = findfiles(outputfolder, "package.info")
352
        if len(files) != 1:
353
            msgerror("Can't locate package.info in pool '%s'." % (index_path))
354
            return None
355

    
356
        package_info = files[0]
357
        self._ini = ConfigParser.ConfigParser()
358
        f = file(package_info,"r")
359
        ss = f.read()
360
        self._ini.readfp(StringIO.StringIO("[general]\n"+ss))
361
        f.close()
362
        shutil.rmtree(outputfolder)
363
        return self._ini
364

    
365
    def __str__(self):
366
        return self.filename
367

    
368
    def __repr__(self):
369
        return "filename=%r:gvsig=%r:gvsig_version=%r:code=%r:version=%r:build=%r:status=%r" % (
370
                self.filename, self.gvsig, self.gvsig_version, self.code, self.version, self.build, self.status )
371

    
372
class IndexList(list):
373

    
374
    def load(self, fname):
375
        message( "Loading index list from '%s'." % fname)
376
        f=file(fname,"r")
377
        lines=f.readlines()
378
        f.close()
379
        for line in lines:
380
          if line[-1] == "\n":
381
            line = line[:-1]
382
          
383
          info = PackageInfo(line)
384
          self.append(info)
385

    
386
    def save(self,fname):
387
        message( "Saving index list from '%s'." % fname)
388
        f=file(fname,"w")
389
        for index in self:
390
          f.write("%s\n" % index.getFilename())
391
        f.close()
392
        mychmod(fname,RWALL)
393

    
394
    def build(self, pool, versions):
395
        message( "Creating index list for version '%s' from '%s'" % (versions, pool) )
396
        packages=dict()
397
        for root, dirs, files in os.walk(pool):
398
            for f in files :
399
                if f[-7:].lower()  in (".gvspki", ".gvspkg") :
400
                    fullpath = root+"/"+f
401
                    info = PackageInfo(fullpath)
402
                    if info.gvsig == "gvSIG-desktop" and info.gvsig_version in versions :
403
                        if packages.get(info.getKey()) == None:
404
                            debug( "build: add    " + repr(info))
405
                            packages[info.getKey()]=info
406
                        else:
407
                            oldinfo = packages[info.getKey()]
408
                            debug("build: %s %s %s" % ( info.getKey(), oldinfo.getFullVersion(),info.getFullVersion()))
409
                            if oldinfo.getFullVersion()<info.getFullVersion()  :
410
                                debug( "build: update "+ repr(oldinfo))
411
                                packages[info.getKey()]=info
412
                    else:
413
                        debug( "build: skip   "+ repr(info))
414
        self.extend(packages.values())
415
        self.sort()
416

    
417
def lsi(args):
418
    cmd = Command(args)
419
    try:
420
        opts, args = getopt.getopt(cmd.getArgs("lsi"), "l", ["long-format"])
421
    except getopt.GetoptError, err:
422
        # print help information and exit:
423
        print str(err) # will print something like "option -a not recognized"
424
        shorthelp(args)
425
        sys.exit(2)
426

    
427
    long_format=False
428
    for opt, arg in opts:
429
        if opt in ("-l", "--long-format"):
430
            long_format = True
431
        else:
432
            assert False, "unhandled option"
433

    
434
    indexes = IndexList()
435
    indexes.build(getPool(), getSearchVersions())
436

    
437
    for info in indexes:
438
        if info.hasPki():
439
            if long_format:
440
                print "["+os.path.basename(info.getPkiFilename())+"]"
441
                print "# ", info.getPkiFilename()
442
                show(["show", os.path.basename(info.getPkiFilename())])
443
            else:
444
                print info.getPkiFilename()
445

    
446

    
447
def installer_add(cmd,arg1,arg2):
448
    installer_add_use_zip(cmd,arg1,arg2)
449
    
450
def installer_add_use_zip(cmd,arg1,arg2):
451
    if cmd == "addjrelin":
452
      return
453
    
454
    if cmd == "addjrewin":
455
      return
456
    
457
    if cmd == "addpks":
458
       zip = zipfile.ZipFile(arg1,"a",zipfile.ZIP_STORED)
459
       zip.write(arg2,"package.gvspks")
460
       zip.close()
461
    
462
def installer_add_use_installkit(cmd,arg1,arg2):
463
    folder = "%s/gvspkg.bin" % GVSPKG_ROOT
464

    
465
    cmd = "%s/installkit %s/main.tcl %s %s %s" % (
466
        "/mnt/data0/public-files/gvsig-desktop/gvspkg.bin",
467
        folder,
468
        cmd,
469
        arg1,
470
        arg2
471
    )
472
    system(cmd)
473

    
474
def mkinstall(args):
475
    cmd = Command(args)
476
    try:
477
        opts, args = getopt.getopt(cmd.getArgs("mkinstall"), "N:lL:wW:", ["addjrewin", "addjrelin", "jrelin=", "jrewin=", "distribution-name="])
478
    except getopt.GetoptError, err:
479
        # print help information and exit:
480
        print str(err) # will print something like "option -a not recognized"
481
        shorthelp(args)
482
        sys.exit(2)
483

    
484
    #print "opts = ",opts
485
    #print "args = ",args
486
    addjrelin=False
487
    addjrewin=False
488
    jrelin=None
489
    jrewin=None
490
    distribution_name = "custom"
491
    for opt, arg in opts:
492
        if opt in ("-L", "--jrelin"):
493
            jrelin = arg
494
        elif opt in ("-W", "--jrewin"):
495
            jrewin = arg
496
        elif opt in ("-l", "--addjrelin"):
497
            addjrelin = True
498
        elif opt in ("-w", "--addjrewin"):
499
            addjrewin = True
500
        elif opt in ("-N", "--distrinution-name"):
501
            distribution_name = arg
502
        else:
503
            assert False, "unhandled option"
504
    
505

    
506
    if len(args) != 2 :
507
        shorthelp(args)
508
        sys.exit(4)
509

    
510
    bin_name = args[0]
511
    gvspks_name = args[1]
512
    custom_name = bin_name.replace("online", distribution_name)
513

    
514
    if not "online" in bin_name :
515
        print "gvspkg mkinstall: binary file name must contain 'online'"
516
        sys.exit(3)
517

    
518
    if addjrelin and addjrewin :
519
        print "gvspkg mkinstall: only one of addjrelin or addjrewin is allowed."
520
        sys.exit(4)
521

    
522
    message("Creating %s..." % custom_name)
523
    shutil.copyfile(bin_name, custom_name)
524
    mychmod(custom_name,RWALL)
525
    message("Adding %s..." % gvspks_name)
526
    installer_add("addpks", custom_name, gvspks_name)
527
    
528
    """
529
    if addjrelin:
530
        withjre_name = bin_name.replace("online", distribution_name+"-withjre")
531
        message("Creating %s..." % withjre_name)
532
        shutil.copyfile(custom_name, withjre_name)
533
        mychmod(withjre_name,RWALL)
534
        message("Adding %s..." % jrelin)
535
        installer_add("addjrelin", withjre_name, jrelin)
536

    
537

    
538
    if addjrewin:
539
        withjre_name = bin_name.replace("online", distribution_name+"-withjre")
540
        message("Creating %s..." % withjre_name)
541
        shutil.copyfile(custom_name, withjre_name)
542
        mychmod(withjre_name,RWALL)
543
        message("Adding %s..." % jrewin)
544
        installer_add("addjrewin", withjre_name, jrewin)
545
    """
546

    
547
def mks(args):
548
    cmd = Command(args)
549
    try:
550
        opts, args = getopt.getopt(cmd.getArgs("mks"), "ixscI:p:", ["index-only","include-default-selection", "clear-list", "exclude=", "excludepki=", "excludepkg=", "include=", "platform="])
551
    except getopt.GetoptError, err:
552
        # print help information and exit:
553
        print str(err) # will print something like "option -a not recognized"
554
        shorthelp(args)
555
        sys.exit(2)
556

    
557
    platforms = ("x86", "x86_64")
558
    oss = ("lin","win")
559
    default_selection = None
560
    index_only = False
561
    clear_list=False
562
    includes=list()
563
    excludes_pki=list()
564
    excludes_pkg=list()
565
    for opt, arg in opts:
566
        if opt in ("-c", "--clear-list"):
567
            clear_list = True
568
        elif opt in ("-s", "--include-default-selection"):
569
            default_selection = "defaultPackages"
570
        elif opt in ("-p", "--platform"):
571
            if arg == "amd64":
572
              arg = "x86_64"
573
            if not platform in ( "x86", "x86_64", "all"):
574
                msgerror("Unsuported platform value "+repr(platform)+". available values are x86, x86_64, amd64 or all")
575
                sys.exit(3)
576
            platforms = (arg,)
577
        elif opt in ("-x", "--exclude"):
578
            excludes_pki.append(arg)
579
            excludes_pkg.append(arg)
580
        elif opt in ( "--excludepki"):
581
            excludes_pki.append(arg)
582
        elif opt in ( "--excludepkg"):
583
            excludes_pkg.append(arg)
584
        elif opt in ( "--include", "-I"):
585
            if not os.path.isabs(arg) :
586
              arg = os.path.join(getPool(), arg)
587
            if arg.endswith(".*"):
588
              includes.append(PackageInfo(arg[:-2]+".gvspkg"))
589
              includes.append(PackageInfo(arg[:-2]+".gvspki"))
590
            else:
591
              includes.append(PackageInfo(arg))
592
        elif opt in ("-i", "--index-only"):
593
            index_only = True
594
        else:
595
            assert False, "unhandled option %r" % opt
596

    
597
    if default_selection!=None and  not os.path.isfile(default_selection) :
598
        msgwarn("No se ha encontrado el fichero %r. la opcion -s/--include-default-selection sera ignorada." % default_selection)
599
        default_selection = None
600

    
601
      
602
    indexes = IndexList()
603

    
604
    packages_txt = getDist() +"/packages.txt"
605
    packages_gvspki = getDist() +"/packages.gvspki"    
606

    
607
    message( "Creating 'packages.gvspki' for version '%s'" % getVersion() + "...")
608
    if not os.path.exists(getDist()):
609
        msgerror("Can't locate version folder '%s'." % getDist())
610
        sys.exit(3)
611
   
612
    if os.path.exists(packages_txt) and not clear_list:
613
        indexes.load(packages_txt)
614
    else:
615
        indexes.build(getPool(), getSearchVersions())
616
        indexes.save(packages_txt)
617

    
618
    for pkg in includes:
619
      indexes.append(pkg)
620

    
621
    # El indice de paquetes lleva los paquetes para todas las plataformas y sistemas
622
    # ya que al conectarnos a el desde el administrador de complementos ya
623
    # se encarga la aplicacion de seleccionar los correspondientes a la plataforma
624
    # sobre la que esta rodando gvSIG.
625
    message( "Writing 'packages.gvspki' to '%s'" % packages_gvspki )
626
    set = zipfile.ZipFile(packages_gvspki,"w",zipfile.ZIP_STORED)
627
    for info in indexes:
628
        if not ( info.code in excludes_pki or info.getFullName() in excludes_pki ):
629
            debug("Add package '%s'" % info.getPkiFilename())
630
            try:
631
                if info.hasPki() :
632
                    set.write(info.getPkiFilename(), os.path.basename(info.getPkiFilename()))
633
            except Exception, ex:
634
                msgerror("Can't add index '%s', error %s" % (info, str(ex)))
635
        else:
636
            debug("Exclude package '%s'" % info.getFullName())
637
    if default_selection != None :
638
        set.write(default_selection,default_selection)
639
    set.close()
640
    mychmod(packages_gvspki,RWALL)
641

    
642
    md5sum(packages_gvspki,packages_gvspki+".md5")
643
    mychmod(packages_gvspki+".md5",RWALL)
644

    
645
    if not index_only :
646
      for cur_os in oss:
647
        for cur_platform in platforms:
648
          packages_gvspks = getDist() +"/packages-"+cur_os+"-"+cur_platform+".gvspks"
649
          message( "Writing 'packages-"+cur_os+"-"+cur_platform+".gvspks' to '%s'" % packages_gvspks )
650
          set = zipfile.ZipFile(packages_gvspks,"w",zipfile.ZIP_STORED)
651
          for info in indexes:
652
              if not ( info.code in excludes_pkg or info.getFullName() in excludes_pkg ):
653
                  try:
654
                      if info.hasPkg():
655
                        if cur_os == "all" or info.getOS() in ("all", cur_os) :
656
                          if cur_platform == "all" or info.getArch() in ("all", cur_platform) :
657
                            set.write(info.getPkgFilename(), os.path.basename(info.getPkgFilename()))
658
                  except Exception, ex:
659
                      msgerror("Can't add package '%s', error %s" % (index, str(ex)))
660
              else:
661
                  debug("Exclude package '%s'" % info.getFullName())
662
          if default_selection != None :
663
              set.write(default_selection,default_selection)
664
          set.close()
665
          mychmod(packages_gvspks,RWALL)
666

    
667
          md5sum(packages_gvspks,packages_gvspks+".md5")
668
          mychmod(packages_gvspks+".md5",RWALL)
669

    
670
    message( "Createds package indexes.\n")
671

    
672
def mkmirror(args):
673
    cmd = Command(args)
674
    try:
675
        opts, args = getopt.getopt(cmd.getArgs("mkmirrot"), "b:", [ "build="])
676
    except getopt.GetoptError, err:
677
        # print help information and exit:
678
        print str(err) # will print something like "option -a not recognized"
679
        shorthelp(args)
680
        sys.exit(2)
681

    
682
    build = None
683
    for opt, arg in opts:
684
        if opt in ("-b", "--build"):
685
            build = arg
686
        else:
687
            assert False, "unhandled option %r" % opt
688

    
689
    if build == None:
690
        msgerror("Build number required.")
691
        sys.exit(3)
692
    domkmirror( getPackagesRoot(),getVersion(),build)
693

    
694
def linkfile(src,dst):
695
  if os.path.lexists(dst):
696
    os.remove(dst)
697
  os.symlink(src,dst)
698
  if os.path.lexists(src+".md5") :
699
    if os.path.lexists(dst+".md5"):
700
      os.remove(dst+".md5")
701
    os.symlink(src+".md5",dst+".md5")
702
    
703
def domkmirror(root_src, version, build):
704
  join = os.path.join
705

    
706
  build = str(build)
707
  root_target = join(root_src,"mirrors",version+"-"+build,"gvsig-desktop")
708
  build_src = join(root_src,"dists",version,"builds",build)
709
  build_target = join(root_target,"dists",version,"builds",build)
710
  pool_src = join(root_src,"pool")
711
  pool_target = join(root_target,"pool")
712
  
713
  makedirs(root_target)
714
  makedirs(build_target)
715
  makedirs(pool_target)
716
  files = os.listdir(build_src)
717
  linkfile(join(build_src,"packages.gvspki"), join(root_target,"dists",version,"packages.gvspki"))
718
  for f in files:
719
    f_src = join(build_src,f)
720
    f_target = join(build_target,f)
721
    if os.path.isfile(f_src):
722
      linkfile(f_src,f_target)
723

    
724
  z = zipfile.ZipFile(join(build_src,"packages.gvspki"))
725
  pkgs = z.namelist()
726
  for pkgname in pkgs:
727
    if pkgname!='defaultPackages':
728
      pkg = PackageInfo(pkgname)
729
      makedirs(join(root_target,"pool",pkg.getCode()))
730
      src = join(root_src,"pool",pkg.getCode(),pkg.getPkgFilename())
731
      target = join(root_target,"pool",pkg.getCode(),pkg.getPkgFilename())
732
      linkfile(src,target)
733
  cmd = "cd %s ; find . ! -type d >%s/files.lst" % (root_target, build_target)
734
  os.system(cmd)
735

    
736
def mkhtml(args):
737
    def getCode(info):
738
      return info.code
739

    
740

    
741
    cmd = Command(args)
742
    try:
743
        opts, args = getopt.getopt(cmd.getArgs("mkhtml"), "xsc", ["clear-list", "exclude=", "excludepki=", "excludepkg=", "include="])
744
    except getopt.GetoptError, err:
745
        # print help information and exit:
746
        print str(err) # will print something like "option -a not recognized"
747
        shorthelp(args)
748
        sys.exit(2)
749

    
750
    index_only = False
751
    clear_list=False
752
    includes=list()
753
    excludes_pki=list()
754
    excludes_pkg=list()
755
    for opt, arg in opts:
756
        if opt in ("-c", "--clear-list"):
757
            clear_list = True
758
        elif opt in ("-x", "--exclude"):
759
            excludes_pki.append(arg)
760
            excludes_pkg.append(arg)
761
        elif opt in ( "--excludepki"):
762
            excludes_pki.append(arg)
763
        elif opt in ( "--excludepkg"):
764
            excludes_pkg.append(arg)
765
        elif opt in ( "--include", "-I"):
766
            includes.append(PackageInfo(arg))
767
        else:
768
            assert False, "unhandled option %r" % opt
769

    
770
    message("Creating html pages...")
771
    indexes = IndexList()
772

    
773
    packages_txt = getDist() +"/packages.txt"
774
   
775
    if os.path.exists(packages_txt) and not clear_list:
776
        indexes.load(packages_txt)
777
    else:
778
        indexes.build(getPool(), getSearchVersions())
779
        indexes.save(packages_txt)
780

    
781
    for pkg in includes:
782
      indexes.append(pkg)
783

    
784
    allpackages = list()
785
    basepath = getWeb()
786
    for info in indexes:
787
        if not ( info.code in excludes_pki or info.getFullName() in excludes_pki ):
788
            try:
789
                if info.hasPki() :
790
                    mkpkihtml(basepath, info)
791
                    allpackages.append(info)
792
            except Exception, ex:
793
                msgerror("Can't create html '%s', error %s" % (info, str(ex)))
794

    
795
    html = '''
796
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
797
<html xmlns="http://www.w3.org/1999/xhtml">
798
<head>
799
  <meta http-equiv="Content-Type" content= "text/html; charset=us-ascii" />
800
      <title>"%s" package list</title>'''% getVersion() # Title
801

    
802
    html += '''  
803
<!-- estilos para las tablas -->
804
  <style type="text/css" title="currentStyle">
805
    @import "css/demo_table.css";
806
    @import "css/thickbox.css";
807
    #pkglist{
808
        width:100%;
809
        clear:both;
810
        font-family:Arial,Helvetica,sans-serif;
811
    }
812
    #pkgdetails{
813
        width:600px !important;
814
        clear:both;
815
    }
816
    #pkgdetails table th{
817
        text-algin:right;
818
    }
819
  </style>
820
</head>'''
821

    
822
    html += '''
823
<body>
824
  <h1>%s package list</h1>
825
  <table id="pkglist" summary="%s package list" width="100%%" >
826
    <thead>
827
    <tr>
828
      <td>Package name</td>
829
      <td>Version</td>
830
      <td>O.S.</td>
831
      <td>Official</td>
832
      <td>Type</td>
833
      <td>Owner</td>
834
    </tr>
835
    </thead>
836
    <tbody>'''%(getVersion(),getVersion())
837

    
838
    # sort allpackages
839
    for item in sorted(allpackages, key=getCode):
840
      html += '''\n    <tr>
841
      <td><a class="thickbox" href="%s">%s</a></td>
842
      <td>%s</td>
843
      <td>%s</td>
844
      <td>%s</td>
845
      <td>%s</td>
846
      <td>%s</td>
847
    </tr>\n'''%(
848
  "../../../web/" + item.getFullName() + ".html?height=400&width=600",
849
        item.getName(),
850
  item.version,
851
  item.os,
852
  item.getOfficial(),
853
  item.getType(),
854
  item.getOwner()
855
      )
856
    html += """ </tbody>\n </table>
857
<!--javascript para la visualizaci�n de la tabla y carga din�mica del contenido del enlace -->
858
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js" type="text/javascript"></script>
859
<script src="http://datatables.net/release-datatables/media/js/jquery.dataTables.js" type="text/javascript"></script>
860
<script type="text/javascript" src="js/thickbox-compressed.js"></script>
861

    
862
<!-- inicializaci�n de la tabla con cosas chachis -->
863
<script type="text/javascript">
864
  $(document).ready(function() {
865
      $('#pkglist').dataTable( {
866
      "bPaginate": false,
867
      "bLengthChange": true,
868
      "bFilter": true,
869
      "bSort": true,
870
      "bInfo": true,
871
      "bAutoWidth": true
872
    });
873
 } );
874
</script>
875
</body>
876
</html>"""
877

    
878
    # generate index.html
879
    try:
880
      f=file(getDist()+"/web/index.html","w")
881
      f.write(html)
882
      f.close()
883
    except Exception, ex:
884
      raise ex
885

    
886
    message("html pages createds.\n")
887
  
888
  
889
def mkpkihtml(basepath, info):
890
  html='''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
891
<html xmlns="http://www.w3.org/1999/xhtml">
892
<head>
893
  <meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
894
  <title>%s</title>
895
  <!-- estilos para las tablas -->
896
  <style type="text/css" title="currentStyle">
897
    @import "../dists/%s/web/css/demo_table.css";
898
    #pkgdetails{
899
      width:600px;
900
      clear:both;
901
    }
902
    #pkgdetails table th{
903
        text-algin:right;
904
    }
905
  </style>
906
</head>
907
<body>\n'''%(info.getIniOption("name"), getVersion())
908
  html += '  <table id="pkgdetails" summary=%s >\n'%info.getIniOption("name")
909
  html += '    <thead>\n  <tr>\n  <th>%s </th>\n  <td>%s</td>\n  </tr>\n  </thead>\n'%("Name", info.getIniOption("name"))
910
  html += '    <tbody><tr><th>%s </th><td>%s</td></tr>\n'%("Code", info.code)
911
  html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("Version", info.version)
912
  html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("State", info.getIniOption("state"))
913
  html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("Build", info.build)
914
  html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("Owner", info.getOwner())
915

    
916
  #url = info.getUrl()
917
  url = info.getIniOption("download-url")
918
  if url != None:
919
    html += '    <tr><th valing="top">Downloads</th><td><a href ="%s">Binaries</a></td></tr>\n'%(url)
920
  else:
921
    html += '    <tr><th valing="top">Downloads</th><td>Binaries</td></tr>\n'
922

    
923
  sourceUrl = info.getSourceUrl()
924

    
925
  if sourceUrl != None:
926
    html += '    <tr><td></td><td><a href ="%s">Sources</a></td></tr>\n'%(sourceUrl)
927
  else:
928
    html += "    <tr><td></td><td>Sources</td></tr>\n"
929

    
930
  if info.getDependencies() == None:
931
    html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("Dependencies", "")
932
  else:
933
    html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("Dependencies", info.getDependencies().replace("\:",":"))
934
  html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("Type", info.getType())
935
  html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("Official", info.getOfficial())
936
  html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("O.S.", info.getOS())
937
  html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("Architecture", info.getArch())
938
  html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("Categories", info.getCategories())
939

    
940
  description = info.getDescription()
941
  if description == None:
942
    description = ""
943
  description = description.replace("\\n", "<br>")
944
  description = description.replace("\:",":")
945
  html += '    <tr valing="top"><th valing="top">%s </th><td>%s</td></tr>\n'%("Description", description)
946
  html += """  </tbody>\n</table>\n"""
947
  html += """
948
  <!-- javascript para la visualizaci�n de la tabla -->
949
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript"></script>
950
  <script src="http://datatables.net/release-datatables/media/js/jquery.dataTables.js" type="text/javascript"></script>
951
  <!-- inicializaci�n de la tabla con cosas chachis -->
952
  <script type="text/javascript">
953
    $(document).ready(function() {
954
      $('#pkgdetails').dataTable( {
955
        "bPaginate": false,
956
        "bLengthChange": true,
957
        "bFilter": false,
958
        "bSort": false,
959
        "bInfo": false,
960
        "bAutoWidth": true
961
      });
962
    });
963
  </script>
964
  </body>\n</html>"""
965

    
966

    
967
  try:
968
    f = file(getWeb() + "/" + info.getFullName() + ".html","w")
969
    f.write(html)
970
    f.close()
971
  except Exception, ex:
972
    raise ex
973

    
974
def extract_make_portable(zfile, targetfolder):
975
  zf = zipfile.ZipFile(zfile)
976
  data = zf.read("gvsig-desktop/tools/make-portable")
977
  f = open(os.path.join(targetfolder,"make-portable"),"wb")
978
  f.write(data)
979
  f.close()
980
  zf.close()
981

    
982
def prepare_portable(args):
983
    cmd = Command(args)
984
    try:
985
        opts, args = getopt.getopt(cmd.getArgs("prepare-portable"), "b:s:", [ "build=", "state=" ])
986
    except getopt.GetoptError, err:
987
        # print help information and exit:
988
        print str(err) # will print something like "option -a not recognized"
989
        shorthelp(args)
990
        sys.exit(2)
991

    
992
    build=None
993
    state=None
994
    for opt, arg in opts:
995
        if opt in ("-b", "--build"):
996
            build=arg
997
        elif opt in ("-s", "--state"):
998
            state=arg
999
        else:
1000
            assert False, "unhandled option %r" % opt
1001

    
1002
    if build == None:
1003
      print "Requiered option --build not found."
1004
      shorthelp(args)
1005
      sys.exit(2)
1006

    
1007
    if state == None:
1008
      print "Requiered option --state not found."
1009
      shorthelp(args)
1010
      sys.exit(2)
1011
      
1012
    join = os.path.join
1013
    build_folder = join(getPackagesRoot(),"dists",getVersion(),"builds",build)
1014
    if not os.path.isdir(build_folder):
1015
      print "Can't access the build folder "+build_folder+"."
1016
      sys.exit(2)
1017

    
1018
    do_prepare_portable(build,state)
1019

    
1020
def do_prepare_portable(build,state):
1021
    join = os.path.join
1022
    build_folder = join(getPackagesRoot(),"dists",getVersion(),"builds",build)
1023
    portable_folder = join(build_folder,"misc","portable")
1024
    makedirs(portable_folder)
1025
    makedirs(join(portable_folder,"packages","custom"))
1026
    makedirs(join(portable_folder,"standard"))
1027
    makedirs(join(portable_folder,"patchs"))
1028
    f=open(join(portable_folder,"packages","excludes"),"w")
1029
    f.write("""EPSG_v6                                                                                                                               
1030
EPSG_v8_4                                                                                                                                     
1031
org.gvsig.app.document.layout1.app.mainplugin
1032
org.gvsig.dyschromatopsia.app.extension
1033
org.gvsig.educa.portableview.app.editor
1034
org.gvsig.educa.portableview.app.viewer
1035
org.gvsig.projection.app.cresques
1036
org.gvsig.projection.app.proj4j
1037
org.gvsig.editing.app.mainplugin
1038
org.gvsig.downloader.app.mainplugin
1039
""")
1040
    f.close()
1041
    fname_base = "gvSIG-desktop-%s-%s-%s" % (getVersion(),build,state)
1042
    linkfile(
1043
      join(build_folder,fname_base + "-all-x86-online.zip"),
1044
      join(portable_folder,"standard",fname_base + "-all-x86-online.zip")
1045
    )
1046
    linkfile(
1047
      join(build_folder,fname_base + "-lin-x86.gvspks"),
1048
      join(portable_folder,"standard",fname_base + "-lin-x86.gvspks")
1049
    )
1050
    linkfile(
1051
      join(build_folder,fname_base + "-lin-x86_64.gvspks"),
1052
      join(portable_folder,"standard",fname_base + "-lin-x86_64.gvspks")
1053
    )
1054
    linkfile(
1055
      join(build_folder,fname_base + "-lin-x86-online.jar"),
1056
      join(portable_folder,"standard",fname_base + "-lin-x86-online.jar")
1057
    )
1058
    linkfile(
1059
      join(build_folder,fname_base + "-win-x86.gvspks"),
1060
      join(portable_folder,"standard",fname_base + "-win-x86.gvspks")
1061
    )
1062
    linkfile(
1063
      join(build_folder,fname_base + "-win-x86-online.jar"),
1064
      join(portable_folder,"standard",fname_base + "-win-x86-online.jar")
1065
    )
1066
    extract_make_portable(
1067
      join(build_folder,fname_base + "-all-x86-online.zip"),
1068
      join(portable_folder)
1069
    )
1070
    # shutil.copyfile(
1071
    #   join(getPackagesRoot(),"gvspkg.bin","make-portable"),
1072
    #   join(portable_folder,"make-portable")
1073
    # )
1074
    mychmod(join(portable_folder,"make-portable"),RWXALL)
1075
    
1076
def zipfolder(source,target):
1077
  def zipdir(path, zip):
1078
      for root, dirs, files in os.walk(path):
1079
          for file in files:
1080
              zip.write(os.path.join(root, file))
1081
  zipf = zipfile.ZipFile(target, 'w')
1082
  zipdir(source, zipf)
1083
  zipf.close()
1084

    
1085
def removefile(filename):
1086
  if os.path.exists(filename):
1087
    os.remove(filename)
1088
  
1089
def mkportable(args):
1090
    cmd = Command(args)
1091
    try:
1092
        opts, args = getopt.getopt(cmd.getArgs("mkportable"), "b:s:", [ "build=", "state=" ])
1093
    except getopt.GetoptError, err:
1094
        # print help information and exit:
1095
        print str(err) # will print something like "option -a not recognized"
1096
        shorthelp(args)
1097
        sys.exit(2)
1098

    
1099
    build=None
1100
    state=None
1101
    for opt, arg in opts:
1102
        if opt in ("-b", "--build"):
1103
            build=arg
1104
        elif opt in ("-s", "--state"):
1105
            state=arg
1106
        else:
1107
            assert False, "unhandled option %r" % opt
1108

    
1109
    if build == None:
1110
      print "Requiered option --build not found."
1111
      shorthelp(args)
1112
      sys.exit(2)
1113

    
1114
    if state == None:
1115
      print "Requiered option --state not found."
1116
      shorthelp(args)
1117
      sys.exit(2)
1118
      
1119
    join = os.path.join
1120
    build_folder = join(getPackagesRoot(),"dists",getVersion(),"builds",build)
1121
    if not os.path.isdir(build_folder):
1122
      print "Can't access the build folder "+build_folder+"."
1123
      sys.exit(2)
1124
    
1125
    portable_folder = join(build_folder,"misc","portable")
1126
    if not os.path.isdir(portable_folder) :
1127
      do_prepare_portable(build,state)
1128
    os.system('cd %s ; ./make-portable' % (portable_folder))
1129

    
1130
    message("Removing previos portable zip files")
1131
    removefile(join(build_folder,"gvsig-desktop-%s-%s-%s-lin-x86.zip" %  (getVersion(),build,state)))
1132
    removefile(join(build_folder,"gvsig-desktop-%s-%s-%s-lin-x86_x86.zip" % (getVersion(),build,state)))
1133
    removefile(join(build_folder,"gvsig-desktop-%s-%s-%s-win-x86.zip" % (getVersion(),build,state)))
1134
    
1135
    target_folder = join(getPackagesRoot(),"dists",getVersion(),"builds",build,"misc","portable","target")
1136
    os.chdir(target_folder)
1137
    
1138
    message("Creating zip gvsig-desktop-%s-%s-%s-lin-x86.zip" % (getVersion(),build,state))
1139
    zipfolder(
1140
      "gvsig-desktop-%s-%s-%s-lin-x86" % (getVersion(),build,state),
1141
      join(build_folder,"gvsig-desktop-%s-%s-%s-lin-x86.zip" % (getVersion(),build,state))
1142
    )
1143
    message("Creating zip gvsig-desktop-%s-%s-%s-lin-x86_64.zip" % (getVersion(),build,state))
1144
    zipfolder(
1145
      "gvsig-desktop-%s-%s-%s-lin-x86_64" % (getVersion(),build,state),
1146
      join(build_folder,"gvsig-desktop-%s-%s-%s-lin-x86_64.zip" % (getVersion(),build,state))
1147
    )
1148
    message("Creating zip gvsig-desktop-%s-%s-%s-win-x86.zip" % (getVersion(),build,state))
1149
    zipfolder(
1150
      "gvsig-desktop-%s-%s-%s-win-x86" % (getVersion(),build,state),
1151
      join(build_folder,"gvsig-desktop-%s-%s-%s-win-x86.zip" % (getVersion(),build,state))
1152
    )
1153
    
1154
    #message("Remove temporary folders")
1155
    #shutil.rmtree(target_folder)
1156

    
1157
def mkdist(args):
1158
    cmd = Command(args)
1159
    try:
1160
        opts, args = getopt.getopt(cmd.getArgs("mkdist"), "b:s:p:", [ "build=", "state=", "distribution_name=", "platform" ])
1161
    except getopt.GetoptError, err:
1162
        # print help information and exit:
1163
        print str(err) # will print something like "option -a not recognized"
1164
        shorthelp(args)
1165
        sys.exit(2)
1166

    
1167
    build=None
1168
    state=None
1169
    distribution_name = "standard"
1170
    platforms = ("x86", "x86_64")
1171
    oss = ("lin", "win")
1172
    
1173
    for opt, arg in opts:
1174
        if opt in ("-b", "--build"):
1175
            build=arg
1176
        elif opt in ("-s", "--state"):
1177
            state=arg
1178
        elif opt in ("-N", "--distrinution-name"):
1179
            distribution_name = arg
1180
        elif opt in ("-p", "--platform"):
1181
          if args == "amd64":
1182
            # Aceptamos la plataforma amd64 como sinonimo de x86_64
1183
            args = "x86_64"
1184
          if not arg in ("x86","x86_64"):
1185
            print "Unsuported platform "+repr(platform)+", must be x86, x86_64 or amd64."
1186
            shorthelp(args)
1187
            sys.exit(2)
1188
          platforms = (arg,)
1189
        else:
1190
            assert False, "unhandled option %r" % opt
1191

    
1192
    if build == None:
1193
      print "Requiered option --build not found."
1194
      shorthelp(args)
1195
      sys.exit(2)
1196

    
1197
    if state == None:
1198
      print "Requiered option --state not found."
1199
      shorthelp(args)
1200
      sys.exit(2)
1201

    
1202
    #
1203
    # Independientemente de la plataforma, los binarios de la version online a utilizar
1204
    # que usamos son siempre los de x86, con lo que el instalador siempre sera para x86.
1205
    # Si hemos especificado que queremos una instalacion para x86, este llevara solo paquetes
1206
    # multiplataforma, "all", y "x86".
1207
    # Si hemos especificado que queremos una instalacion para x86_64, este llevara solo paquetes
1208
    # multiplataforma, "all", y "x86_64".
1209
    #
1210

    
1211
    if not os.path.isdir("builds/"+build):
1212
      print "Can't access the build folder builds/"+build+"."
1213
      sys.exit(2)
1214
       
1215
    message( "Generating distribution for build "+ build + "...")
1216
    message("Recreating index of packages...")
1217
    executeCommand("mks", "-s", "-c")
1218
    
1219
    executeCommand("mkhtml" )
1220

    
1221
    gvspki_filename = "builds/"+build+"/packages.gvspki"
1222
    message( "Coping packages.gvspki to "+ gvspki_filename + "\n")
1223
    shutil.copyfile("packages.gvspki", gvspki_filename)
1224
    shutil.copyfile("packages.gvspki.md5", gvspki_filename +".md5")
1225
    
1226
    #exec_extensions = {
1227
    #  "lin" : LINUX_EXEC_EXTENSION,
1228
    #  "win" : ".exe"
1229
    #}
1230
    
1231
    for cur_os in oss:
1232
      exec_extension = ".jar" #exec_extensions[cur_os]
1233
      for cur_platform in platforms:
1234
        message( "Creating installers for platform "+cur_os+"/"+cur_platform+"...")
1235
        gvspks_filename = "builds/"+build+"/gvSIG-desktop-" + VERSION + "-" + build+ "-" + state + "-"+cur_os+"-"+cur_platform+".gvspks"
1236
        online_filename = "builds/"+build+"/gvSIG-desktop-" + VERSION + "-" + build+ "-" + state + "-"+cur_os+"-x86-online" + exec_extension
1237

    
1238
        if not os.path.isfile(online_filename):
1239
          msgwarn("Can't access the online installable for "+cur_os+"/"+cur_platform + " ("+online_filename+").")
1240
          continue
1241
       
1242
        message( "Coping packages-"+cur_os+"-"+cur_platform+"..gvspks to "+ gvspks_filename)
1243
        shutil.copyfile("packages-"+cur_os+"-"+cur_platform+".gvspks", gvspks_filename)
1244
        shutil.copyfile("packages-"+cur_os+"-"+cur_platform+".gvspks.md5", gvspks_filename +".md5")
1245

    
1246
        message( "Add execution permissions to online installables....")
1247
        mychmod(online_filename,RWXALL)
1248

    
1249
        md5sum(online_filename,online_filename+".md5")
1250
        mychmod(online_filename+".md5",RWALL)
1251

    
1252
        
1253
        executeCommand("mkinstall" , "--addjre"+cur_os, online_filename, gvspks_filename)
1254

    
1255
        message( "Renaming files from custom to standard...")
1256
        target_filename = "builds/"+build+"/gvSIG-desktop-" + VERSION + "-" + build+ "-" + state + "-"+cur_os+"-"+cur_platform+"-"+distribution_name + exec_extension
1257
        shutil.move(
1258
            "builds/"+build+"/gvSIG-desktop-" + VERSION + "-" + build+ "-" + state + "-"+cur_os+"-x86-custom" + exec_extension,
1259
            target_filename
1260
        )
1261
        mychmod(target_filename,RWXALL)
1262

    
1263
        md5sum(target_filename,target_filename+".md5")
1264
        mychmod(target_filename+".md5",RWALL)
1265

    
1266
        """
1267
        target_filename = "builds/"+build+"/gvSIG-desktop-" + VERSION + "-" + build+ "-" + state + "-"+cur_os+"-"+cur_platform+"-"+distribution_name+"-withjre" + exec_extension
1268
        shutil.move(
1269
            "builds/"+build+"/gvSIG-desktop-" + VERSION + "-" + build+ "-" + state + "-"+cur_os+"-x86-custom-withjre" + exec_extension,
1270
            target_filename
1271
        )
1272
        mychmod(target_filename,RWXALL)
1273

    
1274
        md5sum(target_filename,target_filename+".md5")
1275
        mychmod(target_filename+".md5",RWALL)
1276
        """
1277
        message( "Createds installers for platform "+cur_os+"/"+cur_platform+"\n")
1278
        
1279
    message( "Coping html index to browse paqueges of the distro.")
1280
    shutil.rmtree("builds/"+build+"/web", ignore_errors=True)
1281
    shutil.copytree("web", "builds/"+build+"/web")
1282
    f = file("builds/"+build+"/web/index.html","r")
1283
    contents = f.read()
1284
    f.close()
1285
    contents = contents.replace("href=\"../../../web/gvSIG-desktop-", "href=\"../../../../../web/gvSIG-desktop-")
1286
    f = file("builds/"+build+"/web/index.html","w")
1287
    f.write(contents)
1288
    f.close()
1289

    
1290
    message( "\nCreation of distribution completed.\n")
1291
         
1292
      
1293
      
1294

    
1295
def show(args):
1296
    cmd = Command(args)
1297
    try:
1298
        opts, args = getopt.getopt(cmd.getArgs("show"), "S", [ "verify"])
1299
    except getopt.GetoptError, err:
1300
        # print help information and exit:
1301
        print str(err) # will print something like "option -a not recognized"
1302
        shorthelp(args)
1303
        sys.exit(2)
1304

    
1305
    eerify = False
1306
    for opt, arg in opts:
1307
        if opt in ("-V", "--verify"):
1308
            verify = True
1309
        else:
1310
            assert False, "unhandled option %r" % opt
1311

    
1312
    index_name=args[0]
1313
    message( "Show package.info from '%s'" % index_name)
1314
    files = findfiles(getPool(), index_name)
1315
    if len(files) != 1:
1316
        msgerror("Can't locate package '%s' in pool '%s'." % (index_name, getPool()))
1317
        return
1318
    index_path = files[0]
1319
    outputfolder="/tmp/gvspkg.%s" % os.getpid()
1320
    os.mkdir(outputfolder)
1321
    os.system('unzip -q %s -d %s' % (index_path,outputfolder))
1322

    
1323
    files = findfiles(outputfolder, "package.info")
1324
    if len(files) != 1:
1325
        msgerror("Can't locate package.info in pool '%s'." % (index_name))
1326
        return
1327

    
1328
    package_info = files[0]
1329
    f = file(package_info,"r")
1330
    s = f.read()
1331
    f.close()
1332
    print s
1333
    if verify:
1334
      verify_sign(package_info)
1335
    shutil.rmtree(outputfolder)
1336

    
1337
def editall(args):
1338
    cmd = Command(args)
1339
    try:  
1340
        opts, args = getopt.getopt(cmd.getArgs("editall"), "Scx:I:r:", ["clear-list", "exclude=", "excludepki=", "excludepkg=", "include=", "replace=", "sign"])
1341
    except getopt.GetoptError, err:
1342
        # print help information and exit:
1343
        print str(err) # will print something like "option -a not recognized"
1344
        shorthelp(args)
1345
        sys.exit(2)
1346

    
1347
    index_only = False
1348
    clear_list=False
1349
    includes=list()
1350
    excludes_pki=list()
1351
    replaces = list()
1352
    excludes_pkg=list()
1353
    sign = False
1354
    interactive = True
1355
    for opt, arg in opts:
1356
        if opt in ("-c", "--clear-list"):
1357
            clear_list = True
1358
        elif opt in ("-x", "--exclude"):
1359
            excludes_pki.append(arg)
1360
            excludes_pkg.append(arg)
1361
        elif opt in ( "--excludepki"):
1362
            excludes_pki.append(arg)
1363
        elif opt in ( "--excludepkg"):
1364
            excludes_pkg.append(arg)
1365
        elif opt in ( "--include", "-I"):
1366
            includes.append(PackageInfo(arg))
1367
        elif opt in ("-r", "--replace"):
1368
            interactive = False
1369
            replaces.append(arg)
1370
        elif opt in ("-S", "--sign"):
1371
            sign = True
1372
        else:
1373
            assert False, "unhandled option %r" % opt
1374

    
1375
    indexes = IndexList()
1376

    
1377
    packages_txt = getDist() +"/packages.txt"
1378
    if os.path.exists(packages_txt) and not clear_list:
1379
        indexes.load(packages_txt)
1380
    else:
1381
        indexes.build(getPool(), getSearchVersions())
1382
        indexes.save(packages_txt)
1383

    
1384
    for pkg in includes:
1385
      indexes.append(pkg)
1386

    
1387
    allpackages = list()
1388
    for info in indexes:
1389
        if not ( info.code in excludes_pki or info.getFullName() in excludes_pki ):
1390
            try:
1391
                if info.hasPki() :
1392
                  print info.getPkiFilename()
1393
                  if interactive :
1394
                    edit_pkginfo_of_package(info.getPkiFilename(), edit_ui)
1395
                  elif len(replaces) < 1:
1396
                    edit_pkginfo_of_package(info.getPkiFilename(), edit_replace, replaces)
1397

    
1398
                  if sign:
1399
                    edit_pkginfo_of_package(info.getPkiFilename(), edit_sign)
1400

    
1401
            except Exception, ex:
1402
                msgerror("Can't add index '%s', error %s" % (info, str(ex)))
1403

    
1404
def edit(args):
1405
    cmd = Command(args)
1406
    try:
1407
        opts, args = getopt.getopt(cmd.getArgs("edit"), "Sr:", [ "replace=", "onlysign", "sign" ])
1408
    except getopt.GetoptError, err:
1409
        # print help information and exit:
1410
        print str(err) # will print something like "option -a not recognized"
1411
        shorthelp(args)
1412
        sys.exit(2)
1413

    
1414
    replaces = list()
1415
    interactive = True
1416
    sign = False
1417
    for opt, arg in opts:
1418
        if opt in ("-r", "--replace"):
1419
            interactive = False
1420
            replaces.append(arg)
1421
        elif opt in ("--onlysign"):
1422
            interactive = False
1423
            sign = True
1424
        elif opt in ("-S", "--sign"):
1425
            sign = True
1426
        else:
1427
            assert False, "unhandled option %r" % opt
1428

    
1429
    index_name=args[0]
1430
    message( "Show package.info from '%s'" % index_name)
1431
    files = findfiles(getPool(), index_name)
1432
    if len(files) != 1:
1433
        msgerror("Can't locate package '%s' in pool '%s'." % (index_name, getPool()))
1434
        return
1435
    index_path = files[0]
1436
    if interactive:
1437
      edit_pkginfo_of_package(index_path, edit_ui)
1438
    elif len(replaces) < 1:
1439
      edit_pkginfo_of_package(index_path, edit_replace, replaces)
1440

    
1441
    if sign:
1442
      edit_pkginfo_of_package(index_path, edit_sign)
1443

    
1444
def edit_ui(filename, args):
1445
      os.system('vi "%s"' % filename)
1446

    
1447
def edit_replace(filename, args):
1448
      replaces = args[0]
1449
      f = open(filename)
1450
      s = f.read()
1451
      f.close()
1452
      for replace in replaces:
1453
        x = replace.split(replace[0])
1454
        if len(x)==4:
1455
          s=re.sub(x[1],x[2],s)
1456
      f = open(filename,"w")
1457
      f.write(s)
1458
      f.close()
1459

    
1460
def edit_sign(filename, args):
1461
      os.system('java -cp "%s/commons-codec-1.6.jar:%s/org.gvsig.installer.lib.impl-1.0.1-SNAPSHOT.jar" org.gvsig.installer.lib.impl.utils.SignUtil sign %s' %  (
1462
        get_gvspkg_bin_folder(),
1463
        get_gvspkg_bin_folder(),
1464
        filename)
1465
      )
1466

    
1467
def verify_sign(filename):
1468
      os.system('java -cp "%s/commons-codec-1.6.jar:%s/org.gvsig.installer.lib.impl-1.0.1-SNAPSHOT.jar" org.gvsig.installer.lib.impl.utils.SignUtil verify %s' % (
1469
        get_gvspkg_bin_folder(),
1470
        get_gvspkg_bin_folder(),
1471
        filename)
1472
      )
1473

    
1474
def edit_pkginfo_of_package(pkg_path, operation, *args):
1475
    outputfolder="/tmp/gvspkg.%s" % os.getpid()
1476
    os.mkdir(outputfolder)
1477
    os.system('unzip -q %s -d %s' % (pkg_path,outputfolder))
1478

    
1479
    files = findfiles(outputfolder, "package.info")
1480
    if len(files) != 1:
1481
        msgerror("Can't locate package.info in pool '%s'." % (pkg_path))
1482
        return
1483

    
1484
    package_info = files[0]
1485
    code = package_info.split("/")[-2]
1486
    operation(package_info, args)
1487

    
1488
    # zip -Dr kk.zip org.gvsig.wfs
1489
    temp_index_name = "/tmp/packages.gvspki.%s" % os.getpid()
1490
    temp_index = zipfile.ZipFile(temp_index_name,"w",zipfile.ZIP_STORED)
1491
    temp_index.write(package_info, "%s/package.info" % (code))
1492
    temp_index.close()
1493
    shutil.rmtree(outputfolder)
1494
    os.remove(pkg_path)
1495
    shutil.move(temp_index_name,pkg_path)
1496

    
1497
def install(args):
1498
    cmd = Command(args)
1499
    try:
1500
        opts, args = getopt.getopt(cmd.getArgs("install"), "fS", [ "force","nohttps" ])
1501
    except getopt.GetoptError, err:
1502
        # print help information and exit:
1503
        print str(err) # will print something like "option -a not recognized"
1504
        shorthelp(args)
1505
        sys.exit(2)
1506

    
1507
    force = False
1508
    nohttps = False
1509
    for opt, arg in opts:
1510
        if opt in ("-f", "--force"):
1511
            force = True
1512
        if opt in ("-S", "--nohttps"):
1513
            nohttps = True
1514
        else:
1515
            assert False, "unhandled option %r" % opt
1516

    
1517
    url_pki = args[0]
1518
    if url_pki.startswith("https:") and nohttps :
1519
       url_pki = "http:" + url_pki[6:]
1520
       
1521
    message( "Download package index '%s'" % url_pki)
1522
    temppath_pki= os.path.join("/tmp",os.path.basename(url_pki))
1523
    if not downloadFile(url_pki,temppath_pki):
1524
      msgerror("Can't download index.")
1525
      msgerror("Can't install '%s'." % url_pki)
1526
      print # force a newline
1527
      return 1
1528
    pkg = PackageInfo(temppath_pki)
1529
    url_pkg = pkg.getUrl().replace("\\","")
1530
    if url_pkg[-7:] == ".gvspki" :
1531
      msgwarn("Suspicious download-url value. Ends with gvspki, expected gvspkg.")
1532
      msgwarn("download-url ='%s'." % url_pkg)
1533
    
1534
    if url_pkg.startswith("https:") and nohttps :
1535
       url_pkg = "http:" + url_pkg[6:]
1536
       
1537
    message( "Download package '%s'" % url_pkg)
1538
    temppath_pkg= os.path.join("/tmp",os.path.basename(url_pkg))
1539
    if not downloadFile(url_pkg,temppath_pkg):
1540
      msgerror("Can't download package from download-url ('%s')." % url_pkg)
1541
      msgerror("Can't install '%s'," % url_pki)
1542
      print # force a newline
1543
      return 1
1544
    folder = os.path.join(getPool(),pkg.getCode())
1545
    makedirs(folder)
1546
    pathname_pki = os.path.join(folder,os.path.basename(url_pki))
1547
    if not force and os.path.isfile(pathname_pki) :
1548
        msgwarn("The package index alreade exist in the pool. Use -f to forrce install.")
1549
        print # force a newline
1550
        return 1
1551
    pathname_pkg = os.path.join(folder,os.path.basename(url_pkg))
1552
    if  not force and os.path.isfile(pathname_pki) :
1553
        msgwarn("The package downloaded from download-url alredy exists in the pool. Use -f to force install.")
1554
        print # force a newline  
1555
        return 1
1556
    message( "installing package '%s'" % os.path.basename(pathname_pki))
1557
    shutil.copyfile(temppath_pki, pathname_pki)
1558
    message( "installing package '%s'" % os.path.basename(pathname_pkg))
1559
    shutil.copyfile(temppath_pkg, pathname_pkg)
1560

    
1561
    md5sum(pathname_pki, pathname_pki+".md5")
1562
    md5sum(pathname_pkg, pathname_pkg+".md5")
1563

    
1564

    
1565
def md5sum(fin, fout):
1566
    message( "Calculating md5sum of %s..." % fin )
1567
    system("md5sum -b %s >%s" % (fin, fout) )
1568

    
1569
def downloadFile(url,path):
1570
  try:
1571
    fsrc = urllib2.urlopen(url)
1572
  except urllib2.HTTPError,e:
1573
    msgerror("Error abriendo url '%s'." % url, e)
1574
    return False
1575
  fdst = file(path,"wb")
1576
  shutil.copyfileobj(fsrc,fdst)
1577
  fdst.close()
1578
  fsrc.close()
1579
  return True
1580

    
1581
def shorthelp(args):
1582
    print """
1583
usage: gvspkg [OPTIONS] COMMANDS
1584
OPTIONS:
1585

    
1586
-h,--help       Muestra esta ayuda
1587
-v,--verbose    Activa el modo verbose
1588
-d,--debug      Activa el modo debug.
1589
--version ver   Fija la version con la que van a trabajar.
1590
-r,--package-root root    Fija la carpeta del raiz del sistema de paquetes
1591
    
1592
COMMANDS:
1593

    
1594
mkinstall [OPTIONS] install-file packages-file
1595
    -L, --jrelin=path
1596
    -W, --jrewin=path
1597
    -l, --addjrelin
1598
    -w, --addjrewin
1599
    -N, --distribution-name=name
1600

    
1601
lsi [OPTIONS]
1602
    -l, --long-format
1603

    
1604
mks [OPTIONS]
1605
     -c, --clear-list
1606
     --excludepkg pkgcode
1607
     --excludepki pkgcode
1608
     --exclude pkgcode
1609
     -s, --include-default-selection
1610
     -p, --platform=name
1611
     -i, --index-only
1612
     -I full-path-to-package, --include full-path-to-package
1613

    
1614
mkdist [OPTIONS]
1615
     -s STATE, --state=STATE
1616
     -b BUILD, --build=BUILD
1617
     -p, --platform=all|x86|x86_64|amd64
1618
     -N, --distribution-name=name
1619
     
1620
mkmirror [OPTIONS]
1621
     -b, --build buildnumber
1622

    
1623
mkhtml [OPTIONS]
1624
     -c, --clear-list
1625
     --excludepkg pkgcode
1626
     --excludepki pkgcode
1627
     --exclude pkgcode
1628

    
1629
show OPTIONS package-index
1630
    --verify, -V
1631

    
1632
edit [OPTIONS] package-index
1633
     --replace=@search@replace@
1634
     --onlysign
1635
     --sign, -S
1636

    
1637
editall [OPTIONS]
1638
     -c, --clear-list
1639
     --excludepkg pkgcode
1640
     --excludepki pkgcode
1641
     --exclude pkgcode
1642
     --replace=@search@replace@
1643
     --sign, -S
1644

    
1645
install [OPTIONS] url-to-pki
1646
     -f, --force
1647

    
1648
prepare-portable [OPTIONS]
1649
     -b, --build
1650
     -s, --state
1651

    
1652
mkportable [OPTIONS]
1653
     -b, --build
1654
     -s, --state
1655

    
1656
La version actual a utilizar es:
1657
  %s
1658

    
1659
El directorio root de la estructura de packetes actual es:
1660
  %s
1661
    """ % (VERSION, GVSPKG_ROOT)
1662

    
1663

    
1664
def help(args):
1665
    print """
1666
usage: gvspkg [OPTIONS] COMMANDS
1667

    
1668
OPTIONS:
1669

    
1670
-h|--help
1671
    Muestra esta ayuda
1672

    
1673
-v|--verbose
1674
    Activa el modo verbose
1675

    
1676
-d|--debug
1677
    Activa el modo debug. Se muestran mensajes que pueden ser
1678
    utilies de cara a depuracion.
1679

    
1680
--version version
1681
    Fija la version con la que van a trabajar los comandos indicados.
1682

    
1683
-r|--package-root package-root
1684
    Fija la carpeta en la que va a buscar el raiz del sistema de paquetes
1685
    con el que trabajar
1686
    
1687
COMMANDS:
1688

    
1689
mkinstall [OPTIONS] install-file packages-file
1690

    
1691
    OPTIONS:
1692

    
1693
    -L | --jrelin=path
1694

    
1695
    -W | --jrewin=path
1696

    
1697
    -l | --addjrelin
1698

    
1699
    -w | --addjrewin
1700
    
1701
    -N | --distribution-name=name
1702
      Nombre usado como sufijo del nuevo binario a generar. Por defecto si no se
1703
      indica valdra "custom".
1704

    
1705

    
1706
lsi [OPTIONS]
1707
    Lista los indices disponibles de la version
1708

    
1709
    OPTIONS:
1710

    
1711
    -l | --long-format
1712
        Muestra para cada paquete la informacion del package.info
1713

    
1714
mks [OPTIONS]
1715
     Crea el fichero packages.gvspki con los indices de la
1716
     version y packages.gvspkg con los paquetes.
1717

    
1718
     OPTIONS:
1719

    
1720
     -c | --clear-list
1721
        Elimina la lista de paquetes a utilizar recreandola a partir
1722
        de los paquetes del pool tomando el ultimo build de cada paquete.
1723

    
1724
     --excludepkg pkgcode
1725
        No incluye el paquete indicado en el fichero gvspkg a generar
1726

    
1727
     --excludepki pkgcode
1728
        No incluye el paquete indicado en el fichero gvspki a generar
1729

    
1730
     --exclude pkgcode
1731
        No incluye el paquete indicado en los ficheros gvspkg y gvspki a generar
1732

    
1733
     -s | --include-default-selection
1734
        Incluye el fichero "defaultPackages", que se debe encontrar en el
1735
        directorio corriente, con los nombres de paquetes a seleccionar
1736
        por defecto.
1737

    
1738
     -p | --platform=name
1739
        Indica para que plataforma queremos generar el conjunto de paquetes.
1740
        Es un parametro opcional.
1741
        Sus valores pueden ser:
1742
        - all (Se incluiren los de todas las plataformas, no solo los multiplataforma)
1743
        - x86
1744
        - x86_64
1745
        - amd64 (sinonimo aceptado para x86_64)
1746
        Si no se indica plataforma se generara para "all".
1747
        El indice,"gvspki", siempre llevara los de todas las plataformas, esta opcion
1748
        solo afecta a la genracion del "gvspks".
1749
        
1750
        
1751
     -i | --index-only
1752
        No crea el fichero gvspks, solo crea el gvspki
1753

    
1754
     -I full-path-to-package | --include full-path-to-package
1755
        A�ade el paquete indicado a la lista de paquetes aunque no coincida para
1756
        la version de gvSIG con la que se esta trabajando.
1757

    
1758
mkdist [OPTIONS]
1759
     Crea los ficheros de la distribucion standard para el buil dindicado a partir de
1760
     la distribucion online y los paquetes que hayan en el pool para esta version.
1761
     Ejecuta un "mks" y un "mkhtml" automaticamente para preparar el conjunto de paquetes
1762
     a incluir en la distribucion, y una vez preparados ejecuta un "mkinsrall" por
1763
     S.O. (win y lin), renombrando los ficheros generados segun corresponda.
1764

    
1765
     OPTIONS:
1766
     -s STATE | --state=STATE
1767
        Indica el estado de la distribucion a generar, devel, alpha, ..., debe estar
1768
        deacuerdo con lo que diga el cihero online a usar como base.
1769

    
1770
     -b BUILD | --build=BUILD
1771
        Indica el numero de build de la destribucion a generar. Es usado para localizar
1772
        los ficheros en la carpeta builds de la distribucion y para saber donde debe
1773
        dejar los ficheros generados.
1774

    
1775
     -p | --platform=name
1776
        Indica para que plataforma queremos generar los instalables de gvSIG.
1777
        Es un parametro opcional.
1778
        Sus valores pueden ser:
1779
        - all (si se indica se generara para x86)
1780
        - x86
1781
        - x86_64
1782
        - amd64 (sinonimo aceptado para x86_64)
1783
        Si no se indica plataforma se generara para x86.
1784
        
1785
     -N | --distribution-name=name
1786
        Nombre usado como sufijo del nuevo binario a generar. Por defecto si no se
1787
        indica valdra "standard".
1788

    
1789
     
1790
mkmirror [OPTIONS]
1791

    
1792
  Prepara una carpeta para hacer un mirror de un build en concreto.
1793

    
1794
     OPTIONS:
1795

    
1796
     -b | --build buildnumber
1797
       Indica el numero de build del que se quiere hacer un mirror.
1798

    
1799
mkhtml [OPTIONS]
1800
     ????
1801

    
1802
     OPTIONS:
1803

    
1804
     -c | --clear-list
1805
        Elimina la lista de paquetes a utilizar recreandola a partir
1806
        de los paquetes del pool tomando el ultimo build de cada paquete.
1807

    
1808
     --excludepkg pkgcode
1809
        No incluye el paquete indicado en el fichero gvspkg a generar
1810

    
1811
     --excludepki pkgcode
1812
        No incluye el paquete indicado en el fichero gvspki a generar
1813

    
1814
     --exclude pkgcode
1815
        No incluye el paquete indicado en los ficheros gvspkg y gvspki a generar
1816

    
1817
show OPTIONS package-index
1818
    Muestra el package.info del indice indicado como parametro.
1819

    
1820
    OPTIONS
1821

    
1822
    --verify | -V
1823
      Comprueba la forma del packete.
1824

    
1825
edit [OPTIONS] package-index
1826
    Edita el package.info del indice indicado como parametro.
1827

    
1828
     OPTIONS:
1829

    
1830
     --replace=@search@replace@
1831
       Reemplaza en el package.info de cada paquete la cadena "search" por "replace"
1832
       todas las veces que aparezca. "@" puede ser cualquier caracter que no aparezca
1833
       en "search" y "replace".
1834
       Esta opcion puede indicarse tatas veces como reemplazos se deseen efectuar.
1835

    
1836
     --onlysign
1837
       firma el package.info sin editarlo de forma interactiva (no invoca al editor antes
1838
       de firmarlo).
1839

    
1840
     --sign | -S
1841
       Firma el package.info tras terminar la edicion (bach o interactiva)
1842

    
1843
editall [OPTIONS]
1844
    Edita todos los package.info
1845

    
1846
     OPTIONS:
1847

    
1848
     -c | --clear-list
1849
        Elimina la lista de paquetes a utilizar recreandola a partir
1850
        de los paquetes del pool tomando el ultimo build de cada paquete.
1851

    
1852
     --excludepkg pkgcode
1853
        No incluye el paquete indicado en el fichero gvspkg a generar
1854

    
1855
     --excludepki pkgcode
1856
        No incluye el paquete indicado en el fichero gvspki a generar
1857

    
1858
     --exclude pkgcode
1859
        No incluye el paquete indicado en los ficheros gvspkg y gvspki a generar
1860

    
1861
     --replace=@search@replace@
1862
       Reemplaza en el package.info de cada paquete la cadena "search" por "replace"
1863
       todas las veces que aparezca. "@" puede ser cualquier caracter que no aparezca
1864
       en "search" y "replace".
1865
       Esta opcion puede indicarse tatas veces como reemplazos se deseen efectuar.
1866

    
1867
      --sign | -S
1868
        Firma todos los paquetes que sean oficiales
1869

    
1870
install [OPTIONS] url-to-pki
1871
    descarga de la url indicada un fichero gvspki e instala este junto con su correspondiente
1872
    pkg en el pool local.
1873

    
1874
     OPTIONS:
1875

    
1876
     -f | --force
1877
       fuerza la sobreescritura de los ficheros en caso de que estos ya existan.
1878

    
1879
Si en la carpeta corriente encuentra un fichero gvspkg.options cargara los
1880
flags indicados ahi como flags por defecto para cada comando. El formato del
1881
fichero es:
1882
  main=OPCION-POR-DEFECTO
1883
  mks=OPCOPNES-POR-DEFECTO
1884
Donde main indica las opciones por defecto generales, independientes del comando
1885
a ejecutar. "mks" indica las opciones por defecto a usar en el comando "mks", y
1886
asi sucesivamente, indicando el nombre del comando seguido de un "=" y las opciones
1887
por defecto para ese comando.
1888

    
1889
Por defecto la version la obtiene del nombre de la carpeta
1890
corriente (%s). Las opciones indicadas en el fichero gvspkg.options tienen prioridad
1891
sobre este valor.
1892

    
1893
El directorio root de la estructura de packetes lo buscara en el
1894
sitio indicado por la variable de entorno GVPKG_ROOT, y si esta no
1895
esta establecida usara "%s". Las opciones indicadas en el fichero gvspkg.options
1896
tienen prioridad sobre este valor.
1897

    
1898
    """ % (VERSION, GVSPKG_ROOT)
1899

    
1900
def executeCommand(*args):
1901
    command = "shorthelp"
1902
    if len(args)>0:
1903
        command=args[0]
1904

    
1905
    r=1
1906
    if command=="lsi" :
1907
        r=lsi(args)
1908
    elif command == "mks":
1909
        r=mks(args)
1910
    elif command == "edit":
1911
        r=edit(args)
1912
    elif command == "editall":
1913
        r=editall(args)
1914
    elif command == "show":
1915
        r=show(args)
1916
    elif command == "mkhtml":
1917
        r=mkhtml(args)
1918
    elif command == "mkinstall":
1919
        r=mkinstall(args)
1920
    elif command == "install":
1921
        r=install(args)
1922
    elif command == "mkdist":
1923
        r=mkdist(args)
1924
    elif command == "mkmirror":
1925
        r=mkmirror(args)
1926
    elif command == "mkportable":
1927
        r=mkportable(args)
1928
    elif command == "prepare-portable":
1929
        r=prepare_portable(args)
1930
    elif command == "help":
1931
        r=help(args)
1932
    else:
1933
        r=shorthelp(args)
1934
    return r
1935

    
1936
def main():
1937
    global DEBUG
1938
    global VERSION
1939
    global VERBOSE
1940
    global GVSPKG_ROOT
1941
    global SEARCH_VERSIONS
1942

    
1943
    cmd = Command(sys.argv)
1944
    try:
1945
        opts, args = getopt.getopt(cmd.getArgs("main"), "dhvr:", ["debug", "verbose", "version=", "package-root=","help","search_versions="])
1946
    except getopt.GetoptError, err:
1947
        # print help information and exit:
1948
        print str(err) # will print something like "option -a not recognized"
1949
        shorthelp(None)
1950
        sys.exit(2)
1951

    
1952
    for opt, arg in opts:
1953
        if opt in ("-h", "--help"):
1954
            shorthelp(args)
1955
            sys.exit()
1956
        elif opt in ("-d", "--debug"):
1957
            DEBUG = True
1958
        elif opt in ("-v", "--verbose"):
1959
            VERBOSE = True
1960
        elif opt in ("--version"):
1961
            VERSION = arg
1962
        elif opt in ("--search_versions"):
1963
            SEARCH_VERSIONS.append(arg)
1964
        elif opt in ("-r", "--package-root"):
1965
            GVSPKG_ROOT = arg
1966
        else:
1967
            assert False, "unhandled option"
1968
    #
1969
    debug("DEBUG=%s" % DEBUG)
1970
    debug("VERSION=%s" % VERSION)
1971
    debug("GVSPKG_ROOT=%s" % GVSPKG_ROOT)
1972
    if GVSPKG_ROOT == None:
1973
      shorthelp(None)
1974
    else:
1975
      r=executeCommand(*args)
1976
      sys.exit(r)
1977

    
1978
main()