Commit 54e3b3a3 authored by Petr Prikryl's avatar Petr Prikryl

New script winbuild/pack_the_distribution_for_windows.py

parent 5f63c194
#! python3
import glob
import os
import re
import shutil
import subprocess
import sys
import textwrap
def getCurrentSubdirName():
subdir, fname = os.path.split(os.path.realpath(__file__))
return os.path.basename(subdir)
def getCurrentBranchName():
result = None
cmd = 'git branch --list --no-color'
pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE).stdout
for line in pipe:
line = line.decode('utf-8')
if line.startswith('*'):
result = line[2:].rstrip()
pipe.close()
return result
def getUserName():
user = None # init
p = subprocess.Popen('git config user.name', stdout=subprocess.PIPE)
user = p.communicate()[0]
user = user.decode('utf-8')
p.wait()
return user
def getUserInitials():
user = getUserName()
return ''.join(s[0] for s in user.split())
def gitSHA_date_time():
cmd = 'git rev-parse --short HEAD'
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
output = p.communicate()[0]
output = output.decode('ASCII')
p.wait()
sha = output.strip()
cmd = 'git show -s --format="%ci" ' + sha
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
output = p.communicate()[0]
output = output.decode('ASCII')
p.wait()
date = output.strip()
lst = date.split() # string like '2013-06-21 09:23:47 +0200'
dstamp = lst[0].replace('-', '') # '20130621' for the date
tstamp = lst[1].replace(':', '') # '092347' for the time
return sha, dstamp, tstamp
def gitDescribe():
result = None
cmd = 'git describe'
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
descr = p.communicate()[0]
descr = descr.decode('utf-8')
p.wait()
return descr.strip()
def getDoxygenVersion():
# ... from the VERSION file.
sdir, fname = getThisScriptPathAndName()
version_fname = os.path.join(sdir, '..', 'VERSION')
with open(version_fname) as f:
lst = f.readlines()
doxver = lst[0].strip()
m = re.match(r'^(?P<ver>[0-9.]+)(-(?P<date>\d{8}))?', doxver)
assert m
ver = m.group('ver')
return ver
def getThisScriptPathAndName():
script_fname = os.path.realpath(__file__)
sdir, fname = os.path.split(script_fname)
return sdir, fname
def getEmptyDistribDir():
# Get this script full path, name, and the script subdir name
# (for checking the location).
sdir, fname = getThisScriptPathAndName()
subdir = os.path.basename(sdir)
assert subdir == 'winbuild'
# The distribution directory will be a subdirectory of the "../__put"
# (created if it does not exist, not the part of the git repo).
target_dir = os.path.normpath(os.path.join(sdir, '..', '__put'))
if not os.path.exists(target_dir):
os.mkdir(target_dir)
assert os.path.isdir(target_dir)
# The distribution subdir is composed out of 'Doxygen-', version stamp,
# timestamp, and commit id (partial SHA). Ignore the date from the VERSION
# file, take the commit date.
ver = getDoxygenVersion()
sha, dstamp, tstamp = gitSHA_date_time()
dist_subdir = 'Doxygen-' + ver + '-' + dstamp + tstamp
dist_dir = os.path.join(target_dir, dist_subdir)
print(dist_dir)
if os.path.isdir(dist_dir):
print("Removing the existing '{}'".format(dist_dir))
shutil.rmtree(dist_dir)
assert not os.path.exists(dist_dir)
print("Creating the new '{}'".format(dist_dir))
os.mkdir(dist_dir)
assert os.path.isdir(dist_dir)
return dist_dir
def copyBinaries(dist_dir, subdir):
'''Copy the Windows binaries (doxygen.exe only) to the dist_dir directory.'''
# Source file should exist.
sdir, fname = getThisScriptPathAndName()
src = os.path.normpath(os.path.join(sdir, '..', 'bin', subdir, 'doxygen.exe'))
assert os.path.isfile(src)
# Destination directory must not exist. It must be created first.
dst_dir = os.path.normpath(os.path.join(dist_dir, 'bin', subdir))
assert not os.path.isdir(dst_dir)
os.makedirs(dst_dir)
# Copy the file.
print("Copying '{}'".format(src))
shutil.copy2(src, dst_dir)
def getBinariesZipBareName():
ver = getDoxygenVersion()
sha, dstamp, tstamp = gitSHA_date_time()
fname = 'doxygenw{}_{}.zip'.format(dstamp, ver.replace('.', '_'))
return fname
def getTranslatorReportZipBareName():
ver = getDoxygenVersion()
sha, dstamp, tstamp = gitSHA_date_time()
fname = 'tr{}_{}.zip'.format(dstamp, ver.replace('.', '_'))
return fname
def zipBinaries(distr_dir):
# Build the zip filename. It is to be located at the same level as distr_dir.
zip_bare_name = getBinariesZipBareName()
dst, distr_subdir = os.path.split(distr_dir)
zip_full_name = os.path.join(dst, zip_bare_name)
if os.path.isfile(zip_full_name):
print("Removing the existing '{}'".format(zip_full_name))
os.remove(zip_full_name)
# Change the working directory to destination directory and zip from
# there using the bare names so that the full path is not zipped inside.
wd = os.getcwd()
os.chdir(dst)
print("Zipping new '{}'".format(zip_full_name))
subprocess.call('zip -r {} {}'.format(zip_bare_name, distr_subdir), shell=True)
os.chdir(wd) # back to the original working directory
def buildAndZipTranslatorReport(distr_dir):
# Build the translator report zip filename. It is to be located at the same
# level as distr_dir.
zip_bare_name = getTranslatorReportZipBareName()
dst, subdir = os.path.split(distr_dir)
zip_full_name = os.path.join(dst, zip_bare_name)
if os.path.isfile(zip_full_name):
print("Removing the existing '{}'".format(zip_full_name))
os.remove(zip_full_name)
print("Zipping new '{}'".format(zip_full_name))
# Change the working directory to the doc one and generate
# the translator report.
sdir, fname = getThisScriptPathAndName()
docdir = os.path.join(sdir, '..', 'doc')
assert os.path.isdir(docdir)
wd = os.getcwd()
os.chdir(docdir)
subprocess.call('python translator.py', shell=True)
# Zip the generated translator_report.txt.
subprocess.call('zip -r {} {}'.format(zip_full_name,
'translator_report.txt'), shell=True)
os.chdir(wd) # back to the original working directory
def xxx():
# Vytvoříme dopis.
subject = 'Windows binaries available for %s in SVN' % doxdir
subject = subject.replace(' ', '%20')
body = textwrap.dedent('''\
Hi,
If interested, you can download the doxygen binaries
compiled for MS Windows from
http://sourceforge.net/projects/doxygen/files/snapshots/doxygen-1.8-svn/windows
This is the place where you should find also the next
releases. Name of the archive file is
%s
The related translator report can be found inside the directory
http://sourceforge.net/projects/doxygen/files/snapshots/doxygen-1.8-svn/translator_reports/
Name of the archive file is
%s
The binaries are NOT created automatically, so it may
happen that some newer SVN sources were not compiled
because I am not present to do that or I forgot... ;)
Regards,
Petr
--
Petr Prikryl (prikryl at atlas dot cz)''') % (doxzipname, trzipname)
body = body.replace('\n', '%0d')
# Zkonstruujeme URI a spustíme mailer pro odeslání dopisu.
to_addr = 'doxygen-users@lists.sourceforge.net'
mailtoURI = 'mailto:%s?subject=%s&body=%s' % (to_addr, subject, body)
os.startfile(mailtoURI)
if __name__ == '__main__':
# Create the empty directory for the distribution files.
dist_dir = getEmptyDistribDir()
# Copy the compiled binaries to the distribution directory and zip them.
copyBinaries(dist_dir, 'Debug')
copyBinaries(dist_dir, 'Debug64')
copyBinaries(dist_dir, 'Release')
copyBinaries(dist_dir, 'Release64')
zipBinaries(dist_dir)
# The translator report...
buildAndZipTranslatorReport(dist_dir)
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment