Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 24 additions & 17 deletions diff.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,15 +74,17 @@ class PackageIndex(object):
HEADER_LINE1 = 'Name | Version | Description'
HEADER_LINE2 = '-----|---------|------------'

def __init__(self, version, rootdir=None):
def __init__(self, version, rootdir=None, flavor=''):
self.version = version
self.other_packages = {}
self.python_packages = {}
self.flavor = flavor
basedir = get_basedir(version, rootdir=rootdir)
self.from_file(basedir)

def from_file(self, basedir):
fname = osp.join(basedir, 'build', 'WinPython-%s.txt' % self.version)
fname = osp.join(basedir, 'build%s' % self.flavor,
'WinPython%s-%s.txt' % (self.flavor, self.version))
with open(fname, 'r') as fdesc: # python3 doesn't like 'rb'
text = fdesc.read()
self.from_text(text)
Expand Down Expand Up @@ -144,30 +146,32 @@ def diff_package_dicts(dict1, dict2):
return text


def find_closer_version(version1, rootdir=None):
def find_closer_version(version1, rootdir=None, flavor=''):
"""Find version which is the closest to `version`"""
builddir = osp.join(get_basedir(version1, rootdir), 'build')
func = lambda name: re.match(r'WinPython-([0-9\.]*)\.txt', name)
builddir = osp.join(get_basedir(version1, rootdir), 'build%s' % flavor)
func = lambda name: re.match(r'WinPython%s-([0-9\.]*)\.txt' % flavor, name)
versions = [func(name).groups()[0]
for name in os.listdir(builddir) if func(name)]
try:
index = versions.index(version1)
except ValueError:
raise ValueError("Unknown version %s" % version1)
if index == 0:
raise ValueError("No version prior to %s" % version1)
print("No version prior to %s" % version1)
index += 1 # we don't want to fail on this
return versions[index-1]


def compare_package_indexes(version2, version1=None, rootdir=None):
def compare_package_indexes(version2, version1=None, rootdir=None, flavor=''):
"""Compare two package index Wiki pages"""
if version1 is None:
version1 = find_closer_version(version2, rootdir=rootdir)
version1 = find_closer_version(version2, rootdir=rootdir,
flavor=flavor)
text = '\r\n'.join(["## History of changes for WinPython %s" % version2,
"", "The following changes were made to WinPython "
"distribution since version %s." % version1, "", ""])
pi1 = PackageIndex(version1, rootdir=rootdir)
pi2 = PackageIndex(version2, rootdir=rootdir)
pi1 = PackageIndex(version1, rootdir=rootdir, flavor=flavor)
pi2 = PackageIndex(version2, rootdir=rootdir, flavor=flavor)
tools_text = diff_package_dicts(pi1.other_packages, pi2.other_packages)
if tools_text:
text += PackageIndex.TOOLS_LINE + '\r\n\r\n' + tools_text
Expand All @@ -178,20 +182,23 @@ def compare_package_indexes(version2, version1=None, rootdir=None):
return text


def _copy_all_changelogs(version, basedir):
def _copy_all_changelogs(version, basedir, flavor=''):
basever = '.'.join(version.split('.')[:2])
for name in os.listdir(CHANGELOGS_DIR):
if re.match(r'WinPython-%s([0-9\.]*)\.txt' % basever, name):
if re.match(r'WinPython%s-%s([0-9\.]*)\.txt' %
(flavor, basever), name):
shutil.copyfile(osp.join(CHANGELOGS_DIR, name),
osp.join(basedir, 'build', name))
osp.join(basedir, 'build%s' % flavor, name))


def write_changelog(version2, version1=None, rootdir=None):
def write_changelog(version2, version1=None, rootdir=None, flavor=''):
"""Write changelog between version1 and version2 of WinPython"""
basedir = get_basedir(version2, rootdir=rootdir)
_copy_all_changelogs(version2, basedir)
text = compare_package_indexes(version2, version1, rootdir=rootdir)
fname = osp.join(basedir, 'build', 'WinPython-%s_History.txt' % version2)
_copy_all_changelogs(version2, basedir, flavor=flavor)
text = compare_package_indexes(version2, version1, rootdir=rootdir,
flavor=flavor)
fname = osp.join(basedir, 'build%s' % flavor,
'WinPython%s-%s_History.txt' % (flavor, version2))
with open(fname, 'w', encoding='utf-8-sig') as fdesc: # python 3 need
fdesc.write(text)
# Copy to winpython/changelogs
Expand Down
85 changes: 57 additions & 28 deletions make.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,16 +130,18 @@ class WinPythonDistribution(object):
WINMERGE_PATH = r'\tools\WinMerge\WinMergeU.exe'
MINGW32_PATH = r'\tools\mingw32\bin'

def __init__(self, build_number, release_level, target, instdir,
srcdir=None, toolsdirs=None, verbose=False, simulation=False,
rootdir=None, install_options=None):
def __init__(self, build_number, release_level, target, instdirs,
srcdirs=None, toolsdirs=None, verbose=False, simulation=False,
rootdir=None, install_options=None, flavor=''):
assert isinstance(build_number, int)
assert isinstance(release_level, str)
self.build_number = build_number
self.release_level = release_level
self.target = target
self.instdir = instdir
self.srcdir = srcdir
self.instdirs = instdirs
self.srcdirs = srcdirs
if srcdirs is None:
self.srcdirs = []
if toolsdirs is None:
toolsdirs = []
self._toolsdirs = toolsdirs
Expand All @@ -154,6 +156,7 @@ def __init__(self, build_number, release_level, target, instdir,
self.simulation = simulation
self.rootdir = rootdir # addded to build from winpython
self.install_options = install_options
self.flavor = flavor

@property
def package_index_wiki(self):
Expand Down Expand Up @@ -192,7 +195,7 @@ def get_tool_path(relpath, checkfunc):
python_desc = 'Python programming language with standard library'
return """## WinPython %s

The following packages are included in WinPython v%s.
The following packages are included in WinPython v%s%s.

### Tools

Expand All @@ -205,7 +208,7 @@ def get_tool_path(relpath, checkfunc):
Name | Version | Description
-----|---------|------------
[Python](http://www.python.org/) | %s | %s
%s""" % (self.winpyver, self.winpyver, '\n'.join(tools),
%s""" % (self.winpyver , self.winpyver, self.flavor, '\n'.join(tools),
self.python_fullversion, python_desc, '\n'.join(packages))

@property
Expand Down Expand Up @@ -266,8 +269,8 @@ def toolsdirs(self):
return [osp.join(osp.dirname(__file__), 'tools')] + self._toolsdirs

def get_package_fname(self, pattern):
"""Get package matching pattern in instdir"""
for path in (self.instdir, self.srcdir):
"""Get package matching pattern in instdirs"""
for path in (self.instdirs + self.srcdirs):
for fname in os.listdir(path):
match = re.match(pattern, fname)
if match is not None:
Expand Down Expand Up @@ -369,8 +372,8 @@ def create_installer(self):
fname = osp.join(portable_dir, 'installer-tmp.nsi')
data = (('DISTDIR', self.winpydir),
('ARCH', self.winpy_arch),
('VERSION', '%s.%d' % (self.python_fullversion,
self.build_number)),
('VERSION', '%s.%d%s' % (self.python_fullversion,
self.build_number, self.flavor)),
('RELEASELEVEL', self.release_level),)
build_nsis('installer.nsi', fname, data)
self._print_done()
Expand Down Expand Up @@ -408,7 +411,10 @@ def _check_packages(self):
"""Check packages for duplicates or unsupported packages"""
print("Checking packages")
packages = []
for fname0 in os.listdir(self.srcdir) + os.listdir(self.instdir):
my_plist = []
for m in (self.srcdirs + self.instdirs):
my_plist += os.listdir(m)
for fname0 in my_plist:
fname = self.get_package_fname(fname0)
if fname == self.python_fname:
continue
Expand Down Expand Up @@ -460,9 +466,12 @@ def _install_required_packages(self):
% (happy_few, self.py_arch, self.python_version))

def _install_all_other_packages(self):
"""Try to install all other packages in instdir"""
"""Try to install all other packages in instdirs"""
print("Installing other packages")
for fname in os.listdir(self.srcdir) + os.listdir(self.instdir):
my_list = []
for m in (self.srcdirs + self.instdirs):
my_list += os.listdir(m)
for fname in my_list:
if osp.basename(fname) != osp.basename(self.python_fname):
try:
self.install_package(fname)
Expand Down Expand Up @@ -837,7 +846,7 @@ def _create_batch_scripts(self):

def make(self, remove_existing=True):
"""Make WinPython distribution in target directory from the installers
located in instdir
located in instdirs

remove_existing=True: (default) install all from scratch
remove_existing=False: only for test purpose (launchers/scripts)"""
Expand Down Expand Up @@ -897,15 +906,16 @@ def make(self, remove_existing=True):
# Writing package index
self._print("Writing package index")
fname = osp.join(self.winpydir, os.pardir,
'WinPython-%s.txt' % self.winpyver)
'WinPython%s-%s.txt' % (self.flavor, self.winpyver))
open(fname, 'w').write(self.package_index_wiki)
# Copy to winpython/changelogs
shutil.copyfile(fname, osp.join(CHANGELOGS_DIR, osp.basename(fname)))
self._print_done()

# Writing changelog
self._print("Writing changelog")
diff.write_changelog(self.winpyver, rootdir=self.rootdir)
diff.write_changelog(self.winpyver, rootdir=self.rootdir,
flavor=self.flavor)
self._print_done()


Expand All @@ -925,7 +935,7 @@ def rebuild_winpython(basedir=None, verbose=False, archis=(32, 64)):
def make_winpython(build_number, release_level, architecture,
basedir=None, verbose=False, remove_existing=True,
create_installer=True, simulation=False, rootdir=None,
install_options=None):
install_options=None, flavor=''):
"""Make WinPython distribution, for a given base directory and
architecture:

Expand All @@ -944,11 +954,21 @@ def make_winpython(build_number, release_level, architecture,
assert architecture in (32, 64)
utils.print_box("Making WinPython %dbits" % architecture)
suffix = '.win32' if architecture == 32 else '.win-amd64'
packdir = osp.join(basedir, 'packages' + suffix)
assert osp.isdir(packdir)
srcdir = osp.join(basedir, 'packages.src')
assert osp.isdir(srcdir)
builddir = osp.join(basedir, 'build')
packdir1 = osp.join(basedir, 'packages' + suffix)
assert osp.isdir(packdir1)
packdirs = [packdir1]
srcdir1 = osp.join(basedir, 'packages.src')
assert osp.isdir(srcdir1)
srcdirs = [srcdir1]
# add flavor src and binary packages
if flavor != '':
packdir2 = osp.join(basedir, flavor, 'packages' + suffix)
if osp.isdir(packdir2):
packdirs.append(packdir2)
srcdir2 = osp.join(basedir, flavor, 'packages.src')
if osp.isdir(srcdir2):
srcdirs.append(srcdir2)
builddir = osp.join(basedir, 'build' + flavor)
if not osp.isdir(builddir):
os.mkdir(builddir)
toolsdir1 = osp.join(basedir, 'tools')
Expand All @@ -957,11 +977,19 @@ def make_winpython(build_number, release_level, architecture,
toolsdir2 = osp.join(basedir, 'tools' + suffix)
if osp.isdir(toolsdir2):
toolsdirs.append(toolsdir2)
# add flavor tools in basedirxx\flavor\tools and tools+suffix
if flavor != '':
toolsdir3 = osp.join(basedir, flavor, 'tools')
toolsdir4 = osp.join(basedir, flavor, 'tools' + suffix)
for flavor_tools in [toolsdir3, toolsdir4]:
if osp.isdir(flavor_tools):
toolsdirs.append(flavor_tools)

dist = WinPythonDistribution(build_number, release_level,
builddir, packdir, srcdir, toolsdirs,
builddir, packdirs, srcdirs, toolsdirs,
verbose=verbose, simulation=simulation,
rootdir=rootdir,
install_options=install_options)
install_options=install_options, flavor=flavor)
dist.make(remove_existing=remove_existing)
if create_installer and not simulation:
dist.create_installer()
Expand All @@ -971,7 +999,7 @@ def make_winpython(build_number, release_level, architecture,
def make_all(build_number, release_level, pyver,
rootdir=None, simulation=False, create_installer=True,
verbose=False, remove_existing=True, archis=(32, 64),
install_options=['--no-deps']):
install_options=['--no-deps'], flavor=''):
"""Make WinPython for both 32 and 64bit architectures:

make_all(build_number, release_level, pyver, rootdir, simulation=False,
Expand All @@ -988,7 +1016,8 @@ def make_all(build_number, release_level, pyver,
for architecture in archis:
make_winpython(build_number, release_level, architecture, basedir,
verbose, remove_existing, create_installer, simulation,
rootdir=rootdir, install_options=install_options)
rootdir=rootdir, install_options=install_options,
flavor=flavor)


if __name__ == '__main__':
Expand All @@ -998,7 +1027,7 @@ def make_all(build_number, release_level, pyver,
#make_all(1, '', pyver='3.4', rootdir=r'D:\Winpython',
# verbose=False, archis=(32, ))
make_all(1, '', pyver='3.4', rootdir=r'D:\Winpython',
verbose=False, archis=(64, ))
verbose=False, archis=(64, ), flavor='')
#make_all(2, '', pyver='3.3', rootdir=r'D:\Winpython',
# verbose=False, archis=(32, ))
#make_all(2, '', pyver='3.3', rootdir=r'D:\Winpython',
Expand Down