Statistics
| Revision:

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

History | View | Annotate | Download (60.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
#LINUX_EXEC_EXTENSION=".run" # antes ".bin"
27

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

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

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

    
50

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

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

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

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

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

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

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

    
95
def getVersion():
96
    return VERSION
97

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

    
104
def getPackagesRoot():
105
    return GVSPKG_ROOT
106

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

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

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

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

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

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

    
135
class Command:
136

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

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

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

    
163
        f.close()
164

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

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

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

    
197

    
198

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
298
    def getDescription(self):
299
      return self.getIniOption("description")
300

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

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

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

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

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

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

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

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

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

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

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

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

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

    
372
class IndexList(list):
373

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

    
383
          info = PackageInfo(line)
384
          self.append(info)
385

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

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

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

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

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

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

    
446

    
447
def installer_add(cmd,arg1,arg2):
448
    installer_add_use_zip(cmd,arg1,arg2)
449

    
450
def installer_add_use_zip(cmd,arg1,arg2):
451
    if cmd == "addjrelin":
452
      return
453

    
454
    if cmd == "addjrewin":
455
      return
456

    
457
    if cmd == "addpks":
458
       zip = zipfile.ZipFile(arg1,"a",zipfile.ZIP_STORED)
459
       zip.write(arg2,"package.gvspks")
460
       zip.close()
461

    
462
def installer_add_use_installkit(cmd,arg1,arg2):
463
    folder = "%s/gvspkg.bin" % GVSPKG_ROOT
464

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

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

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

    
505

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

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

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

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

    
522
    message("Creating %s..." % custom_name)
523
    shutil.copyfile(bin_name, custom_name)
524
    mychmod(custom_name,RWALL)
525
    message("Adding %s..." % gvspks_name)
526
    installer_add("addpks", custom_name, gvspks_name)
527

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

    
537

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

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

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

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

    
601

    
602
    indexes = IndexList()
603

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

    
607
    message( "Creating 'packages.gvspki' for version '%s'" % getVersion() + "...")
608
    if not os.path.exists(getDist()):
609
        msgerror("Can't locate version folder '%s'." % getDist())
610
        sys.exit(3)
611

    
612
    if os.path.exists(packages_txt) and not clear_list:
613
        indexes.load(packages_txt)
614
    else:
615
        indexes.build(getPool(), getSearchVersions())
616
        indexes.save(packages_txt)
617

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

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

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

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

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

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

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

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

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

    
694
def linkfile(src,dst):
695
  if os.path.lexists(dst):
696
    os.remove(dst)
697
  os.symlink(src,dst)
698
  if os.path.lexists(src+".md5") :
699
    if os.path.lexists(dst+".md5"):
700
      os.remove(dst+".md5")
701
    os.symlink(src+".md5",dst+".md5")
702

    
703
def domkmirror(root_src, version, build):
704
  join = os.path.join
705

    
706
  build = str(build)
707
  root_target = join(root_src,"mirrors",version+"-"+build,"gvsig-desktop")
708
  build_src = join(root_src,"dists",version,"builds",build)
709
  build_target = join(root_target,"dists",version,"builds",build)
710
  pool_src = join(root_src,"pool")
711
  pool_target = join(root_target,"pool")
712

    
713
  makedirs(root_target)
714
  makedirs(build_target)
715
  makedirs(pool_target)
716
  files = os.listdir(build_src)
717
  linkfile(join(build_src,"packages.gvspki"), join(root_target,"dists",version,"packages.gvspki"))
718
  for f in files:
719
    f_src = join(build_src,f)
720
    f_target = join(build_target,f)
721
    if os.path.isfile(f_src):
722
      linkfile(f_src,f_target)
723

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

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

    
740

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

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

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

    
773
    packages_txt = getDist() +"/packages.txt"
774

    
775
    if os.path.exists(packages_txt) and not clear_list:
776
        indexes.load(packages_txt)
777
    else:
778
        indexes.build(getPool(), getSearchVersions())
779
        indexes.save(packages_txt)
780

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

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

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

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

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

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

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

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

    
886
    message("html pages createds.\n")
887

    
888

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

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

    
923
  sourceUrl = info.getSourceUrl()
924

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

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

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

    
966

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

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

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

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

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

    
1007
    if state == None:
1008
      print "Requiered option --state not found."
1009
      shorthelp(args)
1010
      sys.exit(2)
1011

    
1012
    join = os.path.join
1013
    build_folder = join(getPackagesRoot(),"dists",getVersion(),"builds",build)
1014
    if not os.path.isdir(build_folder):
1015
      print "Can't access the build folder "+build_folder+"."
1016
      sys.exit(2)
1017

    
1018
    do_prepare_portable(build,state)
1019

    
1020
def do_prepare_portable(build,state):
1021
    join = os.path.join
1022
    build_folder = join(getPackagesRoot(),"dists",getVersion(),"builds",build)
1023
    portable_folder = join(build_folder,"misc","portable")
1024
    makedirs(portable_folder)
1025
    makedirs(join(portable_folder,"packages","custom"))
1026
    makedirs(join(portable_folder,"standard"))
1027
    makedirs(join(portable_folder,"patchs"))
1028
    f=open(join(portable_folder,"packages","excludes"),"w")
1029
    f.write("""EPSG_v6
1030
EPSG_v8_4
1031
EPSG_v8_5
1032
EPSG_v8_6
1033
org.gvsig.app.document.layout1.app.mainplugin
1034
org.gvsig.dyschromatopsia.app.extension
1035
org.gvsig.educa.portableview.app.editor
1036
org.gvsig.educa.portableview.app.viewer
1037
org.gvsig.projection.app.cresques
1038
org.gvsig.projection.app.proj4j
1039
org.gvsig.editing.app.mainplugin
1040
org.gvsig.downloader.app.mainplugin
1041
""")
1042
    f.close()
1043
    fname_base = "gvSIG-desktop-%s-%s-%s" % (getVersion(),build,state)
1044
    for cur_os in ("lin","win") :
1045
      for arch in ("x86", "x86_64"):
1046
        linkfile(
1047
          join(build_folder,fname_base + "-" + cur_os + "-" + arch + "-online.zip"),
1048
          join(portable_folder,"standard",fname_base + "-" + cur_os + "-" + arch + "-online.zip")
1049
        )
1050
        linkfile(
1051
          join(build_folder,fname_base + "-" + cur_os + "-" + arch + ".gvspks"),
1052
          join(portable_folder,"standard",fname_base + "-" + cur_os + "-" + arch + ".gvspks")
1053
        )
1054
    extract_make_portable(
1055
      join(build_folder,fname_base + "-lin-x86_64-online.zip"),
1056
      join(portable_folder)
1057
    )
1058
    mychmod(join(portable_folder,"make-portable"),RWXALL)
1059

    
1060
def zipfolder(source,target):
1061
  def zipdir(path, zip):
1062
      for root, dirs, files in os.walk(path):
1063
          for file in files:
1064
              zip.write(os.path.join(root, file))
1065
  zipf = zipfile.ZipFile(target, 'w')
1066
  zipdir(source, zipf)
1067
  zipf.close()
1068

    
1069
def removefile(filename):
1070
  if os.path.exists(filename):
1071
    os.remove(filename)
1072

    
1073
def mkportable(args):
1074
    cmd = Command(args)
1075
    try:
1076
        opts, args = getopt.getopt(cmd.getArgs("mkportable"), "b:s:", [ "build=", "state=" ])
1077
    except getopt.GetoptError, err:
1078
        # print help information and exit:
1079
        print str(err) # will print something like "option -a not recognized"
1080
        shorthelp(args)
1081
        sys.exit(2)
1082

    
1083
    build=None
1084
    state=None
1085
    for opt, arg in opts:
1086
        if opt in ("-b", "--build"):
1087
            build=arg
1088
        elif opt in ("-s", "--state"):
1089
            state=arg
1090
        else:
1091
            assert False, "unhandled option %r" % opt
1092

    
1093
    if build == None:
1094
      print "Requiered option --build not found."
1095
      shorthelp(args)
1096
      sys.exit(2)
1097

    
1098
    if state == None:
1099
      print "Requiered option --state not found."
1100
      shorthelp(args)
1101
      sys.exit(2)
1102

    
1103
    join = os.path.join
1104
    build_folder = join(getPackagesRoot(),"dists",getVersion(),"builds",build)
1105
    if not os.path.isdir(build_folder):
1106
      print "Can't access the build folder "+build_folder+"."
1107
      sys.exit(2)
1108

    
1109
    portable_folder = join(build_folder,"misc","portable")
1110
    if not os.path.isdir(portable_folder) :
1111
      do_prepare_portable(build,state)
1112
    os.system('cd %s ; ./make-portable' % (portable_folder))
1113
    """
1114
    message("Removing previos portable zip files")
1115
    for cur_os in ("lin","win") :
1116
      for arch in ("x86", "x86_64"):
1117
        removefile(join(build_folder,"gvsig-desktop-%s-%s-%s-%s-%s.zip" %  (getVersion(),build,state,cur_os,arch)))
1118

    
1119
    target_folder = join(getPackagesRoot(),"dists",getVersion(),"builds",build,"misc","portable","target")
1120
    os.chdir(target_folder)
1121

    
1122
    for cur_os in ("lin","win") :
1123
      for arch in ("x86", "x86_64"):
1124
        message("Creating zip gvsig-desktop-%s-%s-%s-%s-%s.zip" % (getVersion(),build,state,cur_os,arch))
1125
        zipfolder(
1126
          "gvsig-desktop-%s-%s-%s-%s-%s" % (getVersion(),build,state,cur_os,arch),
1127
          join(build_folder,"gvsig-desktop-%s-%s-%s-%s-%s.zip" % (getVersion(),build,state,cur_os,arch))
1128
        )
1129
    """
1130
    #message("Remove temporary folders")
1131
    #shutil.rmtree(target_folder)
1132

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

    
1143
    build=None
1144
    state=None
1145
    distribution_name = "standard"
1146
    platforms = ("x86", "x86_64")
1147
    oss = ("lin", "win")
1148

    
1149
    for opt, arg in opts:
1150
        if opt in ("-b", "--build"):
1151
            build=arg
1152
        elif opt in ("-s", "--state"):
1153
            state=arg
1154
        elif opt in ("-N", "--distrinution-name"):
1155
            distribution_name = arg
1156
        elif opt in ("-p", "--platform"):
1157
          if args == "amd64":
1158
            # Aceptamos la plataforma amd64 como sinonimo de x86_64
1159
            args = "x86_64"
1160
          if not arg in ("x86","x86_64"):
1161
            print "Unsuported platform "+repr(platform)+", must be x86, x86_64 or amd64."
1162
            shorthelp(args)
1163
            sys.exit(2)
1164
          platforms = (arg,)
1165
        else:
1166
            assert False, "unhandled option %r" % opt
1167

    
1168
    if build == None:
1169
      print "Requiered option --build not found."
1170
      shorthelp(args)
1171
      sys.exit(2)
1172

    
1173
    if state == None:
1174
      print "Requiered option --state not found."
1175
      shorthelp(args)
1176
      sys.exit(2)
1177

    
1178
    if not os.path.isdir("builds/"+build):
1179
      print "Can't access the build folder builds/"+build+"."
1180
      sys.exit(2)
1181

    
1182
    message( "Generating distribution for build "+ build + "...")
1183
    message("Recreating index of packages...")
1184
    executeCommand("mks", "-s", "-c")
1185

    
1186
    executeCommand("mkhtml" )
1187

    
1188
    gvspki_filename = "builds/"+build+"/packages.gvspki"
1189
    message( "Coping packages.gvspki to "+ gvspki_filename + "\n")
1190
    shutil.copyfile("packages.gvspki", gvspki_filename)
1191
    shutil.copyfile("packages.gvspki.md5", gvspki_filename +".md5")
1192

    
1193
    #exec_extensions = {
1194
    #  "lin" : LINUX_EXEC_EXTENSION,
1195
    #  "win" : ".exe"
1196
    #}
1197

    
1198
    for cur_os in oss:
1199
      exec_extension = ".jar" #exec_extensions[cur_os]
1200
      for cur_platform in platforms:
1201
        message( "Creating installers for platform "+cur_os+"/"+cur_platform+"...")
1202
        gvspks_filename = "builds/"+build+"/gvSIG-desktop-" + VERSION + "-" + build+ "-" + state + "-"+cur_os+"-"+cur_platform+".gvspks"
1203
        online_filename = "builds/"+build+"/gvSIG-desktop-" + VERSION + "-" + build+ "-" + state + "-"+cur_os+"-"+cur_platform + "-online" + exec_extension
1204

    
1205
        if not os.path.isfile(online_filename):
1206
          msgwarn("Can't access the online installable for "+cur_os+"/"+cur_platform + " ("+online_filename+").")
1207
          continue
1208

    
1209
        message( "Coping packages-"+cur_os+"-"+cur_platform+".gvspks to "+ gvspks_filename)
1210
        shutil.copyfile("packages-"+cur_os+"-"+cur_platform+".gvspks", gvspks_filename)
1211
        shutil.copyfile("packages-"+cur_os+"-"+cur_platform+".gvspks.md5", gvspks_filename +".md5")
1212

    
1213
        message( "Add execution permissions to online installables....")
1214
        mychmod(online_filename,RWXALL)
1215

    
1216
        md5sum(online_filename,online_filename+".md5")
1217
        mychmod(online_filename+".md5",RWALL)
1218

    
1219

    
1220
        executeCommand("mkinstall" , "--addjre"+cur_os, online_filename, gvspks_filename)
1221

    
1222
        message( "Renaming files from custom to standard...")
1223
        target_filename = "builds/"+build+"/gvSIG-desktop-" + VERSION + "-" + build+ "-" + state + "-"+cur_os+"-"+cur_platform+"-"+distribution_name + exec_extension
1224
        shutil.move(
1225
            "builds/"+build+"/gvSIG-desktop-" + VERSION + "-" + build+ "-" + state + "-"+cur_os+"-"+cur_platform + "-custom" + exec_extension,
1226
            target_filename
1227
        )
1228
        mychmod(target_filename,RWXALL)
1229

    
1230
        md5sum(target_filename,target_filename+".md5")
1231
        mychmod(target_filename+".md5",RWALL)
1232

    
1233
        message( "Createds installers for platform "+cur_os+"/"+cur_platform+"\n")
1234

    
1235
    message( "Coping html index to browse paqueges of the distro.")
1236
    shutil.rmtree("builds/"+build+"/web", ignore_errors=True)
1237
    shutil.copytree("web", "builds/"+build+"/web")
1238
    f = file("builds/"+build+"/web/index.html","r")
1239
    contents = f.read()
1240
    f.close()
1241
    contents = contents.replace("href=\"../../../web/gvSIG-desktop-", "href=\"../../../../../web/gvSIG-desktop-")
1242
    f = file("builds/"+build+"/web/index.html","w")
1243
    f.write(contents)
1244
    f.close()
1245

    
1246
    message( "\nCreation of distribution completed.\n")
1247

    
1248

    
1249

    
1250

    
1251
def show(args):
1252
    cmd = Command(args)
1253
    try:
1254
        opts, args = getopt.getopt(cmd.getArgs("show"), "S", [ "verify"])
1255
    except getopt.GetoptError, err:
1256
        # print help information and exit:
1257
        print str(err) # will print something like "option -a not recognized"
1258
        shorthelp(args)
1259
        sys.exit(2)
1260

    
1261
    eerify = False
1262
    for opt, arg in opts:
1263
        if opt in ("-V", "--verify"):
1264
            verify = True
1265
        else:
1266
            assert False, "unhandled option %r" % opt
1267

    
1268
    index_name=args[0]
1269
    message( "Show package.info from '%s'" % index_name)
1270
    files = findfiles(getPool(), index_name)
1271
    if len(files) != 1:
1272
        msgerror("Can't locate package '%s' in pool '%s'." % (index_name, getPool()))
1273
        return
1274
    index_path = files[0]
1275
    outputfolder="/tmp/gvspkg.%s" % os.getpid()
1276
    os.mkdir(outputfolder)
1277
    os.system('unzip -q %s -d %s' % (index_path,outputfolder))
1278

    
1279
    files = findfiles(outputfolder, "package.info")
1280
    if len(files) != 1:
1281
        msgerror("Can't locate package.info in pool '%s'." % (index_name))
1282
        return
1283

    
1284
    package_info = files[0]
1285
    f = file(package_info,"r")
1286
    s = f.read()
1287
    f.close()
1288
    print s
1289
    if verify:
1290
      verify_sign(package_info)
1291
    shutil.rmtree(outputfolder)
1292

    
1293
def editall(args):
1294
    cmd = Command(args)
1295
    try:
1296
        opts, args = getopt.getopt(cmd.getArgs("editall"), "Scx:I:r:", ["clear-list", "exclude=", "excludepki=", "excludepkg=", "include=", "replace=", "sign"])
1297
    except getopt.GetoptError, err:
1298
        # print help information and exit:
1299
        print str(err) # will print something like "option -a not recognized"
1300
        shorthelp(args)
1301
        sys.exit(2)
1302

    
1303
    index_only = False
1304
    clear_list=False
1305
    includes=list()
1306
    excludes_pki=list()
1307
    replaces = list()
1308
    excludes_pkg=list()
1309
    sign = False
1310
    interactive = True
1311
    for opt, arg in opts:
1312
        if opt in ("-c", "--clear-list"):
1313
            clear_list = True
1314
        elif opt in ("-x", "--exclude"):
1315
            excludes_pki.append(arg)
1316
            excludes_pkg.append(arg)
1317
        elif opt in ( "--excludepki"):
1318
            excludes_pki.append(arg)
1319
        elif opt in ( "--excludepkg"):
1320
            excludes_pkg.append(arg)
1321
        elif opt in ( "--include", "-I"):
1322
            includes.append(PackageInfo(arg))
1323
        elif opt in ("-r", "--replace"):
1324
            interactive = False
1325
            replaces.append(arg)
1326
        elif opt in ("-S", "--sign"):
1327
            sign = True
1328
        else:
1329
            assert False, "unhandled option %r" % opt
1330

    
1331
    indexes = IndexList()
1332

    
1333
    packages_txt = getDist() +"/packages.txt"
1334
    if os.path.exists(packages_txt) and not clear_list:
1335
        indexes.load(packages_txt)
1336
    else:
1337
        indexes.build(getPool(), getSearchVersions())
1338
        indexes.save(packages_txt)
1339

    
1340
    for pkg in includes:
1341
      indexes.append(pkg)
1342

    
1343
    allpackages = list()
1344
    for info in indexes:
1345
        if not ( info.code in excludes_pki or info.getFullName() in excludes_pki ):
1346
            try:
1347
                if info.hasPki() :
1348
                  print info.getPkiFilename()
1349
                  if interactive :
1350
                    edit_pkginfo_of_package(info.getPkiFilename(), edit_ui)
1351
                  elif len(replaces) < 1:
1352
                    edit_pkginfo_of_package(info.getPkiFilename(), edit_replace, replaces)
1353

    
1354
                  if sign:
1355
                    edit_pkginfo_of_package(info.getPkiFilename(), edit_sign)
1356

    
1357
            except Exception, ex:
1358
                msgerror("Can't add index '%s', error %s" % (info, str(ex)))
1359

    
1360
def edit(args):
1361
    cmd = Command(args)
1362
    try:
1363
        opts, args = getopt.getopt(cmd.getArgs("edit"), "Sr:", [ "replace=", "onlysign", "sign" ])
1364
    except getopt.GetoptError, err:
1365
        # print help information and exit:
1366
        print str(err) # will print something like "option -a not recognized"
1367
        shorthelp(args)
1368
        sys.exit(2)
1369

    
1370
    replaces = list()
1371
    interactive = True
1372
    sign = False
1373
    for opt, arg in opts:
1374
        if opt in ("-r", "--replace"):
1375
            interactive = False
1376
            replaces.append(arg)
1377
        elif opt in ("--onlysign"):
1378
            interactive = False
1379
            sign = True
1380
        elif opt in ("-S", "--sign"):
1381
            sign = True
1382
        else:
1383
            assert False, "unhandled option %r" % opt
1384

    
1385
    index_name=args[0]
1386
    message( "Show package.info from '%s'" % index_name)
1387
    files = findfiles(getPool(), index_name)
1388
    if len(files) != 1:
1389
        msgerror("Can't locate package '%s' in pool '%s'." % (index_name, getPool()))
1390
        return
1391
    index_path = files[0]
1392
    if interactive:
1393
      edit_pkginfo_of_package(index_path, edit_ui)
1394
    elif len(replaces) < 1:
1395
      edit_pkginfo_of_package(index_path, edit_replace, replaces)
1396

    
1397
    if sign:
1398
      edit_pkginfo_of_package(index_path, edit_sign)
1399

    
1400
def edit_ui(filename, args):
1401
      os.system('vi "%s"' % filename)
1402

    
1403
def edit_replace(filename, args):
1404
      replaces = args[0]
1405
      f = open(filename)
1406
      s = f.read()
1407
      f.close()
1408
      for replace in replaces:
1409
        x = replace.split(replace[0])
1410
        if len(x)==4:
1411
          s=re.sub(x[1],x[2],s)
1412
      f = open(filename,"w")
1413
      f.write(s)
1414
      f.close()
1415

    
1416
def edit_sign(filename, args):
1417
      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' %  (
1418
        get_gvspkg_bin_folder(),
1419
        get_gvspkg_bin_folder(),
1420
        filename)
1421
      )
1422

    
1423
def verify_sign(filename):
1424
      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' % (
1425
        get_gvspkg_bin_folder(),
1426
        get_gvspkg_bin_folder(),
1427
        filename)
1428
      )
1429

    
1430
def edit_pkginfo_of_package(pkg_path, operation, *args):
1431
    outputfolder="/tmp/gvspkg.%s" % os.getpid()
1432
    os.mkdir(outputfolder)
1433
    os.system('unzip -q %s -d %s' % (pkg_path,outputfolder))
1434

    
1435
    files = findfiles(outputfolder, "package.info")
1436
    if len(files) != 1:
1437
        msgerror("Can't locate package.info in pool '%s'." % (pkg_path))
1438
        return
1439

    
1440
    package_info = files[0]
1441
    code = package_info.split("/")[-2]
1442
    operation(package_info, args)
1443

    
1444
    # zip -Dr kk.zip org.gvsig.wfs
1445
    temp_index_name = "/tmp/packages.gvspki.%s" % os.getpid()
1446
    temp_index = zipfile.ZipFile(temp_index_name,"w",zipfile.ZIP_STORED)
1447
    temp_index.write(package_info, "%s/package.info" % (code))
1448
    temp_index.close()
1449
    shutil.rmtree(outputfolder)
1450
    os.remove(pkg_path)
1451
    shutil.move(temp_index_name,pkg_path)
1452

    
1453
def install(args):
1454
    cmd = Command(args)
1455
    try:
1456
        opts, args = getopt.getopt(cmd.getArgs("install"), "fS", [ "force","nohttps" ])
1457
    except getopt.GetoptError, err:
1458
        # print help information and exit:
1459
        print str(err) # will print something like "option -a not recognized"
1460
        shorthelp(args)
1461
        sys.exit(2)
1462

    
1463
    force = False
1464
    nohttps = False
1465
    for opt, arg in opts:
1466
        if opt in ("-f", "--force"):
1467
            force = True
1468
        if opt in ("-S", "--nohttps"):
1469
            nohttps = True
1470
        else:
1471
            assert False, "unhandled option %r" % opt
1472

    
1473
    url_pki = args[0]
1474
    if url_pki.startswith("https:") and nohttps :
1475
       url_pki = "http:" + url_pki[6:]
1476

    
1477
    message( "Download package index '%s'" % url_pki)
1478
    temppath_pki= os.path.join("/tmp",os.path.basename(url_pki))
1479
    if not downloadFile(url_pki,temppath_pki):
1480
      msgerror("Can't download index.")
1481
      msgerror("Can't install '%s'." % url_pki)
1482
      print # force a newline
1483
      return 1
1484
    pkg = PackageInfo(temppath_pki)
1485
    url_pkg = pkg.getUrl().replace("\\","")
1486
    if url_pkg[-7:] == ".gvspki" :
1487
      msgwarn("Suspicious download-url value. Ends with gvspki, expected gvspkg.")
1488
      msgwarn("download-url ='%s'." % url_pkg)
1489

    
1490
    if url_pkg.startswith("https:") and nohttps :
1491
       url_pkg = "http:" + url_pkg[6:]
1492

    
1493
    message( "Download package '%s'" % url_pkg)
1494
    temppath_pkg= os.path.join("/tmp",os.path.basename(url_pkg))
1495
    if not downloadFile(url_pkg,temppath_pkg):
1496
      msgerror("Can't download package from download-url ('%s')." % url_pkg)
1497
      msgerror("Can't install '%s'," % url_pki)
1498
      print # force a newline
1499
      return 1
1500
    folder = os.path.join(getPool(),pkg.getCode())
1501
    makedirs(folder)
1502
    pathname_pki = os.path.join(folder,os.path.basename(url_pki))
1503
    if not force and os.path.isfile(pathname_pki) :
1504
        msgwarn("The package index alreade exist in the pool. Use -f to forrce install.")
1505
        print # force a newline
1506
        return 1
1507
    pathname_pkg = os.path.join(folder,os.path.basename(url_pkg))
1508
    if  not force and os.path.isfile(pathname_pki) :
1509
        msgwarn("The package downloaded from download-url alredy exists in the pool. Use -f to force install.")
1510
        print # force a newline
1511
        return 1
1512
    message( "installing package '%s'" % os.path.basename(pathname_pki))
1513
    shutil.copyfile(temppath_pki, pathname_pki)
1514
    message( "installing package '%s'" % os.path.basename(pathname_pkg))
1515
    shutil.copyfile(temppath_pkg, pathname_pkg)
1516

    
1517
    md5sum(pathname_pki, pathname_pki+".md5")
1518
    md5sum(pathname_pkg, pathname_pkg+".md5")
1519

    
1520

    
1521
def md5sum(fin, fout):
1522
    message( "Calculating md5sum of %s..." % fin )
1523
    system("md5sum -b %s >%s" % (fin, fout) )
1524

    
1525
def downloadFile(url,path):
1526
  try:
1527
    fsrc = urllib2.urlopen(url)
1528
  except urllib2.HTTPError,e:
1529
    msgerror("Error abriendo url '%s'." % url, e)
1530
    return False
1531
  fdst = file(path,"wb")
1532
  shutil.copyfileobj(fsrc,fdst)
1533
  fdst.close()
1534
  fsrc.close()
1535
  return True
1536

    
1537
def shorthelp(args):
1538
    print """
1539
usage: gvspkg [OPTIONS] COMMANDS
1540
OPTIONS:
1541

    
1542
-h,--help       Muestra esta ayuda
1543
-v,--verbose    Activa el modo verbose
1544
-d,--debug      Activa el modo debug.
1545
--version ver   Fija la version con la que van a trabajar.
1546
-r,--package-root root    Fija la carpeta del raiz del sistema de paquetes
1547

    
1548
COMMANDS:
1549

    
1550
mkinstall [OPTIONS] install-file packages-file
1551
    -L, --jrelin=path
1552
    -W, --jrewin=path
1553
    -l, --addjrelin
1554
    -w, --addjrewin
1555
    -N, --distribution-name=name
1556

    
1557
lsi [OPTIONS]
1558
    -l, --long-format
1559

    
1560
mks [OPTIONS]
1561
     -c, --clear-list
1562
     --excludepkg pkgcode
1563
     --excludepki pkgcode
1564
     --exclude pkgcode
1565
     -s, --include-default-selection
1566
     -p, --platform=name
1567
     -i, --index-only
1568
     -I full-path-to-package, --include full-path-to-package
1569

    
1570
mkdist [OPTIONS]
1571
     -s STATE, --state=STATE
1572
     -b BUILD, --build=BUILD
1573
     -p, --platform=all|x86|x86_64|amd64
1574
     -N, --distribution-name=name
1575

    
1576
mkmirror [OPTIONS]
1577
     -b, --build buildnumber
1578

    
1579
mkhtml [OPTIONS]
1580
     -c, --clear-list
1581
     --excludepkg pkgcode
1582
     --excludepki pkgcode
1583
     --exclude pkgcode
1584

    
1585
show OPTIONS package-index
1586
    --verify, -V
1587

    
1588
edit [OPTIONS] package-index
1589
     --replace=@search@replace@
1590
     --onlysign
1591
     --sign, -S
1592

    
1593
editall [OPTIONS]
1594
     -c, --clear-list
1595
     --excludepkg pkgcode
1596
     --excludepki pkgcode
1597
     --exclude pkgcode
1598
     --replace=@search@replace@
1599
     --sign, -S
1600

    
1601
install [OPTIONS] url-to-pki
1602
     -f, --force
1603

    
1604
prepare-portable [OPTIONS]
1605
     -b, --build
1606
     -s, --state
1607

    
1608
mkportable [OPTIONS]
1609
     -b, --build
1610
     -s, --state
1611

    
1612
La version actual a utilizar es:
1613
  %s
1614

    
1615
El directorio root de la estructura de packetes actual es:
1616
  %s
1617
    """ % (VERSION, GVSPKG_ROOT)
1618

    
1619

    
1620
def help(args):
1621
    print """
1622
usage: gvspkg [OPTIONS] COMMANDS
1623

    
1624
OPTIONS:
1625

    
1626
-h|--help
1627
    Muestra esta ayuda
1628

    
1629
-v|--verbose
1630
    Activa el modo verbose
1631

    
1632
-d|--debug
1633
    Activa el modo debug. Se muestran mensajes que pueden ser
1634
    utilies de cara a depuracion.
1635

    
1636
--version version
1637
    Fija la version con la que van a trabajar los comandos indicados.
1638

    
1639
-r|--package-root package-root
1640
    Fija la carpeta en la que va a buscar el raiz del sistema de paquetes
1641
    con el que trabajar
1642

    
1643
COMMANDS:
1644

    
1645
mkinstall [OPTIONS] install-file packages-file
1646

    
1647
    OPTIONS:
1648

    
1649
    -L | --jrelin=path
1650

    
1651
    -W | --jrewin=path
1652

    
1653
    -l | --addjrelin
1654

    
1655
    -w | --addjrewin
1656

    
1657
    -N | --distribution-name=name
1658
      Nombre usado como sufijo del nuevo binario a generar. Por defecto si no se
1659
      indica valdra "custom".
1660

    
1661

    
1662
lsi [OPTIONS]
1663
    Lista los indices disponibles de la version
1664

    
1665
    OPTIONS:
1666

    
1667
    -l | --long-format
1668
        Muestra para cada paquete la informacion del package.info
1669

    
1670
mks [OPTIONS]
1671
     Crea el fichero packages.gvspki con los indices de la
1672
     version y packages.gvspkg con los paquetes.
1673

    
1674
     OPTIONS:
1675

    
1676
     -c | --clear-list
1677
        Elimina la lista de paquetes a utilizar recreandola a partir
1678
        de los paquetes del pool tomando el ultimo build de cada paquete.
1679

    
1680
     --excludepkg pkgcode
1681
        No incluye el paquete indicado en el fichero gvspkg a generar
1682

    
1683
     --excludepki pkgcode
1684
        No incluye el paquete indicado en el fichero gvspki a generar
1685

    
1686
     --exclude pkgcode
1687
        No incluye el paquete indicado en los ficheros gvspkg y gvspki a generar
1688

    
1689
     -s | --include-default-selection
1690
        Incluye el fichero "defaultPackages", que se debe encontrar en el
1691
        directorio corriente, con los nombres de paquetes a seleccionar
1692
        por defecto.
1693

    
1694
     -p | --platform=name
1695
        Indica para que plataforma queremos generar el conjunto de paquetes.
1696
        Es un parametro opcional.
1697
        Sus valores pueden ser:
1698
        - all (Se incluiren los de todas las plataformas, no solo los multiplataforma)
1699
        - x86
1700
        - x86_64
1701
        - amd64 (sinonimo aceptado para x86_64)
1702
        Si no se indica plataforma se generara para "all".
1703
        El indice,"gvspki", siempre llevara los de todas las plataformas, esta opcion
1704
        solo afecta a la genracion del "gvspks".
1705

    
1706

    
1707
     -i | --index-only
1708
        No crea el fichero gvspks, solo crea el gvspki
1709

    
1710
     -I full-path-to-package | --include full-path-to-package
1711
        A�ade el paquete indicado a la lista de paquetes aunque no coincida para
1712
        la version de gvSIG con la que se esta trabajando.
1713

    
1714
mkdist [OPTIONS]
1715
     Crea los ficheros de la distribucion standard para el buil dindicado a partir de
1716
     la distribucion online y los paquetes que hayan en el pool para esta version.
1717
     Ejecuta un "mks" y un "mkhtml" automaticamente para preparar el conjunto de paquetes
1718
     a incluir en la distribucion, y una vez preparados ejecuta un "mkinsrall" por
1719
     S.O. (win y lin), renombrando los ficheros generados segun corresponda.
1720

    
1721
     OPTIONS:
1722
     -s STATE | --state=STATE
1723
        Indica el estado de la distribucion a generar, devel, alpha, ..., debe estar
1724
        deacuerdo con lo que diga el cihero online a usar como base.
1725

    
1726
     -b BUILD | --build=BUILD
1727
        Indica el numero de build de la destribucion a generar. Es usado para localizar
1728
        los ficheros en la carpeta builds de la distribucion y para saber donde debe
1729
        dejar los ficheros generados.
1730

    
1731
     -p | --platform=name
1732
        Indica para que plataforma queremos generar los instalables de gvSIG.
1733
        Es un parametro opcional.
1734
        Sus valores pueden ser:
1735
        - all (si se indica se generara para x86)
1736
        - x86
1737
        - x86_64
1738
        - amd64 (sinonimo aceptado para x86_64)
1739
        Si no se indica plataforma se generara para x86.
1740

    
1741
     -N | --distribution-name=name
1742
        Nombre usado como sufijo del nuevo binario a generar. Por defecto si no se
1743
        indica valdra "standard".
1744

    
1745

    
1746
mkmirror [OPTIONS]
1747

    
1748
  Prepara una carpeta para hacer un mirror de un build en concreto.
1749

    
1750
     OPTIONS:
1751

    
1752
     -b | --build buildnumber
1753
       Indica el numero de build del que se quiere hacer un mirror.
1754

    
1755
mkhtml [OPTIONS]
1756
     ????
1757

    
1758
     OPTIONS:
1759

    
1760
     -c | --clear-list
1761
        Elimina la lista de paquetes a utilizar recreandola a partir
1762
        de los paquetes del pool tomando el ultimo build de cada paquete.
1763

    
1764
     --excludepkg pkgcode
1765
        No incluye el paquete indicado en el fichero gvspkg a generar
1766

    
1767
     --excludepki pkgcode
1768
        No incluye el paquete indicado en el fichero gvspki a generar
1769

    
1770
     --exclude pkgcode
1771
        No incluye el paquete indicado en los ficheros gvspkg y gvspki a generar
1772

    
1773
show OPTIONS package-index
1774
    Muestra el package.info del indice indicado como parametro.
1775

    
1776
    OPTIONS
1777

    
1778
    --verify | -V
1779
      Comprueba la forma del packete.
1780

    
1781
edit [OPTIONS] package-index
1782
    Edita el package.info del indice indicado como parametro.
1783

    
1784
     OPTIONS:
1785

    
1786
     --replace=@search@replace@
1787
       Reemplaza en el package.info de cada paquete la cadena "search" por "replace"
1788
       todas las veces que aparezca. "@" puede ser cualquier caracter que no aparezca
1789
       en "search" y "replace".
1790
       Esta opcion puede indicarse tatas veces como reemplazos se deseen efectuar.
1791

    
1792
     --onlysign
1793
       firma el package.info sin editarlo de forma interactiva (no invoca al editor antes
1794
       de firmarlo).
1795

    
1796
     --sign | -S
1797
       Firma el package.info tras terminar la edicion (bach o interactiva)
1798

    
1799
editall [OPTIONS]
1800
    Edita todos los package.info
1801

    
1802
     OPTIONS:
1803

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

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

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

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

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

    
1823
      --sign | -S
1824
        Firma todos los paquetes que sean oficiales
1825

    
1826
install [OPTIONS] url-to-pki
1827
    descarga de la url indicada un fichero gvspki e instala este junto con su correspondiente
1828
    pkg en el pool local.
1829

    
1830
     OPTIONS:
1831

    
1832
     -f | --force
1833
       fuerza la sobreescritura de los ficheros en caso de que estos ya existan.
1834

    
1835
Si en la carpeta corriente encuentra un fichero gvspkg.options cargara los
1836
flags indicados ahi como flags por defecto para cada comando. El formato del
1837
fichero es:
1838
  main=OPCION-POR-DEFECTO
1839
  mks=OPCOPNES-POR-DEFECTO
1840
Donde main indica las opciones por defecto generales, independientes del comando
1841
a ejecutar. "mks" indica las opciones por defecto a usar en el comando "mks", y
1842
asi sucesivamente, indicando el nombre del comando seguido de un "=" y las opciones
1843
por defecto para ese comando.
1844

    
1845
Por defecto la version la obtiene del nombre de la carpeta
1846
corriente (%s). Las opciones indicadas en el fichero gvspkg.options tienen prioridad
1847
sobre este valor.
1848

    
1849
El directorio root de la estructura de packetes lo buscara en el
1850
sitio indicado por la variable de entorno GVPKG_ROOT, y si esta no
1851
esta establecida usara "%s". Las opciones indicadas en el fichero gvspkg.options
1852
tienen prioridad sobre este valor.
1853

    
1854
    """ % (VERSION, GVSPKG_ROOT)
1855

    
1856
def executeCommand(*args):
1857
    command = "shorthelp"
1858
    if len(args)>0:
1859
        command=args[0]
1860

    
1861
    r=1
1862
    if command=="lsi" :
1863
        r=lsi(args)
1864
    elif command == "mks":
1865
        r=mks(args)
1866
    elif command == "edit":
1867
        r=edit(args)
1868
    elif command == "editall":
1869
        r=editall(args)
1870
    elif command == "show":
1871
        r=show(args)
1872
    elif command == "mkhtml":
1873
        r=mkhtml(args)
1874
    elif command == "mkinstall":
1875
        r=mkinstall(args)
1876
    elif command == "install":
1877
        r=install(args)
1878
    elif command == "mkdist":
1879
        r=mkdist(args)
1880
    elif command == "mkmirror":
1881
        r=mkmirror(args)
1882
    elif command == "mkportable":
1883
        r=mkportable(args)
1884
    elif command == "prepare-portable":
1885
        r=prepare_portable(args)
1886
    elif command == "help":
1887
        r=help(args)
1888
    else:
1889
        r=shorthelp(args)
1890
    return r
1891

    
1892
def main():
1893
    global DEBUG
1894
    global VERSION
1895
    global VERBOSE
1896
    global GVSPKG_ROOT
1897
    global SEARCH_VERSIONS
1898

    
1899
    cmd = Command(sys.argv)
1900
    try:
1901
        opts, args = getopt.getopt(cmd.getArgs("main"), "dhvr:", ["debug", "verbose", "version=", "package-root=","help","search_versions="])
1902
    except getopt.GetoptError, err:
1903
        # print help information and exit:
1904
        print str(err) # will print something like "option -a not recognized"
1905
        shorthelp(None)
1906
        sys.exit(2)
1907

    
1908
    for opt, arg in opts:
1909
        if opt in ("-h", "--help"):
1910
            shorthelp(args)
1911
            sys.exit()
1912
        elif opt in ("-d", "--debug"):
1913
            DEBUG = True
1914
        elif opt in ("-v", "--verbose"):
1915
            VERBOSE = True
1916
        elif opt in ("--version"):
1917
            VERSION = arg
1918
        elif opt in ("--search_versions"):
1919
            SEARCH_VERSIONS.append(arg)
1920
        elif opt in ("-r", "--package-root"):
1921
            GVSPKG_ROOT = arg
1922
        else:
1923
            assert False, "unhandled option"
1924
    #
1925
    debug("DEBUG=%s" % DEBUG)
1926
    debug("VERSION=%s" % VERSION)
1927
    debug("GVSPKG_ROOT=%s" % GVSPKG_ROOT)
1928
    if GVSPKG_ROOT == None:
1929
      shorthelp(None)
1930
    else:
1931
      r=executeCommand(*args)
1932
      sys.exit(r)
1933

    
1934
main()