Statistics
| Revision:

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

History | View | Annotate | Download (62.6 KB)

1
#!/usr/bin/python
2
# -*- coding: utf-8 -*-
3
#
4
import sys
5
import os
6
import os.path
7
import fnmatch
8
import shutil
9
import zipfile
10
import stat
11
import getopt
12
from os.path import dirname
13
import shutil
14
from os import system
15
import ConfigParser
16
import StringIO
17
import re
18
import urllib2
19
import time
20

    
21
DEBUG = False
22
DEBUG = False
23
VERBOSE = False
24
SEARCH_VERSIONS = list()
25

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

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

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

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

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

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

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

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

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

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

    
83

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

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

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

    
106

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

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

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

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

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

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

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

    
151
def getVersion():
152
    return VERSION
153

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

    
160
def getPackagesRoot():
161
    return GVSPKG_ROOT
162

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

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

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

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

    
181
def 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 hasPki(self):
337
        return os.path.isfile( self.getPkiFilename() )
338

    
339
    def getPkiFilename(self):
340
        return self.filename + ".gvspki"
341

    
342
    def hasPkg(self):
343
        return os.path.isfile( self.getPkgFilename() )
344

    
345
    def getPkgFilename(self):
346
        return self.filename + ".gvspkg"
347

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

    
357
    def getDescription(self):
358
      return self.getIniOption("description")
359

    
360
    def getCategories(self):
361
      return self.getIniOption("categories")
362

    
363
    def getName(self):
364
      return self.getIniOption("name")
365

    
366
    def getOwner(self):
367
      ini = self.getIni()
368
      if ini.has_option("general","owner"):
369
        return ini.get("general","owner")
370
      return None
371

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

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

    
384
    def getDependencies(self):
385
      ini = self.getIni()
386
      if ini.has_option("general","dependencies"):
387
        return ini.get("general","dependencies")
388
      return None
389

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

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

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

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

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

    
424
    def __str__(self):
425
        return self.filename
426

    
427
    def __repr__(self):
428
        return "filename=%r:gvsig=%r:gvsig_version=%r:code=%r:version=%r:build=%r:status=%r" % (
429
                self.filename, self.gvsig, self.gvsig_version, self.code, self.version, self.build, self.status )
430

    
431
class IndexList(list):
432

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

    
442
          info = PackageInfo(line)
443
          self.append(info)
444

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

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

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

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

    
493
    indexes = IndexList()
494
    indexes.build(getPool(), getSearchVersions())
495

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

    
505

    
506
def installer_add(cmd,arg1,arg2):
507
    installer_add_use_zip(cmd,arg1,arg2)
508

    
509
def installer_add_use_zip(cmd,arg1,arg2):
510
    if cmd == "addjrelin":
511
      return
512

    
513
    if cmd == "addjrewin":
514
      return
515

    
516
    if cmd == "addpks":
517
       zip = zipfile.ZipFile(arg1,"a",zipfile.ZIP_STORED)
518
       zip.write(arg2,"package.gvspks")
519
       zip.close()
520

    
521
def installer_add_use_installkit(cmd,arg1,arg2):
522
    folder = "%s/gvspkg.bin" % GVSPKG_ROOT
523

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

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

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

    
564

    
565
    if len(args) != 2 :
566
        shorthelp(args)
567
        sys.exit(4)
568

    
569
    bin_name = args[0]
570
    gvspks_name = args[1]
571
    custom_name = bin_name.replace("online", distribution_name)
572

    
573
    if not "online" in bin_name :
574
        print "gvspkg mkinstall: binary file name must contain 'online'"
575
        sys.exit(3)
576

    
577
    if addjrelin and addjrewin :
578
        print "gvspkg mkinstall: only one of addjrelin or addjrewin is allowed."
579
        sys.exit(4)
580

    
581
    message("Creating %s..." % custom_name)
582
    shutil.copyfile(bin_name, custom_name)
583
    mychmod(custom_name,RWALL)
584
    message("Adding %s..." % gvspks_name)
585
    installer_add("addpks", custom_name, gvspks_name)
586

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

    
596

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

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

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

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

    
651

    
652
    indexes = IndexList()
653

    
654
    packages_txt = getDist() +"/packages.txt"
655
    packages_gvspki = getDist() +"/packages.gvspki"
656

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

    
662
    if os.path.exists(packages_txt) and not clear_list:
663
        indexes.load(packages_txt)
664
    else:
665
        indexes.build(getPool(), getSearchVersions())
666
        indexes.save(packages_txt)
667

    
668
    for pkg in includes:
669
      indexes.append(pkg)
670

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

    
693
    md5sum(packages_gvspki,packages_gvspki+".md5")
694
    mychmod(packages_gvspki+".md5",RWALL)
695

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

    
718
        md5sum(packages_gvspks,packages_gvspks+".md5")
719
        mychmod(packages_gvspks+".md5",RWALL)
720

    
721
    message( "Createds package indexes.\n")
722

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

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

    
740
    if build == None:
741
        msgerror("Build number required.")
742
        sys.exit(3)
743
    domkmirror( getPackagesRoot(),getVersion(),build)
744

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

    
754
def domkmirror(root_src, version, build):
755
  join = os.path.join
756

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

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

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

    
787
def mkhtml(args):
788
    def getCode(info):
789
      return info.code
790

    
791

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

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

    
821
    message("Creating html pages...")
822
    indexes = IndexList()
823

    
824
    packages_txt = getDist() +"/packages.txt"
825

    
826
    if os.path.exists(packages_txt) and not clear_list:
827
        indexes.load(packages_txt)
828
    else:
829
        indexes.build(getPool(), getSearchVersions())
830
        indexes.save(packages_txt)
831

    
832
    for pkg in includes:
833
      indexes.append(pkg)
834

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

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

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

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

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

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

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

    
937
    message("html pages createds.\n")
938

    
939

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

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

    
974
  sourceUrl = info.getSourceUrl()
975

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

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

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

    
1017

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

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

    
1034

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

    
1044

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

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

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

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

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

    
1081
    do_prepare_portable(build,state)
1082

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

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

    
1136
def removefile(filename):
1137
  if os.path.exists(filename):
1138
    os.remove(filename)
1139

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

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

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

    
1165
    if state == None:
1166
      print "Requiered option --state not found."
1167
      shorthelp(args)
1168
      sys.exit(2)
1169

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

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

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

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

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

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

    
1221
    build=None
1222
    state=None
1223
    distribution_name = "standard"
1224

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

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

    
1240
    if state == None:
1241
      print "Requiered option --state not found."
1242
      shorthelp(args)
1243
      sys.exit(2)
1244

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

    
1249
    message( "Generating distribution for build "+ build + "...")
1250
    message("Recreating index of packages...")
1251
    executeCommand("mks", "-s", "-c")
1252

    
1253
    #executeCommand("mkhtml" )
1254

    
1255
    gvspki_filename = "builds/"+build+"/packages.gvspki"
1256
    message( "Coping packages.gvspki to "+ gvspki_filename + "\n")
1257
    shutil.copyfile("packages.gvspki", gvspki_filename)
1258
    shutil.copyfile("packages.gvspki.md5", gvspki_filename +".md5")
1259

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

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

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

    
1277
        message( "Coping packages-"+platform.getOS()+"-"+platform.getArch()+".gvspks to "+ gvspks_filename)
1278
        shutil.copyfile("packages-"+platform.getOS()+"-"+platform.getArch()+".gvspks", gvspks_filename)
1279
        shutil.copyfile("packages-"+platform.getOS()+"-"+platform.getArch()+".gvspks.md5", gvspks_filename +".md5")
1280

    
1281
        message( "Add execution permissions to online installers....")
1282
        mychmod(online_filename,RWXALL)
1283

    
1284
        md5sum(online_filename,online_filename+".md5")
1285
        mychmod(online_filename+".md5",RWALL)
1286

    
1287

    
1288
        executeCommand("mkinstall" , online_filename, gvspks_filename)
1289

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

    
1298
        md5sum(target_filename,target_filename+".md5")
1299
        mychmod(target_filename+".md5",RWALL)
1300

    
1301
        message( "Createds installers for platform "+platform.getOS()+"/"+platform.getArch()+"\n")
1302

    
1303
    mkexec(VERSION, build, state, distribution_name, os.path.join(os.getcwd(), "builds", build))
1304

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

    
1316
    message( "\nCreation of distribution completed.\n")
1317

    
1318

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

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

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

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

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

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

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

    
1399
    indexes = IndexList()
1400

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

    
1408
    for pkg in includes:
1409
      indexes.append(pkg)
1410

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

    
1422
                  if sign:
1423
                    edit_pkginfo_of_package(info.getPkiFilename(), edit_sign)
1424

    
1425
            except Exception, ex:
1426
                msgerror("Can't add index '%s', error %s" % (info, str(ex)))
1427

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

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

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

    
1465
    if sign:
1466
      edit_pkginfo_of_package(index_path, edit_sign)
1467

    
1468
def edit_ui(filename, args):
1469
      os.system('vi "%s"' % filename)
1470

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

    
1484
def edit_sign(filename, args):
1485
      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' %  (
1486
        get_gvspkg_bin_folder(),
1487
        get_gvspkg_bin_folder(),
1488
        filename)
1489
      )
1490

    
1491
def verify_sign(filename):
1492
      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' % (
1493
        get_gvspkg_bin_folder(),
1494
        get_gvspkg_bin_folder(),
1495
        filename)
1496
      )
1497

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

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

    
1508
    package_info = files[0]
1509
    code = package_info.split("/")[-2]
1510
    operation(package_info, args)
1511

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

    
1521

    
1522
def crearpki(path_pkg, url_pkg):
1523
  z = zipfile.ZipFile(path_pkg,"r")
1524
  zi = z.infolist()
1525
  filename = None
1526
  contents = None
1527
  for info in zi :
1528
    if info.filename.endswith("/package.info"):
1529
      filename = info.filename
1530
      contents = z.read(filename)
1531
      if contents[-1:]!= "\n":
1532
        contents += "\n"
1533
      contents += "download-url=%s\n" % url_pkg.replace(":","\\:")
1534
      break
1535

    
1536
  z.close()
1537
  
1538
  if filename == None:
1539
    return
1540
  
1541
  fname = path_pkg[:-7]+".gvspki"
1542
  z = zipfile.ZipFile(fname,"w")
1543
  z.writestr(filename,contents)
1544
  z.close()
1545
  
1546
  return fname
1547
  
1548
def install(args):
1549
    cmd = Command(args)
1550
    try:
1551
        opts, args = getopt.getopt(cmd.getArgs("install"), "fS", [ "force","nohttps" ])
1552
    except getopt.GetoptError, err:
1553
        # print help information and exit:
1554
        print str(err) # will print something like "option -a not recognized"
1555
        shorthelp(args)
1556
        sys.exit(2)
1557

    
1558
    force = False
1559
    nohttps = False
1560
    for opt, arg in opts:
1561
        if opt in ("-f", "--force"):
1562
            force = True
1563
        if opt in ("-S", "--nohttps"):
1564
            nohttps = True
1565
        else:
1566
            assert False, "unhandled option %r" % opt
1567

    
1568
    url_pki = args[0]
1569
    if url_pki.startswith("https:") and nohttps :
1570
       url_pki = "http:" + url_pki[6:]
1571

    
1572
    message( "Download package index '%s'" % url_pki)
1573
    temppath_pki= os.path.join("/tmp",os.path.basename(url_pki))
1574
    if not downloadFile(url_pki,temppath_pki):
1575
      msgerror("Can't download index.")
1576
      msgerror("Can't install '%s'." % url_pki)
1577
      print # force a newline
1578
      return 1
1579
    if temppath_pki.endswith(".gvspki"):
1580
      pkg = PackageInfo(temppath_pki)
1581
      url_pkg = pkg.getUrl().replace("\\","")
1582
      if url_pkg[-7:] == ".gvspki" :
1583
        msgwarn("Suspicious download-url value. Ends with gvspki, expected gvspkg.")
1584
        msgwarn("download-url ='%s'." % url_pkg)
1585

    
1586
      if url_pkg.startswith("https:") and nohttps :
1587
         url_pkg = "http:" + url_pkg[6:]
1588

    
1589
      message( "Download package '%s'" % url_pkg)
1590
      temppath_pkg= os.path.join("/tmp",os.path.basename(url_pkg))
1591
      if not downloadFile(url_pkg,temppath_pkg):
1592
        msgerror("Can't download package from download-url ('%s')." % url_pkg)
1593
        msgerror("Can't install '%s'," % url_pki)
1594
        print # force a newline
1595
        return 1
1596

    
1597
    elif temppath_pki.endswith(".gvspkg"):
1598
      temppath_pkg = temppath_pki
1599
      pkg = PackageInfo(temppath_pki)
1600
      url = getpackageUrl(getPool()+"/"+pkg.getCode()+"/"+os.path.basename(temppath_pkg))
1601
      temppath_pki = crearpki(temppath_pkg,url)
1602

    
1603
    else:
1604
      msgerror("Can't install '%s', extension is not a gvspki or gvspkg.\n" % url_pki)
1605
      return 1
1606

    
1607
    folder = os.path.join(getPool(),pkg.getCode())
1608
    makedirs(folder)
1609
    pathname_pki = os.path.join(folder,os.path.basename(temppath_pki))
1610
    if not force and os.path.isfile(pathname_pki) :
1611
        msgwarn("The package index alreade exist in the pool. Use -f to forrce install.")
1612
        print # force a newline
1613
        return 1
1614
    pathname_pkg = os.path.join(folder,os.path.basename(temppath_pkg))
1615
    if  not force and os.path.isfile(pathname_pki) :
1616
        msgwarn("The package downloaded from download-url alredy exists in the pool. Use -f to force install.")
1617
        print # force a newline
1618
        return 1
1619
    message( "installing package '%s'" % os.path.basename(pathname_pki))
1620
    shutil.copyfile(temppath_pki, pathname_pki)
1621
    message( "installing package '%s'" % os.path.basename(pathname_pkg))
1622
    shutil.copyfile(temppath_pkg, pathname_pkg)
1623

    
1624
    md5sum(pathname_pki, pathname_pki+".md5")
1625
    md5sum(pathname_pkg, pathname_pkg+".md5")
1626
    
1627
def md5sum(fin, fout):
1628
    message( "Calculating md5sum of %s..." % fin )
1629
    system("md5sum -b %s >%s" % (fin, fout) )
1630

    
1631
def downloadFile(url,path):
1632
  try:
1633
    fsrc = urllib2.urlopen(url)
1634
  except urllib2.HTTPError,e:
1635
    msgerror("Error abriendo url '%s'." % url, e)
1636
    return False
1637
  fdst = file(path,"wb")
1638
  shutil.copyfileobj(fsrc,fdst)
1639
  fdst.close()
1640
  fsrc.close()
1641
  return True
1642

    
1643
def shorthelp(args):
1644
    print """
1645
usage: gvspkg [OPTIONS] COMMANDS
1646
OPTIONS:
1647

    
1648
-h,--help       Muestra esta ayuda
1649
-v,--verbose    Activa el modo verbose
1650
-d,--debug      Activa el modo debug.
1651
--version ver   Fija la version con la que van a trabajar.
1652
-r,--package-root root    Fija la carpeta del raiz del sistema de paquetes
1653

    
1654
COMMANDS:
1655

    
1656
mkinstall [OPTIONS] install-file packages-file
1657
    -L, --jrelin=path
1658
    -W, --jrewin=path
1659
    -l, --addjrelin
1660
    -w, --addjrewin
1661
    -N, --distribution-name=name
1662

    
1663
lsi [OPTIONS]
1664
    -l, --long-format
1665

    
1666
mks [OPTIONS]
1667
     -c, --clear-list
1668
     --excludepkg pkgcode
1669
     --excludepki pkgcode
1670
     --exclude pkgcode
1671
     -s, --include-default-selection
1672
     -i, --index-only
1673
     -I full-path-to-package, --include full-path-to-package
1674

    
1675
mkdist [OPTIONS]
1676
     -s STATE, --state=STATE
1677
     -b BUILD, --build=BUILD
1678
     -N, --distribution-name=name
1679

    
1680
mkmirror [OPTIONS]
1681
     -b, --build buildnumber
1682

    
1683
mkhtml [OPTIONS]
1684
     -c, --clear-list
1685
     --excludepkg pkgcode
1686
     --excludepki pkgcode
1687
     --exclude pkgcode
1688

    
1689
show OPTIONS package-index
1690
    --verify, -V
1691

    
1692
edit [OPTIONS] package-index
1693
     --replace=@search@replace@
1694
     --onlysign
1695
     --sign, -S
1696

    
1697
editall [OPTIONS]
1698
     -c, --clear-list
1699
     --excludepkg pkgcode
1700
     --excludepki pkgcode
1701
     --exclude pkgcode
1702
     --replace=@search@replace@
1703
     --sign, -S
1704

    
1705
install [OPTIONS] url-to-pki
1706
     -f, --force
1707

    
1708
prepare-portable [OPTIONS]
1709
     -b, --build
1710
     -s, --state
1711

    
1712
mkportable [OPTIONS]
1713
     -b, --build
1714
     -s, --state
1715

    
1716
La version actual a utilizar es:
1717
  %s
1718

    
1719
El directorio root de la estructura de packetes actual es:
1720
  %s
1721
    """ % (VERSION, GVSPKG_ROOT)
1722

    
1723

    
1724
def help(args):
1725
    print """
1726
usage: gvspkg [OPTIONS] COMMANDS
1727

    
1728
OPTIONS:
1729

    
1730
-h|--help
1731
    Muestra esta ayuda
1732

    
1733
-v|--verbose
1734
    Activa el modo verbose
1735

    
1736
-d|--debug
1737
    Activa el modo debug. Se muestran mensajes que pueden ser
1738
    utilies de cara a depuracion.
1739

    
1740
--version version
1741
    Fija la version con la que van a trabajar los comandos indicados.
1742

    
1743
-r|--package-root package-root
1744
    Fija la carpeta en la que va a buscar el raiz del sistema de paquetes
1745
    con el que trabajar
1746

    
1747
COMMANDS:
1748

    
1749
mkinstall [OPTIONS] install-file packages-file
1750

    
1751
    OPTIONS:
1752

    
1753
    -L | --jrelin=path
1754

    
1755
    -W | --jrewin=path
1756

    
1757
    -l | --addjrelin
1758

    
1759
    -w | --addjrewin
1760

    
1761
    -N | --distribution-name=name
1762
      Nombre usado como sufijo del nuevo binario a generar. Por defecto si no se
1763
      indica valdra "custom".
1764

    
1765

    
1766
lsi [OPTIONS]
1767
    Lista los indices disponibles de la version
1768

    
1769
    OPTIONS:
1770

    
1771
    -l | --long-format
1772
        Muestra para cada paquete la informacion del package.info
1773

    
1774
mks [OPTIONS]
1775
     Crea el fichero packages.gvspki con los indices de la
1776
     version y packages.gvspkg con los paquetes.
1777

    
1778
     OPTIONS:
1779

    
1780
     -c | --clear-list
1781
        Elimina la lista de paquetes a utilizar recreandola a partir
1782
        de los paquetes del pool tomando el ultimo build de cada paquete.
1783

    
1784
     --excludepkg pkgcode
1785
        No incluye el paquete indicado en el fichero gvspkg a generar
1786

    
1787
     --excludepki pkgcode
1788
        No incluye el paquete indicado en el fichero gvspki a generar
1789

    
1790
     --exclude pkgcode
1791
        No incluye el paquete indicado en los ficheros gvspkg y gvspki a generar
1792

    
1793
     -s | --include-default-selection
1794
        Incluye el fichero "defaultPackages", que se debe encontrar en el
1795
        directorio corriente, con los nombres de paquetes a seleccionar
1796
        por defecto.
1797

    
1798
     -i | --index-only
1799
        No crea el fichero gvspks, solo crea el gvspki
1800

    
1801
     -I full-path-to-package | --include full-path-to-package
1802
        Agrega el paquete indicado a la lista de paquetes aunque no coincida para
1803
        la version de gvSIG con la que se esta trabajando.
1804

    
1805
mkdist [OPTIONS]
1806
     Crea los ficheros de la distribucion standard para el buil dindicado a partir de
1807
     la distribucion online y los paquetes que hayan en el pool para esta version.
1808
     Ejecuta un "mks" y un "mkhtml" automaticamente para preparar el conjunto de paquetes
1809
     a incluir en la distribucion, y una vez preparados ejecuta un "mkinsrall" por
1810
     S.O. (win y lin), renombrando los ficheros generados segun corresponda.
1811

    
1812
     OPTIONS:
1813
     -s STATE | --state=STATE
1814
        Indica el estado de la distribucion a generar, devel, alpha, ..., debe estar
1815
        deacuerdo con lo que diga el cihero online a usar como base.
1816

    
1817
     -b BUILD | --build=BUILD
1818
        Indica el numero de build de la destribucion a generar. Es usado para localizar
1819
        los ficheros en la carpeta builds de la distribucion y para saber donde debe
1820
        dejar los ficheros generados.
1821

    
1822
     -N | --distribution-name=name
1823
        Nombre usado como sufijo del nuevo binario a generar. Por defecto si no se
1824
        indica valdra "standard".
1825

    
1826

    
1827
mkmirror [OPTIONS]
1828

    
1829
  Prepara una carpeta para hacer un mirror de un build en concreto.
1830

    
1831
     OPTIONS:
1832

    
1833
     -b | --build buildnumber
1834
       Indica el numero de build del que se quiere hacer un mirror.
1835

    
1836
mkhtml [OPTIONS]
1837
     ????
1838

    
1839
     OPTIONS:
1840

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

    
1845
     --excludepkg pkgcode
1846
        No incluye el paquete indicado en el fichero gvspkg a generar
1847

    
1848
     --excludepki pkgcode
1849
        No incluye el paquete indicado en el fichero gvspki a generar
1850

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

    
1854
show OPTIONS package-index
1855
    Muestra el package.info del indice indicado como parametro.
1856

    
1857
    OPTIONS
1858

    
1859
    --verify | -V
1860
      Comprueba la forma del packete.
1861

    
1862
edit [OPTIONS] package-index
1863
    Edita el package.info del indice indicado como parametro.
1864

    
1865
     OPTIONS:
1866

    
1867
     --replace=@search@replace@
1868
       Reemplaza en el package.info de cada paquete la cadena "search" por "replace"
1869
       todas las veces que aparezca. "@" puede ser cualquier caracter que no aparezca
1870
       en "search" y "replace".
1871
       Esta opcion puede indicarse tatas veces como reemplazos se deseen efectuar.
1872

    
1873
     --onlysign
1874
       firma el package.info sin editarlo de forma interactiva (no invoca al editor antes
1875
       de firmarlo).
1876

    
1877
     --sign | -S
1878
       Firma el package.info tras terminar la edicion (bach o interactiva)
1879

    
1880
editall [OPTIONS]
1881
    Edita todos los package.info
1882

    
1883
     OPTIONS:
1884

    
1885
     -c | --clear-list
1886
        Elimina la lista de paquetes a utilizar recreandola a partir
1887
        de los paquetes del pool tomando el ultimo build de cada paquete.
1888

    
1889
     --excludepkg pkgcode
1890
        No incluye el paquete indicado en el fichero gvspkg a generar
1891

    
1892
     --excludepki pkgcode
1893
        No incluye el paquete indicado en el fichero gvspki a generar
1894

    
1895
     --exclude pkgcode
1896
        No incluye el paquete indicado en los ficheros gvspkg y gvspki a generar
1897

    
1898
     --replace=@search@replace@
1899
       Reemplaza en el package.info de cada paquete la cadena "search" por "replace"
1900
       todas las veces que aparezca. "@" puede ser cualquier caracter que no aparezca
1901
       en "search" y "replace".
1902
       Esta opcion puede indicarse tatas veces como reemplazos se deseen efectuar.
1903

    
1904
      --sign | -S
1905
        Firma todos los paquetes que sean oficiales
1906

    
1907
install [OPTIONS] url-to-pki
1908
    descarga de la url indicada un fichero gvspki e instala este junto con su correspondiente
1909
    pkg en el pool local.
1910

    
1911
     OPTIONS:
1912

    
1913
     -f | --force
1914
       fuerza la sobreescritura de los ficheros en caso de que estos ya existan.
1915

    
1916
Si en la carpeta corriente encuentra un fichero gvspkg.options cargara los
1917
flags indicados ahi como flags por defecto para cada comando. El formato del
1918
fichero es:
1919
  main=OPCION-POR-DEFECTO
1920
  mks=OPCOPNES-POR-DEFECTO
1921
Donde main indica las opciones por defecto generales, independientes del comando
1922
a ejecutar. "mks" indica las opciones por defecto a usar en el comando "mks", y
1923
asi sucesivamente, indicando el nombre del comando seguido de un "=" y las opciones
1924
por defecto para ese comando.
1925

    
1926
Por defecto la version la obtiene del nombre de la carpeta
1927
corriente (%s). Las opciones indicadas en el fichero gvspkg.options tienen prioridad
1928
sobre este valor.
1929

    
1930
El directorio root de la estructura de packetes lo buscara en el
1931
sitio indicado por la variable de entorno GVPKG_ROOT, y si esta no
1932
esta establecida usara "%s". Las opciones indicadas en el fichero gvspkg.options
1933
tienen prioridad sobre este valor.
1934

    
1935
    """ % (VERSION, GVSPKG_ROOT)
1936

    
1937
def executeCommand(*args):
1938
    command = "shorthelp"
1939
    if len(args)>0:
1940
        command=args[0]
1941

    
1942
    r=1
1943
    if command=="lsi" :
1944
        r=lsi(args)
1945
    elif command == "mks":
1946
        r=mks(args)
1947
    elif command == "edit":
1948
        r=edit(args)
1949
    elif command == "editall":
1950
        r=editall(args)
1951
    elif command == "show":
1952
        r=show(args)
1953
    elif command == "mkhtml":
1954
        r=mkhtml(args)
1955
    elif command == "mkinstall":
1956
        r=mkinstall(args)
1957
    elif command == "install":
1958
        r=install(args)
1959
    elif command == "mkdist":
1960
        r=mkdist(args)
1961
    elif command == "mkmirror":
1962
        r=mkmirror(args)
1963
    elif command == "mkportable":
1964
        r=mkportable(args)
1965
    elif command == "prepare-portable":
1966
        r=prepare_portable(args)
1967
    elif command == "help":
1968
        r=help(args)
1969
    else:
1970
        r=shorthelp(args)
1971
    return r
1972

    
1973
def main():
1974
    global DEBUG
1975
    global VERSION
1976
    global VERBOSE
1977
    global GVSPKG_ROOT
1978
    global SEARCH_VERSIONS
1979

    
1980
    cmd = Command(sys.argv)
1981
    try:
1982
        opts, args = getopt.getopt(cmd.getArgs("main"), "dhvr:", ["debug", "verbose", "version=", "package-root=","help","search_versions="])
1983
    except getopt.GetoptError, err:
1984
        # print help information and exit:
1985
        print str(err) # will print something like "option -a not recognized"
1986
        shorthelp(None)
1987
        sys.exit(2)
1988

    
1989
    for opt, arg in opts:
1990
        if opt in ("-h", "--help"):
1991
            shorthelp(args)
1992
            sys.exit()
1993
        elif opt in ("-d", "--debug"):
1994
            DEBUG = True
1995
        elif opt in ("-v", "--verbose"):
1996
            VERBOSE = True
1997
        elif opt in ("--version"):
1998
            VERSION = arg
1999
        elif opt in ("--search_versions"):
2000
            SEARCH_VERSIONS.append(arg)
2001
        elif opt in ("-r", "--package-root"):
2002
            GVSPKG_ROOT = arg
2003
        else:
2004
            assert False, "unhandled option"
2005
    #
2006
    debug("DEBUG=%s" % DEBUG)
2007
    debug("VERSION=%s" % VERSION)
2008
    debug("GVSPKG_ROOT=%s" % GVSPKG_ROOT)
2009
    if GVSPKG_ROOT == None:
2010
      shorthelp(None)
2011
    else:
2012
      r=executeCommand(*args)
2013
      sys.exit(r)
2014

    
2015
main()