#! /usr/bin/env python

##     ____                _       __               
##    / __ )____  _____   | |     / /___ ___________
##   / __  / __ \/ ___/   | | /| / / __ `/ ___/ ___/
##  / /_/ / /_/ (__  )    | |/ |/ / /_/ / /  (__  ) 
## /_____/\____/____/     |__/|__/\__,_/_/  /____/  
##                                              
##       A futuristic real-time strategy game.
##          This file is part of Bos Wars.
##
##      Script that generates all the distribution packages.
##      (c) Copyright 2007 by Francois Beerten
##
##      Stratagus is free software; you can redistribute it and/or modify
##      it under the terms of the GNU General Public License as published
##      by the Free Software Foundation; only version 2 of the License.
##
##      Stratagus is distributed in the hope that it will be useful,
##      but WITHOUT ANY WARRANTY; without even the implied warranty of
##      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
##      GNU General Public License for more details.

import sys
import os
import tarfile
import zipfile
import time

def printDot():
  sys.stdout.write('.')
  sys.stdout.flush()

def createTarArchive(archivename, namelist):
  print "\nCreating %s.tar.gz" % archivename
  tar = tarfile.open(archivename + ".tar.gz", "w:gz")
  for name in namelist:
      tarinfo = tar.gettarinfo(name, archivename + "/" + name)
      tarinfo.uid = 500
      tarinfo.gid = 500
      tarinfo.uname = "user"
      tarinfo.gname = "user"
      printDot()
      tar.addfile(tarinfo, file(name))
  tar.close()
  print

def createZipArchive(archivename, namelist):
  print "\nCreating %s.zip" % archivename
  z = zipfile.ZipFile(archivename + ".zip", "w", zipfile.ZIP_DEFLATED)
  for name in namelist:
      z.write(name, archivename + "/" + name)
      printDot()
  z.close()
  print


def isSvnWorkSpace():
   return os.access('.svn', os.F_OK)

def listSvnFiles():
   entries = os.popen('svn ls -R').readlines()
   files = []
   for e in entries:
     e = e.strip()
     if not e.endswith('/'):
        files.append(e)
   return files

def listFilesInDirectories():
   raise "Not implemented"

def listFiles():
   if isSvnWorkSpace():
      return listSvnFiles()
   else:
      return listFilesInDirectories()

def buildDefaultVersionName():
   t = time.time()
   v = time.strftime('%Y%m%d', time.gmtime(t))
   return v

def buildVersionName():
   if len(sys.argv) > 1:
      return sys.argv[1]
   else:
      return buildDefaultVersionName()

def filterDirectories(files):
   return [x for x in files if not x.endswith('/')]
def filterSources(files):
   buildfiles = ['SConstruct', 'bos.sln', 'make.py', 'fabricate.py']
   def isGoodFile(f):
     return (not f.startswith('engine/') and not f.startswith('tools/') and
             f not in buildfiles)
   return [x for x in files if isGoodFile(x)]
   


def buildPackages():
  name = 'boswars-' + buildVersionName() + '-%s'

  os.chdir('../..')
  files = listFiles()
  files = filterDirectories(files)

  # create source packages
  createTarArchive(name % 'src', files)
  createZipArchive(name % 'src', files)

  # create binary packages
  #os.popen('scons static=1 debug=0 CXX=apg++')
  binarydistfiles = filterSources(files)
  linuxfiles = binarydistfiles[:]
  linuxfiles.append('boswars')
  createTarArchive(name % 'linux', linuxfiles)
  if os.access('boswars.exe', os.F_OK):
     winfiles = binarydistfiles[:]
     winfiles.append('boswars.exe')
     createZipArchive(name % 'win32', winfiles)
  

if __name__ == '__main__':
  buildPackages()





