[calm - Cygwin server-side packaging maintenance script] branch master, updated. 20171008-8-g45fcd7b
jturney@sourceware.org
jturney@sourceware.org
Fri Nov 3 13:13:00 GMT 2017
https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/calm.git;h=45fcd7b97a86a02cb4e72a68efea71d92d7a8def
commit 45fcd7b97a86a02cb4e72a68efea71d92d7a8def
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date: Fri Jan 20 21:31:57 2017 +0000
Write setup.ini version sections for more than 3 versions
It would be much easier just to do things in version order, but we put
things in a specific order to ensure setup behaves as we want.
Update tests appropriately
Diff:
---
calm/package.py | 108 ++++++++++++++++++++++--------
test/testdata/inifile/setup.ini.expected | 18 +++++
2 files changed, 99 insertions(+), 27 deletions(-)
diff --git a/calm/package.py b/calm/package.py
index ed4cf00..610671a 100755
--- a/calm/package.py
+++ b/calm/package.py
@@ -25,7 +25,7 @@
# utilities for working with a package database
#
-from collections import defaultdict
+from collections import defaultdict, OrderedDict
import copy
import difflib
import hashlib
@@ -779,35 +779,88 @@ def write_setup_ini(args, packages, arch):
if 'message' in packages[p].version_hints[bv]:
print("message: %s" % packages[p].version_hints[bv]['message'], file=f)
- # write tarfile lines for each stability level
- for level in ['curr', 'prev', 'test']:
+ # make a list of version sections
+ #
+ # (they are put in a particular order to ensure certain behaviour
+ # from setup)
+ vs = []
+
+ # put 'curr' first
+ #
+ # due to a historic bug in setup (fixed in 78e4c7d7), we keep the
+ # [curr] version first, to ensure that dependencies are used
+ # correctly.
+ if 'curr' in packages[p].stability:
+ version = packages[p].stability['curr']
+ vs.append((version, 'curr'))
+
+ # next put any other versions
+ #
+ # these [prev] or [test] sections are superseded by the final ones.
+ for i, version in enumerate(sorted(packages[p].vermap.keys(), key=lambda v: SetupVersion(v), reverse=True)):
+ # ignore versions which should have been removed by stale
+ # package removal
+ if not (set(['install', 'source']) & set(packages[p].vermap[version])):
+ continue
+
+ # skip over versions assigned to stability level: 'curr' has
+ # already be done, and 'prev' and 'test' will be done later
+ skip = False
+ for level in ['curr', 'prev', 'test']:
+ if level in packages[p].stability:
+ if version == packages[p].stability[level]:
+ skip = True
+ break
+
+ if skip:
+ continue
+
+ # test versions receive the test label
+ if 'test' in packages[p].version_hints[version]:
+ level = "test"
+ else:
+ level = "prev"
+ vs.append((version, level))
+
+ # finally, add 'prev' and 'test' versions
+ #
+ # because setup processes version sections in order, these supersede
+ # any previous [prev] and [test] sections (hopefully). i.e. the
+ # version in the final [test] section is the one selected when test
+ # packages are requested.
+ for level in ['prev', 'test']:
if level in packages[p].stability:
version = packages[p].stability[level]
- if level != 'curr':
- print("[%s]" % level, file=f)
- print("version: %s" % version, file=f)
-
- if 'install' in packages[p].vermap[version]:
- t = packages[p].vermap[version]['install']
- tar_line('install', packages[p], t, f)
-
- # look for corresponding source in this package first
- if 'source' in packages[p].vermap[version]:
- t = packages[p].vermap[version]['source']
- tar_line('source', packages[p], t, f)
- # if that doesn't exist, follow external-source
- elif 'external-source' in packages[p].version_hints[version]:
- s = packages[p].version_hints[version]['external-source']
- # external-source points to a real source package (-src)
- if s.endswith('-src'):
- print("Source: %s" % (s), file=f)
- # external-source points to a source file in another package
+ vs.append((version, level))
+
+ # write the section for each version
+ for (version, tag) in vs:
+ # [curr] can be omitted if it's the first section
+ if tag != 'curr':
+ print("[%s]" % tag, file=f)
+ print("version: %s" % version, file=f)
+
+ if 'install' in packages[p].vermap[version]:
+ t = packages[p].vermap[version]['install']
+ tar_line('install', packages[p], t, f)
+
+ # look for corresponding source in this package first
+ if 'source' in packages[p].vermap[version]:
+ t = packages[p].vermap[version]['source']
+ tar_line('source', packages[p], t, f)
+ # if that doesn't exist, follow external-source
+ elif 'external-source' in packages[p].version_hints[version]:
+ s = packages[p].version_hints[version]['external-source']
+ # external-source points to a real source package (-src)
+ if s.endswith('-src'):
+ print("Source: %s" % (s), file=f)
+ # external-source points to a source file in another package
+ else:
+ if 'source' in packages[s].vermap[version]:
+ t = packages[s].vermap[version]['source']
+ tar_line('source', packages[s], t, f)
else:
- if 'source' in packages[s].vermap[version]:
- t = packages[s].vermap[version]['source']
- tar_line('source', packages[s], t, f)
- else:
- logging.warning("package '%s' version '%s' has no source in external-source '%s'" % (p, version, s))
+ logging.warning("package '%s' version '%s' has no source in external-source '%s'" % (p, version, s))
# helper function to output details for a particular tar file
@@ -904,6 +957,7 @@ def delete(packages, path, fn):
for t in packages[p].tars:
if t == fn:
del packages[p].tars[t]
+ # XXX: should also remove from vermap
break
for h in packages[p].hint_files:
diff --git a/test/testdata/inifile/setup.ini.expected b/test/testdata/inifile/setup.ini.expected
index c3957ca..64281f8 100644
--- a/test/testdata/inifile/setup.ini.expected
+++ b/test/testdata/inifile/setup.ini.expected
@@ -254,6 +254,24 @@
'source: x86/release/staleversion/staleversion-250-0-src.tar.xz 228 '
'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
'[prev]\n'
+ 'version: 251-0\n'
+ 'install: x86/release/staleversion/staleversion-251-0.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ 'source: x86/release/staleversion/staleversion-251-0-src.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ '[prev]\n'
+ 'version: 242-0\n'
+ 'install: x86/release/staleversion/staleversion-242-0.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ 'source: x86/release/staleversion/staleversion-242-0-src.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ '[prev]\n'
+ 'version: 240-1\n'
+ 'install: x86/release/staleversion/staleversion-240-1.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ 'source: x86/release/staleversion/staleversion-240-1-src.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ '[prev]\n'
'version: 243-0\n'
'install: x86/release/staleversion/staleversion-243-0.tar.xz 228 '
'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
More information about the Cygwin-apps-cvs
mailing list