update.txt 5.43 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
Automatic Buildout Updates
==========================

When a buildout is run, one of the first steps performed is to check
for updates to either zc.buildout or setuptools.  To demonstrate this,
we've creates some "new releases" of buildout and setuptools in a
new_releases folder:

    >>> ls(new_releases)
    d  setuptools
11
    -  setuptools-99.99-py2.4.egg
12
    d  zc.buildout
13
    -  zc.buildout-99.99-py2.4.egg
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

Let's update the sample buildout.cfg to look in this area:

    >>> write(sample_buildout, 'buildout.cfg',
    ... """
    ... [buildout]
    ... find-links = %(new_releases)s
    ... index = %(new_releases)s
    ... parts = show-versions
    ... develop = showversions
    ... 
    ... [show-versions]
    ... recipe = showversions
    ... """ % dict(new_releases=new_releases))

29
We'll also include a recipe that echos the versions of setuptools and
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
zc.buildout used:

    >>> mkdir(sample_buildout, 'showversions')

    >>> write(sample_buildout, 'showversions', 'showversions.py', 
    ... """
    ... import pkg_resources
    ...
    ... class Recipe:
    ...
    ...     def __init__(self, buildout, name, options):
    ...         pass
    ...
    ...     def install(self):
    ...         for project in 'zc.buildout', 'setuptools':
    ...             req = pkg_resources.Requirement.parse(project)
    ...             print project, pkg_resources.working_set.find(req).version
Jim Fulton's avatar
Jim Fulton committed
47
    ...         return ()
48
    ...     update = install
49 50 51 52 53 54 55 56 57 58 59 60 61
    ... """)


    >>> write(sample_buildout, 'showversions', 'setup.py',
    ... """
    ... from setuptools import setup
    ... 
    ... setup(
    ...     name = "showversions",
    ...     entry_points = {'zc.buildout': ['default = showversions:Recipe']},
    ...     )
    ... """)

Jim Fulton's avatar
Jim Fulton committed
62

63 64 65 66
Now if we run the buildout, the buildout will upgrade itself to the
new versions found in new releases:

    >>> print system(buildout),
67 68 69 70 71 72 73 74
    zc.buildout.easy_install: Getting new distribution for zc.buildout
    zc.buildout.easy_install: Got zc.buildout 99.99
    zc.buildout.easy_install: Getting new distribution for setuptools
    zc.buildout.easy_install: Got setuptools 99.99
    buildout: Upgraded:
      zc.buildout version 99.99,
      setuptools version 99.99;
    restarting.
75
    buildout: Develop: /sample-buildout/showversions
76
    buildout: Installing show-versions
77 78 79 80 81 82
    zc.buildout 99.99
    setuptools 99.99

Our buildout script has been updated to use the new eggs:

    >>> cat(sample_buildout, 'bin', 'buildout') 
83
    #!/usr/local/bin/python2.4
84 85 86
    <BLANKLINE>
    import sys
    sys.path[0:0] = [
87 88
      '/sample-buildout/eggs/zc.buildout-99.99-py2.4.egg',
      '/sample-buildout/eggs/setuptools-99.99-py2.4.egg',
89 90 91 92 93 94
      ]
    <BLANKLINE>
    import zc.buildout.buildout
    <BLANKLINE>
    if __name__ == '__main__':
        zc.buildout.buildout.main()
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

There are a number of cases in which the updates don't happen.
Let's recreate the sample buildout. One case is the one in which we
specify versions of zc.buildout and setuptools for which the don't
match. If we update out configuration file to specify an older
version:

    >>> write(sample_buildout, 'buildout.cfg',
    ... """
    ... [buildout]
    ... find-links = %(new_releases)s
    ... index = %(new_releases)s
    ... parts = show-versions
    ... develop = showversions
    ... zc.buildout-version = < 99
    ... setuptools-version = < 99
    ... 
    ... [show-versions]
    ... recipe = showversions
    ... """ % dict(new_releases=new_releases))

We'll actually "upgrade" to an earlier version.

    >>> print system(buildout),
    buildout: Upgraded:
      zc.buildout version 1.0.0,
      setuptools version 0.6;
    restarting.
123
    buildout: Develop: /sample-buildout/showversions
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
    buildout: Updating show-versions
    zc.buildout 1.0.0
    setuptools 0.6

We won't upgrade in offline mode:

    >>> write(sample_buildout, 'buildout.cfg',
    ... """
    ... [buildout]
    ... find-links = %(new_releases)s
    ... index = %(new_releases)s
    ... parts = show-versions
    ... develop = showversions
    ... 
    ... [show-versions]
    ... recipe = showversions
    ... """ % dict(new_releases=new_releases))

Jim Fulton's avatar
Jim Fulton committed
142
    >>> print system(buildout+' -o'),
143
    buildout: Develop: /sample-buildout/showversions
144 145 146
    buildout: Updating show-versions
    zc.buildout 1.0.0
    setuptools 0.6
Jim Fulton's avatar
Jim Fulton committed
147 148 149 150 151 152 153 154 155

Or in non-newest mode:

    >>> print system(buildout+' -N'),
    buildout: Develop: /sample-buildout/showversions
    buildout: Updating show-versions
    zc.buildout 1.0.0
    setuptools 0.6

156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
We also won't upgrade if the buildout script bing run isn't in the
buildouts bin directory.  To see this we'll create a new buildout
directory:

    >>> sample_buildout2 = tmpdir('sample_buildout2')
    >>> write(sample_buildout2, 'buildout.cfg',
    ... """
    ... [buildout]
    ... find-links = %(new_releases)s
    ... index = %(new_releases)s
    ... parts = 
    ... """ % dict(new_releases=new_releases))
    
    >>> cd(sample_buildout2)
    >>> print system(buildout),
    buildout: Creating directory /sample_buildout2/bin
    buildout: Creating directory /sample_buildout2/parts
    buildout: Creating directory /sample_buildout2/eggs
    buildout: Creating directory /sample_buildout2/develop-eggs
    zc.buildout.easy_install: Getting new distribution for zc.buildout
    zc.buildout.easy_install: Got zc.buildout 99.99
    zc.buildout.easy_install: Getting new distribution for setuptools
    zc.buildout.easy_install: Got setuptools 99.99
    buildout: Not upgrading because not running a local buildout command

    >>> ls('bin')