Offline and newest modes
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
We have ways to make buildout not download the latest versions found
on indexes and be very conservative on what we already got local.

Let's create a buildout configuration file and a basic egg not published on pypi, and install it::

    >>> rmdir(tempdir)
    >>> mkdir(tempdir)
    >>> cd(tempdir)
    >>> a = [mkdir(d) for d in ('eggs', 'develop-eggs', 'bin', 'src')]
    >>> install_develop_eggs(['minitage.recipe'])
    >>> install_eggs_from_pathes(['zc.buildout'], sys.path)
    >>> touch('buildout.cfg')
    >>> sh('buildout -o bootstrap')
    buildout -o bootstrap...
    >>> if not os.path.exists('foo'):
    ...     mkdir('foo')
    ... else:
    ...     rmdir(foo)
    ...     mkdir('foo')
    >>> touch('foo/setup.py', data="""
    ... from setuptools import setup
    ... setup(name='foo', version='1.0')
    ...
    ... """)
    >>> touch('foo/toto.py', data="""
    ... def f():
    ...     print "foo"
    ...
    ... """)
    >>> noecho = [os.remove(d) for d in os.listdir('.') if '.tar.gz' in d]
    >>> os.chdir('foo')
    >>> sh('python setup.py sdist')
    p...
    >>> touch('setup.py', data="""
    ... from setuptools import setup
    ... setup(name='foo', version='2.0')
    ...
    ... """)
    >>> sh('python setup.py sdist')
    p...
    >>> noecho = [shutil.copy(os.path.join('dist', d), os.path.join('..', d)) for d in os.listdir('dist')]
    >>> os.chdir('..')
    >>> index_url = start_server(os.path.sep.join(tempdir))
    >>> data = """
    ... [versions]
    ... foo=1.0
    ... [buildout]
    ... download-cache=${buildout:directory}
    ... parts =
    ...     part
    ... [part]
    ... recipe=minitage.recipe.egg
    ... find-links=%(index)s
    ... eggs=foo
    ... """%{'index': index_url}
    >>> touch('buildout.cfg', data=data)
    >>> noecho = [remove(os.path.join('eggs', egg)) for egg in os.listdir('eggs') if 'foo' in egg]
    >>> sh('bin/buildout -vvvvv install part')
    bin/...
    Installing part.
    minitage.recipe: Installing python egg(s)...
    minitage.recipe: Downloading http://...:.../foo-1.0.tar.gz in /tmp/buildout.test/minitage/eggs/foo-1.0.tar.gz
    minitage.recipe: Unpacking in ...
    Processing foo-1.0.tar.gz...
    minitage.recipe: Installed foo 1.0 (/tmp/buildout.test/eggs/foo-1.0-p....egg)...

Well, now, we are 1.0.
Removing the version bit, but choosing to be non newest will make
buildout not to install the new foo-2.0 version.

    >>> data = """\
    ... [versions]
    ... [buildout]
    ... download-cache=${buildout:directory}
    ... parts =
    ...     part
    ... versions = versions
    ... [t]
    ... recipe=minitage.recipe.egg
    ... find-links=%(index)s
    ... eggs=foo
    ... """%{'index': index_url}
    >>> touch('buildout.cfg', data=data)
    >>> sh('bin/buildout -Nvvvvv install t')
    b...
    minitage.recipe: Installing python egg(s).
    minitage.recipe: Picked: foo = 1.0
    minitage.recipe: All egg dependencies seem to be installed!...

Idem in offline mode.

    >>> sh('bin/buildout -ovvvvv install t')
    b...
    minitage.recipe: Picked: foo = 1.0
    minitage.recipe: All egg dependencies seem to be installed!...

But then, going online/newest will trigger the installation of the 2.0 egg.

    >>> sh('bin/buildout -nvvvvv install t')
    b...
    minitage.recipe: Picked: foo = 2.0
    minitage.recipe: All egg dependencies seem to be installed!...

File urls work in offline mode.

    >>> data = """
    ... [buildout]
    ... download-cache=${buildout:directory}
    ... parts =
    ...     part
    ... [part]
    ... recipe=minitage.recipe.egg
    ... urls=file://${buildout:directory}/foo-2.0.tar.gz
    ... """
    >>> touch('buildout.cfg', data=data)
    >>> sh('bin/buildout -vvvvv install part')
    b...
    >>> cat('buildout.cfg')
    <BLANKLINE>
    [buildout]
    download-cache=${buildout:directory}
    parts =
        part
    versions = versions
    [part]
    recipe=minitage.recipe.egg
    urls=file://${buildout:directory}/foo-2.0.tar.gz...
    [versions]
    foo = 2.0...
    >>> noecho = [remove(os.path.join('eggs', egg)) for egg in os.listdir('eggs') if 'foo' in egg]
    >>> [egg for egg in os.listdir('eggs') if 'foo' in egg]
    []
    >>> sh('bin/buildout -o install part')
    b...
    >>> [egg for egg in os.listdir('eggs') if 'foo' in egg]
    ['foo-2.0-py...egg']

