Statistics
| Revision:

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

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_16.04","x86_64",".run"),
76
  Platform("lin","x86",".run"),
77
  Platform("lin","x86_64",".run"),
78
  Platform("win","x86",".exe"),
79
  Platform("win","x86_64",".exe")
80
)
81

    
82

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

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

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

    
105

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

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

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

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

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

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

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

    
150
def getVersion():
151
    return VERSION
152

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

    
159
def getPackagesRoot():
160
    return GVSPKG_ROOT
161

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

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

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

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

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

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

    
190
class Command:
191

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

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

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

    
218
        f.close()
219

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

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

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

    
252

    
253

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
427
class IndexList(list):
428

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

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

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

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

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

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

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

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

    
501

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

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

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

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

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

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

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

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

    
560

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

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

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

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

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

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

    
592

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

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

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

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

    
647

    
648
    indexes = IndexList()
649

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
787

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
935

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

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

    
970
  sourceUrl = info.getSourceUrl()
971

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

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

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

    
1013

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

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

    
1030

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

    
1040

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

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

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

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

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

    
1077
    do_prepare_portable(build,state)
1078

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1249
    #executeCommand("mkhtml" )
1250

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

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

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

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

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

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

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

    
1283

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

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

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

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

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

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

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

    
1314

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

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

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

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

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

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

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

    
1395
    indexes = IndexList()
1396

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1584

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

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

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

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

    
1612
COMMANDS:
1613

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1681

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

    
1686
OPTIONS:
1687

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

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

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

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

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

    
1705
COMMANDS:
1706

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

    
1709
    OPTIONS:
1710

    
1711
    -L | --jrelin=path
1712

    
1713
    -W | --jrewin=path
1714

    
1715
    -l | --addjrelin
1716

    
1717
    -w | --addjrewin
1718

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

    
1723

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

    
1727
    OPTIONS:
1728

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

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

    
1736
     OPTIONS:
1737

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

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

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

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

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

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

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

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

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

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

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

    
1784

    
1785
mkmirror [OPTIONS]
1786

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

    
1789
     OPTIONS:
1790

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

    
1794
mkhtml [OPTIONS]
1795
     ????
1796

    
1797
     OPTIONS:
1798

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

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

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

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

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

    
1815
    OPTIONS
1816

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

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

    
1823
     OPTIONS:
1824

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

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

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

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

    
1841
     OPTIONS:
1842

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

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

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

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

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

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

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

    
1869
     OPTIONS:
1870

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

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

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

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

    
1893
    """ % (VERSION, GVSPKG_ROOT)
1894

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

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

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

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

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

    
1973
main()
1974

    
1975

    
1976

    
1977

    
1978