From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26551 invoked by alias); 3 Nov 2017 13:13:53 -0000 Mailing-List: contact cygwin-apps-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: cygwin-apps-cvs-owner@sourceware.org Received: (qmail 26530 invoked by uid 9795); 3 Nov 2017 13:13:53 -0000 Date: Fri, 03 Nov 2017 13:13:00 -0000 Message-ID: <20171103131353.26503.qmail@sourceware.org> From: jturney@sourceware.org To: cygwin-apps-cvs@sourceware.org Subject: [calm - Cygwin server-side packaging maintenance script] branch master, updated. 20171008-8-g45fcd7b X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: b9a9770ff4e72baa6005a10e705d973db48db5a9 X-Git-Newrev: 45fcd7b97a86a02cb4e72a68efea71d92d7a8def X-SW-Source: 2017-q4/txt/msg00020.txt.bz2 https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/calm.git;h=45fcd7b97a86a02cb4e72a68efea71d92d7a8def commit 45fcd7b97a86a02cb4e72a68efea71d92d7a8def Author: Jon Turney 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'