This is the mail archive of the cygwin-apps-cvs mailing list for the cygwin-apps project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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




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'


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]