You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by hw...@apache.org on 2011/07/13 18:42:22 UTC

svn commit: r1146123 [3/3] - in /subversion/branches/revprop-packing: ./ build/ contrib/hook-scripts/enforcer/ contrib/server-side/ notes/ notes/merge-tracking/ subversion/bindings/javahl/src/org/apache/subversion/javahl/ subversion/bindings/javahl/src...

Modified: subversion/branches/revprop-packing/tools/dist/release.py
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/tools/dist/release.py?rev=1146123&r1=1146122&r2=1146123&view=diff
==============================================================================
--- subversion/branches/revprop-packing/tools/dist/release.py (original)
+++ subversion/branches/revprop-packing/tools/dist/release.py Wed Jul 13 16:42:19 2011
@@ -36,13 +36,17 @@
 
 # Stuff we need
 import os
+import re
 import sys
+import glob
 import shutil
 import urllib2
 import hashlib
 import tarfile
 import logging
 import datetime
+import operator
+import itertools
 import subprocess
 import argparse       # standard in Python 2.7
 
@@ -64,11 +68,74 @@ swig_ver = '2.0.4'
 
 # Some constants
 repos = 'http://svn.apache.org/repos/asf/subversion'
+people_host = 'minotaur.apache.org'
+people_dist_dir = '/www/www.apache.org/dist/subversion'
 
 
 #----------------------------------------------------------------------
 # Utility functions
 
+class Version(object):
+    regex = re.compile('(\d+).(\d+).(\d+)(?:-(?:(rc|alpha|beta)(\d+)))?')
+
+    def __init__(self, ver_str):
+        match = self.regex.search(ver_str)
+
+        if not match:
+            raise RuntimeError("Bad version string '%s'" % ver_str)
+
+        self.major = int(match.group(1))
+        self.minor = int(match.group(2))
+        self.patch = int(match.group(3))
+
+        if match.group(4):
+            self.pre = match.group(4)
+            self.pre_num = int(match.group(5))
+        else:
+            self.pre = None
+            self.pre_num = None
+
+        self.base = '%d.%d.%d' % (self.major, self.minor, self.patch)
+
+    def is_prerelease(self):
+        return self.pre != None
+
+    def __lt__(self, that):
+        if self.major < that.major: return True
+        if self.major > that.major: return False
+
+        if self.minor < that.minor: return True
+        if self.minor > that.minor: return False
+
+        if self.patch < that.patch: return True
+        if self.patch > that.patch: return False
+
+        if not self.pre and not that.pre: return False
+        if not self.pre and that.pre: return False
+        if self.pre and not that.pre: return True
+
+        # We are both pre-releases
+        if self.pre != that.pre:
+            return self.pre < that.pre
+        else:
+            return self.pre_num < that.pre_num
+
+    def __str(self):
+        if self.pre:
+            extra = '-%s%d' % (self.pre, self.pre_num)
+        else:
+            extra = ''
+
+        return self.base + extra
+
+    def __repr__(self):
+
+        return "Version('%s')" % self.__str()
+
+    def __str__(self):
+        return self.__str()
+
+
 def get_prefix(base_dir):
     return os.path.join(base_dir, 'prefix')
 
@@ -108,12 +175,9 @@ def download_file(url, target):
     target_file = open(target, 'w')
     target_file.write(response.read())
 
-def split_version(version):
-    parts = version.split('-')
-    if len(parts) == 1:
-        return (version, None)
-
-    return parts[0], parts[1]
+def assert_people():
+    if os.uname()[1] != people_host:
+        raise RuntimeError('Not running on expected host "%s"' % people_host)
 
 #----------------------------------------------------------------------
 # Cleaning up the environment
@@ -267,12 +331,11 @@ def build_env(args):
 def roll_tarballs(args):
     'Create the release artifacts.'
     extns = ['zip', 'tar.gz', 'tar.bz2']
-    version_base, version_extra = split_version(args.version)
 
     if args.branch:
         branch = args.branch
     else:
-        branch = version_base[:-1] + 'x'
+        branch = 'branches/' + args.version.base[:-1] + 'x'
 
     logging.info('Rolling release %s from branch %s@%d' % (args.version,
                                                            branch, args.revnum))
@@ -289,7 +352,7 @@ def roll_tarballs(args):
     # Make sure CHANGES is sync'd
     if branch != 'trunk':
         trunk_CHANGES = '%s/trunk/CHANGES@%d' % (repos, args.revnum)
-        branch_CHANGES = '%s/branches/%s/CHANGES@%d' % (repos, branch,
+        branch_CHANGES = '%s/%s/CHANGES@%d' % (repos, branch,
                                                         args.revnum)
         proc = subprocess.Popen(['svn', 'diff', '--summarize', branch_CHANGES,
                                    trunk_CHANGES],
@@ -307,28 +370,21 @@ def roll_tarballs(args):
 
     # For now, just delegate to dist.sh to create the actual artifacts
     extra_args = ''
-    if version_extra:
-        if version_extra.startswith('alpha'):
-            extra_args = '-alpha %s' % version_extra[5:]
-        elif version_extra.startswith('beta'):
-            extra_args = '-beta %s' % version_extra[4:]
-        elif version_extra.startswith('rc'):
-            extra_args = '-rc %s' % version_extra[2:]
-        elif version_extra.startswith('nightly'):
-            extra_args = '-nightly'
+    if args.version.is_prerelease():
+        extra_args = '-%s %d' % (args.version.pre, args.version.pre_num)
     logging.info('Building UNIX tarballs')
     run_script(args.verbose, '%s/dist.sh -v %s -pr %s -r %d %s'
-                     % (sys.path[0], version_base, branch, args.revnum,
+                     % (sys.path[0], args.version.base, branch, args.revnum,
                         extra_args) )
     logging.info('Buildling Windows tarballs')
     run_script(args.verbose, '%s/dist.sh -v %s -pr %s -r %d -zip %s'
-                     % (sys.path[0], version_base, branch, args.revnum,
+                     % (sys.path[0], args.version.base, branch, args.revnum,
                         extra_args) )
 
     # Move the results to the deploy directory
     logging.info('Moving artifacts and calculating checksums')
     for e in extns:
-        if version_extra and version_extra.startswith('nightly'):
+        if args.version.pre == 'nightly':
             filename = 'subversion-trunk.%s' % e
         else:
             filename = 'subversion-%s.%s' % (args.version, e)
@@ -349,8 +405,6 @@ def roll_tarballs(args):
 
 def post_candidates(args):
     'Post the generated tarballs to web-accessible directory.'
-    version_base, version_extra = split_version(args.version)
-
     if args.target:
         target = args.target
     else:
@@ -371,8 +425,8 @@ def post_candidates(args):
            }
 
     # Choose the right template text
-    if version_extra:
-        if version_extra.startswith('nightly'):
+    if args.version.is_prerelease():
+        if args.version.pre == 'nightly':
             template_filename = 'nightly-candidates.ezt'
         else:
             template_filename = 'rc-candidates.ezt'
@@ -390,21 +444,49 @@ def post_candidates(args):
 
 
 #----------------------------------------------------------------------
+# Clean dist
+
+def clean_dist(args):
+    'Clean the distribution directory of all but the most recent artifacts.'
+
+    regex = re.compile('subversion-(\d+).(\d+).(\d+)(?:-(?:(rc|alpha|beta)(\d+)))?')
+
+    if not args.dist_dir:
+        assert_people()
+        args.dist_dir = people_dist_dir
+
+    logging.info('Cleaning dist dir \'%s\'' % args.dist_dir)
+
+    filenames = glob.glob(os.path.join(args.dist_dir, 'subversion-*.tar.gz'))
+    versions = []
+    for filename in filenames:
+        versions.append(Version(filename))
+
+    for k, g in itertools.groupby(sorted(versions),
+                                  lambda x: (x.major, x.minor)):
+        releases = list(g)
+        logging.info("Saving release '%s'", releases[-1])
+
+        for r in releases[:-1]:
+            for filename in glob.glob(os.path.join(args.dist_dir,
+                                                   'subversion-%s.*' % r)):
+                logging.info("Removing '%s'" % filename)
+                os.remove(filename)
+
+
+#----------------------------------------------------------------------
 # Write announcements
 
 def write_news(args):
     'Write text for the Subversion website.'
-    version_base, version_extra = split_version(args.version)
-
     data = { 'date' : datetime.date.today().strftime('%Y%m%d'),
              'date_pres' : datetime.date.today().strftime('%Y-%m-%d'),
-             'version' : args.version,
-             'version_base' : version_base[0:3],
+             'version' : str(args.version),
+             'version_base' : args.version.base,
            }
 
-    if version_extra:
-        if version_extra.startswith('alpha'):
-            template_filename = 'rc-news.ezt'
+    if args.version.is_prerelease():
+        template_filename = 'rc-news.ezt'
     else:
         template_filename = 'stable-news.ezt'
 
@@ -413,19 +495,36 @@ def write_news(args):
     template.generate(sys.stdout, data)
 
 
+def get_sha1info(args):
+    'Return a list of sha1 info for the release'
+    sha1s = glob.glob(os.path.join(get_deploydir(args.base_dir), '*.sha1'))
+
+    class info(object):
+        pass
+
+    sha1info = []
+    for s in sha1s:
+        i = info()
+        i.filename = os.path.basename(s)[:-5]
+        i.sha1 = open(s, 'r').read()
+        sha1info.append(i)
+
+    return sha1info
+
+
 def write_announcement(args):
     'Write the release announcement.'
-    version_base, version_extra = split_version(args.version)
+    sha1info = get_sha1info(args)
 
-    data = { 'version'      : args.version,
-             'sha1info'     : 'foo',
-             'siginfo'      : 'bar', 
-             'major-minor'  : 'boo',
+    data = { 'version'              : args.version,
+             'sha1info'             : sha1info,
+             'siginfo'              : open('getsigs-output', 'r').read(),
+             'major-minor'          : args.version.base[:3],
+             'major-minor-patch'    : args.version.base,
            }
 
-    if version_extra:
-        if version_extra.startswith('alpha'):
-            template_filename = 'rc-release-ann.ezt'
+    if args.version.is_prerelease():
+        template_filename = 'rc-release-ann.ezt'
     else:
         template_filename = 'stable-release-ann.ezt'
 
@@ -470,7 +569,7 @@ def main():
     subparser = subparsers.add_parser('roll',
                     help='''Create the release artifacts.''')
     subparser.set_defaults(func=roll_tarballs)
-    subparser.add_argument('version',
+    subparser.add_argument('version', type=Version,
                     help='''The release label, such as '1.7.0-alpha1'.''')
     subparser.add_argument('revnum', type=int,
                     help='''The revision number to base the release on.''')
@@ -483,7 +582,7 @@ def main():
                             The default location is somewhere in ~/public_html.
                             ''')
     subparser.set_defaults(func=post_candidates)
-    subparser.add_argument('version',
+    subparser.add_argument('version', type=Version,
                     help='''The release label, such as '1.7.0-alpha1'.''')
     subparser.add_argument('revnum', type=int,
                     help='''The revision number to base the release on.''')
@@ -493,19 +592,29 @@ def main():
                     help='''A whimsical name for the release, used only for
                             naming the download directory.''')
 
+    # The clean-dist subcommand
+    subparser = subparsers.add_parser('clean-dist',
+                    help='''Clean the distribution directory (and mirrors) of
+                            all but the most recent MAJOR.MINOR release.  If no
+                            dist-dir is given, this command will assume it is
+                            running on people.apache.org.''')
+    subparser.set_defaults(func=clean_dist)
+    subparser.add_argument('--dist-dir',
+                    help='''The directory to clean.''')
+
     # The write-news subcommand
     subparser = subparsers.add_parser('write-news',
                     help='''Output to stdout template text for use in the news
                             section of the Subversion website.''')
     subparser.set_defaults(func=write_news)
-    subparser.add_argument('version',
+    subparser.add_argument('version', type=Version,
                     help='''The release label, such as '1.7.0-alpha1'.''')
 
     subparser = subparsers.add_parser('write-announcement',
                     help='''Output to stdout template text for the emailed
                             release announcement.''')
     subparser.set_defaults(func=write_announcement)
-    subparser.add_argument('version',
+    subparser.add_argument('version', type=Version,
                     help='''The release label, such as '1.7.0-alpha1'.''')
 
     # A meta-target

Modified: subversion/branches/revprop-packing/tools/dist/templates/stable-release-ann.ezt
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/tools/dist/templates/stable-release-ann.ezt?rev=1146123&r1=1146122&r2=1146123&view=diff
==============================================================================
--- subversion/branches/revprop-packing/tools/dist/templates/stable-release-ann.ezt (original)
+++ subversion/branches/revprop-packing/tools/dist/templates/stable-release-ann.ezt Wed Jul 13 16:42:19 2011
@@ -5,8 +5,8 @@ Please choose the mirror closest to you 
 
 The SHA1 checksums are:
 
-[sha1info]
-
+[for sha1info]    [sha1info.sha1] [sha1info.filename]
+[end]
 PGP Signatures are available at:
 
     http://www.apache.org/dist/subversion/subversion-[version].tar.bz2.asc
@@ -16,7 +16,6 @@ PGP Signatures are available at:
 For this release, the following people have provided PGP signatures:
 
 [siginfo]
-
 Release notes for the [major-minor].x release series may be found at:
 
     http://subversion.apache.org/docs/release-notes/[major-minor].html

Modified: subversion/branches/revprop-packing/tools/hook-scripts/svnperms.py
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/tools/hook-scripts/svnperms.py?rev=1146123&r1=1146122&r2=1146123&view=diff
==============================================================================
--- subversion/branches/revprop-packing/tools/hook-scripts/svnperms.py (original)
+++ subversion/branches/revprop-packing/tools/hook-scripts/svnperms.py Wed Jul 13 16:42:19 2011
@@ -285,7 +285,7 @@ Options:
     -s NAME    Use section NAME as permission section (default is
                repository name, extracted from repository path)
     -R REV     Query revision REV for commit information (for tests)
-    -A AUTHOR  Check commit as if AUTHOR had commited it (for tests)
+    -A AUTHOR  Check commit as if AUTHOR had committed it (for tests)
     -h         Show this message
 """
 

Modified: subversion/branches/revprop-packing/win-tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/win-tests.py?rev=1146123&r1=1146122&r2=1146123&view=diff
==============================================================================
--- subversion/branches/revprop-packing/win-tests.py (original)
+++ subversion/branches/revprop-packing/win-tests.py Wed Jul 13 16:42:19 2011
@@ -437,7 +437,7 @@ class Httpd:
       self.httpv2_option = 'on'
     else:
       self.httpv2_option = 'off'
-      
+
     if bulk_updates:
       self.bulkupdates_option = 'on'
     else: