[Checkins] SVN: grokproject/trunk/ When grok is not installed yet,
download a tar ball with all eggs
Maurits van Rees
m.van.rees at zestsoftware.nl
Sat May 3 15:54:18 EDT 2008
Log message for revision 86280:
When grok is not installed yet, download a tar ball with all eggs
needed by Grok and install those in the shared eggs directory.
Changed:
U grokproject/trunk/CHANGES.txt
U grokproject/trunk/grokproject/templates.py
U grokproject/trunk/grokproject/utils.py
U grokproject/trunk/setup.py
-=-
Modified: grokproject/trunk/CHANGES.txt
===================================================================
--- grokproject/trunk/CHANGES.txt 2008-05-03 19:52:56 UTC (rev 86279)
+++ grokproject/trunk/CHANGES.txt 2008-05-03 19:54:18 UTC (rev 86280)
@@ -4,6 +4,9 @@
0.8 (unreleased)
------------------
+* When grok is not installed yet, download a tar ball with all eggs
+ needed by Grok and install those in the shared eggs directory.
+
* Added svn:external for bootstrap/bootstrap.py to the buildout. And we're
downloading a fresh one for every grokproject that we're generating.
Modified: grokproject/trunk/grokproject/templates.py
===================================================================
--- grokproject/trunk/grokproject/templates.py 2008-05-03 19:52:56 UTC (rev 86279)
+++ grokproject/trunk/grokproject/templates.py 2008-05-03 19:54:18 UTC (rev 86280)
@@ -2,19 +2,23 @@
import os
import urllib
import urlparse
+import shutil
+import tempfile
import xml.sax.saxutils
+import tarfile
from paste.script import templates
from paste.script.templates import NoDefault
from grokproject.utils import run_buildout
-from grokproject.utils import default_eggs_dir
from grokproject.utils import get_buildout_default_eggs_dir
from grokproject.utils import ask_var
-from grokproject.utils import get_var
from grokproject.utils import get_boolean_value_for_option
from grokproject.utils import create_buildout_default_file
from grokproject.utils import exist_buildout_default_file
+from grokproject.utils import required_grok_version
+from zc.buildout.easy_install import install
+from zc.buildout.easy_install import MissingDistribution
-VERSIONINFO_INFO_URL = 'http://grok.zope.org/releaseinfo/current'
+GROK_RELEASE_URL = 'http://grok.zope.org/releaseinfo/'
BOOTSTRAP = 'http://svn.zope.org/*checkout*/zc.buildout/trunk/bootstrap/bootstrap.py'
class GrokProject(templates.Template):
@@ -65,8 +69,9 @@
vars['app_class_name'] = vars['project'].capitalize()
# Handling the version.cfg file.
- info = urllib.urlopen(VERSIONINFO_INFO_URL).read().strip()
- version_info_url = urlparse.urljoin(VERSIONINFO_INFO_URL, info)
+ current_info_url = GROK_RELEASE_URL + 'current'
+ info = urllib.urlopen(current_info_url).read().strip()
+ version_info_url = urlparse.urljoin(current_info_url, info)
vars['version_info_url'] = version_info_url
version_info_file_contents = urllib.urlopen(version_info_url).read()
vars['version_info_file_contents'] = version_info_file_contents
@@ -77,6 +82,8 @@
buildout_default = exist_buildout_default_file()
if explicit_eggs_dir:
+ # Put explicit_eggs_dir in the vars; used by the post command.
+ vars['explicit_eggs_dir'] = explicit_eggs_dir
vars['eggs_dir'] = (
'# Warning: when you share this buildout.cfg with friends\n'
'# please remove the eggs-directory line as it is hardcoded.\n'
@@ -89,6 +96,58 @@
return vars
def post(self, command, output_dir, vars):
- if vars['run_buildout']:
- os.chdir(vars['project'])
- run_buildout(command.options.verbose)
+ if not vars['run_buildout']:
+ return
+ os.chdir(vars['project'])
+ eggs_dir = vars.get('explicit_eggs_dir',
+ get_buildout_default_eggs_dir())
+ if not os.path.isdir(eggs_dir):
+ os.mkdir(eggs_dir)
+
+ version = required_grok_version(vars['version_info_file_contents'])
+ try:
+ empty_index = tempfile.mkdtemp()
+
+ # Check if the required grok version is already installed.
+ # We do this by trying to install grok in the eggs dir and
+ # letting easy_install only look inside that same eggs
+ # dir while doing that.
+ try:
+ install(['grok'], eggs_dir, newest=False,
+ versions={'grok': version}, links=[eggs_dir],
+ index='file://' + empty_index)
+ except MissingDistribution:
+ print "Grok is missing! We will download a tar ball."
+
+ tarball_name = 'grok-eggs-%s.tgz' % version
+ url = GROK_RELEASE_URL + tarball_name
+ print "Attempting download from %s ..." % url
+
+ try:
+ extraction_dir = tempfile.mkdtemp() + '/'
+ filenum, temp_tarball_name = tempfile.mkstemp()
+ tarball = open(temp_tarball_name, 'w')
+ tarball.write(urllib.urlopen(url).read())
+ tarball.close()
+ print "Finished downloading."
+ print "Installing eggs to %s ..." % eggs_dir
+
+ tf = tarfile.open(temp_tarball_name,
+ 'r:gz')
+ links = []
+ for name in tf.getnames():
+ tf.extract(name, extraction_dir)
+ links.append(extraction_dir + name)
+ tf.close()
+
+ install(['grok'], eggs_dir, newest=False,
+ versions={'grok': version},
+ links=links,
+ index='file://' + empty_index)
+ finally:
+ shutil.rmtree(extraction_dir)
+ os.unlink(temp_tarball_name)
+ finally:
+ shutil.rmtree(empty_index)
+
+ run_buildout(command.options.verbose)
Modified: grokproject/trunk/grokproject/utils.py
===================================================================
--- grokproject/trunk/grokproject/utils.py 2008-05-03 19:52:56 UTC (rev 86279)
+++ grokproject/trunk/grokproject/utils.py 2008-05-03 19:54:18 UTC (rev 86280)
@@ -87,17 +87,12 @@
if eggs_dir:
return os.path.expanduser(eggs_dir)
+
def exist_buildout_default_file():
default_cfg = os.path.join(HOME, '.buildout', 'default.cfg')
return os.path.isfile(default_cfg)
-def default_eggs_dir():
- buildout_default = get_buildout_default_eggs_dir()
- if buildout_default:
- return buildout_default
- return os.path.join(HOME, 'buildout-eggs')
-
def run_buildout(verbose=False):
"""Run a buildout.
@@ -139,3 +134,9 @@
print "Invoking zc.buildout..."
zc.buildout.buildout.main(['-q', 'install'])
+
+
+def required_grok_version(versionfile):
+ for line in versionfile.split('\n'):
+ if line.startswith('grok ='):
+ return line.split(' ')[-1]
Modified: grokproject/trunk/setup.py
===================================================================
--- grokproject/trunk/setup.py 2008-05-03 19:52:56 UTC (rev 86279)
+++ grokproject/trunk/setup.py 2008-05-03 19:54:18 UTC (rev 86280)
@@ -20,7 +20,7 @@
packages=find_packages(),
include_package_data=True,
zip_safe=False,
- install_requires=['PasteScript>=1.6',],
+ install_requires=['PasteScript>=1.6', 'zc.buildout'],
tests_require=['zope.testing', 'zc.buildout', 'Cheetah', 'PasteScript'],
test_suite='tests.test_suite',
entry_points={
More information about the Checkins
mailing list