[calm - Cygwin server-side packaging maintenance script] branch master, updated. 20171008-8-g45fcd7b

jturney-9JcytcrH/[email protected]
Newsgroups gmane.os.cygwin.cvs.apps
Message-ID <[email protected]>


https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/calm.git;h=45fcd7b97a86a02cb4e72a68efea71d92d7a8def

commit 45fcd7b97a86a02cb4e72a68efea71d92d7a8def
Author: Jon Turney <[email protected]>
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'
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.