Statistics
| Revision:

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

History | View | Annotate | Download (62 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("lin","x86_64",".run"),
75
  Platform("win","x86_64",".exe"),
76
  Platform("darwin_macos_10.11","x86_64",".run",onlinefamily="lin", portableSufix=".app"),
77
  Platform("lin","x86",".run"),
78
  Platform("win","x86",".exe"),
79
  Platform("lin_ubuntu_14.04","x86_64",".run"),
80
  Platform("lin_ubuntu_14.04","x86",".run")
81
)
82

    
83

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

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

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

    
106

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

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

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

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

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

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

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

    
151
def getVersion():
152
    return VERSION
153

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

    
160
def getPackagesRoot():
161
    return GVSPKG_ROOT
162

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

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

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

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

    
181
def getpackageUrl(path):
182
  return re.sub(".*/downloads/","http://downloads.gvsig.org/download/",path)
183

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

    
190
def makedirs(path):
191
    if not os.path.isdir(path) :
192
      os.makedirs(path)
193

    
194
class Command:
195

    
196
    def __init__(self, args):
197
        self.args = args
198
        self.defaultoptions = None
199

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

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

    
222
        f.close()
223

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

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

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

    
256

    
257

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

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

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

    
298
    def getCode(self):
299
        return self.code
300

    
301
    def getOS(self):
302
        return self.os
303

    
304
    def getArch(self):
305
        return self.arch
306

    
307
    def getKey(self):
308
        return self.code+"-"+self.os+"-"+self.arch
309

    
310
    def getFullName(self):
311
        return os.path.basename(self.filename)
312

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

    
333
    def getFilename(self):
334
        return self.filename + "." + self.type
335

    
336
    def isPki(self):
337
        return self.type.lower() == "gvspki"
338

    
339
    def isPkg(self):
340
        return self.type.lower() != "gvspki"
341

    
342
    def hasPki(self):
343
        return os.path.isfile( self.getPkiFilename() )
344

    
345
    def getPkiFilename(self):
346
        return self.filename + ".gvspki"
347

    
348
    def hasPkg(self):
349
        return os.path.isfile( self.getPkgFilename() )
350

    
351
    def getPkgFilename(self):
352
        return self.filename + ".gvspkg"
353

    
354
    def getIniOption(self, name, default=None):
355
      section = "general"
356
      ini = self.getIni()
357
      if ini.has_option(section, name):
358
        x = ini.get(section, name)
359
        x = x.replace("\\:", ":")
360
        return x
361
      return default
362

    
363
    def getDescription(self):
364
      return self.getIniOption("description")
365

    
366
    def getCategories(self):
367
      return self.getIniOption("categories")
368

    
369
    def getName(self):
370
      return self.getIniOption("name")
371

    
372
    def getOwner(self):
373
      ini = self.getIni()
374
      if ini.has_option("general","owner"):
375
        return ini.get("general","owner")
376
      return None
377

    
378
    def getUrl(self):
379
      ini = self.getIni()
380
      if ini.has_option("general","download-url"):
381
        return ini.get("general","download-url")
382
      return None
383

    
384
    def getSourceUrl(self):
385
      ini = self.getIni()
386
      if ini.has_option("general","source-url"):
387
        return ini.get("general","source-url")
388
      return None
389

    
390
    def getDependencies(self):
391
      ini = self.getIni()
392
      if ini.has_option("general","dependencies"):
393
        return ini.get("general","dependencies")
394
      return None
395

    
396
    def getType(self):
397
      ini = self.getIni()
398
      if ini.has_option("general","type"):
399
        return ini.get("general","type")
400
      return None
401

    
402
    def getOfficial(self):
403
      ini = self.getIni()
404
      if ini.has_option("general","official"):
405
        return ini.get("general","official")
406
      return None
407

    
408
    def getIni(self):
409
        if self._ini != None:
410
          return self._ini
411
        index_path = self.getPkiFilename()
412
        outputfolder="/tmp/gvspkg.%s" % os.getpid()
413
        os.mkdir(outputfolder)
414
        os.system('unzip -q %s -d %s' % (index_path,outputfolder))
415

    
416
        files = findfiles(outputfolder, "package.info")
417
        if len(files) != 1:
418
            msgerror("Can't locate package.info in pool '%s'." % (index_path))
419
            return None
420

    
421
        package_info = files[0]
422
        self._ini = ConfigParser.ConfigParser()
423
        f = file(package_info,"r")
424
        ss = f.read()
425
        self._ini.readfp(StringIO.StringIO("[general]\n"+ss))
426
        f.close()
427
        shutil.rmtree(outputfolder)
428
        return self._ini
429

    
430
    def __str__(self):
431
        return self.filename
432

    
433
    def __repr__(self):
434
        return "filename=%r:gvsig=%r:gvsig_version=%r:code=%r:version=%r:build=%r:status=%r" % (
435
                self.filename, self.gvsig, self.gvsig_version, self.code, self.version, self.build, self.status )
436

    
437
class IndexList(list):
438

    
439
    def load(self, fname):
440
        message( "Loading index list from '%s'." % fname)
441
        f=file(fname,"r")
442
        lines=f.readlines()
443
        f.close()
444
        for line in lines:
445
          if line[-1] == "\n":
446
            line = line[:-1]
447

    
448
          info = PackageInfo(line)
449
          self.append(info)
450

    
451
    def save(self,fname):
452
        message( "Saving index list from '%s'." % fname)
453
        f=file(fname,"w")
454
        for index in self:
455
          f.write("%s\n" % index.getFilename())
456
        f.close()
457
        mychmod(fname,RWALL)
458

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

    
482
def lsi(args):
483
    cmd = Command(args)
484
    try:
485
        opts, args = getopt.getopt(cmd.getArgs("lsi"), "l", ["long-format"])
486
    except getopt.GetoptError, err:
487
        # print help information and exit:
488
        print str(err) # will print something like "option -a not recognized"
489
        shorthelp(args)
490
        sys.exit(2)
491

    
492
    long_format=False
493
    for opt, arg in opts:
494
        if opt in ("-l", "--long-format"):
495
            long_format = True
496
        else:
497
            assert False, "unhandled option"
498

    
499
    indexes = IndexList()
500
    indexes.build(getPool(), getSearchVersions())
501

    
502
    for info in indexes:
503
        if info.hasPki():
504
            if long_format:
505
                print "["+os.path.basename(info.getPkiFilename())+"]"
506
                print "# ", info.getPkiFilename()
507
                show(["show", os.path.basename(info.getPkiFilename())])
508
            else:
509
                print info.getPkiFilename()
510

    
511

    
512
def installer_add(cmd,arg1,arg2):
513
    installer_add_use_zip(cmd,arg1,arg2)
514

    
515
def installer_add_use_zip(cmd,arg1,arg2):
516
    if cmd == "addjrelin":
517
      return
518

    
519
    if cmd == "addjrewin":
520
      return
521

    
522
    if cmd == "addpks":
523
       zip = zipfile.ZipFile(arg1,"a",zipfile.ZIP_STORED)
524
       zip.write(arg2,"package.gvspks")
525
       zip.close()
526

    
527
def installer_add_use_installkit(cmd,arg1,arg2):
528
    folder = "%s/gvspkg.bin" % GVSPKG_ROOT
529

    
530
    cmd = "%s/installkit %s/main.tcl %s %s %s" % (
531
        "/mnt/data0/public-files/gvsig-desktop/gvspkg.bin",
532
        folder,
533
        cmd,
534
        arg1,
535
        arg2
536
    )
537
    system(cmd)
538

    
539
def mkinstall(args):
540
    cmd = Command(args)
541
    try:
542
        opts, args = getopt.getopt(cmd.getArgs("mkinstall"), "N:lL:wW:", ["addjrewin", "addjrelin", "jrelin=", "jrewin=", "distribution-name="])
543
    except getopt.GetoptError, err:
544
        # print help information and exit:
545
        print str(err) # will print something like "option -a not recognized"
546
        shorthelp(args)
547
        sys.exit(2)
548

    
549
    #print "opts = ",opts
550
    #print "args = ",args
551
    addjrelin=False
552
    addjrewin=False
553
    jrelin=None
554
    jrewin=None
555
    distribution_name = "custom"
556
    for opt, arg in opts:
557
        if opt in ("-L", "--jrelin"):
558
            jrelin = arg
559
        elif opt in ("-W", "--jrewin"):
560
            jrewin = arg
561
        elif opt in ("-l", "--addjrelin"):
562
            addjrelin = True
563
        elif opt in ("-w", "--addjrewin"):
564
            addjrewin = True
565
        elif opt in ("-N", "--distrinution-name"):
566
            distribution_name = arg
567
        else:
568
            assert False, "unhandled option"
569

    
570

    
571
    if len(args) != 2 :
572
        shorthelp(args)
573
        sys.exit(4)
574

    
575
    bin_name = args[0]
576
    gvspks_name = args[1]
577
    custom_name = bin_name.replace("online", distribution_name)
578

    
579
    if not "online" in bin_name :
580
        print "gvspkg mkinstall: binary file name must contain 'online'"
581
        sys.exit(3)
582

    
583
    if addjrelin and addjrewin :
584
        print "gvspkg mkinstall: only one of addjrelin or addjrewin is allowed."
585
        sys.exit(4)
586

    
587
    message("Creating %s..." % custom_name)
588
    shutil.copyfile(bin_name, custom_name)
589
    mychmod(custom_name,RWALL)
590
    message("Adding %s..." % gvspks_name)
591
    installer_add("addpks", custom_name, gvspks_name)
592

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

    
602

    
603
    if addjrewin:
604
        withjre_name = bin_name.replace("online", distribution_name+"-withjre")
605
        message("Creating %s..." % withjre_name)
606
        shutil.copyfile(custom_name, withjre_name)
607
        mychmod(withjre_name,RWALL)
608
        message("Adding %s..." % jrewin)
609
        installer_add("addjrewin", withjre_name, jrewin)
610
    """
611

    
612
def mks(args):
613
    cmd = Command(args)
614
    try:
615
        opts, args = getopt.getopt(cmd.getArgs("mks"), "ixscI:", ["index-only","include-default-selection", "clear-list", "exclude=", "excludepki=", "excludepkg=", "include="])
616
    except getopt.GetoptError, err:
617
        # print help information and exit:
618
        print str(err) # will print something like "option -a not recognized"
619
        shorthelp(args)
620
        sys.exit(2)
621

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

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

    
657

    
658
    indexes = IndexList()
659

    
660
    packages_txt = getDist() +"/packages.txt"
661
    packages_gvspki = getDist() +"/packages.gvspki"
662

    
663
    message( "Creating 'packages.gvspki' for version '%s'" % getVersion() + "...")
664
    if not os.path.exists(getDist()):
665
        msgerror("Can't locate version folder '%s'." % getDist())
666
        sys.exit(3)
667

    
668
    if os.path.exists(packages_txt) and not clear_list:
669
        indexes.load(packages_txt)
670
    else:
671
        indexes.build(getPool(), getSearchVersions())
672
        indexes.save(packages_txt)
673

    
674
    for pkg in includes:
675
      indexes.append(pkg)
676

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

    
699
    md5sum(packages_gvspki,packages_gvspki+".md5")
700
    mychmod(packages_gvspki+".md5",RWALL)
701

    
702
    if not index_only :
703
      for platform in platforms:
704
        packages_gvspks = getDist() +"/packages-"+platform.getOS()+"-"+platform.getArch()+".gvspks"
705
        message( "Writing 'packages-"+platform.getOS()+"-"+platform.getArch()+".gvspks' to '%s'" % packages_gvspks )
706
        set = zipfile.ZipFile(packages_gvspks,"w",zipfile.ZIP_STORED)
707
        for info in indexes:
708
            if not ( info.code in excludes_pkg or info.getFullName() in excludes_pkg ):
709
                try:
710
                    if info.isPkg(): #info.hasPkg():
711
                      if info.getOS() in ("all", platform.getOS()) :
712
                        if info.getArch() in ("all", platform.getArch()) :
713
                          set.write(info.getPkgFilename(), os.path.basename(info.getPkgFilename()))
714
                except Exception, ex:
715
                    msgerror("Can't add package '%s', error %s" % (info, str(ex)))
716
            else:
717
                debug("Exclude package '%s'" % info.getFullName())
718
        if default_selection != None :
719
            set.write(default_selection,default_selection)
720
        set.write("packages.properties","packages.properties")
721
        set.close()
722
        mychmod(packages_gvspks,RWALL)
723

    
724
        md5sum(packages_gvspks,packages_gvspks+".md5")
725
        mychmod(packages_gvspks+".md5",RWALL)
726

    
727
    message( "Createds package indexes.\n")
728

    
729
def mkmirror(args):
730
    cmd = Command(args)
731
    try:
732
        opts, args = getopt.getopt(cmd.getArgs("mkmirrot"), "b:", [ "build="])
733
    except getopt.GetoptError, err:
734
        # print help information and exit:
735
        print str(err) # will print something like "option -a not recognized"
736
        shorthelp(args)
737
        sys.exit(2)
738

    
739
    build = None
740
    for opt, arg in opts:
741
        if opt in ("-b", "--build"):
742
            build = arg
743
        else:
744
            assert False, "unhandled option %r" % opt
745

    
746
    if build == None:
747
        msgerror("Build number required.")
748
        sys.exit(3)
749
    domkmirror( getPackagesRoot(),getVersion(),build)
750

    
751
def linkfile(src,dst):
752
  if os.path.lexists(dst):
753
    os.remove(dst)
754
  os.symlink(src,dst)
755
  if os.path.lexists(src+".md5") :
756
    if os.path.lexists(dst+".md5"):
757
      os.remove(dst+".md5")
758
    os.symlink(src+".md5",dst+".md5")
759

    
760
def domkmirror(root_src, version, build):
761
  join = os.path.join
762

    
763
  build = str(build)
764
  root_target = join(root_src,"mirrors",version+"-"+build,"gvsig-desktop")
765
  build_src = join(root_src,"dists",version,"builds",build)
766
  build_target = join(root_target,"dists",version,"builds",build)
767
  pool_src = join(root_src,"pool")
768
  pool_target = join(root_target,"pool")
769

    
770
  makedirs(root_target)
771
  makedirs(build_target)
772
  makedirs(pool_target)
773
  files = os.listdir(build_src)
774
  linkfile(join(build_src,"packages.gvspki"), join(root_target,"dists",version,"packages.gvspki"))
775
  for f in files:
776
    f_src = join(build_src,f)
777
    f_target = join(build_target,f)
778
    if os.path.isfile(f_src):
779
      linkfile(f_src,f_target)
780

    
781
  z = zipfile.ZipFile(join(build_src,"packages.gvspki"))
782
  pkgs = z.namelist()
783
  for pkgname in pkgs:
784
    if pkgname!='defaultPackages':
785
      pkg = PackageInfo(pkgname)
786
      makedirs(join(root_target,"pool",pkg.getCode()))
787
      src = join(root_src,"pool",pkg.getCode(),pkg.getPkgFilename())
788
      target = join(root_target,"pool",pkg.getCode(),pkg.getPkgFilename())
789
      linkfile(src,target)
790
  cmd = "cd %s ; find . ! -type d >%s/files.lst" % (root_target, build_target)
791
  os.system(cmd)
792

    
793
def mkhtml(args):
794
    def getCode(info):
795
      return info.code
796

    
797

    
798
    cmd = Command(args)
799
    try:
800
        opts, args = getopt.getopt(cmd.getArgs("mkhtml"), "xsc", ["clear-list", "exclude=", "excludepki=", "excludepkg=", "include="])
801
    except getopt.GetoptError, err:
802
        # print help information and exit:
803
        print str(err) # will print something like "option -a not recognized"
804
        shorthelp(args)
805
        sys.exit(2)
806

    
807
    index_only = False
808
    clear_list=False
809
    includes=list()
810
    excludes_pki=list()
811
    excludes_pkg=list()
812
    for opt, arg in opts:
813
        if opt in ("-c", "--clear-list"):
814
            clear_list = True
815
        elif opt in ("-x", "--exclude"):
816
            excludes_pki.append(arg)
817
            excludes_pkg.append(arg)
818
        elif opt in ( "--excludepki"):
819
            excludes_pki.append(arg)
820
        elif opt in ( "--excludepkg"):
821
            excludes_pkg.append(arg)
822
        elif opt in ( "--include", "-I"):
823
            includes.append(PackageInfo(arg))
824
        else:
825
            assert False, "unhandled option %r" % opt
826

    
827
    message("Creating html pages...")
828
    indexes = IndexList()
829

    
830
    packages_txt = getDist() +"/packages.txt"
831

    
832
    if os.path.exists(packages_txt) and not clear_list:
833
        indexes.load(packages_txt)
834
    else:
835
        indexes.build(getPool(), getSearchVersions())
836
        indexes.save(packages_txt)
837

    
838
    for pkg in includes:
839
      indexes.append(pkg)
840

    
841
    allpackages = list()
842
    basepath = getWeb()
843
    for info in indexes:
844
        if not ( info.code in excludes_pki or info.getFullName() in excludes_pki ):
845
            try:
846
                if info.hasPki() :
847
                    mkpkihtml(basepath, info)
848
                    allpackages.append(info)
849
            except Exception, ex:
850
                msgerror("Can't create html '%s', error %s" % (info, str(ex)))
851

    
852
    html = '''
853
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
854
<html xmlns="http://www.w3.org/1999/xhtml">
855
<head>
856
  <meta http-equiv="Content-Type" content= "text/html; charset=us-ascii" />
857
      <title>"%s" package list</title>'''% getVersion() # Title
858

    
859
    html += '''
860
<!-- estilos para las tablas -->
861
  <style type="text/css" title="currentStyle">
862
    @import "css/demo_table.css";
863
    @import "css/thickbox.css";
864
    #pkglist{
865
        width:100%;
866
        clear:both;
867
        font-family:Arial,Helvetica,sans-serif;
868
    }
869
    #pkgdetails{
870
        width:600px !important;
871
        clear:both;
872
    }
873
    #pkgdetails table th{
874
        text-algin:right;
875
    }
876
  </style>
877
</head>'''
878

    
879
    html += '''
880
<body>
881
  <h1>%s package list</h1>
882
  <table id="pkglist" summary="%s package list" width="100%%" >
883
    <thead>
884
    <tr>
885
      <td>Package name</td>
886
      <td>Version</td>
887
      <td>O.S.</td>
888
      <td>Official</td>
889
      <td>Type</td>
890
      <td>Owner</td>
891
    </tr>
892
    </thead>
893
    <tbody>'''%(getVersion(),getVersion())
894

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

    
919
<!-- inicializacion de la tabla con cosas chachis -->
920
<script type="text/javascript">
921
  $(document).ready(function() {
922
      $('#pkglist').dataTable( {
923
      "bPaginate": false,
924
      "bLengthChange": true,
925
      "bFilter": true,
926
      "bSort": true,
927
      "bInfo": true,
928
      "bAutoWidth": true
929
    });
930
 } );
931
</script>
932
</body>
933
</html>"""
934

    
935
    # generate index.html
936
    try:
937
      f=file(getDist()+"/web/index.html","w")
938
      f.write(html)
939
      f.close()
940
    except Exception, ex:
941
      raise ex
942

    
943
    message("html pages createds.\n")
944

    
945

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

    
973
  #url = info.getUrl()
974
  url = info.getIniOption("download-url")
975
  if url != None:
976
    html += '    <tr><th valing="top">Downloads</th><td><a href ="%s">Binaries</a></td></tr>\n'%(url)
977
  else:
978
    html += '    <tr><th valing="top">Downloads</th><td>Binaries</td></tr>\n'
979

    
980
  sourceUrl = info.getSourceUrl()
981

    
982
  if sourceUrl != None:
983
    html += '    <tr><td></td><td><a href ="%s">Sources</a></td></tr>\n'%(sourceUrl)
984
  else:
985
    html += "    <tr><td></td><td>Sources</td></tr>\n"
986

    
987
  if info.getDependencies() == None:
988
    html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("Dependencies", "")
989
  else:
990
    html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("Dependencies", info.getDependencies().replace("\:",":"))
991
  html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("Type", info.getType())
992
  html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("Official", info.getOfficial())
993
  html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("O.S.", info.getOS())
994
  html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("Architecture", info.getArch())
995
  html += '    <tr><th valing="top">%s </th><td>%s</td></tr>\n'%("Categories", info.getCategories())
996

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

    
1023

    
1024
  try:
1025
    f = file(getWeb() + "/" + info.getFullName() + ".html","w")
1026
    f.write(html)
1027
    f.close()
1028
  except Exception, ex:
1029
    raise ex
1030

    
1031
def extract_make_portable(zfile, targetfolder):
1032
  print "Extracting 'make-portable' from %r to %r" % (zfile,targetfolder)
1033
  zf = zipfile.ZipFile(zfile)
1034
  data = zf.read("tools/make-portable")
1035
  f = open(os.path.join(targetfolder,"make-portable"),"wb")
1036
  f.write(data)
1037
  f.close()
1038
  zf.close()
1039

    
1040

    
1041
def extract_mkexec(zfile, targetfolder):
1042
  print "extract_mkexec: zfile=%s, target=%s" % (zfile, os.path.join(targetfolder,"mkexec"))
1043
  zf = zipfile.ZipFile(zfile)
1044
  data = zf.read("tools/mkexec")
1045
  f = open(os.path.join(targetfolder,"mkexec"),"wb")
1046
  f.write(data)
1047
  f.close()
1048
  zf.close()
1049

    
1050

    
1051
def prepare_portable(args):
1052
    cmd = Command(args)
1053
    try:
1054
        opts, args = getopt.getopt(cmd.getArgs("prepare-portable"), "b:s:", [ "build=", "state=" ])
1055
    except getopt.GetoptError, err:
1056
        # print help information and exit:
1057
        print str(err) # will print something like "option -a not recognized"
1058
        shorthelp(args)
1059
        sys.exit(2)
1060

    
1061
    build=None
1062
    state=None
1063
    for opt, arg in opts:
1064
        if opt in ("-b", "--build"):
1065
            build=arg
1066
        elif opt in ("-s", "--state"):
1067
            state=arg
1068
        else:
1069
            assert False, "unhandled option %r" % opt
1070

    
1071
    if build == None:
1072
      print "Requiered option --build not found."
1073
      shorthelp(args)
1074
      sys.exit(2)
1075

    
1076
    if state == None:
1077
      print "Requiered option --state not found."
1078
      shorthelp(args)
1079
      sys.exit(2)
1080

    
1081
    join = os.path.join
1082
    build_folder = join(getPackagesRoot(),"dists",getVersion(),"builds",build)
1083
    if not os.path.isdir(build_folder):
1084
      print "Can't access the build folder "+build_folder+"."
1085
      sys.exit(2)
1086

    
1087
    do_prepare_portable(build,state)
1088

    
1089
def do_prepare_portable(build,state):
1090
    join = os.path.join
1091
    build_folder = join(getPackagesRoot(),"dists",getVersion(),"builds",build)
1092
    portable_folder = join(build_folder,"misc","portable")
1093
    makedirs(portable_folder)
1094
    makedirs(join(portable_folder,"packages","custom"))
1095
    makedirs(join(portable_folder,"standard"))
1096
    makedirs(join(portable_folder,"patchs"))
1097
    shutil.copy(
1098
        join(getPackagesRoot(),"dists",getVersion(),"excludes.portable"),
1099
        join(portable_folder,"packages","excludes")
1100
    )
1101
    for platform in platforms :
1102
      fname_base = "gvSIG-desktop-%s-%s-%s-%s-%s" % (
1103
        getVersion(),build,state,platform.getOS(),platform.getArch()
1104
      )
1105
      linkfile(
1106
        join(build_folder,fname_base + "-online.zip"),
1107
        join(portable_folder,"standard",fname_base + "-online.zip")
1108
      )
1109
      linkfile(
1110
        join(build_folder,fname_base + ".gvspks"),
1111
        join(portable_folder,"standard",fname_base + ".gvspks")
1112
      )
1113
    extract_make_portable(
1114
      join(build_folder,fname_base + "-online.zip"),
1115
      join(portable_folder)
1116
    )
1117
    mychmod(join(portable_folder,"make-portable"),RWXALL)
1118

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

    
1128
def removefile(filename):
1129
  if os.path.exists(filename):
1130
    os.remove(filename)
1131

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

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

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

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

    
1162
    join = os.path.join
1163
    build_folder = join(getPackagesRoot(),"dists",getVersion(),"builds",build)
1164
    portable_folder = join(build_folder,"misc","portable")
1165
    target_folder = join(portable_folder,"target")
1166

    
1167
    if not os.path.isdir(build_folder):
1168
      print "Can't access the build folder "+build_folder+"."
1169
      sys.exit(2)
1170

    
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("Moving portable zip files to build folder")
1176
    for platform in platforms :
1177
      fname = "gvSIG-desktop-%s-%s-%s-%s-%s%s.zip" %  (
1178
        getVersion(),build,state,platform.getOS(),platform.getArch(), platform.getPortableSufix()
1179
      )
1180
      if os.path.exists(join(target_folder,fname)) :
1181
        message("    Removing previos %s" % fname)
1182
        removefile(join(build_folder,fname))
1183
        message("    Moving zip %s" % fname)
1184
        shutil.move(join(target_folder,fname), build_folder)
1185
      else:
1186
        message("    Skip zip %s" % fname)
1187

    
1188
    message("Remove temporary folders")
1189
    shutil.rmtree(target_folder)
1190

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

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

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

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

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

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

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

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

    
1242
    #executeCommand("mkhtml" )
1243

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

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

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

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

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

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

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

    
1276

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

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

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

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

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

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

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

    
1307

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

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

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

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

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

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

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

    
1388
    indexes = IndexList()
1389

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

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

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

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

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

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

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

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

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

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

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

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

    
1480
def verify_sign(filename):
1481
      os.system('java -cp "%s/commons-codec-1.6.jar:%s/org.gvsig.installer.lib.impl-1.0.1-SNAPSHOT.jar" org.gvsig.installer.lib.impl.utils.SignUtil verify %s' % (
1482
        get_gvspkg_bin_folder(),
1483
        get_gvspkg_bin_folder(),
1484
        filename)
1485
      )
1486

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

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

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

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

    
1510

    
1511
def crearpki(path_pkg, url_pkg):
1512
  z = zipfile.ZipFile(path_pkg,"r")
1513
  zi = z.infolist()
1514
  filename = None
1515
  contents = None
1516
  for info in zi :
1517
    if info.filename.endswith("/package.info"):
1518
      filename = info.filename
1519
      contents = z.read(filename)
1520
      if contents[-1:]!= "\n":
1521
        contents += "\n"
1522
      contents += "download-url=%s\n" % url_pkg.replace(":","\\:")
1523
      break
1524

    
1525
  z.close()
1526
  
1527
  if filename == None:
1528
    return
1529
  
1530
  fname = path_pkg[:-7]+".gvspki"
1531
  z = zipfile.ZipFile(fname,"w")
1532
  z.writestr(filename,contents)
1533
  z.close()
1534
  
1535
  return fname
1536
  
1537
def install(args):
1538
    cmd = Command(args)
1539
    try:
1540
        opts, args = getopt.getopt(cmd.getArgs("install"), "fS", [ "force","nohttps" ])
1541
    except getopt.GetoptError, err:
1542
        # print help information and exit:
1543
        print str(err) # will print something like "option -a not recognized"
1544
        shorthelp(args)
1545
        sys.exit(2)
1546

    
1547
    force = False
1548
    nohttps = False
1549
    for opt, arg in opts:
1550
        if opt in ("-f", "--force"):
1551
            force = True
1552
        if opt in ("-S", "--nohttps"):
1553
            nohttps = True
1554
        else:
1555
            assert False, "unhandled option %r" % opt
1556

    
1557
    url_pki = args[0]
1558
    if url_pki.endswith(".gvspki") and url_pki.startswith("https:") and nohttps :
1559
       url_pki = "http:" + url_pki[6:]
1560

    
1561
    message( "Download package index '%s'" % url_pki)
1562
    temppath_pki= os.path.join("/tmp",os.path.basename(url_pki))
1563
    if not downloadFile(url_pki,temppath_pki):
1564
      msgerror("Can't download index.")
1565
      msgerror("Can't install '%s'." % url_pki)
1566
      print # force a newline
1567
      return 1
1568
    if temppath_pki.endswith(".gvspki"):
1569
      pkg = PackageInfo(temppath_pki)
1570
      url_pkg = pkg.getUrl().replace("\\","")
1571
      if url_pkg[-7:] == ".gvspki" :
1572
        msgwarn("Suspicious download-url value. Ends with gvspki, expected gvspkg.")
1573
        msgwarn("download-url ='%s'." % url_pkg)
1574

    
1575
      if url_pkg.startswith("https:") and nohttps :
1576
         url_pkg = "http:" + url_pkg[6:]
1577

    
1578
      message( "Download package '%s'" % url_pkg)
1579
      temppath_pkg= os.path.join("/tmp",os.path.basename(url_pkg))
1580
      if not downloadFile(url_pkg,temppath_pkg):
1581
        msgerror("Can't download package from download-url ('%s')." % url_pkg)
1582
        msgerror("Can't install '%s'," % url_pki)
1583
        print # force a newline
1584
        return 1
1585

    
1586
    elif temppath_pki.endswith(".gvspkg"):
1587
      temppath_pkg = temppath_pki
1588
      pkg = PackageInfo(temppath_pki)
1589
      url = getpackageUrl(getPool()+"/"+pkg.getCode()+"/"+os.path.basename(temppath_pkg))
1590
      temppath_pki = crearpki(temppath_pkg,url)
1591

    
1592
    else:
1593
      msgerror("Can't install '%s', extension is not a gvspki or gvspkg.\n" % url_pki)
1594
      return 1
1595

    
1596
    folder = os.path.join(getPool(),pkg.getCode())
1597
    makedirs(folder)
1598
    pathname_pki = os.path.join(folder,os.path.basename(temppath_pki))
1599
    if not force and os.path.isfile(pathname_pki) :
1600
        msgwarn("The package index alreade exist in the pool. Use -f to forrce install.")
1601
        print # force a newline
1602
        return 1
1603
    pathname_pkg = os.path.join(folder,os.path.basename(temppath_pkg))
1604
    if  not force and os.path.isfile(pathname_pki) :
1605
        msgwarn("The package downloaded from download-url alredy exists in the pool. Use -f to force install.")
1606
        print # force a newline
1607
        return 1
1608
    message( "installing package '%s'" % os.path.basename(pathname_pki))
1609
    shutil.copyfile(temppath_pki, pathname_pki)
1610
    message( "installing package '%s'" % os.path.basename(pathname_pkg))
1611
    shutil.copyfile(temppath_pkg, pathname_pkg)
1612

    
1613
    md5sum(pathname_pki, pathname_pki+".md5")
1614
    md5sum(pathname_pkg, pathname_pkg+".md5")
1615
    
1616
def md5sum(fin, fout):
1617
    message( "Calculating md5sum of %s..." % fin )
1618
    system("md5sum -b %s >%s" % (fin, fout) )
1619

    
1620
def downloadFile(url,path):
1621
  try:
1622
    fsrc = urllib2.urlopen(url)
1623
  except urllib2.HTTPError,e:
1624
    msgerror("Error abriendo url '%s'." % url, e)
1625
    return False
1626
  fdst = file(path,"wb")
1627
  shutil.copyfileobj(fsrc,fdst)
1628
  fdst.close()
1629
  fsrc.close()
1630
  return True
1631

    
1632
def shorthelp(args):
1633
    print """
1634
usage: gvspkg [OPTIONS] COMMANDS
1635
OPTIONS:
1636

    
1637
-h,--help       Muestra esta ayuda
1638
-v,--verbose    Activa el modo verbose
1639
-d,--debug      Activa el modo debug.
1640
--version ver   Fija la version con la que van a trabajar.
1641
-r,--package-root root    Fija la carpeta del raiz del sistema de paquetes
1642

    
1643
COMMANDS:
1644

    
1645
mkinstall [OPTIONS] install-file packages-file
1646
    -L, --jrelin=path
1647
    -W, --jrewin=path
1648
    -l, --addjrelin
1649
    -w, --addjrewin
1650
    -N, --distribution-name=name
1651

    
1652
lsi [OPTIONS]
1653
    -l, --long-format
1654

    
1655
mks [OPTIONS]
1656
     -c, --clear-list
1657
     --excludepkg pkgcode
1658
     --excludepki pkgcode
1659
     --exclude pkgcode
1660
     -s, --include-default-selection
1661
     -i, --index-only
1662
     -I full-path-to-package, --include full-path-to-package
1663

    
1664
mkdist [OPTIONS]
1665
     -s STATE, --state=STATE
1666
     -b BUILD, --build=BUILD
1667
     -N, --distribution-name=name
1668

    
1669
mkmirror [OPTIONS]
1670
     -b, --build buildnumber
1671

    
1672
mkhtml [OPTIONS]
1673
     -c, --clear-list
1674
     --excludepkg pkgcode
1675
     --excludepki pkgcode
1676
     --exclude pkgcode
1677

    
1678
show OPTIONS package-index
1679
    --verify, -V
1680

    
1681
edit [OPTIONS] package-index
1682
     --replace=@search@replace@
1683
     --onlysign
1684
     --sign, -S
1685

    
1686
editall [OPTIONS]
1687
     -c, --clear-list
1688
     --excludepkg pkgcode
1689
     --excludepki pkgcode
1690
     --exclude pkgcode
1691
     --replace=@search@replace@
1692
     --sign, -S
1693

    
1694
install [OPTIONS] url-to-pki
1695
     -f, --force
1696

    
1697
prepare-portable [OPTIONS]
1698
     -b, --build
1699
     -s, --state
1700

    
1701
mkportable [OPTIONS]
1702
     -b, --build
1703
     -s, --state
1704

    
1705
La version actual a utilizar es:
1706
  %s
1707

    
1708
El directorio root de la estructura de packetes actual es:
1709
  %s
1710
    """ % (VERSION, GVSPKG_ROOT)
1711

    
1712

    
1713
def help(args):
1714
    print """
1715
usage: gvspkg [OPTIONS] COMMANDS
1716

    
1717
OPTIONS:
1718

    
1719
-h|--help
1720
    Muestra esta ayuda
1721

    
1722
-v|--verbose
1723
    Activa el modo verbose
1724

    
1725
-d|--debug
1726
    Activa el modo debug. Se muestran mensajes que pueden ser
1727
    utilies de cara a depuracion.
1728

    
1729
--version version
1730
    Fija la version con la que van a trabajar los comandos indicados.
1731

    
1732
-r|--package-root package-root
1733
    Fija la carpeta en la que va a buscar el raiz del sistema de paquetes
1734
    con el que trabajar
1735

    
1736
COMMANDS:
1737

    
1738
mkinstall [OPTIONS] install-file packages-file
1739

    
1740
    OPTIONS:
1741

    
1742
    -L | --jrelin=path
1743

    
1744
    -W | --jrewin=path
1745

    
1746
    -l | --addjrelin
1747

    
1748
    -w | --addjrewin
1749

    
1750
    -N | --distribution-name=name
1751
      Nombre usado como sufijo del nuevo binario a generar. Por defecto si no se
1752
      indica valdra "custom".
1753

    
1754

    
1755
lsi [OPTIONS]
1756
    Lista los indices disponibles de la version
1757

    
1758
    OPTIONS:
1759

    
1760
    -l | --long-format
1761
        Muestra para cada paquete la informacion del package.info
1762

    
1763
mks [OPTIONS]
1764
     Crea el fichero packages.gvspki con los indices de la
1765
     version y packages.gvspkg con los paquetes.
1766

    
1767
     OPTIONS:
1768

    
1769
     -c | --clear-list
1770
        Elimina la lista de paquetes a utilizar recreandola a partir
1771
        de los paquetes del pool tomando el ultimo build de cada paquete.
1772

    
1773
     --excludepkg pkgcode
1774
        No incluye el paquete indicado en el fichero gvspkg a generar
1775

    
1776
     --excludepki pkgcode
1777
        No incluye el paquete indicado en el fichero gvspki a generar
1778

    
1779
     --exclude pkgcode
1780
        No incluye el paquete indicado en los ficheros gvspkg y gvspki a generar
1781

    
1782
     -s | --include-default-selection
1783
        Incluye el fichero "defaultPackages", que se debe encontrar en el
1784
        directorio corriente, con los nombres de paquetes a seleccionar
1785
        por defecto.
1786

    
1787
     -i | --index-only
1788
        No crea el fichero gvspks, solo crea el gvspki
1789

    
1790
     -I full-path-to-package | --include full-path-to-package
1791
        Agrega el paquete indicado a la lista de paquetes aunque no coincida para
1792
        la version de gvSIG con la que se esta trabajando.
1793

    
1794
mkdist [OPTIONS]
1795
     Crea los ficheros de la distribucion standard para el buil dindicado a partir de
1796
     la distribucion online y los paquetes que hayan en el pool para esta version.
1797
     Ejecuta un "mks" y un "mkhtml" automaticamente para preparar el conjunto de paquetes
1798
     a incluir en la distribucion, y una vez preparados ejecuta un "mkinsrall" por
1799
     S.O. (win y lin), renombrando los ficheros generados segun corresponda.
1800

    
1801
     OPTIONS:
1802
     -s STATE | --state=STATE
1803
        Indica el estado de la distribucion a generar, devel, alpha, ..., debe estar
1804
        deacuerdo con lo que diga el cihero online a usar como base.
1805

    
1806
     -b BUILD | --build=BUILD
1807
        Indica el numero de build de la destribucion a generar. Es usado para localizar
1808
        los ficheros en la carpeta builds de la distribucion y para saber donde debe
1809
        dejar los ficheros generados.
1810

    
1811
     -N | --distribution-name=name
1812
        Nombre usado como sufijo del nuevo binario a generar. Por defecto si no se
1813
        indica valdra "standard".
1814

    
1815

    
1816
mkmirror [OPTIONS]
1817

    
1818
  Prepara una carpeta para hacer un mirror de un build en concreto.
1819

    
1820
     OPTIONS:
1821

    
1822
     -b | --build buildnumber
1823
       Indica el numero de build del que se quiere hacer un mirror.
1824

    
1825
mkhtml [OPTIONS]
1826
     ????
1827

    
1828
     OPTIONS:
1829

    
1830
     -c | --clear-list
1831
        Elimina la lista de paquetes a utilizar recreandola a partir
1832
        de los paquetes del pool tomando el ultimo build de cada paquete.
1833

    
1834
     --excludepkg pkgcode
1835
        No incluye el paquete indicado en el fichero gvspkg a generar
1836

    
1837
     --excludepki pkgcode
1838
        No incluye el paquete indicado en el fichero gvspki a generar
1839

    
1840
     --exclude pkgcode
1841
        No incluye el paquete indicado en los ficheros gvspkg y gvspki a generar
1842

    
1843
show OPTIONS package-index
1844
    Muestra el package.info del indice indicado como parametro.
1845

    
1846
    OPTIONS
1847

    
1848
    --verify | -V
1849
      Comprueba la forma del packete.
1850

    
1851
edit [OPTIONS] package-index
1852
    Edita el package.info del indice indicado como parametro.
1853

    
1854
     OPTIONS:
1855

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

    
1862
     --onlysign
1863
       firma el package.info sin editarlo de forma interactiva (no invoca al editor antes
1864
       de firmarlo).
1865

    
1866
     --sign | -S
1867
       Firma el package.info tras terminar la edicion (bach o interactiva)
1868

    
1869
editall [OPTIONS]
1870
    Edita todos los package.info
1871

    
1872
     OPTIONS:
1873

    
1874
     -c | --clear-list
1875
        Elimina la lista de paquetes a utilizar recreandola a partir
1876
        de los paquetes del pool tomando el ultimo build de cada paquete.
1877

    
1878
     --excludepkg pkgcode
1879
        No incluye el paquete indicado en el fichero gvspkg a generar
1880

    
1881
     --excludepki pkgcode
1882
        No incluye el paquete indicado en el fichero gvspki a generar
1883

    
1884
     --exclude pkgcode
1885
        No incluye el paquete indicado en los ficheros gvspkg y gvspki a generar
1886

    
1887
     --replace=@search@replace@
1888
       Reemplaza en el package.info de cada paquete la cadena "search" por "replace"
1889
       todas las veces que aparezca. "@" puede ser cualquier caracter que no aparezca
1890
       en "search" y "replace".
1891
       Esta opcion puede indicarse tatas veces como reemplazos se deseen efectuar.
1892

    
1893
      --sign | -S
1894
        Firma todos los paquetes que sean oficiales
1895

    
1896
install [OPTIONS] url-to-pki
1897
    descarga de la url indicada un fichero gvspki e instala este junto con su correspondiente
1898
    pkg en el pool local.
1899

    
1900
     OPTIONS:
1901

    
1902
     -f | --force
1903
       fuerza la sobreescritura de los ficheros en caso de que estos ya existan.
1904

    
1905
Si en la carpeta corriente encuentra un fichero gvspkg.options cargara los
1906
flags indicados ahi como flags por defecto para cada comando. El formato del
1907
fichero es:
1908
  main=OPCION-POR-DEFECTO
1909
  mks=OPCOPNES-POR-DEFECTO
1910
Donde main indica las opciones por defecto generales, independientes del comando
1911
a ejecutar. "mks" indica las opciones por defecto a usar en el comando "mks", y
1912
asi sucesivamente, indicando el nombre del comando seguido de un "=" y las opciones
1913
por defecto para ese comando.
1914

    
1915
Por defecto la version la obtiene del nombre de la carpeta
1916
corriente (%s). Las opciones indicadas en el fichero gvspkg.options tienen prioridad
1917
sobre este valor.
1918

    
1919
El directorio root de la estructura de packetes lo buscara en el
1920
sitio indicado por la variable de entorno GVPKG_ROOT, y si esta no
1921
esta establecida usara "%s". Las opciones indicadas en el fichero gvspkg.options
1922
tienen prioridad sobre este valor.
1923

    
1924
    """ % (VERSION, GVSPKG_ROOT)
1925

    
1926
def executeCommand(*args):
1927
    command = "shorthelp"
1928
    if len(args)>0:
1929
        command=args[0]
1930

    
1931
    r=1
1932
    if command=="lsi" :
1933
        r=lsi(args)
1934
    elif command == "mks":
1935
        r=mks(args)
1936
    elif command == "edit":
1937
        r=edit(args)
1938
    elif command == "editall":
1939
        r=editall(args)
1940
    elif command == "show":
1941
        r=show(args)
1942
    elif command == "mkhtml":
1943
        r=mkhtml(args)
1944
    elif command == "mkinstall":
1945
        r=mkinstall(args)
1946
    elif command == "install":
1947
        r=install(args)
1948
    elif command == "mkdist":
1949
        r=mkdist(args)
1950
    elif command == "mkmirror":
1951
        r=mkmirror(args)
1952
    elif command == "mkportable":
1953
        r=mkportable(args)
1954
    elif command == "prepare-portable":
1955
        r=prepare_portable(args)
1956
    elif command == "help":
1957
        r=help(args)
1958
    else:
1959
        r=shorthelp(args)
1960
    return r
1961

    
1962
def main():
1963
    global DEBUG
1964
    global VERSION
1965
    global VERBOSE
1966
    global GVSPKG_ROOT
1967
    global SEARCH_VERSIONS
1968

    
1969
    cmd = Command(sys.argv)
1970
    try:
1971
        opts, args = getopt.getopt(cmd.getArgs("main"), "dhvr:", ["debug", "verbose", "version=", "package-root=","help","search_versions="])
1972
    except getopt.GetoptError, err:
1973
        # print help information and exit:
1974
        print str(err) # will print something like "option -a not recognized"
1975
        shorthelp(None)
1976
        sys.exit(2)
1977

    
1978
    for opt, arg in opts:
1979
        if opt in ("-h", "--help"):
1980
            shorthelp(args)
1981
            sys.exit()
1982
        elif opt in ("-d", "--debug"):
1983
            DEBUG = True
1984
        elif opt in ("-v", "--verbose"):
1985
            VERBOSE = True
1986
        elif opt in ("--version"):
1987
            VERSION = arg
1988
        elif opt in ("--search_versions"):
1989
            SEARCH_VERSIONS.append(arg)
1990
        elif opt in ("-r", "--package-root"):
1991
            GVSPKG_ROOT = arg
1992
        else:
1993
            assert False, "unhandled option"
1994
    #
1995
    debug("DEBUG=%s" % DEBUG)
1996
    debug("VERSION=%s" % VERSION)
1997
    debug("GVSPKG_ROOT=%s" % GVSPKG_ROOT)
1998
    if GVSPKG_ROOT == None:
1999
      shorthelp(None)
2000
    else:
2001
      r=executeCommand(*args)
2002
      sys.exit(r)
2003

    
2004
main()
2005