#! /usr/bin/env python3

##     ____                _       __
##    / __ )____  _____   | |     / /___ ___________
##   / __  / __ \/ ___/   | | /| / / __ `/ ___/ ___/
##  / /_/ / /_/ (__  )    | |/ |/ / /_/ / /  (__  )
## /_____/\____/____/     |__/|__/\__,_/_/  /____/
##
##       A futuristic real-time strategy game.
##          This file is part of Bos Wars.
##
##      Script that generates all the distribution packages.
##      (c) Copyright 2007-2023 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, open(name, 'rb'))
  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 listGitFiles():
   entries = os.popen('git ls-files').readlines()
   return [i.strip() for i in entries]

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 RuntimeError("Not implemented")

def listFiles():
   if os.access('.git', os.F_OK):
      return listGitFiles()
   elif os.access('.svn', os.F_OK):
      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 = ['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
  #  FIXME: automatically build a "static" boswars executable ?
  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()





