From df76e657b707c1c4f3795b8bf9e8b22a8417c0e6 Mon Sep 17 00:00:00 2001
From: Fred Drake <fdrake@acm.org>
Date: Thu, 11 Aug 2005 17:55:28 +0000
Subject: [PATCH] Move to a zpkg-based setup:

- References to headers now involve the package names.

- The zpkg support files have been moved to the top-level directory,
  and the releases/ tree has been removed.  The resource map and
  configuration file have been combined now that zpkg allows that.

- The scripts are now all located in src/scripts/ in a checkout.

- Scripts that were imported in the tests have been split into library
  and script components; the library portions share name of the
  script (in order to reduce changes).  The library portions may not
  be used as scripts directly.
---
 .../DEPENDENCIES.cfg => DEPENDENCIES.cfg      |   1 +
 PACKAGE.cfg                                   |  17 +
 .../ZODB3/PUBLICATION.cfg => PUBLICATION.cfg  |   0
 SETUP.cfg                                     |   1 +
 releases/ZODB3/PACKAGE.cfg                    |  28 --
 releases/ZODB3/SETUP.cfg                      |  13 -
 releases/ZODB3/zodb3.map                      |  28 --
 setup.py                                      | 291 ++----------------
 src/BTrees/BTreeModuleTemplate.c              |   2 +-
 src/ZEO/runzeo.py                             |   4 -
 src/ZEO/zeopasswd.py                          |   4 -
 src/scripts/SETUP.cfg                         |   1 +
 src/{ZEO => scripts}/mkzeoinst.py             |   0
 src/scripts/runzeo.py                         |  18 ++
 src/{ZEO => scripts}/simul.py                 |   0
 src/{ZEO => scripts}/stats.py                 |   0
 src/{ZEO => scripts}/zeoctl.py                |   0
 src/scripts/zeopasswd.py                      |  20 ++
 zpkg.conf                                     |  38 +++
 19 files changed, 127 insertions(+), 339 deletions(-)
 rename releases/ZODB3/DEPENDENCIES.cfg => DEPENDENCIES.cfg (79%)
 create mode 100644 PACKAGE.cfg
 rename releases/ZODB3/PUBLICATION.cfg => PUBLICATION.cfg (100%)
 create mode 100644 SETUP.cfg
 delete mode 100644 releases/ZODB3/PACKAGE.cfg
 delete mode 100644 releases/ZODB3/SETUP.cfg
 delete mode 100644 releases/ZODB3/zodb3.map
 create mode 100644 src/scripts/SETUP.cfg
 rename src/{ZEO => scripts}/mkzeoinst.py (100%)
 create mode 100755 src/scripts/runzeo.py
 rename src/{ZEO => scripts}/simul.py (100%)
 mode change 100644 => 100755
 rename src/{ZEO => scripts}/stats.py (100%)
 rename src/{ZEO => scripts}/zeoctl.py (100%)
 mode change 100644 => 100755
 create mode 100755 src/scripts/zeopasswd.py
 create mode 100644 zpkg.conf

diff --git a/releases/ZODB3/DEPENDENCIES.cfg b/DEPENDENCIES.cfg
similarity index 79%
rename from releases/ZODB3/DEPENDENCIES.cfg
rename to DEPENDENCIES.cfg
index 12a6b1bc..d89b6538 100644
--- a/releases/ZODB3/DEPENDENCIES.cfg
+++ b/DEPENDENCIES.cfg
@@ -1,5 +1,6 @@
 ZEO
 ZODB
+ZODB-Scripts
 # Needed because...?
 Persistence
 ZopeUndo
diff --git a/PACKAGE.cfg b/PACKAGE.cfg
new file mode 100644
index 00000000..2e78cf11
--- /dev/null
+++ b/PACKAGE.cfg
@@ -0,0 +1,17 @@
+<distribution>
+  doc
+  log.ini
+  test.py
+  COPYRIGHT.txt
+  LICENSE.txt
+  NEWS.txt
+  README.txt
+</distribution>
+
+<collection>
+  doc           -
+  setup.py      -
+  src           -
+  zpkg.conf     -
+  zpkgsetup     -
+</collection>
diff --git a/releases/ZODB3/PUBLICATION.cfg b/PUBLICATION.cfg
similarity index 100%
rename from releases/ZODB3/PUBLICATION.cfg
rename to PUBLICATION.cfg
diff --git a/SETUP.cfg b/SETUP.cfg
new file mode 100644
index 00000000..3f7ec92a
--- /dev/null
+++ b/SETUP.cfg
@@ -0,0 +1 @@
+# unfortunate turd
diff --git a/releases/ZODB3/PACKAGE.cfg b/releases/ZODB3/PACKAGE.cfg
deleted file mode 100644
index fbcd856d..00000000
--- a/releases/ZODB3/PACKAGE.cfg
+++ /dev/null
@@ -1,28 +0,0 @@
-<load>
-  doc           svn://svn.zope.org/repos/main/ZODB/tags/*/doc/
-  scripts       svn://svn.zope.org/repos/main/ZODB/tags/*/src/scripts/
-  scripts/runzeo.py    svn://svn.zope.org/repos/main/ZODB/tags/*/src/ZEO/runzeo.py
-  scripts/zeoctl.py    svn://svn.zope.org/repos/main/ZODB/tags/*/src/ZEO/zeoctl.py
-  scripts/zeopasswd.py svn://svn.zope.org/repos/main/ZODB/tags/*/src/ZEO/zeopasswd.py
-  scripts/mkzeoinst.py svn://svn.zope.org/repos/main/ZODB/tags/*/src/ZEO/mkzeoinst.py
-  log.ini       svn://svn.zope.org/repos/main/ZODB/tags/*/log.ini
-  test.py       svn://svn.zope.org/repos/main/ZODB/tags/*/test.py
-  COPYRIGHT.txt svn://svn.zope.org/repos/main/ZODB/tags/*/COPYRIGHT.txt
-  LICENSE.txt   svn://svn.zope.org/repos/main/ZODB/tags/*/LICENSE.txt
-  NEWS.txt      svn://svn.zope.org/repos/main/ZODB/tags/*/NEWS.txt
-  README.txt    svn://svn.zope.org/repos/main/ZODB/tags/*/README.txt
-</load>
-
-<distribution>
-  doc
-  log.ini
-  test.py
-  COPYRIGHT.txt
-  LICENSE.txt
-  NEWS.txt
-  README.txt
-</distribution>
-
-<collection>
-  doc           -
-</collection>
diff --git a/releases/ZODB3/SETUP.cfg b/releases/ZODB3/SETUP.cfg
deleted file mode 100644
index 47b68e23..00000000
--- a/releases/ZODB3/SETUP.cfg
+++ /dev/null
@@ -1,13 +0,0 @@
-script  scripts/fsdump.py
-script  scripts/fsoids.py
-script  scripts/fsrefs.py
-script  scripts/fstail.py
-script  scripts/fstest.py
-script  scripts/repozo.py
-script  scripts/zeopack.py
-
-# scripts from ZEO package
-script  scripts/runzeo.py
-script  scripts/zeoctl.py
-script  scripts/zeopasswd.py
-script  scripts/mkzeoinst.py
diff --git a/releases/ZODB3/zodb3.map b/releases/ZODB3/zodb3.map
deleted file mode 100644
index 7febab3c..00000000
--- a/releases/ZODB3/zodb3.map
+++ /dev/null
@@ -1,28 +0,0 @@
-# These packages are used to provide the standalone ZODB distribution.
-
-# This is the ZODB3 release package:
-#
-ZODB3           svn://svn.zope.org/repos/main/ZODB/tags/*/releases/ZODB3
-
-# This group is maintained as part of the ZODB project:
-#
-BTrees          svn://svn.zope.org/repos/main/ZODB/tags/*/src/BTrees
-Persistence     svn://svn.zope.org/repos/main/ZODB/tags/*/src/Persistence
-persistent      svn://svn.zope.org/repos/main/ZODB/tags/*/src/persistent
-transaction     svn://svn.zope.org/repos/main/ZODB/tags/*/src/transaction
-ThreadedAsync   svn://svn.zope.org/repos/main/ZODB/tags/*/src/ThreadedAsync
-ZEO             svn://svn.zope.org/repos/main/ZODB/tags/*/src/ZEO
-ZODB            svn://svn.zope.org/repos/main/ZODB/tags/*/src/ZODB
-ZopeUndo        svn://svn.zope.org/repos/main/ZODB/tags/*/src/ZopeUndo
-zope            svn://svn.zope.org/repos/main/ZODB/tags/*/src/zope
-
-# These are copied in from the Zope3 project; they are needed for ZODB
-# 3.4 and newer:
-#
-zope.interface  svn://svn.zope.org/repos/main/Zope3/tags/ZopeX3-3.0.0-Zope-2.8-a4/src/zope/interface
-zope.testing    svn://svn.zope.org/repos/main/zope.testing/trunk/src/zope/testing
-
-# The ZConfig and zdaemon projects:
-
-ZConfig         svn://svn.zope.org/repos/main/ZConfig/tags/ZConfig-2.3
-zdaemon         svn://svn.zope.org/repos/main/zdaemon/tags/zdaemon-1.1
\ No newline at end of file
diff --git a/setup.py b/setup.py
index 2fba67bb..24b4a191 100644
--- a/setup.py
+++ b/setup.py
@@ -1,6 +1,7 @@
+#!/usr/bin/env python
 ##############################################################################
 #
-# Copyright (c) 2002, 2003 Zope Corporation and Contributors.
+# Copyright (c) 2005 Zope Corporation and Contributors.
 # All Rights Reserved.
 #
 # This software is subject to the provisions of the Zope Public License,
@@ -11,274 +12,42 @@
 # FOR A PARTICULAR PURPOSE.
 #
 ##############################################################################
-"""Zope Object Database: object database and persistence
 
-The Zope Object Database provides an object-oriented database for
-Python that provides a high-degree of transparency. Applications can
-take advantage of object database features with few, if any, changes
-to application logic.  ZODB includes features such as a plugable storage
-interface, rich transaction support, and undo.
-"""
-
-# The (non-obvious!) choices for the Trove Development Status line:
-# Development Status :: 5 - Production/Stable
-# Development Status :: 4 - Beta
-# Development Status :: 3 - Alpha
-
-classifiers = """\
-Development Status :: 3 - Alpha
-Intended Audience :: Developers
-License :: OSI Approved :: Zope Public License
-Programming Language :: Python
-Topic :: Database
-Topic :: Software Development :: Libraries :: Python Modules
-Operating System :: Microsoft :: Windows
-Operating System :: Unix
-"""
-
-import glob
 import os
+import posixpath
 import sys
-from distutils.core import setup
-from distutils.extension import Extension
-from distutils import dir_util
-from distutils.core import setup
-from distutils.dist import Distribution
-from distutils.command.install_lib import install_lib
-from distutils.command.build_py import build_py
-from distutils.util import convert_path
-
-if sys.version_info < (2, 3, 4):
-    print "ZODB 3.3 requires Python 2.3.4 or higher"
-    sys.exit(0)
-
-# Include directories for C extensions
-include = ['src/persistent']
-
-# Set up dependencies for the BTrees package
-base_btrees_depends = [
-    "src/BTrees/BTreeItemsTemplate.c",
-    "src/BTrees/BTreeModuleTemplate.c",
-    "src/BTrees/BTreeTemplate.c",
-    "src/BTrees/BucketTemplate.c",
-    "src/BTrees/MergeTemplate.c",
-    "src/BTrees/SetOpTemplate.c",
-    "src/BTrees/SetTemplate.c",
-    "src/BTrees/TreeSetTemplate.c",
-    "src/BTrees/sorters.c",
-    "src/persistent/cPersistence.h",
-    ]
-
-_flavors = {"O": "object", "I": "int", "F": "float"}
-
-KEY_H = "src/BTrees/%skeymacros.h"
-VALUE_H = "src/BTrees/%svaluemacros.h"
-
-def BTreeExtension(flavor):
-    key = flavor[0]
-    value = flavor[1]
-    name = "BTrees._%sBTree" % flavor
-    sources = ["src/BTrees/_%sBTree.c" % flavor]
-    kwargs = {"include_dirs": include}
-    if flavor != "fs":
-        kwargs["depends"] = (base_btrees_depends + [KEY_H % _flavors[key],
-                                                    VALUE_H % _flavors[value]])
-    if key != "O":
-        kwargs["define_macros"] = [('EXCLUDE_INTSET_SUPPORT', None)]
-    return Extension(name, sources, **kwargs)
-
-exts = [BTreeExtension(flavor)
-        for flavor in ("OO", "IO", "OI", "II", "IF", "fs")]
-
-cPersistence = Extension(name = 'persistent.cPersistence',
-                         include_dirs = include,
-                         sources= ['src/persistent/cPersistence.c',
-                                   'src/persistent/ring.c'],
-                         depends = ['src/persistent/cPersistence.h',
-                                    'src/persistent/ring.h',
-                                    'src/persistent/ring.c']
-                         )
-
-cPickleCache = Extension(name = 'persistent.cPickleCache',
-                         include_dirs = include,
-                         sources= ['src/persistent/cPickleCache.c',
-                                   'src/persistent/ring.c'],
-                         depends = ['src/persistent/cPersistence.h',
-                                    'src/persistent/ring.h',
-                                    'src/persistent/ring.c']
-                         )
-
-TimeStamp = Extension(name = 'persistent.TimeStamp',
-                      include_dirs = include,
-                      sources= ['src/persistent/TimeStamp.c']
-                      )
-
-##coptimizations = Extension(name = 'ZODB.coptimizations',
-##                           include_dirs = include,
-##                           sources= ['src/ZODB/coptimizations.c']
-##                           )
-
-winlock = Extension(name = 'ZODB.winlock',
-                    include_dirs = include,
-                    sources = ['src/ZODB/winlock.c']
-                    )
-
-cZopeInterface = Extension(
-            name = 'zope.interface._zope_interface_coptimizations',
-            sources= ['src/zope/interface/_zope_interface_coptimizations.c']
-            )
-
-cZopeProxy = Extension(
-            name = 'zope.proxy._zope_proxy_proxy',
-            sources= ['src/zope/proxy/_zope_proxy_proxy.c']
-            )
-
-exts += [cPersistence,
-         cPickleCache,
-         TimeStamp,
-         winlock,
-         cZopeInterface,
-         cZopeProxy,
-        ]
-
-# The ZODB.zodb4 code is not being packaged, because it is only
-# need to convert early versions of Zope3 databases to ZODB3.
-
-packages = ["BTrees", "BTrees.tests",
-            "ZEO", "ZEO.auth", "ZEO.zrpc", "ZEO.tests",
-            "ZODB", "ZODB.FileStorage", "ZODB.tests",
-            "Persistence", "Persistence.tests",
-            "persistent", "persistent.tests",
-            "transaction", "transaction.tests",
-            "ThreadedAsync",
-            "zdaemon", "zdaemon.tests",
-
-            "zope",
-            "zope.interface", "zope.interface.tests",
-            "zope.interface.common", "zope.interface.common.tests",
-            "zope.proxy", "zope.proxy.tests",
-            "zope.testing",
-
-            "ZopeUndo", "ZopeUndo.tests",
-            "ZConfig", "ZConfig.tests",
-            "ZConfig.components",
-            "ZConfig.components.basic", "ZConfig.components.basic.tests",
-            "ZConfig.components.logger", "ZConfig.components.logger.tests",
-            "ZConfig.tests.library", "ZConfig.tests.library.widget",
-            "ZConfig.tests.library.thing",
-            ]
-
-scripts = ["src/scripts/fsdump.py",
-           "src/scripts/fsoids.py",
-           "src/scripts/fsrefs.py",
-           "src/scripts/fstail.py",
-           "src/scripts/fstest.py",
-           "src/scripts/repozo.py",
-           "src/scripts/zeopack.py",
-           "src/ZConfig/scripts/zconfig",
-           "src/ZEO/runzeo.py",
-           "src/ZEO/zeopasswd.py",
-           "src/ZEO/mkzeoinst.py",
-           "src/ZEO/zeoctl.py",
-           "src/zdaemon/zdrun.py",
-           "src/zdaemon/zdctl.py",
-           ]
-
-def copy_other_files(cmd, outputbase):
-    # A delicate dance to copy files with certain extensions
-    # into a package just like .py files.
-    extensions = ["*.conf", "*.xml", "*.txt", "*.sh"]
-    directories = [
-        "transaction",
-        "persistent/tests",
-        "ZConfig/components/basic",
-        "ZConfig/components/logger",
-        "ZConfig/tests/input",
-        "ZConfig/tests/library",
-        "ZConfig/tests/library/thing",
-        "ZConfig/tests/library/thing/extras",
-        "ZConfig/tests/library/widget",
-        "ZEO",
-        "ZODB",
-        "ZODB/tests",
-        "zdaemon",
-        "zdaemon/tests",
-        "zope/interface", "zope/interface/tests",
-        "zope/testing",
-        ]
-    # zope.testing's testrunner-ex is not a package, but contains
-    # packages, in a fairly elaborate subtree.  Major special-casing
-    # for this.  First find all the (non-SVN) directories starting
-    # there, and append them all to `directories`.
-    for root, dirs, files in os.walk("src/zope/testing/testrunner-ex"):
-        dirs[:] = [d for d in dirs if ".svn" not in d]
-        assert root.startswith("src/")
-        normpath = root[4:].replace("\\", "/")
-        directories.append(normpath)
-    for dir in directories:
-        exts = extensions
-        if dir.startswith("zope/testing/testrunner-ex"):
-            # testrunner-ex isn't a package, so not even the .py files
-            # get copied unless we force that there.
-            exts = extensions + ["*.py"]
-        dir = convert_path(dir)
-        inputdir = os.path.join("src", dir)
-        outputdir = os.path.join(outputbase, dir)
-        if not os.path.exists(outputdir):
-            dir_util.mkpath(outputdir)
-        for pattern in exts:
-            for fn in glob.glob(os.path.join(inputdir, pattern)):
-                # glob is going to give us a path including "src",
-                # which must be stripped to get the destination dir
-                dest = os.path.join(outputbase, fn[4:])
-                cmd.copy_file(fn, dest)
 
-class MyLibInstaller(install_lib):
-    """Custom library installer, used to put hosttab in the right place."""
+import zpkgsetup.setup
 
-    # We use the install_lib command since we need to put hosttab
-    # inside the library directory.  This is where we already have the
-    # real information about where to install it after the library
-    # location has been set by any relevant distutils command line
-    # options.
 
-    def run(self):
-        install_lib.run(self)
-        copy_other_files(self, self.install_dir)
+here = os.path.dirname(os.path.abspath(__file__))
 
-class MyPyBuilder(build_py):
-    def build_packages(self):
-        build_py.build_packages(self)
-        copy_other_files(self, self.build_lib)
+def join(*parts):
+    local_full_path = os.path.join(here, *parts)
+    relative_path = posixpath.join(*parts)
+    return local_full_path, relative_path
 
-class MyDistribution(Distribution):
-    # To control the selection of MyLibInstaller and MyPyBuilder, we
-    # have to set it into the cmdclass instance variable, set in
-    # Distribution.__init__().
 
-    def __init__(self, *attrs):
-        Distribution.__init__(self, *attrs)
-        self.cmdclass['build_py'] = MyPyBuilder
-        self.cmdclass['install_lib'] = MyLibInstaller
+context = zpkgsetup.setup.SetupContext(
+    "ZODB3", "3.5.0a42", __file__)
 
-doclines = __doc__.split("\n")
+context.load_metadata(
+    os.path.join(here, "releases", "ZODB3", "PUBLICATION.cfg"))
 
-setup(name="ZODB3",
-      version="3.5.0a6",
-      maintainer="Zope Corporation",
-      maintainer_email="zodb-dev@zope.org",
-      url = "http://www.zope.org/Wikis/ZODB",
-      download_url = "http://www.zope.org/Products/ZODB3.5",
-      packages = packages,
-      package_dir = {'': 'src'},
-      ext_modules = exts,
-      headers = ['src/persistent/cPersistence.h',
-                 'src/persistent/ring.h'],
-      license = "ZPL 2.1",
-      platforms = ["any"],
-      description = doclines[0],
-      classifiers = filter(None, classifiers.split("\n")),
-      long_description = "\n".join(doclines[2:]),
-      distclass = MyDistribution,
-      scripts = scripts,
-      )
+context.scan("ZODB3",          *join("releases", "ZODB3"))
+context.scan("BTrees",         *join("src", "BTrees"))
+context.scan("Persistence",    *join("src", "Persistence"))
+context.scan("persistent",     *join("src", "persistent"))
+context.scan("ThreadedAsync",  *join("src", "ThreadedAsync"))
+context.scan("transaction",    *join("src", "transaction"))
+context.scan("ZConfig",        *join("src", "ZConfig"))
+context.scan("zdaemon",        *join("src", "zdaemon"))
+context.scan("ZEO",            *join("src", "ZEO"))
+context.scan("ZODB",           *join("src", "ZODB"))
+context.scan("ZODB-Scripts",   *join("src", "scripts"))
+context.scan("zope",           *join("src", "zope"))
+context.scan("zope.interface", *join("src", "zope", "interface"))
+context.scan("zope.proxy",     *join("src", "zope", "proxy"))
+context.scan("zope.testing",   *join("src", "zope", "testing"))
+context.scan("ZopeUndo",       *join("src", "ZopeUndo"))
+context.setup()
diff --git a/src/BTrees/BTreeModuleTemplate.c b/src/BTrees/BTreeModuleTemplate.c
index 8238cec8..998d0378 100644
--- a/src/BTrees/BTreeModuleTemplate.c
+++ b/src/BTrees/BTreeModuleTemplate.c
@@ -17,7 +17,7 @@
 #include "structmember.h"
 
 #ifdef PERSISTENT
-#include "cPersistence.h"
+#include "persistent/cPersistence.h"
 #else
 #define PER_USE_OR_RETURN(self, NULL)
 #define PER_ALLOW_DEACTIVATION(self)
diff --git a/src/ZEO/runzeo.py b/src/ZEO/runzeo.py
index a00b2ffd..960ae673 100644
--- a/src/ZEO/runzeo.py
+++ b/src/ZEO/runzeo.py
@@ -1,4 +1,3 @@
-#!python
 ##############################################################################
 #
 # Copyright (c) 2001, 2002, 2003 Zope Corporation and Contributors.
@@ -352,6 +351,3 @@ def main(args=None):
     options.realize(args)
     s = ZEOServer(options)
     s.main()
-
-if __name__ == "__main__":
-    main()
diff --git a/src/ZEO/zeopasswd.py b/src/ZEO/zeopasswd.py
index e45c220d..0dac0a52 100644
--- a/src/ZEO/zeopasswd.py
+++ b/src/ZEO/zeopasswd.py
@@ -1,4 +1,3 @@
-#!python
 ##############################################################################
 #
 # Copyright (c) 2003 Zope Corporation and Contributors.
@@ -124,6 +123,3 @@ def main(args=None, dbclass=None):
             password = getpass.getpass("Enter password: ")
         db.add_user(username, password)
     db.save()
-
-if __name__ == "__main__":
-    main(sys.argv[1:])
diff --git a/src/scripts/SETUP.cfg b/src/scripts/SETUP.cfg
new file mode 100644
index 00000000..985d9b88
--- /dev/null
+++ b/src/scripts/SETUP.cfg
@@ -0,0 +1 @@
+script *.py
diff --git a/src/ZEO/mkzeoinst.py b/src/scripts/mkzeoinst.py
similarity index 100%
rename from src/ZEO/mkzeoinst.py
rename to src/scripts/mkzeoinst.py
diff --git a/src/scripts/runzeo.py b/src/scripts/runzeo.py
new file mode 100755
index 00000000..b4220f71
--- /dev/null
+++ b/src/scripts/runzeo.py
@@ -0,0 +1,18 @@
+#!python
+##############################################################################
+#
+# Copyright (c) 2003 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+
+from ZEO.runzeo import main
+
+main()
diff --git a/src/ZEO/simul.py b/src/scripts/simul.py
old mode 100644
new mode 100755
similarity index 100%
rename from src/ZEO/simul.py
rename to src/scripts/simul.py
diff --git a/src/ZEO/stats.py b/src/scripts/stats.py
similarity index 100%
rename from src/ZEO/stats.py
rename to src/scripts/stats.py
diff --git a/src/ZEO/zeoctl.py b/src/scripts/zeoctl.py
old mode 100644
new mode 100755
similarity index 100%
rename from src/ZEO/zeoctl.py
rename to src/scripts/zeoctl.py
diff --git a/src/scripts/zeopasswd.py b/src/scripts/zeopasswd.py
new file mode 100755
index 00000000..23d8fcb4
--- /dev/null
+++ b/src/scripts/zeopasswd.py
@@ -0,0 +1,20 @@
+#!python
+##############################################################################
+#
+# Copyright (c) 2003 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+
+import sys
+
+from ZEO.zeopasswd import main
+
+main(sys.argv[1:])
diff --git a/zpkg.conf b/zpkg.conf
new file mode 100644
index 00000000..2ec1879a
--- /dev/null
+++ b/zpkg.conf
@@ -0,0 +1,38 @@
+# zpkg config file
+#
+# To getnerate a ZODB release, use:
+#
+
+build-application     no
+collect-dependencies  yes
+
+<resources>
+  # This is the ZODB3 release package:
+  #
+  ZODB3           .
+
+  # This group is maintained as part of the ZODB project:
+  #
+  BTrees          src/BTrees
+  Persistence     src/Persistence
+  persistent      src/persistent
+  transaction     src/transaction
+  ThreadedAsync   src/ThreadedAsync
+  ZEO             src/ZEO
+  ZODB            src/ZODB
+  ZODB-Scripts    src/scripts
+  ZopeUndo        src/ZopeUndo
+
+  # These are copied in from the Zope3 project; they are needed for ZODB
+  # 3.4 and newer:
+  #
+  zope            src/zope
+  zope.interface  src/zope/interface
+  zope.proxy      src/zope/proxy
+  zope.testing    src/zope/testing
+
+  # These are copied in from the ZConfig and zdaemon projects:
+  #
+  ZConfig         src/ZConfig
+  zdaemon         src/zdaemon
+</resources>
-- 
2.30.9