Statistics
| Revision:

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

History | View | Annotate | Download (61.5 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
class Platform:
27
  def __init__(self,os,arch,exe,onlinefamily=None, portableSufix=""):
28
    self.osfamily = None
29
    self.osname = None
30
    self.osversion = None
31
    self.os = os
32
    self.arch = arch
33
    self.exe_extension = exe
34
    self.portableSufix = portableSufix
35
    if "_" in self.os:
36
      ss=self.os.split("_")
37
      self.osfamily = ss[0]
38
      if len(ss)>1:
39
        self.osname = ss[1]
40
        if len(ss)>2:
41
          self.osversion= ss[2]
42
    else:
43
      self.osfamily = self.os
44
    if onlinefamily == None:
45
      self.onlinefamily = self.osfamily
46
    else:
47
      self.onlinefamily = onlinefamily
48

    
49
  def getOS(self):
50
    return self.os
51

    
52
  def getOSFamily(self):
53
    return self.osfamily
54

    
55
  def getOSFamilyForOnlineInstaller(self):
56
    return self.onlinefamily
57

    
58
  def getOSName(self):
59
    return self.osname
60

    
61
  def getOSVersion(self):
62
    return self.osversion
63

    
64
  def getArch(self):
65
    return self.arch
66

    
67
  def getExeExtension(self):
68
    return self.exe_extension
69

    
70
  def getPortableSufix(self):
71
    return self.portableSufix
72

    
73
platforms = (
74
  Platform("darwin_macos_10.11","x86_64",".run",onlinefamily="lin", portableSufix=".app"),
75
  Platform("lin_ubuntu_14.04","x86_64",".run"),
76
  Platform("lin_ubuntu_14.04","x86",".run"),
77
  Platform("lin","x86",".run"),
78
  Platform("lin","x86_64",".run"),
79
  Platform("win","x86",".exe"),
80
  Platform("win","x86_64",".exe")
81
)
82

    
83

    
84
def log(msg):
85
  f=open("/tmp/gvspkg.log","a")
86
  f.write(time.ctime())
87
  f.write(": ")
88
  f.write(msg)
89
  f.write("\n")
90
  f.close()
91

    
92
def message(msg):
93
    if VERBOSE:
94
        print msg
95
        sys.stdout.flush()
96
    log(msg)
97

    
98
def msgerror(msg, err=None):
99
    print "ERROR: ", msg
100
    log("ERROR: "+msg)
101
    if err!=None :
102
      print "ERROR: ", str(err)
103
      sys.stdout.flush()
104
      log("ERROR: "+ str(err))
105

    
106

    
107
def msgwarn(msg):
108
    print "WARNING: ", msg
109
    sys.stdout.flush()
110
    log("WARNING: "+ msg)
111

    
112
def debug(msg):
113
    if DEBUG:
114
        print "DEBUG: ", msg
115
        sys.stdout.flush()
116
        log("DEBUG: "+ msg)
117

    
118
def acquire_file(name):
119
  files = list()
120
  folder = os.getcwd()
121
  while folder not in ( None, "", "/"):
122
    pathname = os.path.join(folder,name)
123
    if os.path.exists(pathname):
124
      files.append(pathname)
125
    folder = os.path.dirname(folder)
126
  return files
127

    
128
def get_gvspkg_bin_folder():
129
    files = list()
130
    if os.environ.get("HOME") != None :
131
        files.append(os.path.join(os.environ['HOME'],".gvspkg.bin"))
132
    files.extend( acquire_file(".gvspkg.bin") )
133
    files.extend( acquire_file("gvspkg.bin") )
134
    if len(files)<1 :
135
      return None
136
    debug( "gvspkg.bin = %s" % files[-1])
137
    return files[-1]
138

    
139
def search_GVSPKG_ROOT():
140
  f = get_gvspkg_bin_folder()
141
  if f==None:
142
    return None
143
  return os.path.dirname(f)
144

    
145
RWALL = stat.S_IWOTH | stat.S_IROTH | stat.S_IWUSR | stat.S_IRUSR | stat.S_IWGRP | stat.S_IRGRP
146
RWXALL = RWALL | stat.S_IXUSR | stat.S_IXOTH | stat.S_IXGRP
147

    
148
VERSION = os.path.basename(os.getcwd())
149
GVSPKG_ROOT = search_GVSPKG_ROOT()
150

    
151
def getVersion():
152
    return VERSION
153

    
154
def getSearchVersions():
155
    vers = list();
156
    vers.extend(SEARCH_VERSIONS)
157
    vers.append(VERSION)
158
    return vers
159

    
160
def getPackagesRoot():
161
    return GVSPKG_ROOT
162

    
163
def getPool():
164
    return getPackagesRoot() + "/pool"
165

    
166
def getWeb():
167
    return getPackagesRoot() + "/web"
168

    
169
def getDist():
170
    return getPackagesRoot() + "/dists/" +getVersion()
171

    
172
def findfiles(root,filename):
173
    result=list()
174
    for wroot, dirs, files in os.walk(root):
175
        for f in files :
176
            if fnmatch.fnmatch(f,filename):
177
                result.append(wroot+"/"+f)
178
    result.sort()
179
    return result
180

    
181
def mychmod(filename, perms):
182
    try:
183
        os.chmod(filename,perms)
184
    except Exception, ex:
185
        msgwarn("Can't change permissions of file '%s', error %s" % (filename, str(ex)))
186

    
187
def makedirs(path):
188
    if not os.path.isdir(path) :
189
      os.makedirs(path)
190

    
191
class Command:
192

    
193
    def __init__(self, args):
194
        self.args = args
195
        self.defaultoptions = None
196

    
197
    def load_options(self,filename):
198
        debug("loading option from %s" % filename)
199
        if not os.path.isfile(filename):
200
            debug("filename %s not found" % filename)
201
            return
202
        f=file(filename,"r")
203
        for line in f.readlines():
204
            line = line.strip()
205
            if line=="" or line.startswith("#"):
206
                continue
207
            if line[-1] == "\n":
208
                line = line[:-1]
209
            n = line.find("=")
210
            if n<0 :
211
                continue
212
            cmd = line[:n]
213
            args = line[n+1:].strip()
214

    
215
            if args != "":
216
              self.defaultoptions[cmd] = self.defaultoptions.get(cmd,[]) +  args.split(" ")
217
            debug("add options: %s=%r" % (cmd, args.split(" ")))
218

    
219
        f.close()
220

    
221
    def load_default_options(self):
222
        if self.defaultoptions != None:
223
            return
224
        self.defaultoptions = dict()
225
        options = list();
226
        if GVSPKG_ROOT != None:
227
          rootoptions = os.path.join(GVSPKG_ROOT,"gvspkg.bin/options")
228
        else:
229
          rootoptions = None
230
        if rootoptions != None and os.path.isfile(rootoptions):
231
            options.append(rootoptions)
232
        else:
233
            options.append("~/.gvspkg.bin/options")
234
        options.extend(acquire_file(".gvspkg.options"))
235
        options.extend(acquire_file("gvspkg.options"))
236
        for optionfile in options:
237
          self.load_options(optionfile)
238

    
239
    def getArgs(self,name):
240
        self.load_default_options()
241
        l = list()
242
        cmd = self.defaultoptions.get(name,None)
243
        if cmd != None:
244
          l.extend(cmd)
245
        l.extend(self.args[1:])
246
        return l
247

    
248
def isDigit(s):
249
    if len(s)>1:
250
        s=s[0]
251
    return s in ("0","1","2","3","4","5","6","7","8","9")
252

    
253

    
254

    
255
class PackageInfo(str):
256
    def __init__(self, filename):
257
        self._ini = None
258
        self.filename = filename[:-7]
259
        self.type = filename[-6:]
260
        s = os.path.basename(self.filename)
261
        s = s.split("-")
262
        #print "## PackageInfo ", repr(s)
263
        self.gvsig = s[0] + "-" + s[1]
264
        self.gvsig_version = s[2]
265
        self.code = s[3]
266
        try:
267
  # gvSIG-desktop-1.12.0-com.iver.cit.gvsig.cad-1.12.0-opencadtools-1418-final-all-all-j1_6.gvspkg
268
  #    0 -  1    -  2   -          3           -  4   - 5          -  6 - 7   - 8 - 9 - 10
269
  # gvSIG-desktop-1.12.0-com.iver.cit.gvsig.cad-1.12.0-1418-final-all-all-j1_6.gvspkg
270
  #    0 -  1    -  2   -          3           -  4   - 5  -  6  - 7 - 8 - 9
271

    
272
            if isDigit(s[5]) :
273
                self.version = s[4]
274
                self.build = s[5]
275
                self.status = s[6]
276
                self.os = s[7]
277
                self.arch = s[8]
278
            else:
279
                self.version = s[4] + "-" + s[5]
280
                self.build = s[6]
281
                self.status = s[7]
282
                self.os = s[8]
283
                self.arch = s[9]
284

    
285
        except Exception:
286
            self.build = "0"
287
            self.status = "unknow"
288
            self.os = "all"
289
            self.arch = "all"
290
        try:
291
            self.build = int(self.build)
292
        except:
293
            pass
294

    
295
    def getCode(self):
296
        return self.code
297

    
298
    def getOS(self):
299
        return self.os
300

    
301
    def getArch(self):
302
        return self.arch
303

    
304
    def getKey(self):
305
        return self.code+"-"+self.os+"-"+self.arch
306

    
307
    def getFullName(self):
308
        return os.path.basename(self.filename)
309

    
310
    def getFullVersion(self):
311
        try:
312
          r = re.compile("([0-9]+)[.]([0-9]+)[.]([0-9]+)-([a-zA-Z0-0]+)$")
313
          m = r.match(self.version)
314
          if m == None:
315
            clasificador="ZZZZZZZZ"
316
            r = re.compile("([0-9]+)[.]([0-9]+)[.]([0-9]+)$")
317
            m = r.match(self.version)
318
          else:
319
            clasificador=m.group(4)
320
          v1=int(m.group(1))
321
          v2=int(m.group(2))
322
          v3=int(m.group(3))
323
          return "%06d.%06d.%06d-%s-%06d" % (v1,v2,v3,clasificador,self.build)
324
        except:
325
          if "-" in self.version :
326
            return "%s-%06d" %(self.version,self.build)
327
          else:
328
            return "%s-ZZZZZZZZ-%06d" %(self.version,self.build)
329

    
330
    def getFilename(self):
331
        return self.filename + "." + self.type
332

    
333
    def hasPki(self):
334
        return os.path.isfile( self.getPkiFilename() )
335

    
336
    def getPkiFilename(self):
337
        return self.filename + ".gvspki"
338

    
339
    def hasPkg(self):
340
        return os.path.isfile( self.getPkgFilename() )
341

    
342
    def getPkgFilename(self):
343
        return self.filename + ".gvspkg"
344

    
345
    def getIniOption(self, name, default=None):
346
      section = "general"
347
      ini = self.getIni()
348
      if ini.has_option(section, name):
349
        x = ini.get(section, name)
350
        x = x.replace("\\:", ":")
351
        return x
352
      return default
353

    
354
    def getDescription(self):
355
      return self.getIniOption("description")
356

    
357
    def getCategories(self):
358
      return self.getIniOption("categories")
359

    
360
    def getName(self):
361
      return self.getIniOption("name")
362

    
363
    def getOwner(self):
364
      ini = self.getIni()
365
      if ini.has_option("general","owner"):
366
        return ini.get("general","owner")
367
      return None
368

    
369
    def getUrl(self):
370
      ini = self.getIni()
371
      if ini.has_option("general","download-url"):
372
        return ini.get("general","download-url")
373
      return None
374

    
375
    def getSourceUrl(self):
376
      ini = self.getIni()
377
      if ini.has_option("general","source-url"):
378
        return ini.get("general","source-url")
379
      return None
380

    
381
    def getDependencies(self):
382
      ini = self.getIni()
383
      if ini.has_option("general","dependencies"):
384
        return ini.get("general","dependencies")
385
      return None
386

    
387
    def getType(self):
388
      ini = self.getIni()
389
      if ini.has_option("general","type"):
390
        return ini.get("general","type")
391
      return None
392

    
393
    def getOfficial(self):
394
      ini = self.getIni()
395
      if ini.has_option("general","official"):
396
        return ini.get("general","official")
397
      return None
398

    
399
    def getIni(self):
400
        if self._ini != None:
401
          return self._ini
402
        index_path = self.getPkiFilename()
403
        outputfolder="/tmp/gvspkg.%s" % os.getpid()
404
        os.mkdir(outputfolder)
405
        os.system('unzip -q %s -d %s' % (index_path,outputfolder))
406

    
407
        files = findfiles(outputfolder, "package.info")
408
        if len(files) != 1:
409
            msgerror("Can't locate package.info in pool '%s'." % (index_path))
410
            return None
411

    
412
        package_info = files[0]
413
        self._ini = ConfigParser.ConfigParser()
414
        f = file(package_info,"r")
415
        ss = f.read()
416
        self._ini.readfp(StringIO.StringIO("[general]\n"+ss))
417
        f.close()
418
        shutil.rmtree(outputfolder)
419
        return self._ini
420

    
421
    def __str__(self):
422
        return self.filename
423

    
424
    def __repr__(self):
425
        return "filename=%r:gvsig=%r:gvsig_version=%r:code=%r:version=%r:build=%r:status=%r" % (
426
                self.filename, self.gvsig, self.gvsig_version, self.code, self.version, self.build, self.status )
427

    
428
class IndexList(list):
429

    
430
    def load(self, fname):
431
        message( "Loading index list from '%s'." % fname)
432
        f=file(fname,"r")
433
        lines=f.readlines()
434
        f.close()
435
        for line in lines:
436
          if line[-1] == "\n":
437
            line = line[:-1]
438

    
439
          info = PackageInfo(line)
440
          self.append(info)
441

    
442
    def save(self,fname):
443
        message( "Saving index list from '%s'." % fname)
444
        f=file(fname,"w")
445
        for index in self:
446
          f.write("%s\n" % index.getFilename())
447
        f.close()
448
        mychmod(fname,RWALL)
449

    
450
    def build(self, pool, versions):
451
        message( "Creating index list for version '%s' from '%s'" % (versions, pool) )
452
        packages=dict()
453
        for root, dirs, files in os.walk(pool):
454
            for f in files :
455
                if f[-7:].lower()  in (".gvspki", ".gvspkg") :
456
                    fullpath = root+"/"+f
457
                    info = PackageInfo(fullpath)
458
                    if info.gvsig == "gvSIG-desktop" and info.gvsig_version in versions :
459
                        if packages.get(info.getKey()) == None:
460
                            debug( "build: add    " + repr(info))
461
                            packages[info.getKey()]=info
462
                        else:
463
                            oldinfo = packages[info.getKey()]
464
                            debug("build: %s %s %s" % ( info.getKey(), oldinfo.getFullVersion(),info.getFullVersion()))
465
                            if oldinfo.getFullVersion()<info.getFullVersion()  :
466
                                debug( "build: update "+ repr(oldinfo))
467
                                packages[info.getKey()]=info
468
                    else:
469
                        debug( "build: skip   "+ repr(info))
470
        self.extend(packages.values())
471
        self.sort()
472

    
473
def lsi(args):
474
    cmd = Command(args)
475
    try:
476
        opts, args = getopt.getopt(cmd.getArgs("lsi"), "l", ["long-format"])
477
    except getopt.GetoptError, err:
478
        # print help information and exit:
479
        print str(err) # will print something like "option -a not recognized"
480
        shorthelp(args)
481
        sys.exit(2)
482

    
483
    long_format=False
484
    for opt, arg in opts:
485
        if opt in ("-l", "--long-format"):
486
            long_format = True
487
        else:
488
            assert False, "unhandled option"
489

    
490
    indexes = IndexList()
491
    indexes.build(getPool(), getSearchVersions())
492

    
493
    for info in indexes:
494
        if info.hasPki():
495
            if long_format:
496
                print "["+os.path.basename(info.getPkiFilename())+"]"
497
                print "# ", info.getPkiFilename()
498
                show(["show", os.path.basename(info.getPkiFilename())])
499
            else:
500
                print info.getPkiFilename()
501

    
502

    
503
def installer_add(cmd,arg1,arg2):
504
    installer_add_use_zip(cmd,arg1,arg2)
505

    
506
def installer_add_use_zip(cmd,arg1,arg2):
507
    if cmd == "addjrelin":
508
      return
509

    
510
    if cmd == "addjrewin":
511
      return
512

    
513
    if cmd == "addpks":
514
       zip = zipfile.ZipFile(arg1,"a",zipfile.ZIP_STORED)
515
       zip.write(arg2,"package.gvspks")
516
       zip.close()
517

    
518
def installer_add_use_installkit(cmd,arg1,arg2):
519
    folder = "%s/gvspkg.bin" % GVSPKG_ROOT
520

    
521
    cmd = "%s/installkit %s/main.tcl %s %s %s" % (
522
        "/mnt/data0/public-files/gvsig-desktop/gvspkg.bin",
523
        folder,
524
        cmd,
525
        arg1,
526
        arg2
527
    )
528
    system(cmd)
529

    
530
def mkinstall(args):
531
    cmd = Command(args)
532
    try:
533
        opts, args = getopt.getopt(cmd.getArgs("mkinstall"), "N:lL:wW:", ["addjrewin", "addjrelin", "jrelin=", "jrewin=", "distribution-name="])
534
    except getopt.GetoptError, err:
535
        # print help information and exit:
536
        print str(err) # will print something like "option -a not recognized"
537
        shorthelp(args)
538
        sys.exit(2)
539

    
540
    #print "opts = ",opts
541
    #print "args = ",args
542
    addjrelin=False
543
    addjrewin=False
544
    jrelin=None
545
    jrewin=None
546
    distribution_name = "custom"
547
    for opt, arg in opts:
548
        if opt in ("-L", "--jrelin"):
549
            jrelin = arg
550
        elif opt in ("-W", "--jrewin"):
551
            jrewin = arg
552
        elif opt in ("-l", "--addjrelin"):
553
            addjrelin = True
554
        elif opt in ("-w", "--addjrewin"):
555
            addjrewin = True
556
        elif opt in ("-N", "--distrinution-name"):
557
            distribution_name = arg
558
        else:
559
            assert False, "unhandled option"
560

    
561

    
562
    if len(args) != 2 :
563
        shorthelp(args)
564
        sys.exit(4)
565

    
566
    bin_name = args[0]
567
    gvspks_name = args[1]
568
    custom_name = bin_name.replace("online", distribution_name)
569

    
570
    if not "online" in bin_name :
571
        print "gvspkg mkinstall: binary file name must contain 'online'"
572
        sys.exit(3)
573

    
574
    if addjrelin and addjrewin :
575
        print "gvspkg mkinstall: only one of addjrelin or addjrewin is allowed."
576
        sys.exit(4)
577

    
578
    message("Creating %s..." % custom_name)
579
    shutil.copyfile(bin_name, custom_name)
580
    mychmod(custom_name,RWALL)
581
    message("Adding %s..." % gvspks_name)
582
    installer_add("addpks", custom_name, gvspks_name)
583

    
584
    """
585
    if addjrelin:
586
        withjre_name = bin_name.replace("online", distribution_name+"-withjre")
587
        message("Creating %s..." % withjre_name)
588
        shutil.copyfile(custom_name, withjre_name)
589
        mychmod(withjre_name,RWALL)
590
        message("Adding %s..." % jrelin)
591
        installer_add("addjrelin", withjre_name, jrelin)
592

    
593

    
594
    if addjrewin:
595
        withjre_name = bin_name.replace("online", distribution_name+"-withjre")
596
        message("Creating %s..." % withjre_name)
597
        shutil.copyfile(custom_name, withjre_name)
598
        mychmod(withjre_name,RWALL)
599
        message("Adding %s..." % jrewin)
600
        installer_add("addjrewin", withjre_name, jrewin)
601
    """
602

    
603
def mks(args):
604
    cmd = Command(args)
605
    try:
606
        opts, args = getopt.getopt(cmd.getArgs("mks"), "ixscI:", ["index-only","include-default-selection", "clear-list", "exclude=", "excludepki=", "excludepkg=", "include="])
607
    except getopt.GetoptError, err:
608
        # print help information and exit:
609
        print str(err) # will print something like "option -a not recognized"
610
        shorthelp(args)
611
        sys.exit(2)
612

    
613
    default_selection = None
614
    index_only = False
615
    clear_list=False
616
    includes=list()
617
    excludes_pki=list()
618
    excludes_pkg=list()
619
    for opt, arg in opts:
620
        if opt in ("-c", "--clear-list"):
621
            clear_list = True
622
        elif opt in ("-s", "--include-default-selection"):
623
            default_selection = "defaultPackages"
624
        elif opt in ("-x", "--exclude"):
625
            excludes_pki.append(arg)
626
            excludes_pkg.append(arg)
627
        elif opt in ( "--excludepki"):
628
            excludes_pki.append(arg)
629
        elif opt in ( "--excludepkg"):
630
            excludes_pkg.append(arg)
631
        elif opt in ( "--include", "-I"):
632
            if not os.path.isabs(arg) :
633
              arg = os.path.join(getPool(), arg)
634
            if arg.endswith(".*"):
635
              includes.append(PackageInfo(arg[:-2]+".gvspkg"))
636
              includes.append(PackageInfo(arg[:-2]+".gvspki"))
637
            else:
638
              includes.append(PackageInfo(arg))
639
        elif opt in ("-i", "--index-only"):
640
            index_only = True
641
        else:
642
            assert False, "unhandled option %r" % opt
643

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

    
648

    
649
    indexes = IndexList()
650

    
651
    packages_txt = getDist() +"/packages.txt"
652
    packages_gvspki = getDist() +"/packages.gvspki"
653

    
654
    message( "Creating 'packages.gvspki' for version '%s'" % getVersion() + "...")
655
    if not os.path.exists(getDist()):
656
        msgerror("Can't locate version folder '%s'." % getDist())
657
        sys.exit(3)
658

    
659
    if os.path.exists(packages_txt) and not clear_list:
660
        indexes.load(packages_txt)
661
    else:
662
        indexes.build(getPool(), getSearchVersions())
663
        indexes.save(packages_txt)
664

    
665
    for pkg in includes:
666
      indexes.append(pkg)
667

    
668
    # El indice de paquetes lleva los paquetes para todas las plataformas y sistemas
669
    # ya que al conectarnos a el desde el administrador de complementos ya
670
    # se encarga la aplicacion de seleccionar los correspondientes a la plataforma
671
    # sobre la que esta rodando gvSIG.
672
    message( "Writing 'packages.gvspki' to '%s'" % packages_gvspki )
673
    set = zipfile.ZipFile(packages_gvspki,"w",zipfile.ZIP_STORED)
674
    for info in indexes:
675
        if not ( info.code in excludes_pki or info.getFullName() in excludes_pki ):
676
            debug("Add package '%s'" % info.getPkiFilename())
677
            try:
678
                if info.hasPki() :
679
                    set.write(info.getPkiFilename(), os.path.basename(info.getPkiFilename()))
680
            except Exception, ex:
681
                msgerror("Can't add index '%s', error %s" % (info, str(ex)))
682
        else:
683
            debug("Exclude package '%s'" % info.getFullName())
684
    if default_selection != None :
685
        set.write(default_selection,default_selection)
686
    set.write("packages.properties","packages.properties")
687
    set.close()
688
    mychmod(packages_gvspki,RWALL)
689

    
690
    md5sum(packages_gvspki,packages_gvspki+".md5")
691
    mychmod(packages_gvspki+".md5",RWALL)
692

    
693
    if not index_only :
694
      for platform in platforms:
695
        packages_gvspks = getDist() +"/packages-"+platform.getOS()+"-"+platform.getArch()+".gvspks"
696
        message( "Writing 'packages-"+platform.getOS()+"-"+platform.getArch()+".gvspks' to '%s'" % packages_gvspks )
697
        set = zipfile.ZipFile(packages_gvspks,"w",zipfile.ZIP_STORED)
698
        for info in indexes:
699
            if not ( info.code in excludes_pkg or info.getFullName() in excludes_pkg ):
700
                try:
701
                    if info.hasPkg():
702
                      if info.getOS() in ("all", platform.getOS()) :
703
                        if info.getArch() in ("all", platform.getArch()) :
704
                          set.write(info.getPkgFilename(), os.path.basename(info.getPkgFilename()))
705
                except Exception, ex:
706
                    msgerror("Can't add package '%s', error %s" % (index, str(ex)))
707
            else:
708
                debug("Exclude package '%s'" % info.getFullName())
709
        if default_selection != None :
710
            set.write(default_selection,default_selection)
711
        set.write("packages.properties","packages.properties")
712
        set.close()
713
        mychmod(packages_gvspks,RWALL)
714

    
715
        md5sum(packages_gvspks,packages_gvspks+".md5")
716
        mychmod(packages_gvspks+".md5",RWALL)
717

    
718
    message( "Createds package indexes.\n")
719

    
720
def mkmirror(args):
721
    cmd = Command(args)
722
    try:
723
        opts, args = getopt.getopt(cmd.getArgs("mkmirrot"), "b:", [ "build="])
724
    except getopt.GetoptError, err:
725
        # print help information and exit:
726
        print str(err) # will print something like "option -a not recognized"
727
        shorthelp(args)
728
        sys.exit(2)
729

    
730
    build = None
731
    for opt, arg in opts:
732
        if opt in ("-b", "--build"):
733
            build = arg
734
        else:
735
            assert False, "unhandled option %r" % opt
736

    
737
    if build == None:
738
        msgerror("Build number required.")
739
        sys.exit(3)
740
    domkmirror( getPackagesRoot(),getVersion(),build)
741

    
742
def linkfile(src,dst):
743
  if os.path.lexists(dst):
744
    os.remove(dst)
745
  os.symlink(src,dst)
746
  if os.path.lexists(src+".md5") :
747
    if os.path.lexists(dst+".md5"):
748
      os.remove(dst+".md5")
749
    os.symlink(src+".md5",dst+".md5")
750

    
751
def domkmirror(root_src, version, build):
752
  join = os.path.join
753

    
754
  build = str(build)
755
  root_target = join(root_src,"mirrors",version+"-"+build,"gvsig-desktop")
756
  build_src = join(root_src,"dists",version,"builds",build)
757
  build_target = join(root_target,"dists",version,"builds",build)
758
  pool_src = join(root_src,"pool")
759
  pool_target = join(root_target,"pool")
760

    
761
  makedirs(root_target)
762
  makedirs(build_target)
763
  makedirs(pool_target)
764
  files = os.listdir(build_src)
765
  linkfile(join(build_src,"packages.gvspki"), join(root_target,"dists",version,"packages.gvspki"))
766
  for f in files:
767
    f_src = join(build_src,f)
768
    f_target = join(build_target,f)
769
    if os.path.isfile(f_src):
770
      linkfile(f_src,f_target)
771

    
772
  z = zipfile.ZipFile(join(build_src,"packages.gvspki"))
773
  pkgs = z.namelist()
774
  for pkgname in pkgs:
775
    if pkgname!='defaultPackages':
776
      pkg = PackageInfo(pkgname)
777
      makedirs(join(root_target,"pool",pkg.getCode()))
778
      src = join(root_src,"pool",pkg.getCode(),pkg.getPkgFilename())
779
      target = join(root_target,"pool",pkg.getCode(),pkg.getPkgFilename())
780
      linkfile(src,target)
781
  cmd = "cd %s ; find . ! -type d >%s/files.lst" % (root_target, build_target)
782
  os.system(cmd)
783

    
784
def mkhtml(args):
785
    def getCode(info):
786
      return info.code
787

    
788

    
789
    cmd = Command(args)
790
    try:
791
        opts, args = getopt.getopt(cmd.getArgs("mkhtml"), "xsc", ["clear-list", "exclude=", "excludepki=", "excludepkg=", "include="])
792
    except getopt.GetoptError, err:
793
        # print help information and exit:
794
        print str(err) # will print something like "option -a not recognized"
795
        shorthelp(args)
796
        sys.exit(2)
797

    
798
    index_only = False
799
    clear_list=False
800
    includes=list()
801
    excludes_pki=list()
802
    excludes_pkg=list()
803
    for opt, arg in opts:
804
        if opt in ("-c", "--clear-list"):
805
            clear_list = True
806
        elif opt in ("-x", "--exclude"):
807
            excludes_pki.append(arg)
808
            excludes_pkg.append(arg)
809
        elif opt in ( "--excludepki"):
810
            excludes_pki.append(arg)
811
        elif opt in ( "--excludepkg"):
812
            excludes_pkg.append(arg)
813
        elif opt in ( "--include", "-I"):
814
            includes.append(PackageInfo(arg))
815
        else:
816
            assert False, "unhandled option %r" % opt
817

    
818
    message("Creating html pages...")
819
    indexes = IndexList()
820

    
821
    packages_txt = getDist() +"/packages.txt"
822

    
823
    if os.path.exists(packages_txt) and not clear_list:
824
        indexes.load(packages_txt)
825
    else:
826
        indexes.build(getPool(), getSearchVersions())
827
        indexes.save(packages_txt)
828

    
829
    for pkg in includes:
830
      indexes.append(pkg)
831

    
832
    allpackages = list()
833
    basepath = getWeb()
834
    for info in indexes:
835
        if not ( info.code in excludes_pki or info.getFullName() in excludes_pki ):
836
            try:
837
                if info.hasPki() :
838
                    mkpkihtml(basepath, info)
839
                    allpackages.append(info)
840
            except Exception, ex:
841
                msgerror("Can't create html '%s', error %s" % (info, str(ex)))
842

    
843
    html = '''
844
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
845
<html xmlns="http://www.w3.org/1999/xhtml">
846
<head>
847
  <meta http-equiv="Content-Type" content= "text/html; charset=us-ascii" />
848
      <title>"%s" package list</title>'''% getVersion() # Title
849

    
850
    html += '''
851
<!-- estilos para las tablas -->
852
  <style type="text/css" title="currentStyle">
853
    @import "css/demo_table.css";
854
    @import "css/thickbox.css";
855
    #pkglist{
856
        width:100%;
857
        clear:both;
858
        font-family:Arial,Helvetica,sans-serif;
859
    }
860
    #pkgdetails{
861
        width:600px !important;
862
        clear:both;
863
    }
864
    #pkgdetails table th{
865
        text-algin:right;
866
    }
867
  </style>
868
</head>'''
869

    
870
    html += '''
871
<body>
872
  <h1>%s package list</h1>
873
  <table id="pkglist" summary="%s package list" width="100%%" >
874
    <thead>
875
    <tr>
876
      <td>Package name</td>
877
      <td>Version</td>
878
      <td>O.S.</td>
879
      <td>Official</td>
880
      <td>Type</td>
881
      <td>Owner</td>
882
    </tr>
883
    </thead>
884
    <tbody>'''%(getVersion(),getVersion())
885

    
886
    # sort allpackages
887
    for item in sorted(allpackages, key=getCode):
888
      html += '''\n    <tr>
889
      <td><a class="thickbox" href="%s">%s</a></td>
890
      <td>%s</td>
891
      <td>%s</td>
892
      <td>%s</td>
893
      <td>%s</td>
894
      <td>%s</td>
895
    </tr>\n'''%(
896
  "../../../web/" + item.getFullName() + ".html?height=400&width=600",
897
        item.getName(),
898
  item.version,
899
  item.os,
900
  item.getOfficial(),
901
  item.getType(),
902
  item.getOwner()
903
      )
904
    html += """ </tbody>\n </table>
905
<!--javascript para la visualizacion de la tabla y carga dinamica del contenido del enlace -->
906
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js" type="text/javascript"></script>
907
<script src="http://datatables.net/release-datatables/media/js/jquery.dataTables.js" type="text/javascript"></script>
908
<script type="text/javascript" src="js/thickbox-compressed.js"></script>
909

    
910
<!-- inicializacion de la tabla con cosas chachis -->
911
<script type="text/javascript">
912
  $(document).ready(function() {
913
      $('#pkglist').dataTable( {
914
      "bPaginate": false,
915
      "bLengthChange": true,
916
      "bFilter": true,
917
      "bSort": true,
918
      "bInfo": true,
919
      "bAutoWidth": true
920
    });
921
 } );
922
</script>
923
</body>
924
</html>"""
925

    
926
    # generate index.html
927
    try:
928
      f=file(getDist()+"/web/index.html","w")
929
      f.write(html)
930
      f.close()
931
    except Exception, ex:
932
      raise ex
933

    
934
    message("html pages createds.\n")
935

    
936

    
937
def mkpkihtml(basepath, info):
938
  html='''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
939
<html xmlns="http://www.w3.org/1999/xhtml">
940
<head>
941
  <meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
942
  <title>%s</title>
943
  <!-- estilos para las tablas -->
944
  <style type="text/css" title="currentStyle">
945
    @import "../dists/%s/web/css/demo_table.css";
946
    #pkgdetails{
947
      width:600px;
948
      clear:both;
949
    }
950
    #pkgdetails table th{
951
        text-algin:right;
952
    }
953
  </style>
954
</head>
955
<body>\n'''%(info.getIniOption("name"), getVersion())
956
  html += '  <table id="pkgdetails" summary=%s >\n'%info.getIniOption("name")
957
  html += '    <thead>\n  <tr>\n  <th>%s </th>\n  <td>%s</td>\n  </tr>\n  </thead>\n'%("Name", info.getIniOption("name"))
958
  html += '    <tbody><tr><th>%s </th><td>%s</td></tr>\n'%("Code", info.code)
959
  html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("Version", info.version)
960
  html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("State", info.getIniOption("state"))
961
  html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("Build", info.build)
962
  html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("Owner", info.getOwner())
963

    
964
  #url = info.getUrl()
965
  url = info.getIniOption("download-url")
966
  if url != None:
967
    html += '    <tr><th valing="top">Downloads</th><td><a href ="%s">Binaries</a></td></tr>\n'%(url)
968
  else:
969
    html += '    <tr><th valing="top">Downloads</th><td>Binaries</td></tr>\n'
970

    
971
  sourceUrl = info.getSourceUrl()
972

    
973
  if sourceUrl != None:
974
    html += '    <tr><td></td><td><a href ="%s">Sources</a></td></tr>\n'%(sourceUrl)
975
  else:
976
    html += "    <tr><td></td><td>Sources</td></tr>\n"
977

    
978
  if info.getDependencies() == None:
979
    html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("Dependencies", "")
980
  else:
981
    html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("Dependencies", info.getDependencies().replace("\:",":"))
982
  html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("Type", info.getType())
983
  html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("Official", info.getOfficial())
984
  html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("O.S.", info.getOS())
985
  html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("Architecture", info.getArch())
986
  html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("Categories", info.getCategories())
987

    
988
  description = info.getDescription()
989
  if description == None:
990
    description = ""
991
  description = description.replace("\\n", "<br>")
992
  description = description.replace("\:",":")
993
  html += '    <tr valing="top"><th valing="top">%s </th><td>%s</td></tr>\n'%("Description", description)
994
  html += """  </tbody>\n</table>\n"""
995
  html += """
996
  <!-- javascript para la visualizacion de la tabla -->
997
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript"></script>
998
  <script src="http://datatables.net/release-datatables/media/js/jquery.dataTables.js" type="text/javascript"></script>
999
  <!-- inicializacion de la tabla con cosas chachis -->
1000
  <script type="text/javascript">
1001
    $(document).ready(function() {
1002
      $('#pkgdetails').dataTable( {
1003
        "bPaginate": false,
1004
        "bLengthChange": true,
1005
        "bFilter": false,
1006
        "bSort": false,
1007
        "bInfo": false,
1008
        "bAutoWidth": true
1009
      });
1010
    });
1011
  </script>
1012
  </body>\n</html>"""
1013

    
1014

    
1015
  try:
1016
    f = file(getWeb() + "/" + info.getFullName() + ".html","w")
1017
    f.write(html)
1018
    f.close()
1019
  except Exception, ex:
1020
    raise ex
1021

    
1022
def extract_make_portable(zfile, targetfolder):
1023
  print "Extracting 'make-portable' from %r to %r" % (zfile,targetfolder)
1024
  zf = zipfile.ZipFile(zfile)
1025
  data = zf.read("tools/make-portable")
1026
  f = open(os.path.join(targetfolder,"make-portable"),"wb")
1027
  f.write(data)
1028
  f.close()
1029
  zf.close()
1030

    
1031

    
1032
def extract_mkexec(zfile, targetfolder):
1033
  print "extract_mkexec: zfile=%s, target=%s" % (zfile, os.path.join(targetfolder,"mkexec"))
1034
  zf = zipfile.ZipFile(zfile)
1035
  data = zf.read("tools/mkexec")
1036
  f = open(os.path.join(targetfolder,"mkexec"),"wb")
1037
  f.write(data)
1038
  f.close()
1039
  zf.close()
1040

    
1041

    
1042
def prepare_portable(args):
1043
    cmd = Command(args)
1044
    try:
1045
        opts, args = getopt.getopt(cmd.getArgs("prepare-portable"), "b:s:", [ "build=", "state=" ])
1046
    except getopt.GetoptError, err:
1047
        # print help information and exit:
1048
        print str(err) # will print something like "option -a not recognized"
1049
        shorthelp(args)
1050
        sys.exit(2)
1051

    
1052
    build=None
1053
    state=None
1054
    for opt, arg in opts:
1055
        if opt in ("-b", "--build"):
1056
            build=arg
1057
        elif opt in ("-s", "--state"):
1058
            state=arg
1059
        else:
1060
            assert False, "unhandled option %r" % opt
1061

    
1062
    if build == None:
1063
      print "Requiered option --build not found."
1064
      shorthelp(args)
1065
      sys.exit(2)
1066

    
1067
    if state == None:
1068
      print "Requiered option --state not found."
1069
      shorthelp(args)
1070
      sys.exit(2)
1071

    
1072
    join = os.path.join
1073
    build_folder = join(getPackagesRoot(),"dists",getVersion(),"builds",build)
1074
    if not os.path.isdir(build_folder):
1075
      print "Can't access the build folder "+build_folder+"."
1076
      sys.exit(2)
1077

    
1078
    do_prepare_portable(build,state)
1079

    
1080
def do_prepare_portable(build,state):
1081
    join = os.path.join
1082
    build_folder = join(getPackagesRoot(),"dists",getVersion(),"builds",build)
1083
    portable_folder = join(build_folder,"misc","portable")
1084
    makedirs(portable_folder)
1085
    makedirs(join(portable_folder,"packages","custom"))
1086
    makedirs(join(portable_folder,"standard"))
1087
    makedirs(join(portable_folder,"patchs"))
1088
    f=open(join(portable_folder,"packages","excludes"),"w")
1089
    f.write("""EPSG_v6
1090
EPSG_v8_4
1091
EPSG_v8_5
1092
EPSG_v8_6
1093
org.gvsig.app.document.layout1.app.mainplugin
1094
org.gvsig.dyschromatopsia.app.extension
1095
org.gvsig.educa.portableview.app.editor
1096
org.gvsig.educa.portableview.app.viewer
1097
org.gvsig.projection.app.cresques
1098
org.gvsig.projection.app.proj4j
1099
org.gvsig.editing.app.mainplugin
1100
org.gvsig.downloader.app.mainplugin
1101
org.gvsig.publish.app.mainplugin
1102
org.gvsig.mapsheets.app.mainplugin
1103
org.gvsig.customize.app.mainplugin
1104
org.gvsig.timesupport.app.viewfilter
1105
org.gvsig.timesupport.app.animation
1106
""")
1107
    f.close()
1108
    fname_base = "gvSIG-desktop-%s-%s-%s" % (getVersion(),build,state)
1109
    for platform in platforms :
1110
      linkfile(
1111
        join(build_folder,fname_base + "-" + platform.getOS() + "-" + platform.getArch() + "-online.zip"),
1112
        join(portable_folder,"standard",fname_base + "-" + platform.getOS() + "-" + platform.getArch() + "-online.zip")
1113
      )
1114
      linkfile(
1115
        join(build_folder,fname_base + "-" + platform.getOS() + "-" + platform.getArch() + ".gvspks"),
1116
        join(portable_folder,"standard",fname_base + "-" + platform.getOS() + "-" + platform.getArch() + ".gvspks")
1117
      )
1118
    extract_make_portable(
1119
      join(build_folder,fname_base + "-lin-x86_64-online.zip"),
1120
      join(portable_folder)
1121
    )
1122
    mychmod(join(portable_folder,"make-portable"),RWXALL)
1123

    
1124
def zipfolder(source,target):
1125
  def zipdir(path, zip):
1126
      for root, dirs, files in os.walk(path):
1127
          for file in files:
1128
              zip.write(os.path.join(root, file))
1129
  zipf = zipfile.ZipFile(target, 'w')
1130
  zipdir(source, zipf)
1131
  zipf.close()
1132

    
1133
def removefile(filename):
1134
  if os.path.exists(filename):
1135
    os.remove(filename)
1136

    
1137
def mkportable(args):
1138
    cmd = Command(args)
1139
    try:
1140
        opts, args = getopt.getopt(cmd.getArgs("mkportable"), "b:s:", [ "build=", "state=" ])
1141
    except getopt.GetoptError, err:
1142
        # print help information and exit:
1143
        print str(err) # will print something like "option -a not recognized"
1144
        shorthelp(args)
1145
        sys.exit(2)
1146

    
1147
    build=None
1148
    state=None
1149
    for opt, arg in opts:
1150
        if opt in ("-b", "--build"):
1151
            build=arg
1152
        elif opt in ("-s", "--state"):
1153
            state=arg
1154
        else:
1155
            assert False, "unhandled option %r" % opt
1156

    
1157
    if build == None:
1158
      print "Requiered option --build not found."
1159
      shorthelp(args)
1160
      sys.exit(2)
1161

    
1162
    if state == None:
1163
      print "Requiered option --state not found."
1164
      shorthelp(args)
1165
      sys.exit(2)
1166

    
1167
    join = os.path.join
1168
    build_folder = join(getPackagesRoot(),"dists",getVersion(),"builds",build)
1169
    if not os.path.isdir(build_folder):
1170
      print "Can't access the build folder "+build_folder+"."
1171
      sys.exit(2)
1172

    
1173
    portable_folder = join(build_folder,"misc","portable")
1174
    if not os.path.isdir(portable_folder) :
1175
      do_prepare_portable(build,state)
1176
    os.system('cd %s ; ./make-portable' % (portable_folder))
1177

    
1178
    message("Removing previos portable zip files")
1179
    for platform in platforms :
1180
      removefile(join(build_folder,"gvSIG-desktop-%s-%s-%s-%s-%s%s.zip" %  (
1181
        getVersion(),build,state,platform.getOS(),platform.getArch(), platform.getPortableSufix()
1182
      )))
1183

    
1184
    target_folder = join(getPackagesRoot(),"dists",getVersion(),"builds",build,"misc","portable","target")
1185
    for platform in platforms :
1186
      message("Moving zip gvSIG-desktop-%s-%s-%s-%s-%s%s.zip" % (
1187
        getVersion(),build,state,platform.getOS(),platform.getArch(), platform.getPortableSufix()
1188
      ))
1189
      shutil.move(
1190
        join(portable_folder,"target","gvSIG-desktop-%s-%s-%s-%s-%s%s.zip" % (
1191
        getVersion(), build, state, platform.getOS(), platform.getArch(), platform.getPortableSufix()
1192
    )
1193
  ),
1194
        build_folder
1195
      )
1196
    message("Remove temporary folders")
1197
    shutil.rmtree(target_folder)
1198

    
1199
def mkexec(version, build, state, distribution_name, folder):
1200
  fname = "gvSIG-desktop-%s-%s-%s-lin-x86_64-online.zip" % (version,build,state)
1201
  extract_mkexec(os.path.join(folder,fname), folder)
1202
  mychmod(os.path.join(folder,"mkexec"),RWXALL)
1203
  cmd = 'cd %s ; ./mkexec "%s" "%s" "%s" "%s" "%s"' % (folder,version, build, state, distribution_name, folder)
1204
  print "mkexec: cmd=", cmd
1205
  os.system(cmd)
1206
  os.remove(os.path.join(folder,"mkexec"))
1207

    
1208
def mkdist(args):
1209
    cmd = Command(args)
1210
    try:
1211
        opts, args = getopt.getopt(cmd.getArgs("mkdist"), "b:s:", [ "build=", "state=", "distribution_name=" ])
1212
    except getopt.GetoptError, err:
1213
        # print help information and exit:
1214
        print str(err) # will print something like "option -a not recognized"
1215
        shorthelp(args)
1216
        sys.exit(2)
1217

    
1218
    build=None
1219
    state=None
1220
    distribution_name = "standard"
1221

    
1222
    for opt, arg in opts:
1223
        if opt in ("-b", "--build"):
1224
            build=arg
1225
        elif opt in ("-s", "--state"):
1226
            state=arg
1227
        elif opt in ("-N", "--distrinution-name"):
1228
            distribution_name = arg
1229
        else:
1230
            assert False, "unhandled option %r" % opt
1231

    
1232
    if build == None:
1233
      print "Requiered option --build not found."
1234
      shorthelp(args)
1235
      sys.exit(2)
1236

    
1237
    if state == None:
1238
      print "Requiered option --state not found."
1239
      shorthelp(args)
1240
      sys.exit(2)
1241

    
1242
    if not os.path.isdir("builds/"+build):
1243
      print "Can't access the build folder builds/"+build+"."
1244
      sys.exit(2)
1245

    
1246
    message( "Generating distribution for build "+ build + "...")
1247
    message("Recreating index of packages...")
1248
    executeCommand("mks", "-s", "-c")
1249

    
1250
    #executeCommand("mkhtml" )
1251

    
1252
    gvspki_filename = "builds/"+build+"/packages.gvspki"
1253
    message( "Coping packages.gvspki to "+ gvspki_filename + "\n")
1254
    shutil.copyfile("packages.gvspki", gvspki_filename)
1255
    shutil.copyfile("packages.gvspki.md5", gvspki_filename +".md5")
1256

    
1257
    for platform in platforms:
1258
        message( "Creating installers for platform "+platform.getOS()+"/"+platform.getArch()+"...")
1259
        gvspks_filename = "builds/"+build+"/gvSIG-desktop-" + VERSION + "-" + build+ "-" + state + "-"+platform.getOS()+"-"+platform.getArch()+".gvspks"
1260
        online_filename = "builds/"+build+"/gvSIG-desktop-" + VERSION + "-" + build+ "-" + state + "-"+platform.getOS()+"-"+platform.getArch() + "-online.jar"
1261

    
1262
        if not os.path.isfile(online_filename):
1263
          osfamily=platform.getOSFamilyForOnlineInstaller()
1264
          message("Coping standard online installer from os family (%s) to %s." % (osfamily, online_filename))
1265
          shutil.copyfile(
1266
            "builds/"+build+"/gvSIG-desktop-" + VERSION + "-" + build+ "-" + state + "-"+osfamily+"-"+platform.getArch() + "-online.jar",
1267
            online_filename
1268
          )
1269

    
1270
        if not os.path.isfile(online_filename):
1271
          msgwarn("Can't access the online installer for "+platform.getOS()+"/"+platform.getArch() + " ("+online_filename+").")
1272
          continue
1273

    
1274
        message( "Coping packages-"+platform.getOS()+"-"+platform.getArch()+".gvspks to "+ gvspks_filename)
1275
        shutil.copyfile("packages-"+platform.getOS()+"-"+platform.getArch()+".gvspks", gvspks_filename)
1276
        shutil.copyfile("packages-"+platform.getOS()+"-"+platform.getArch()+".gvspks.md5", gvspks_filename +".md5")
1277

    
1278
        message( "Add execution permissions to online installers....")
1279
        mychmod(online_filename,RWXALL)
1280

    
1281
        md5sum(online_filename,online_filename+".md5")
1282
        mychmod(online_filename+".md5",RWALL)
1283

    
1284

    
1285
        executeCommand("mkinstall" , online_filename, gvspks_filename)
1286

    
1287
        message( "Renaming files from custom to standard...")
1288
        target_filename = "builds/"+build+"/gvSIG-desktop-" + VERSION + "-" + build+ "-" + state + "-"+platform.getOS()+"-"+platform.getArch()+"-"+distribution_name + ".jar"
1289
        shutil.move(
1290
            "builds/"+build+"/gvSIG-desktop-" + VERSION + "-" + build+ "-" + state + "-"+platform.getOS()+"-"+platform.getArch() + "-custom.jar",
1291
            target_filename
1292
        )
1293
        mychmod(target_filename,RWXALL)
1294

    
1295
        md5sum(target_filename,target_filename+".md5")
1296
        mychmod(target_filename+".md5",RWALL)
1297

    
1298
        message( "Createds installers for platform "+platform.getOS()+"/"+platform.getArch()+"\n")
1299

    
1300
    mkexec(VERSION, build, state, distribution_name, os.path.join(os.getcwd(), "builds", build))
1301

    
1302
    #message( "Coping html index to browse paqueges of the distro.")
1303
    #shutil.rmtree("builds/"+build+"/web", ignore_errors=True)
1304
    #shutil.copytree("web", "builds/"+build+"/web")
1305
    #f = file("builds/"+build+"/web/index.html","r")
1306
    #contents = f.read()
1307
    #f.close()
1308
    #contents = contents.replace("href=\"../../../web/gvSIG-desktop-", "href=\"../../../../../web/gvSIG-desktop-")
1309
    #f = file("builds/"+build+"/web/index.html","w")
1310
    #f.write(contents)
1311
    #f.close()
1312

    
1313
    message( "\nCreation of distribution completed.\n")
1314

    
1315

    
1316
def show(args):
1317
    cmd = Command(args)
1318
    try:
1319
        opts, args = getopt.getopt(cmd.getArgs("show"), "S", [ "verify"])
1320
    except getopt.GetoptError, err:
1321
        # print help information and exit:
1322
        print str(err) # will print something like "option -a not recognized"
1323
        shorthelp(args)
1324
        sys.exit(2)
1325

    
1326
    eerify = False
1327
    for opt, arg in opts:
1328
        if opt in ("-V", "--verify"):
1329
            verify = True
1330
        else:
1331
            assert False, "unhandled option %r" % opt
1332

    
1333
    index_name=args[0]
1334
    message( "Show package.info from '%s'" % index_name)
1335
    files = findfiles(getPool(), index_name)
1336
    if len(files) != 1:
1337
        msgerror("Can't locate package '%s' in pool '%s'." % (index_name, getPool()))
1338
        return
1339
    index_path = files[0]
1340
    outputfolder="/tmp/gvspkg.%s" % os.getpid()
1341
    os.mkdir(outputfolder)
1342
    os.system('unzip -q %s -d %s' % (index_path,outputfolder))
1343

    
1344
    files = findfiles(outputfolder, "package.info")
1345
    if len(files) != 1:
1346
        msgerror("Can't locate package.info in pool '%s'." % (index_name))
1347
        return
1348

    
1349
    package_info = files[0]
1350
    f = file(package_info,"r")
1351
    s = f.read()
1352
    f.close()
1353
    print s
1354
    if verify:
1355
      verify_sign(package_info)
1356
    shutil.rmtree(outputfolder)
1357

    
1358
def editall(args):
1359
    cmd = Command(args)
1360
    try:
1361
        opts, args = getopt.getopt(cmd.getArgs("editall"), "Scx:I:r:", ["clear-list", "exclude=", "excludepki=", "excludepkg=", "include=", "replace=", "sign"])
1362
    except getopt.GetoptError, err:
1363
        # print help information and exit:
1364
        print str(err) # will print something like "option -a not recognized"
1365
        shorthelp(args)
1366
        sys.exit(2)
1367

    
1368
    index_only = False
1369
    clear_list=False
1370
    includes=list()
1371
    excludes_pki=list()
1372
    replaces = list()
1373
    excludes_pkg=list()
1374
    sign = False
1375
    interactive = True
1376
    for opt, arg in opts:
1377
        if opt in ("-c", "--clear-list"):
1378
            clear_list = True
1379
        elif opt in ("-x", "--exclude"):
1380
            excludes_pki.append(arg)
1381
            excludes_pkg.append(arg)
1382
        elif opt in ( "--excludepki"):
1383
            excludes_pki.append(arg)
1384
        elif opt in ( "--excludepkg"):
1385
            excludes_pkg.append(arg)
1386
        elif opt in ( "--include", "-I"):
1387
            includes.append(PackageInfo(arg))
1388
        elif opt in ("-r", "--replace"):
1389
            interactive = False
1390
            replaces.append(arg)
1391
        elif opt in ("-S", "--sign"):
1392
            sign = True
1393
        else:
1394
            assert False, "unhandled option %r" % opt
1395

    
1396
    indexes = IndexList()
1397

    
1398
    packages_txt = getDist() +"/packages.txt"
1399
    if os.path.exists(packages_txt) and not clear_list:
1400
        indexes.load(packages_txt)
1401
    else:
1402
        indexes.build(getPool(), getSearchVersions())
1403
        indexes.save(packages_txt)
1404

    
1405
    for pkg in includes:
1406
      indexes.append(pkg)
1407

    
1408
    allpackages = list()
1409
    for info in indexes:
1410
        if not ( info.code in excludes_pki or info.getFullName() in excludes_pki ):
1411
            try:
1412
                if info.hasPki() :
1413
                  print info.getPkiFilename()
1414
                  if interactive :
1415
                    edit_pkginfo_of_package(info.getPkiFilename(), edit_ui)
1416
                  elif len(replaces) < 1:
1417
                    edit_pkginfo_of_package(info.getPkiFilename(), edit_replace, replaces)
1418

    
1419
                  if sign:
1420
                    edit_pkginfo_of_package(info.getPkiFilename(), edit_sign)
1421

    
1422
            except Exception, ex:
1423
                msgerror("Can't add index '%s', error %s" % (info, str(ex)))
1424

    
1425
def edit(args):
1426
    cmd = Command(args)
1427
    try:
1428
        opts, args = getopt.getopt(cmd.getArgs("edit"), "Sr:", [ "replace=", "onlysign", "sign" ])
1429
    except getopt.GetoptError, err:
1430
        # print help information and exit:
1431
        print str(err) # will print something like "option -a not recognized"
1432
        shorthelp(args)
1433
        sys.exit(2)
1434

    
1435
    replaces = list()
1436
    interactive = True
1437
    sign = False
1438
    for opt, arg in opts:
1439
        if opt in ("-r", "--replace"):
1440
            interactive = False
1441
            replaces.append(arg)
1442
        elif opt in ("--onlysign"):
1443
            interactive = False
1444
            sign = True
1445
        elif opt in ("-S", "--sign"):
1446
            sign = True
1447
        else:
1448
            assert False, "unhandled option %r" % opt
1449

    
1450
    index_name=args[0]
1451
    message( "Show package.info from '%s'" % index_name)
1452
    files = findfiles(getPool(), index_name)
1453
    if len(files) != 1:
1454
        msgerror("Can't locate package '%s' in pool '%s'." % (index_name, getPool()))
1455
        return
1456
    index_path = files[0]
1457
    if interactive:
1458
      edit_pkginfo_of_package(index_path, edit_ui)
1459
    elif len(replaces) < 1:
1460
      edit_pkginfo_of_package(index_path, edit_replace, replaces)
1461

    
1462
    if sign:
1463
      edit_pkginfo_of_package(index_path, edit_sign)
1464

    
1465
def edit_ui(filename, args):
1466
      os.system('vi "%s"' % filename)
1467

    
1468
def edit_replace(filename, args):
1469
      replaces = args[0]
1470
      f = open(filename)
1471
      s = f.read()
1472
      f.close()
1473
      for replace in replaces:
1474
        x = replace.split(replace[0])
1475
        if len(x)==4:
1476
          s=re.sub(x[1],x[2],s)
1477
      f = open(filename,"w")
1478
      f.write(s)
1479
      f.close()
1480

    
1481
def edit_sign(filename, args):
1482
      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' %  (
1483
        get_gvspkg_bin_folder(),
1484
        get_gvspkg_bin_folder(),
1485
        filename)
1486
      )
1487

    
1488
def verify_sign(filename):
1489
      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' % (
1490
        get_gvspkg_bin_folder(),
1491
        get_gvspkg_bin_folder(),
1492
        filename)
1493
      )
1494

    
1495
def edit_pkginfo_of_package(pkg_path, operation, *args):
1496
    outputfolder="/tmp/gvspkg.%s" % os.getpid()
1497
    os.mkdir(outputfolder)
1498
    os.system('unzip -q %s -d %s' % (pkg_path,outputfolder))
1499

    
1500
    files = findfiles(outputfolder, "package.info")
1501
    if len(files) != 1:
1502
        msgerror("Can't locate package.info in pool '%s'." % (pkg_path))
1503
        return
1504

    
1505
    package_info = files[0]
1506
    code = package_info.split("/")[-2]
1507
    operation(package_info, args)
1508

    
1509
    # zip -Dr kk.zip org.gvsig.wfs
1510
    temp_index_name = "/tmp/packages.gvspki.%s" % os.getpid()
1511
    temp_index = zipfile.ZipFile(temp_index_name,"w",zipfile.ZIP_STORED)
1512
    temp_index.write(package_info, "%s/package.info" % (code))
1513
    temp_index.close()
1514
    shutil.rmtree(outputfolder)
1515
    os.remove(pkg_path)
1516
    shutil.move(temp_index_name,pkg_path)
1517

    
1518
def install(args):
1519
    cmd = Command(args)
1520
    try:
1521
        opts, args = getopt.getopt(cmd.getArgs("install"), "fS", [ "force","nohttps" ])
1522
    except getopt.GetoptError, err:
1523
        # print help information and exit:
1524
        print str(err) # will print something like "option -a not recognized"
1525
        shorthelp(args)
1526
        sys.exit(2)
1527

    
1528
    force = False
1529
    nohttps = False
1530
    for opt, arg in opts:
1531
        if opt in ("-f", "--force"):
1532
            force = True
1533
        if opt in ("-S", "--nohttps"):
1534
            nohttps = True
1535
        else:
1536
            assert False, "unhandled option %r" % opt
1537

    
1538
    url_pki = args[0]
1539
    if url_pki.startswith("https:") and nohttps :
1540
       url_pki = "http:" + url_pki[6:]
1541

    
1542
    message( "Download package index '%s'" % url_pki)
1543
    temppath_pki= os.path.join("/tmp",os.path.basename(url_pki))
1544
    if not downloadFile(url_pki,temppath_pki):
1545
      msgerror("Can't download index.")
1546
      msgerror("Can't install '%s'." % url_pki)
1547
      print # force a newline
1548
      return 1
1549
    pkg = PackageInfo(temppath_pki)
1550
    url_pkg = pkg.getUrl().replace("\\","")
1551
    if url_pkg[-7:] == ".gvspki" :
1552
      msgwarn("Suspicious download-url value. Ends with gvspki, expected gvspkg.")
1553
      msgwarn("download-url ='%s'." % url_pkg)
1554

    
1555
    if url_pkg.startswith("https:") and nohttps :
1556
       url_pkg = "http:" + url_pkg[6:]
1557

    
1558
    message( "Download package '%s'" % url_pkg)
1559
    temppath_pkg= os.path.join("/tmp",os.path.basename(url_pkg))
1560
    if not downloadFile(url_pkg,temppath_pkg):
1561
      msgerror("Can't download package from download-url ('%s')." % url_pkg)
1562
      msgerror("Can't install '%s'," % url_pki)
1563
      print # force a newline
1564
      return 1
1565
    folder = os.path.join(getPool(),pkg.getCode())
1566
    makedirs(folder)
1567
    pathname_pki = os.path.join(folder,os.path.basename(url_pki))
1568
    if not force and os.path.isfile(pathname_pki) :
1569
        msgwarn("The package index alreade exist in the pool. Use -f to forrce install.")
1570
        print # force a newline
1571
        return 1
1572
    pathname_pkg = os.path.join(folder,os.path.basename(url_pkg))
1573
    if  not force and os.path.isfile(pathname_pki) :
1574
        msgwarn("The package downloaded from download-url alredy exists in the pool. Use -f to force install.")
1575
        print # force a newline
1576
        return 1
1577
    message( "installing package '%s'" % os.path.basename(pathname_pki))
1578
    shutil.copyfile(temppath_pki, pathname_pki)
1579
    message( "installing package '%s'" % os.path.basename(pathname_pkg))
1580
    shutil.copyfile(temppath_pkg, pathname_pkg)
1581

    
1582
    md5sum(pathname_pki, pathname_pki+".md5")
1583
    md5sum(pathname_pkg, pathname_pkg+".md5")
1584

    
1585

    
1586
def md5sum(fin, fout):
1587
    message( "Calculating md5sum of %s..." % fin )
1588
    system("md5sum -b %s >%s" % (fin, fout) )
1589

    
1590
def downloadFile(url,path):
1591
  try:
1592
    fsrc = urllib2.urlopen(url)
1593
  except urllib2.HTTPError,e:
1594
    msgerror("Error abriendo url '%s'." % url, e)
1595
    return False
1596
  fdst = file(path,"wb")
1597
  shutil.copyfileobj(fsrc,fdst)
1598
  fdst.close()
1599
  fsrc.close()
1600
  return True
1601

    
1602
def shorthelp(args):
1603
    print """
1604
usage: gvspkg [OPTIONS] COMMANDS
1605
OPTIONS:
1606

    
1607
-h,--help       Muestra esta ayuda
1608
-v,--verbose    Activa el modo verbose
1609
-d,--debug      Activa el modo debug.
1610
--version ver   Fija la version con la que van a trabajar.
1611
-r,--package-root root    Fija la carpeta del raiz del sistema de paquetes
1612

    
1613
COMMANDS:
1614

    
1615
mkinstall [OPTIONS] install-file packages-file
1616
    -L, --jrelin=path
1617
    -W, --jrewin=path
1618
    -l, --addjrelin
1619
    -w, --addjrewin
1620
    -N, --distribution-name=name
1621

    
1622
lsi [OPTIONS]
1623
    -l, --long-format
1624

    
1625
mks [OPTIONS]
1626
     -c, --clear-list
1627
     --excludepkg pkgcode
1628
     --excludepki pkgcode
1629
     --exclude pkgcode
1630
     -s, --include-default-selection
1631
     -i, --index-only
1632
     -I full-path-to-package, --include full-path-to-package
1633

    
1634
mkdist [OPTIONS]
1635
     -s STATE, --state=STATE
1636
     -b BUILD, --build=BUILD
1637
     -N, --distribution-name=name
1638

    
1639
mkmirror [OPTIONS]
1640
     -b, --build buildnumber
1641

    
1642
mkhtml [OPTIONS]
1643
     -c, --clear-list
1644
     --excludepkg pkgcode
1645
     --excludepki pkgcode
1646
     --exclude pkgcode
1647

    
1648
show OPTIONS package-index
1649
    --verify, -V
1650

    
1651
edit [OPTIONS] package-index
1652
     --replace=@search@replace@
1653
     --onlysign
1654
     --sign, -S
1655

    
1656
editall [OPTIONS]
1657
     -c, --clear-list
1658
     --excludepkg pkgcode
1659
     --excludepki pkgcode
1660
     --exclude pkgcode
1661
     --replace=@search@replace@
1662
     --sign, -S
1663

    
1664
install [OPTIONS] url-to-pki
1665
     -f, --force
1666

    
1667
prepare-portable [OPTIONS]
1668
     -b, --build
1669
     -s, --state
1670

    
1671
mkportable [OPTIONS]
1672
     -b, --build
1673
     -s, --state
1674

    
1675
La version actual a utilizar es:
1676
  %s
1677

    
1678
El directorio root de la estructura de packetes actual es:
1679
  %s
1680
    """ % (VERSION, GVSPKG_ROOT)
1681

    
1682

    
1683
def help(args):
1684
    print """
1685
usage: gvspkg [OPTIONS] COMMANDS
1686

    
1687
OPTIONS:
1688

    
1689
-h|--help
1690
    Muestra esta ayuda
1691

    
1692
-v|--verbose
1693
    Activa el modo verbose
1694

    
1695
-d|--debug
1696
    Activa el modo debug. Se muestran mensajes que pueden ser
1697
    utilies de cara a depuracion.
1698

    
1699
--version version
1700
    Fija la version con la que van a trabajar los comandos indicados.
1701

    
1702
-r|--package-root package-root
1703
    Fija la carpeta en la que va a buscar el raiz del sistema de paquetes
1704
    con el que trabajar
1705

    
1706
COMMANDS:
1707

    
1708
mkinstall [OPTIONS] install-file packages-file
1709

    
1710
    OPTIONS:
1711

    
1712
    -L | --jrelin=path
1713

    
1714
    -W | --jrewin=path
1715

    
1716
    -l | --addjrelin
1717

    
1718
    -w | --addjrewin
1719

    
1720
    -N | --distribution-name=name
1721
      Nombre usado como sufijo del nuevo binario a generar. Por defecto si no se
1722
      indica valdra "custom".
1723

    
1724

    
1725
lsi [OPTIONS]
1726
    Lista los indices disponibles de la version
1727

    
1728
    OPTIONS:
1729

    
1730
    -l | --long-format
1731
        Muestra para cada paquete la informacion del package.info
1732

    
1733
mks [OPTIONS]
1734
     Crea el fichero packages.gvspki con los indices de la
1735
     version y packages.gvspkg con los paquetes.
1736

    
1737
     OPTIONS:
1738

    
1739
     -c | --clear-list
1740
        Elimina la lista de paquetes a utilizar recreandola a partir
1741
        de los paquetes del pool tomando el ultimo build de cada paquete.
1742

    
1743
     --excludepkg pkgcode
1744
        No incluye el paquete indicado en el fichero gvspkg a generar
1745

    
1746
     --excludepki pkgcode
1747
        No incluye el paquete indicado en el fichero gvspki a generar
1748

    
1749
     --exclude pkgcode
1750
        No incluye el paquete indicado en los ficheros gvspkg y gvspki a generar
1751

    
1752
     -s | --include-default-selection
1753
        Incluye el fichero "defaultPackages", que se debe encontrar en el
1754
        directorio corriente, con los nombres de paquetes a seleccionar
1755
        por defecto.
1756

    
1757
     -i | --index-only
1758
        No crea el fichero gvspks, solo crea el gvspki
1759

    
1760
     -I full-path-to-package | --include full-path-to-package
1761
        Agrega el paquete indicado a la lista de paquetes aunque no coincida para
1762
        la version de gvSIG con la que se esta trabajando.
1763

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

    
1771
     OPTIONS:
1772
     -s STATE | --state=STATE
1773
        Indica el estado de la distribucion a generar, devel, alpha, ..., debe estar
1774
        deacuerdo con lo que diga el cihero online a usar como base.
1775

    
1776
     -b BUILD | --build=BUILD
1777
        Indica el numero de build de la destribucion a generar. Es usado para localizar
1778
        los ficheros en la carpeta builds de la distribucion y para saber donde debe
1779
        dejar los ficheros generados.
1780

    
1781
     -N | --distribution-name=name
1782
        Nombre usado como sufijo del nuevo binario a generar. Por defecto si no se
1783
        indica valdra "standard".
1784

    
1785

    
1786
mkmirror [OPTIONS]
1787

    
1788
  Prepara una carpeta para hacer un mirror de un build en concreto.
1789

    
1790
     OPTIONS:
1791

    
1792
     -b | --build buildnumber
1793
       Indica el numero de build del que se quiere hacer un mirror.
1794

    
1795
mkhtml [OPTIONS]
1796
     ????
1797

    
1798
     OPTIONS:
1799

    
1800
     -c | --clear-list
1801
        Elimina la lista de paquetes a utilizar recreandola a partir
1802
        de los paquetes del pool tomando el ultimo build de cada paquete.
1803

    
1804
     --excludepkg pkgcode
1805
        No incluye el paquete indicado en el fichero gvspkg a generar
1806

    
1807
     --excludepki pkgcode
1808
        No incluye el paquete indicado en el fichero gvspki a generar
1809

    
1810
     --exclude pkgcode
1811
        No incluye el paquete indicado en los ficheros gvspkg y gvspki a generar
1812

    
1813
show OPTIONS package-index
1814
    Muestra el package.info del indice indicado como parametro.
1815

    
1816
    OPTIONS
1817

    
1818
    --verify | -V
1819
      Comprueba la forma del packete.
1820

    
1821
edit [OPTIONS] package-index
1822
    Edita el package.info del indice indicado como parametro.
1823

    
1824
     OPTIONS:
1825

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

    
1832
     --onlysign
1833
       firma el package.info sin editarlo de forma interactiva (no invoca al editor antes
1834
       de firmarlo).
1835

    
1836
     --sign | -S
1837
       Firma el package.info tras terminar la edicion (bach o interactiva)
1838

    
1839
editall [OPTIONS]
1840
    Edita todos los package.info
1841

    
1842
     OPTIONS:
1843

    
1844
     -c | --clear-list
1845
        Elimina la lista de paquetes a utilizar recreandola a partir
1846
        de los paquetes del pool tomando el ultimo build de cada paquete.
1847

    
1848
     --excludepkg pkgcode
1849
        No incluye el paquete indicado en el fichero gvspkg a generar
1850

    
1851
     --excludepki pkgcode
1852
        No incluye el paquete indicado en el fichero gvspki a generar
1853

    
1854
     --exclude pkgcode
1855
        No incluye el paquete indicado en los ficheros gvspkg y gvspki a generar
1856

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

    
1863
      --sign | -S
1864
        Firma todos los paquetes que sean oficiales
1865

    
1866
install [OPTIONS] url-to-pki
1867
    descarga de la url indicada un fichero gvspki e instala este junto con su correspondiente
1868
    pkg en el pool local.
1869

    
1870
     OPTIONS:
1871

    
1872
     -f | --force
1873
       fuerza la sobreescritura de los ficheros en caso de que estos ya existan.
1874

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

    
1885
Por defecto la version la obtiene del nombre de la carpeta
1886
corriente (%s). Las opciones indicadas en el fichero gvspkg.options tienen prioridad
1887
sobre este valor.
1888

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

    
1894
    """ % (VERSION, GVSPKG_ROOT)
1895

    
1896
def executeCommand(*args):
1897
    command = "shorthelp"
1898
    if len(args)>0:
1899
        command=args[0]
1900

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

    
1932
def main():
1933
    global DEBUG
1934
    global VERSION
1935
    global VERBOSE
1936
    global GVSPKG_ROOT
1937
    global SEARCH_VERSIONS
1938

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

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

    
1974
main()
1975

    
1976