Statistics
| Revision:

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

History | View | Annotate | Download (61.3 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.close()
686
    mychmod(packages_gvspki,RWALL)
687

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

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

    
712
        md5sum(packages_gvspks,packages_gvspks+".md5")
713
        mychmod(packages_gvspks+".md5",RWALL)
714

    
715
    message( "Createds package indexes.\n")
716

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

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

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

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

    
748
def domkmirror(root_src, version, build):
749
  join = os.path.join
750

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

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

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

    
781
def mkhtml(args):
782
    def getCode(info):
783
      return info.code
784

    
785

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

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

    
815
    message("Creating html pages...")
816
    indexes = IndexList()
817

    
818
    packages_txt = getDist() +"/packages.txt"
819

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

    
826
    for pkg in includes:
827
      indexes.append(pkg)
828

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

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

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

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

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

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

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

    
931
    message("html pages createds.\n")
932

    
933

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

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

    
968
  sourceUrl = info.getSourceUrl()
969

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

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

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

    
1011

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

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

    
1028

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

    
1038

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

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

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

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

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

    
1075
    do_prepare_portable(build,state)
1076

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

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

    
1130
def removefile(filename):
1131
  if os.path.exists(filename):
1132
    os.remove(filename)
1133

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

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

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

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

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

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

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

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

    
1192
def mkexec(version, build, state, distribution_name, folder):
1193
  fname = "gvSIG-desktop-%s-%s-%s-lin-x86_64-online.zip" % (version,build,state)
1194
  extract_mkexec(os.path.join(folder,fname), folder)
1195
  mychmod(os.path.join(folder,"mkexec"),RWXALL)
1196
  cmd = 'cd %s ; ./mkexec "%s" "%s" "%s" "%s" "%s"' % (folder,version, build, state, distribution_name, folder)
1197
  print "mkexec: cmd=", cmd
1198
  os.system(cmd)
1199
  os.remove(os.path.join(folder,"mkexec"))
1200

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

    
1211
    build=None
1212
    state=None
1213
    distribution_name = "standard"
1214

    
1215
    for opt, arg in opts:
1216
        if opt in ("-b", "--build"):
1217
            build=arg
1218
        elif opt in ("-s", "--state"):
1219
            state=arg
1220
        elif opt in ("-N", "--distrinution-name"):
1221
            distribution_name = arg
1222
        else:
1223
            assert False, "unhandled option %r" % opt
1224

    
1225
    if build == None:
1226
      print "Requiered option --build not found."
1227
      shorthelp(args)
1228
      sys.exit(2)
1229

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

    
1235
    if not os.path.isdir("builds/"+build):
1236
      print "Can't access the build folder builds/"+build+"."
1237
      sys.exit(2)
1238

    
1239
    message( "Generating distribution for build "+ build + "...")
1240
    message("Recreating index of packages...")
1241
    executeCommand("mks", "-s", "-c")
1242

    
1243
    executeCommand("mkhtml" )
1244

    
1245
    gvspki_filename = "builds/"+build+"/packages.gvspki"
1246
    message( "Coping packages.gvspki to "+ gvspki_filename + "\n")
1247
    shutil.copyfile("packages.gvspki", gvspki_filename)
1248
    shutil.copyfile("packages.gvspki.md5", gvspki_filename +".md5")
1249

    
1250
    for platform in platforms:
1251
        message( "Creating installers for platform "+platform.getOS()+"/"+platform.getArch()+"...")
1252
        gvspks_filename = "builds/"+build+"/gvSIG-desktop-" + VERSION + "-" + build+ "-" + state + "-"+platform.getOS()+"-"+platform.getArch()+".gvspks"
1253
        online_filename = "builds/"+build+"/gvSIG-desktop-" + VERSION + "-" + build+ "-" + state + "-"+platform.getOS()+"-"+platform.getArch() + "-online.jar"
1254

    
1255
        if not os.path.isfile(online_filename):
1256
          osfamily=platform.getOSFamilyForOnlineInstaller()
1257
          message("Coping standard online installer from os family (%s) to %s." % (osfamily, online_filename))
1258
          shutil.copyfile(
1259
            "builds/"+build+"/gvSIG-desktop-" + VERSION + "-" + build+ "-" + state + "-"+osfamily+"-"+platform.getArch() + "-online.jar",
1260
            online_filename
1261
          )
1262

    
1263
        if not os.path.isfile(online_filename):
1264
          msgwarn("Can't access the online installer for "+platform.getOS()+"/"+platform.getArch() + " ("+online_filename+").")
1265
          continue
1266

    
1267
        message( "Coping packages-"+platform.getOS()+"-"+platform.getArch()+".gvspks to "+ gvspks_filename)
1268
        shutil.copyfile("packages-"+platform.getOS()+"-"+platform.getArch()+".gvspks", gvspks_filename)
1269
        shutil.copyfile("packages-"+platform.getOS()+"-"+platform.getArch()+".gvspks.md5", gvspks_filename +".md5")
1270

    
1271
        message( "Add execution permissions to online installers....")
1272
        mychmod(online_filename,RWXALL)
1273

    
1274
        md5sum(online_filename,online_filename+".md5")
1275
        mychmod(online_filename+".md5",RWALL)
1276

    
1277

    
1278
        executeCommand("mkinstall" , online_filename, gvspks_filename)
1279

    
1280
        message( "Renaming files from custom to standard...")
1281
        target_filename = "builds/"+build+"/gvSIG-desktop-" + VERSION + "-" + build+ "-" + state + "-"+platform.getOS()+"-"+platform.getArch()+"-"+distribution_name + ".jar"
1282
        shutil.move(
1283
            "builds/"+build+"/gvSIG-desktop-" + VERSION + "-" + build+ "-" + state + "-"+platform.getOS()+"-"+platform.getArch() + "-custom.jar",
1284
            target_filename
1285
        )
1286
        mychmod(target_filename,RWXALL)
1287

    
1288
        md5sum(target_filename,target_filename+".md5")
1289
        mychmod(target_filename+".md5",RWALL)
1290

    
1291
        message( "Createds installers for platform "+platform.getOS()+"/"+platform.getArch()+"\n")
1292

    
1293
    mkexec(VERSION, build, state, distribution_name, os.path.join(os.getcwd(), "builds", build))
1294

    
1295
    message( "Coping html index to browse paqueges of the distro.")
1296
    shutil.rmtree("builds/"+build+"/web", ignore_errors=True)
1297
    shutil.copytree("web", "builds/"+build+"/web")
1298
    f = file("builds/"+build+"/web/index.html","r")
1299
    contents = f.read()
1300
    f.close()
1301
    contents = contents.replace("href=\"../../../web/gvSIG-desktop-", "href=\"../../../../../web/gvSIG-desktop-")
1302
    f = file("builds/"+build+"/web/index.html","w")
1303
    f.write(contents)
1304
    f.close()
1305

    
1306
    message( "\nCreation of distribution completed.\n")
1307

    
1308

    
1309
def show(args):
1310
    cmd = Command(args)
1311
    try:
1312
        opts, args = getopt.getopt(cmd.getArgs("show"), "S", [ "verify"])
1313
    except getopt.GetoptError, err:
1314
        # print help information and exit:
1315
        print str(err) # will print something like "option -a not recognized"
1316
        shorthelp(args)
1317
        sys.exit(2)
1318

    
1319
    eerify = False
1320
    for opt, arg in opts:
1321
        if opt in ("-V", "--verify"):
1322
            verify = True
1323
        else:
1324
            assert False, "unhandled option %r" % opt
1325

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

    
1337
    files = findfiles(outputfolder, "package.info")
1338
    if len(files) != 1:
1339
        msgerror("Can't locate package.info in pool '%s'." % (index_name))
1340
        return
1341

    
1342
    package_info = files[0]
1343
    f = file(package_info,"r")
1344
    s = f.read()
1345
    f.close()
1346
    print s
1347
    if verify:
1348
      verify_sign(package_info)
1349
    shutil.rmtree(outputfolder)
1350

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

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

    
1389
    indexes = IndexList()
1390

    
1391
    packages_txt = getDist() +"/packages.txt"
1392
    if os.path.exists(packages_txt) and not clear_list:
1393
        indexes.load(packages_txt)
1394
    else:
1395
        indexes.build(getPool(), getSearchVersions())
1396
        indexes.save(packages_txt)
1397

    
1398
    for pkg in includes:
1399
      indexes.append(pkg)
1400

    
1401
    allpackages = list()
1402
    for info in indexes:
1403
        if not ( info.code in excludes_pki or info.getFullName() in excludes_pki ):
1404
            try:
1405
                if info.hasPki() :
1406
                  print info.getPkiFilename()
1407
                  if interactive :
1408
                    edit_pkginfo_of_package(info.getPkiFilename(), edit_ui)
1409
                  elif len(replaces) < 1:
1410
                    edit_pkginfo_of_package(info.getPkiFilename(), edit_replace, replaces)
1411

    
1412
                  if sign:
1413
                    edit_pkginfo_of_package(info.getPkiFilename(), edit_sign)
1414

    
1415
            except Exception, ex:
1416
                msgerror("Can't add index '%s', error %s" % (info, str(ex)))
1417

    
1418
def edit(args):
1419
    cmd = Command(args)
1420
    try:
1421
        opts, args = getopt.getopt(cmd.getArgs("edit"), "Sr:", [ "replace=", "onlysign", "sign" ])
1422
    except getopt.GetoptError, err:
1423
        # print help information and exit:
1424
        print str(err) # will print something like "option -a not recognized"
1425
        shorthelp(args)
1426
        sys.exit(2)
1427

    
1428
    replaces = list()
1429
    interactive = True
1430
    sign = False
1431
    for opt, arg in opts:
1432
        if opt in ("-r", "--replace"):
1433
            interactive = False
1434
            replaces.append(arg)
1435
        elif opt in ("--onlysign"):
1436
            interactive = False
1437
            sign = True
1438
        elif opt in ("-S", "--sign"):
1439
            sign = True
1440
        else:
1441
            assert False, "unhandled option %r" % opt
1442

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

    
1455
    if sign:
1456
      edit_pkginfo_of_package(index_path, edit_sign)
1457

    
1458
def edit_ui(filename, args):
1459
      os.system('vi "%s"' % filename)
1460

    
1461
def edit_replace(filename, args):
1462
      replaces = args[0]
1463
      f = open(filename)
1464
      s = f.read()
1465
      f.close()
1466
      for replace in replaces:
1467
        x = replace.split(replace[0])
1468
        if len(x)==4:
1469
          s=re.sub(x[1],x[2],s)
1470
      f = open(filename,"w")
1471
      f.write(s)
1472
      f.close()
1473

    
1474
def edit_sign(filename, args):
1475
      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' %  (
1476
        get_gvspkg_bin_folder(),
1477
        get_gvspkg_bin_folder(),
1478
        filename)
1479
      )
1480

    
1481
def verify_sign(filename):
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 verify %s' % (
1483
        get_gvspkg_bin_folder(),
1484
        get_gvspkg_bin_folder(),
1485
        filename)
1486
      )
1487

    
1488
def edit_pkginfo_of_package(pkg_path, operation, *args):
1489
    outputfolder="/tmp/gvspkg.%s" % os.getpid()
1490
    os.mkdir(outputfolder)
1491
    os.system('unzip -q %s -d %s' % (pkg_path,outputfolder))
1492

    
1493
    files = findfiles(outputfolder, "package.info")
1494
    if len(files) != 1:
1495
        msgerror("Can't locate package.info in pool '%s'." % (pkg_path))
1496
        return
1497

    
1498
    package_info = files[0]
1499
    code = package_info.split("/")[-2]
1500
    operation(package_info, args)
1501

    
1502
    # zip -Dr kk.zip org.gvsig.wfs
1503
    temp_index_name = "/tmp/packages.gvspki.%s" % os.getpid()
1504
    temp_index = zipfile.ZipFile(temp_index_name,"w",zipfile.ZIP_STORED)
1505
    temp_index.write(package_info, "%s/package.info" % (code))
1506
    temp_index.close()
1507
    shutil.rmtree(outputfolder)
1508
    os.remove(pkg_path)
1509
    shutil.move(temp_index_name,pkg_path)
1510

    
1511
def install(args):
1512
    cmd = Command(args)
1513
    try:
1514
        opts, args = getopt.getopt(cmd.getArgs("install"), "fS", [ "force","nohttps" ])
1515
    except getopt.GetoptError, err:
1516
        # print help information and exit:
1517
        print str(err) # will print something like "option -a not recognized"
1518
        shorthelp(args)
1519
        sys.exit(2)
1520

    
1521
    force = False
1522
    nohttps = False
1523
    for opt, arg in opts:
1524
        if opt in ("-f", "--force"):
1525
            force = True
1526
        if opt in ("-S", "--nohttps"):
1527
            nohttps = True
1528
        else:
1529
            assert False, "unhandled option %r" % opt
1530

    
1531
    url_pki = args[0]
1532
    if url_pki.startswith("https:") and nohttps :
1533
       url_pki = "http:" + url_pki[6:]
1534

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

    
1548
    if url_pkg.startswith("https:") and nohttps :
1549
       url_pkg = "http:" + url_pkg[6:]
1550

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

    
1575
    md5sum(pathname_pki, pathname_pki+".md5")
1576
    md5sum(pathname_pkg, pathname_pkg+".md5")
1577

    
1578

    
1579
def md5sum(fin, fout):
1580
    message( "Calculating md5sum of %s..." % fin )
1581
    system("md5sum -b %s >%s" % (fin, fout) )
1582

    
1583
def downloadFile(url,path):
1584
  try:
1585
    fsrc = urllib2.urlopen(url)
1586
  except urllib2.HTTPError,e:
1587
    msgerror("Error abriendo url '%s'." % url, e)
1588
    return False
1589
  fdst = file(path,"wb")
1590
  shutil.copyfileobj(fsrc,fdst)
1591
  fdst.close()
1592
  fsrc.close()
1593
  return True
1594

    
1595
def shorthelp(args):
1596
    print """
1597
usage: gvspkg [OPTIONS] COMMANDS
1598
OPTIONS:
1599

    
1600
-h,--help       Muestra esta ayuda
1601
-v,--verbose    Activa el modo verbose
1602
-d,--debug      Activa el modo debug.
1603
--version ver   Fija la version con la que van a trabajar.
1604
-r,--package-root root    Fija la carpeta del raiz del sistema de paquetes
1605

    
1606
COMMANDS:
1607

    
1608
mkinstall [OPTIONS] install-file packages-file
1609
    -L, --jrelin=path
1610
    -W, --jrewin=path
1611
    -l, --addjrelin
1612
    -w, --addjrewin
1613
    -N, --distribution-name=name
1614

    
1615
lsi [OPTIONS]
1616
    -l, --long-format
1617

    
1618
mks [OPTIONS]
1619
     -c, --clear-list
1620
     --excludepkg pkgcode
1621
     --excludepki pkgcode
1622
     --exclude pkgcode
1623
     -s, --include-default-selection
1624
     -i, --index-only
1625
     -I full-path-to-package, --include full-path-to-package
1626

    
1627
mkdist [OPTIONS]
1628
     -s STATE, --state=STATE
1629
     -b BUILD, --build=BUILD
1630
     -N, --distribution-name=name
1631

    
1632
mkmirror [OPTIONS]
1633
     -b, --build buildnumber
1634

    
1635
mkhtml [OPTIONS]
1636
     -c, --clear-list
1637
     --excludepkg pkgcode
1638
     --excludepki pkgcode
1639
     --exclude pkgcode
1640

    
1641
show OPTIONS package-index
1642
    --verify, -V
1643

    
1644
edit [OPTIONS] package-index
1645
     --replace=@search@replace@
1646
     --onlysign
1647
     --sign, -S
1648

    
1649
editall [OPTIONS]
1650
     -c, --clear-list
1651
     --excludepkg pkgcode
1652
     --excludepki pkgcode
1653
     --exclude pkgcode
1654
     --replace=@search@replace@
1655
     --sign, -S
1656

    
1657
install [OPTIONS] url-to-pki
1658
     -f, --force
1659

    
1660
prepare-portable [OPTIONS]
1661
     -b, --build
1662
     -s, --state
1663

    
1664
mkportable [OPTIONS]
1665
     -b, --build
1666
     -s, --state
1667

    
1668
La version actual a utilizar es:
1669
  %s
1670

    
1671
El directorio root de la estructura de packetes actual es:
1672
  %s
1673
    """ % (VERSION, GVSPKG_ROOT)
1674

    
1675

    
1676
def help(args):
1677
    print """
1678
usage: gvspkg [OPTIONS] COMMANDS
1679

    
1680
OPTIONS:
1681

    
1682
-h|--help
1683
    Muestra esta ayuda
1684

    
1685
-v|--verbose
1686
    Activa el modo verbose
1687

    
1688
-d|--debug
1689
    Activa el modo debug. Se muestran mensajes que pueden ser
1690
    utilies de cara a depuracion.
1691

    
1692
--version version
1693
    Fija la version con la que van a trabajar los comandos indicados.
1694

    
1695
-r|--package-root package-root
1696
    Fija la carpeta en la que va a buscar el raiz del sistema de paquetes
1697
    con el que trabajar
1698

    
1699
COMMANDS:
1700

    
1701
mkinstall [OPTIONS] install-file packages-file
1702

    
1703
    OPTIONS:
1704

    
1705
    -L | --jrelin=path
1706

    
1707
    -W | --jrewin=path
1708

    
1709
    -l | --addjrelin
1710

    
1711
    -w | --addjrewin
1712

    
1713
    -N | --distribution-name=name
1714
      Nombre usado como sufijo del nuevo binario a generar. Por defecto si no se
1715
      indica valdra "custom".
1716

    
1717

    
1718
lsi [OPTIONS]
1719
    Lista los indices disponibles de la version
1720

    
1721
    OPTIONS:
1722

    
1723
    -l | --long-format
1724
        Muestra para cada paquete la informacion del package.info
1725

    
1726
mks [OPTIONS]
1727
     Crea el fichero packages.gvspki con los indices de la
1728
     version y packages.gvspkg con los paquetes.
1729

    
1730
     OPTIONS:
1731

    
1732
     -c | --clear-list
1733
        Elimina la lista de paquetes a utilizar recreandola a partir
1734
        de los paquetes del pool tomando el ultimo build de cada paquete.
1735

    
1736
     --excludepkg pkgcode
1737
        No incluye el paquete indicado en el fichero gvspkg a generar
1738

    
1739
     --excludepki pkgcode
1740
        No incluye el paquete indicado en el fichero gvspki a generar
1741

    
1742
     --exclude pkgcode
1743
        No incluye el paquete indicado en los ficheros gvspkg y gvspki a generar
1744

    
1745
     -s | --include-default-selection
1746
        Incluye el fichero "defaultPackages", que se debe encontrar en el
1747
        directorio corriente, con los nombres de paquetes a seleccionar
1748
        por defecto.
1749

    
1750
     -i | --index-only
1751
        No crea el fichero gvspks, solo crea el gvspki
1752

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

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

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

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

    
1774
     -N | --distribution-name=name
1775
        Nombre usado como sufijo del nuevo binario a generar. Por defecto si no se
1776
        indica valdra "standard".
1777

    
1778

    
1779
mkmirror [OPTIONS]
1780

    
1781
  Prepara una carpeta para hacer un mirror de un build en concreto.
1782

    
1783
     OPTIONS:
1784

    
1785
     -b | --build buildnumber
1786
       Indica el numero de build del que se quiere hacer un mirror.
1787

    
1788
mkhtml [OPTIONS]
1789
     ????
1790

    
1791
     OPTIONS:
1792

    
1793
     -c | --clear-list
1794
        Elimina la lista de paquetes a utilizar recreandola a partir
1795
        de los paquetes del pool tomando el ultimo build de cada paquete.
1796

    
1797
     --excludepkg pkgcode
1798
        No incluye el paquete indicado en el fichero gvspkg a generar
1799

    
1800
     --excludepki pkgcode
1801
        No incluye el paquete indicado en el fichero gvspki a generar
1802

    
1803
     --exclude pkgcode
1804
        No incluye el paquete indicado en los ficheros gvspkg y gvspki a generar
1805

    
1806
show OPTIONS package-index
1807
    Muestra el package.info del indice indicado como parametro.
1808

    
1809
    OPTIONS
1810

    
1811
    --verify | -V
1812
      Comprueba la forma del packete.
1813

    
1814
edit [OPTIONS] package-index
1815
    Edita el package.info del indice indicado como parametro.
1816

    
1817
     OPTIONS:
1818

    
1819
     --replace=@search@replace@
1820
       Reemplaza en el package.info de cada paquete la cadena "search" por "replace"
1821
       todas las veces que aparezca. "@" puede ser cualquier caracter que no aparezca
1822
       en "search" y "replace".
1823
       Esta opcion puede indicarse tatas veces como reemplazos se deseen efectuar.
1824

    
1825
     --onlysign
1826
       firma el package.info sin editarlo de forma interactiva (no invoca al editor antes
1827
       de firmarlo).
1828

    
1829
     --sign | -S
1830
       Firma el package.info tras terminar la edicion (bach o interactiva)
1831

    
1832
editall [OPTIONS]
1833
    Edita todos los package.info
1834

    
1835
     OPTIONS:
1836

    
1837
     -c | --clear-list
1838
        Elimina la lista de paquetes a utilizar recreandola a partir
1839
        de los paquetes del pool tomando el ultimo build de cada paquete.
1840

    
1841
     --excludepkg pkgcode
1842
        No incluye el paquete indicado en el fichero gvspkg a generar
1843

    
1844
     --excludepki pkgcode
1845
        No incluye el paquete indicado en el fichero gvspki a generar
1846

    
1847
     --exclude pkgcode
1848
        No incluye el paquete indicado en los ficheros gvspkg y gvspki a generar
1849

    
1850
     --replace=@search@replace@
1851
       Reemplaza en el package.info de cada paquete la cadena "search" por "replace"
1852
       todas las veces que aparezca. "@" puede ser cualquier caracter que no aparezca
1853
       en "search" y "replace".
1854
       Esta opcion puede indicarse tatas veces como reemplazos se deseen efectuar.
1855

    
1856
      --sign | -S
1857
        Firma todos los paquetes que sean oficiales
1858

    
1859
install [OPTIONS] url-to-pki
1860
    descarga de la url indicada un fichero gvspki e instala este junto con su correspondiente
1861
    pkg en el pool local.
1862

    
1863
     OPTIONS:
1864

    
1865
     -f | --force
1866
       fuerza la sobreescritura de los ficheros en caso de que estos ya existan.
1867

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

    
1878
Por defecto la version la obtiene del nombre de la carpeta
1879
corriente (%s). Las opciones indicadas en el fichero gvspkg.options tienen prioridad
1880
sobre este valor.
1881

    
1882
El directorio root de la estructura de packetes lo buscara en el
1883
sitio indicado por la variable de entorno GVPKG_ROOT, y si esta no
1884
esta establecida usara "%s". Las opciones indicadas en el fichero gvspkg.options
1885
tienen prioridad sobre este valor.
1886

    
1887
    """ % (VERSION, GVSPKG_ROOT)
1888

    
1889
def executeCommand(*args):
1890
    command = "shorthelp"
1891
    if len(args)>0:
1892
        command=args[0]
1893

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

    
1925
def main():
1926
    global DEBUG
1927
    global VERSION
1928
    global VERBOSE
1929
    global GVSPKG_ROOT
1930
    global SEARCH_VERSIONS
1931

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

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

    
1967
main()
1968

    
1969

    
1970

    
1971

    
1972