Merge lp:~gary/zc.buildout/python-support into lp:zc.buildout
- python-support
- Merge into trunk
Status: | Needs review |
---|---|
Proposed branch: | lp:~gary/zc.buildout/python-support |
Merge into: | lp:zc.buildout |
Prerequisite: | lp:~gary/zc.buildout/python-support-8-support-subprocess |
Diff against target: |
1026 lines (+349/-185) (has conflicts) 12 files modified
CHANGES.txt (+24/-2) bootstrap/bootstrap.py (+1/-1) dev.py (+44/-7) src/zc/buildout/bootstrap.txt (+1/-1) src/zc/buildout/buildout.py (+22/-2) src/zc/buildout/buildout.txt (+181/-115) src/zc/buildout/easy_install.py (+8/-28) src/zc/buildout/easy_install.txt (+10/-5) src/zc/buildout/tests.py (+42/-16) src/zc/buildout/update.txt (+3/-2) z3c.recipe.scripts_/src/z3c/recipe/scripts/tests.py (+3/-2) zc.recipe.egg_/src/zc/recipe/egg/tests.py (+10/-4) Text conflict in CHANGES.txt Text conflict in src/zc/buildout/buildout.py Text conflict in src/zc/buildout/buildout.txt |
To merge this branch: | bzr merge lp:~gary/zc.buildout/python-support |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Francis J. Lacoste (community) | Approve | ||
Review via email: mp+21733@code.launchpad.net |
Commit message
Description of the change
This merges recent zc.buildout changes with the python-support-* line of branches. As such, the only work from myself here is merge conflict resolutions.
- 545. By Gary Poster
-
reinstate test cleanup
Gary Poster (gary) wrote : | # |
Interesting, and good catch! The change is from the trunk, but from a very old revision. One of my many early branches must have changed the "Picked" and "executable" lines to the better versions, but the bzr merge didn't quite guess correctly as to what to do. So, yes, I should change it back to the values in my branch, thank you. I've done so.
- 546. By Gary Poster
-
merge from python-support-8
Gary Poster (gary) wrote : | # |
The most recent changes (r546) merely keep the branch up-to-date with python-support-8
- 547. By Gary Poster
-
merge gary-9
- 548. By Gary Poster
-
merge lp:~gary/zc.buildout/python-support-10: add significantly improved Distribute support.
Unmerged revisions
- 548. By Gary Poster
-
merge lp:~gary/zc.buildout/python-support-10: add significantly improved Distribute support.
- 547. By Gary Poster
-
merge gary-9
- 546. By Gary Poster
-
merge from python-support-8
- 545. By Gary Poster
-
reinstate test cleanup
- 544. By Gary Poster
-
merge from python-support-8
- 543. By Gary Poster
-
merge from buildout trunk
- 542. By Gary Poster
-
merge from gary-8
- 541. By Gary Poster
-
merge buildout trunk with system python support branches.
Preview Diff
1 | === modified file 'CHANGES.txt' |
2 | --- CHANGES.txt 2010-04-29 14:34:36 +0000 |
3 | +++ CHANGES.txt 2010-04-29 14:34:36 +0000 |
4 | @@ -1,11 +1,21 @@ |
5 | Change History |
6 | ************** |
7 | |
8 | +<<<<<<< TREE |
9 | +1.4.4 (?) |
10 | +========= |
11 | + |
12 | +======= |
13 | + |
14 | 1.?.? (201?-??-??) |
15 | ================== |
16 | |
17 | New Features: |
18 | |
19 | +- Added buildout:socket-timout option so that socket timeout can be configured |
20 | + both from command line and from config files. (gotcha) |
21 | +>>>>>>> MERGE-SOURCE |
22 | + |
23 | - Buildout can be safely used with a system Python (or any Python with code |
24 | in site-packages), as long as you use the new z3c.recipe.scripts |
25 | recipe to generate scripts and interpreters, rather than zc.recipe.egg. |
26 | @@ -39,22 +49,34 @@ |
27 | * The buildout script generated by bootstrap honors more of the settings |
28 | in the designated configuration file (e.g., buildout.cfg). |
29 | |
30 | +- You can develop zc.buildout using Distribute instead of Setuptools. Use |
31 | + the --distribute option on the dev.py script. (Releases should be tested |
32 | + with both Distribute and Setuptools.) |
33 | + |
34 | +- The ``distribute-version`` now works in the [buildout] section, mirroring |
35 | + the ``setuptools-version`` option (this is for consistency; using the |
36 | + general-purpose ``versions`` option is preferred). |
37 | + |
38 | Bugs fixed: |
39 | |
40 | +- Using Distribute with the ``allow-picked-versions = false`` buildout |
41 | + option no longer causes an error. |
42 | + |
43 | - The handling and documenting of default buildout options was normalized. |
44 | This means, among other things, that ``bin/buildout -vv`` and |
45 | ``bin/buildout annotate`` correctly list more of the options. |
46 | |
47 | - Installing a namespace package using a Python that already has a package |
48 | in the same namespace (e.g., in the Python's site-packages) failed in |
49 | - some cases. |
50 | + some cases. It is now handled correctly. |
51 | |
52 | - Another variation of this error showed itself when at least two |
53 | dependencies were in a shared location like site-packages, and the |
54 | first one met the "versions" setting. The first dependency would be |
55 | added, but subsequent dependencies from the same location (e.g., |
56 | site-packages) would use the version of the package found in the |
57 | - shared location, ignoring the version setting. |
58 | + shared location, ignoring the version setting. This is also now |
59 | + handled correctly. |
60 | |
61 | 1.4.3 (2009-12-10) |
62 | ================== |
63 | |
64 | === modified file 'bootstrap/bootstrap.py' |
65 | --- bootstrap/bootstrap.py 2010-04-29 14:34:36 +0000 |
66 | +++ bootstrap/bootstrap.py 2010-04-29 14:34:36 +0000 |
67 | @@ -115,7 +115,7 @@ |
68 | |
69 | options, args = parser.parse_args() |
70 | |
71 | -# if -c was provided, we push it back into args for buildout' main function |
72 | +# if -c was provided, we push it back into args for buildout's main function |
73 | if options.config_file is not None: |
74 | args += ['-c', options.config_file] |
75 | |
76 | |
77 | === modified file 'dev.py' |
78 | --- dev.py 2010-04-29 14:34:36 +0000 |
79 | +++ dev.py 2010-04-29 14:34:36 +0000 |
80 | @@ -20,6 +20,7 @@ |
81 | """ |
82 | |
83 | import os, shutil, sys, subprocess, urllib2 |
84 | +from optparse import OptionParser |
85 | |
86 | if sys.platform == 'win32': |
87 | def quote(c): |
88 | @@ -56,10 +57,36 @@ |
89 | |
90 | is_jython = sys.platform.startswith('java') |
91 | |
92 | +setuptools_source = 'http://peak.telecommunity.com/dist/ez_setup.py' |
93 | +distribute_source = 'http://python-distribute.org/distribute_setup.py' |
94 | + |
95 | +usage = '''\ |
96 | +[DESIRED PYTHON FOR DEVELOPING BUILDOUT] dev.py [options] |
97 | + |
98 | +Bootstraps buildout itself for development. |
99 | + |
100 | +This is different from a normal bootstrapping process because the |
101 | +buildout egg itself is installed as a develop egg. |
102 | +''' |
103 | + |
104 | +parser = OptionParser(usage=usage) |
105 | +parser.add_option("-d", "--distribute", |
106 | + action="store_true", dest="use_distribute", default=False, |
107 | + help="Use Distribute rather than Setuptools.") |
108 | + |
109 | +options, args = parser.parse_args() |
110 | + |
111 | +if args: |
112 | + parser.error('This script accepts no arguments other than its options.') |
113 | + |
114 | +if options.use_distribute: |
115 | + setup_source = distribute_source |
116 | +else: |
117 | + setup_source = setuptools_source |
118 | + |
119 | for d in 'eggs', 'develop-eggs', 'bin': |
120 | if not os.path.exists(d): |
121 | os.mkdir(d) |
122 | - |
123 | if os.path.isdir('build'): |
124 | shutil.rmtree('build') |
125 | |
126 | @@ -67,22 +94,32 @@ |
127 | to_reload = False |
128 | import pkg_resources |
129 | to_reload = True |
130 | + if not hasattr(pkg_resources, '_distribute'): |
131 | + raise ImportError |
132 | import setuptools # A flag. Sometimes pkg_resources is installed alone. |
133 | except ImportError: |
134 | + ez_code = urllib2.urlopen(setup_source).read().replace('\r\n', '\n') |
135 | ez = {} |
136 | - exec urllib2.urlopen('http://peak.telecommunity.com/dist/ez_setup.py' |
137 | - ).read() in ez |
138 | - ez['use_setuptools'](to_dir='eggs', download_delay=0) |
139 | - |
140 | - import pkg_resources |
141 | + exec ez_code in ez |
142 | + setup_args = dict(to_dir='eggs', download_delay=0) |
143 | + if options.use_distribute: |
144 | + setup_args['no_fake'] = True |
145 | + ez['use_setuptools'](**setup_args) |
146 | if to_reload: |
147 | reload(pkg_resources) |
148 | + else: |
149 | + import pkg_resources |
150 | + # This does not (always?) update the default working set. We will |
151 | + # do it. |
152 | + for path in sys.path: |
153 | + if path not in pkg_resources.working_set.entries: |
154 | + pkg_resources.working_set.add_entry(path) |
155 | |
156 | env = os.environ.copy() # Windows needs yet-to-be-determined values from this. |
157 | env['PYTHONPATH'] = os.path.dirname(pkg_resources.__file__) |
158 | subprocess.Popen( |
159 | [sys.executable] + |
160 | - ['-S', 'setup.py', '-q', 'develop', '-m', '-x', '-d', 'develop-eggs'], |
161 | + ['setup.py', '-q', 'develop', '-m', '-x', '-d', 'develop-eggs'], |
162 | env=env).wait() |
163 | |
164 | pkg_resources.working_set.add_entry('src') |
165 | |
166 | === modified file 'src/zc/buildout/bootstrap.txt' |
167 | --- src/zc/buildout/bootstrap.txt 2010-04-29 14:34:36 +0000 |
168 | +++ src/zc/buildout/bootstrap.txt 2010-04-29 14:34:36 +0000 |
169 | @@ -47,7 +47,7 @@ |
170 | X... |
171 | d zc.buildout-...egg |
172 | |
173 | -Now trying the `--version` option, that let you define a version for |
174 | +Now we will try the `--version` option, which lets you define a version for |
175 | `zc.buildout`. If not provided, bootstrap will look for the latest one. |
176 | |
177 | Let's try with an unknown version:: |
178 | |
179 | === modified file 'src/zc/buildout/buildout.py' |
180 | --- src/zc/buildout/buildout.py 2010-04-29 14:34:36 +0000 |
181 | +++ src/zc/buildout/buildout.py 2010-04-29 14:34:36 +0000 |
182 | @@ -128,8 +128,16 @@ |
183 | 'parts-directory': 'parts', |
184 | 'prefer-final': 'false', |
185 | 'python': 'buildout', |
186 | +<<<<<<< TREE |
187 | + 'executable': sys.executable, |
188 | + 'log-level': 'INFO', |
189 | + 'log-format': '', |
190 | +======= |
191 | + 'relative-paths': 'false', |
192 | + 'socket-timeout': '', |
193 | 'unzip': 'false', |
194 | 'use-dependency-links': 'true', |
195 | +>>>>>>> MERGE-SOURCE |
196 | }, 'DEFAULT_VALUE') |
197 | |
198 | |
199 | @@ -397,9 +405,16 @@ |
200 | partsdir = os.path.join(options['parts-directory'], 'buildout') |
201 | if not os.path.exists(partsdir): |
202 | os.mkdir(partsdir) |
203 | + # (Honor the relative-paths option.) |
204 | + relative_paths = options.get('relative-paths', 'false') |
205 | + if relative_paths == 'true': |
206 | + relative_paths = options['directory'] |
207 | + else: |
208 | + assert relative_paths == 'false' |
209 | + relative_paths = '' |
210 | zc.buildout.easy_install.sitepackage_safe_scripts( |
211 | options['bin-directory'], ws, options['executable'], partsdir, |
212 | - reqs=['zc.buildout']) |
213 | + reqs=['zc.buildout'], relative_paths=relative_paths) |
214 | |
215 | init = bootstrap |
216 | |
217 | @@ -830,10 +845,15 @@ |
218 | |
219 | options = self['buildout'] |
220 | |
221 | + specs = ['zc.buildout'] |
222 | + if zc.buildout.easy_install.is_distribute: |
223 | + specs.append('distribute') |
224 | + else: |
225 | + specs.append('setuptools') |
226 | ws = zc.buildout.easy_install.install( |
227 | [ |
228 | (spec + ' ' + options.get(spec+'-version', '')).strip() |
229 | - for spec in ('zc.buildout', 'setuptools') |
230 | + for spec in specs |
231 | ], |
232 | options['eggs-directory'], |
233 | links = options.get('find-links', '').split(), |
234 | |
235 | === modified file 'src/zc/buildout/buildout.txt' |
236 | --- src/zc/buildout/buildout.txt 2010-04-29 14:34:36 +0000 |
237 | +++ src/zc/buildout/buildout.txt 2010-04-29 14:34:36 +0000 |
238 | @@ -767,10 +767,17 @@ |
239 | DEFAULT_VALUE |
240 | python= buildout |
241 | DEFAULT_VALUE |
242 | +<<<<<<< TREE |
243 | +======= |
244 | + relative-paths= false |
245 | + DEFAULT_VALUE |
246 | + socket-timeout= |
247 | + DEFAULT_VALUE |
248 | unzip= false |
249 | DEFAULT_VALUE |
250 | use-dependency-links= true |
251 | DEFAULT_VALUE |
252 | +>>>>>>> MERGE-SOURCE |
253 | <BLANKLINE> |
254 | [data-dir] |
255 | path= foo bins |
256 | @@ -2241,8 +2248,13 @@ |
257 | parts-directory = /sample-buildout/parts |
258 | prefer-final = false |
259 | python = buildout |
260 | +<<<<<<< TREE |
261 | +======= |
262 | + relative-paths = false |
263 | + socket-timeout = |
264 | unzip = false |
265 | use-dependency-links = true |
266 | +>>>>>>> MERGE-SOURCE |
267 | verbosity = 20 |
268 | <BLANKLINE> |
269 | |
270 | @@ -2250,37 +2262,6 @@ |
271 | command-line assignments. We've discussed most of these options |
272 | already, but let's review them and touch on some we haven't discussed: |
273 | |
274 | -allow-hosts |
275 | - On some environments the links visited by `zc.buildout` can be forbidden by |
276 | - paranoid firewalls. These URLs might be in the chain of links visited by |
277 | - `zc.buildout` as defined by buildout's `find-links` option, or as defined |
278 | - by various eggs in their `url`, `download_url`, `dependency_links` metadata. |
279 | - |
280 | - The fact that package_index works like a spider and might visit links and |
281 | - go to other locations makes this even harder. |
282 | - |
283 | - The `allow-hosts` option provides a way to prevent this, and |
284 | - works exactly like the one provided in `easy_install`. |
285 | - |
286 | - You can provide a list of allowed host, together with wildcards:: |
287 | - |
288 | - [buildout] |
289 | - ... |
290 | - |
291 | - allow-hosts = |
292 | - *.python.org |
293 | - example.com |
294 | - |
295 | - All URLs that does not match these hosts will not be visited. |
296 | - |
297 | -allow-picked-versions |
298 | - By default, the buildout will choose the best match for a given requirement |
299 | - if the requirement is not specified precisely (for instance, using the |
300 | - "versions" option. This behavior corresponds to the |
301 | - "allow-picked-versions" being set to its default value, "true". If |
302 | - "allow-picked-versions" is "false," instead of picking the best match, |
303 | - buildout will raise an error. This helps enforce repeatability. |
304 | - |
305 | bin-directory |
306 | The directory path where scripts are written. This can be a |
307 | relative path, which is interpreted relative to the directory |
308 | @@ -2305,47 +2286,6 @@ |
309 | The Python executable used to run the buildout. See the python |
310 | option below. |
311 | |
312 | -find-links |
313 | - You can specify more locations to search for distributions using the |
314 | - `find-links` option. All locations specified will be searched for |
315 | - distributions along with the package index as described before. |
316 | - |
317 | - Locations can be urls:: |
318 | - |
319 | - [buildout] |
320 | - ... |
321 | - find-links = http://download.zope.org/distribution/ |
322 | - |
323 | - They can also be directories on disk:: |
324 | - |
325 | - [buildout] |
326 | - ... |
327 | - find-links = /some/path |
328 | - |
329 | - Finally, they can also be direct paths to distributions:: |
330 | - |
331 | - [buildout] |
332 | - ... |
333 | - find-links = /some/path/someegg-1.0.0-py2.3.egg |
334 | - |
335 | - Any number of locations can be specified in the `find-links` option:: |
336 | - |
337 | - [buildout] |
338 | - ... |
339 | - find-links = |
340 | - http://download.zope.org/distribution/ |
341 | - /some/otherpath |
342 | - /some/path/someegg-1.0.0-py2.3.egg |
343 | - |
344 | -install-from-cache |
345 | - A download cache can be used as the basis of application source releases. |
346 | - In an application source release, we want to distribute an application that |
347 | - can be built without making any network accesses. In this case, we |
348 | - distribute a buildout with download cache and tell the buildout to install |
349 | - from the download cache only, without making network accesses. The |
350 | - buildout install-from-cache option can be used to signal that packages |
351 | - should be installed only from the download cache. |
352 | - |
353 | installed |
354 | The file path where information about the results of the previous |
355 | buildout run is written. This can be a relative path, which is |
356 | @@ -2359,51 +2299,12 @@ |
357 | log-level |
358 | The log level before verbosity adjustment |
359 | |
360 | -newest |
361 | - By default buildout and recipes will try to find the newest versions of |
362 | - distributions needed to satisfy requirements. This can be very time |
363 | - consuming, especially when incrementally working on setting up a buildout |
364 | - or working on a recipe. The buildout "newest" option can be used to to |
365 | - suppress this. If the "newest" option is set to false, then new |
366 | - distributions won't be sought if an installed distribution meets |
367 | - requirements. The "newest" option can also be set to false using the -N |
368 | - command-line option. See also the "offline" option. |
369 | - |
370 | -offline |
371 | - The "offline" option goes a bit further than the "newest" option. If the |
372 | - buildout "offline" option is given a value of "true", the buildout and |
373 | - recipes that are aware of the option will avoid doing network access. This |
374 | - is handy when running the buildout when not connected to the internet. It |
375 | - also makes buildouts run much faster. This option is typically set using |
376 | - the buildout -o option. |
377 | - |
378 | parts |
379 | A white space separated list of parts to be installed. |
380 | |
381 | parts-directory |
382 | A working directory that parts can used to store data. |
383 | |
384 | -prefer-final |
385 | - Currently, when searching for new releases, the newest available |
386 | - release is used. This isn't usually ideal, as you may get a |
387 | - development release or alpha releases not ready to be widely used. |
388 | - You can request that final releases be preferred using the prefer |
389 | - final option in the buildout section:: |
390 | - |
391 | - [buildout] |
392 | - ... |
393 | - prefer-final = true |
394 | - |
395 | - When the prefer-final option is set to true, then when searching for |
396 | - new releases, final releases are preferred. If there are final |
397 | - releases that satisfy distribution requirements, then those releases |
398 | - are used even if newer non-final releases are available. The buildout |
399 | - prefer-final option can be used to override this behavior. |
400 | - |
401 | - In buildout version 2, final releases will be preferred by default. |
402 | - You will then need to use a false value for prefer-final to get the |
403 | - newest releases. |
404 | - |
405 | python |
406 | The name of a section containing information about the default |
407 | Python interpreter. Recipes that need a installation |
408 | @@ -2414,6 +2315,13 @@ |
409 | Python executable. By default, the buildout section defines the |
410 | default Python as the Python used to run the buildout. |
411 | |
412 | +relative-paths |
413 | + The paths generated by zc.buildout are absolute by default, and this |
414 | + option is ``false``. However, if you set this value to be ``true``, |
415 | + bin/buildout will be generated with code that makes the paths relative. |
416 | + Some recipes, such as zc.recipe.egg and z3c.recipe.scripts, honor this |
417 | + value as well. |
418 | + |
419 | unzip |
420 | By default, zc.buildout doesn't unzip zip-safe eggs ("unzip = false"). |
421 | This follows the policy followed by setuptools itself. Experience shows |
422 | @@ -2480,8 +2388,56 @@ |
423 | directory if the original buildout had develop eggs for either |
424 | buildout or setuptools.) |
425 | |
426 | -Note that the buildout script was installed but not run. To run |
427 | -the buildout, we'd have to run the installed buildout script. |
428 | +If relative-paths is ``true``, the buildout script uses relative paths. |
429 | + |
430 | + >>> write(sample_bootstrapped, 'setup.cfg', |
431 | + ... ''' |
432 | + ... [buildout] |
433 | + ... relative-paths = true |
434 | + ... parts = |
435 | + ... ''') |
436 | + |
437 | + >>> print system(buildout |
438 | + ... +' -c'+os.path.join(sample_bootstrapped, 'setup.cfg') |
439 | + ... +' bootstrap'), |
440 | + Generated script '/sample-bootstrapped/bin/buildout'. |
441 | + |
442 | + >>> buildout_script = join(sample_bootstrapped, 'bin', 'buildout') |
443 | + >>> import sys |
444 | + >>> if sys.platform.startswith('win'): |
445 | + ... buildout_script += '-script.py' |
446 | + >>> print open(buildout_script).read() # doctest: +ELLIPSIS |
447 | + #!... -S |
448 | + <BLANKLINE> |
449 | + import os |
450 | + <BLANKLINE> |
451 | + join = os.path.join |
452 | + base = os.path.dirname(os.path.abspath(os.path.realpath(__file__))) |
453 | + base = os.path.dirname(base) |
454 | + <BLANKLINE> |
455 | + import sys |
456 | + sys.path[0:0] = [ |
457 | + join(base, 'parts/buildout'), |
458 | + ] |
459 | + <BLANKLINE> |
460 | + <BLANKLINE> |
461 | + import os |
462 | + path = sys.path[0] |
463 | + if os.environ.get('PYTHONPATH'): |
464 | + path = os.pathsep.join([path, os.environ['PYTHONPATH']]) |
465 | + os.environ['PYTHONPATH'] = path |
466 | + import site # imports custom buildout-generated site.py |
467 | + <BLANKLINE> |
468 | + import zc.buildout.buildout |
469 | + <BLANKLINE> |
470 | + if __name__ == '__main__': |
471 | + zc.buildout.buildout.main() |
472 | + <BLANKLINE> |
473 | + |
474 | + |
475 | +Note that, in the above two examples, the buildout script was installed |
476 | +but not run. To run the buildout, we'd have to run the installed |
477 | +buildout script. |
478 | |
479 | If we have an existing buildout that already has a buildout.cfg, we'll |
480 | normally use the bootstrap command instead of init. It will complain |
481 | @@ -2512,6 +2468,48 @@ |
482 | Generated script '/sample-bootstrapped2/bin/buildout'. |
483 | |
484 | |
485 | +Newest and Offline Modes |
486 | +------------------------ |
487 | + |
488 | +By default buildout and recipes will try to find the newest versions |
489 | +of distributions needed to satisfy requirements. This can be very |
490 | +time consuming, especially when incrementally working on setting up a |
491 | +buildout or working on a recipe. The buildout newest option can be |
492 | +used to to suppress this. If the newest option is set to false, then |
493 | +new distributions won't be sought if an installed distribution meets |
494 | +requirements. The newest option can be set to false using the -N |
495 | +command-line option. |
496 | + |
497 | +The offline option goes a bit further. If the buildout offline option |
498 | +is given a value of "true", the buildout and recipes that are aware of |
499 | +the option will avoid doing network access. This is handy when |
500 | +running the buildout when not connected to the internet. It also |
501 | +makes buildouts run much faster. This option is typically set using |
502 | +the buildout -o option. |
503 | + |
504 | +Preferring Final Releases |
505 | +------------------------- |
506 | + |
507 | +Currently, when searching for new releases, the newest available |
508 | +release is used. This isn't usually ideal, as you may get a |
509 | +development release or alpha releases not ready to be widely used. |
510 | +You can request that final releases be preferred using the prefer |
511 | +final option in the buildout section:: |
512 | + |
513 | + [buildout] |
514 | + ... |
515 | + prefer-final = true |
516 | + |
517 | +When the prefer-final option is set to true, then when searching for |
518 | +new releases, final releases are preferred. If there are final |
519 | +releases that satisfy distribution requirements, then those releases |
520 | +are used even if newer non-final releases are available. The buildout |
521 | +prefer-final option can be used to override this behavior. |
522 | + |
523 | +In buildout version 2, final releases will be preferred by default. |
524 | +You will then need to use a false value for prefer-final to get the |
525 | +newest releases. |
526 | + |
527 | Finding distributions |
528 | --------------------- |
529 | |
530 | @@ -2530,7 +2528,49 @@ |
531 | requirements of the buildout will always be used. |
532 | |
533 | You can also specify more locations to search for distributions using |
534 | -the `find-links` option. See its description above. |
535 | +the `find-links` option. All locations specified will be searched for |
536 | +distributions along with the package index as described before. |
537 | + |
538 | +Locations can be urls:: |
539 | + |
540 | + [buildout] |
541 | + ... |
542 | + find-links = http://download.zope.org/distribution/ |
543 | + |
544 | +They can also be directories on disk:: |
545 | + |
546 | + [buildout] |
547 | + ... |
548 | + find-links = /some/path |
549 | + |
550 | +Finally, they can also be direct paths to distributions:: |
551 | + |
552 | + [buildout] |
553 | + ... |
554 | + find-links = /some/path/someegg-1.0.0-py2.3.egg |
555 | + |
556 | +Any number of locations can be specified in the `find-links` option:: |
557 | + |
558 | + [buildout] |
559 | + ... |
560 | + find-links = |
561 | + http://download.zope.org/distribution/ |
562 | + /some/otherpath |
563 | + /some/path/someegg-1.0.0-py2.3.egg |
564 | + |
565 | +Dependency links |
566 | +---------------- |
567 | + |
568 | +By default buildout will obey the setuptools dependency_links metadata |
569 | +when it looks for dependencies. This behavior can be controlled with |
570 | +the use-dependency-links buildout option:: |
571 | + |
572 | + [buildout] |
573 | + ... |
574 | + use-dependency-links = false |
575 | + |
576 | +The option defaults to true. If you set it to false, then dependency |
577 | +links are only looked for in the locations specified by find-links. |
578 | |
579 | Controlling the installation database |
580 | ------------------------------------- |
581 | @@ -2692,11 +2732,37 @@ |
582 | Develop: '/sample-bootstrapped/demo' |
583 | unload ['buildout'] |
584 | |
585 | +Allow hosts |
586 | +----------- |
587 | + |
588 | +On some environments the links visited by `zc.buildout` can be forbidden |
589 | +by paranoiac firewalls. These URL might be on the chain of links |
590 | +visited by `zc.buildout` wheter they are defined in the `find-links` option, |
591 | +wheter they are defined by various eggs in their `url`, `download_url`, |
592 | +`dependency_links` metadata. |
593 | + |
594 | +It is even harder to track that package_index works like a spider and |
595 | +might visit links and go to other location. |
596 | + |
597 | +The `allow-hosts` option provides a way to prevent this, and |
598 | +works exactly like the one provided in `easy_install`. |
599 | + |
600 | +You can provide a list of allowed host, together with wildcards:: |
601 | + |
602 | + [buildout] |
603 | + ... |
604 | + |
605 | + allow-hosts = |
606 | + *.python.org |
607 | + example.com |
608 | + |
609 | +All urls that does not match these hosts will not be visited. |
610 | + |
611 | .. [#future_recipe_methods] In the future, additional methods may be |
612 | added. Older recipes with fewer methods will still be |
613 | supported. |
614 | |
615 | .. [#packaging_info] If we wanted to create a distribution from this |
616 | - package, we would need to specify much more information. See the |
617 | + package, we would need specify much more information. See the |
618 | `setuptools documentation |
619 | <http://peak.telecommunity.com/DevCenter/setuptools>`_. |
620 | |
621 | === modified file 'src/zc/buildout/easy_install.py' |
622 | --- src/zc/buildout/easy_install.py 2010-04-29 14:34:36 +0000 |
623 | +++ src/zc/buildout/easy_install.py 2010-04-29 14:34:36 +0000 |
624 | @@ -51,6 +51,8 @@ |
625 | |
626 | is_win32 = sys.platform == 'win32' |
627 | is_jython = sys.platform.startswith('java') |
628 | +is_distribute = ( |
629 | + pkg_resources.Requirement.parse('setuptools').key=='distribute') |
630 | |
631 | if is_jython: |
632 | import java.lang.System |
633 | @@ -802,6 +804,8 @@ |
634 | |
635 | |
636 | def _constrain(self, requirement): |
637 | + if is_distribute and requirement.key == 'setuptools': |
638 | + requirement = pkg_resources.Requirement.parse('distribute') |
639 | version = self._versions.get(requirement.project_name) |
640 | if version: |
641 | if version not in requirement: |
642 | @@ -853,30 +857,6 @@ |
643 | # Note that we don't use the existing environment, because we want |
644 | # to look for new eggs unless what we have is the best that |
645 | # matches the requirement. |
646 | -<<<<<<< TREE |
647 | - while 1: |
648 | - try: |
649 | - ws.resolve(requirements) |
650 | - except pkg_resources.DistributionNotFound, err: |
651 | - [requirement] = err |
652 | - requirement = self._constrain(requirement) |
653 | - if destination: |
654 | - logger.debug('Getting required %r', str(requirement)) |
655 | - else: |
656 | - logger.debug('Adding required %r', str(requirement)) |
657 | - _log_requirement(ws, requirement) |
658 | - |
659 | - for dist in self._get_dist(requirement, ws, self._always_unzip |
660 | - ): |
661 | - |
662 | - ws.add(dist) |
663 | - self._maybe_add_setuptools(ws, dist) |
664 | - except pkg_resources.VersionConflict, err: |
665 | - raise VersionConflict(err, ws) |
666 | - else: |
667 | - break |
668 | - |
669 | -======= |
670 | env = pkg_resources.Environment(ws.entries) |
671 | while requirements: |
672 | # Process dependencies breadth-first. |
673 | @@ -911,7 +891,6 @@ |
674 | processed[req] = True |
675 | if dist.location in self._site_packages: |
676 | logger.debug('Egg from site-packages: %s', dist) |
677 | ->>>>>>> MERGE-SOURCE |
678 | return ws |
679 | |
680 | def build(self, spec, build_ext): |
681 | @@ -1224,12 +1203,12 @@ |
682 | return generated |
683 | |
684 | _script_initialization_template = ''' |
685 | -import site # imports custom buildout-generated site.py |
686 | import os |
687 | -path = %(site_py_dest)r |
688 | +path = sys.path[0] |
689 | if os.environ.get('PYTHONPATH'): |
690 | path = os.pathsep.join([path, os.environ['PYTHONPATH']]) |
691 | os.environ['PYTHONPATH'] = path |
692 | +import site # imports custom buildout-generated site.py |
693 | %(script_initialization)s''' |
694 | |
695 | # Utilities for the script generation functions. |
696 | @@ -1509,7 +1488,7 @@ |
697 | - executable is a path to the desired Python executable. |
698 | - name is the name of the (pure, not C) Python module. |
699 | """ |
700 | - cmd = [executable, "-c", |
701 | + cmd = [executable, "-Sc", |
702 | "import imp; " |
703 | "fp, path, desc = imp.find_module(%r); " |
704 | "fp.close; " |
705 | @@ -1632,6 +1611,7 @@ |
706 | pkg_resources.working_set.add_entry(sitedir)''' |
707 | |
708 | original_path_snippet = ''' |
709 | + sys.__egginsert = len(buildout_paths) # Support distribute. |
710 | original_paths = [ |
711 | %s |
712 | ] |
713 | |
714 | === modified file 'src/zc/buildout/easy_install.txt' |
715 | --- src/zc/buildout/easy_install.txt 2010-04-29 14:34:36 +0000 |
716 | +++ src/zc/buildout/easy_install.txt 2010-04-29 14:34:36 +0000 |
717 | @@ -222,7 +222,9 @@ |
718 | d other-1.0-py2.4.egg |
719 | |
720 | We can request that eggs be unzipped even if they are zip safe. This |
721 | -can be useful when debugging. |
722 | +can be useful when debugging. (Note that Distribute will unzip eggs by |
723 | +default, so if you are using Distribute, most or all eggs will already be |
724 | +unzipped without this flag.) |
725 | |
726 | >>> rmdir(dest) |
727 | >>> dest = tmpdir('sample-install') |
728 | @@ -1284,6 +1286,7 @@ |
729 | if not sitedircase in known_paths and os.path.exists(sitedir): |
730 | sys.path.append(sitedir) |
731 | known_paths.add(sitedircase) |
732 | + sys.__egginsert = len(buildout_paths) # Support distribute. |
733 | original_paths = [ |
734 | ... |
735 | ] |
736 | @@ -1360,6 +1363,7 @@ |
737 | sys.path.append(sitedir) |
738 | known_paths.add(sitedircase) |
739 | pkg_resources.working_set.add_entry(sitedir) |
740 | + sys.__egginsert = len(buildout_paths) # Support distribute. |
741 | original_paths = [ |
742 | ... |
743 | ] |
744 | @@ -1423,6 +1427,7 @@ |
745 | sys.path.append(sitedir) |
746 | known_paths.add(sitedircase) |
747 | pkg_resources.working_set.add_entry(sitedir) |
748 | + sys.__egginsert = len(buildout_paths) # Support distribute. |
749 | original_paths = [ |
750 | ... |
751 | ] |
752 | @@ -1498,12 +1503,12 @@ |
753 | ] |
754 | <BLANKLINE> |
755 | <BLANKLINE> |
756 | - import site # imports custom buildout-generated site.py |
757 | import os |
758 | - path = '/interpreter/parts/interpreter' |
759 | + path = sys.path[0] |
760 | if os.environ.get('PYTHONPATH'): |
761 | path = os.pathsep.join([path, os.environ['PYTHONPATH']]) |
762 | os.environ['PYTHONPATH'] = path |
763 | + import site # imports custom buildout-generated site.py |
764 | <BLANKLINE> |
765 | import eggrecipedemo |
766 | <BLANKLINE> |
767 | @@ -1542,12 +1547,12 @@ |
768 | '/interpreter/parts/interpreter', |
769 | ] |
770 | <BLANKLINE> |
771 | - import site # imports custom buildout-generated site.py |
772 | import os |
773 | - path = '/interpreter/parts/interpreter' |
774 | + path = sys.path[0] |
775 | if os.environ.get('PYTHONPATH'): |
776 | path = os.pathsep.join([path, os.environ['PYTHONPATH']]) |
777 | os.environ['PYTHONPATH'] = path |
778 | + import site # imports custom buildout-generated site.py |
779 | import os |
780 | os.chdir("foo") |
781 | <BLANKLINE> |
782 | |
783 | === modified file 'src/zc/buildout/tests.py' |
784 | --- src/zc/buildout/tests.py 2010-04-29 14:34:36 +0000 |
785 | +++ src/zc/buildout/tests.py 2010-04-29 14:34:36 +0000 |
786 | @@ -864,7 +864,8 @@ |
787 | - z3c.recipe.scripts.egg-link |
788 | - zc.recipe.egg.egg-link |
789 | |
790 | - >>> ls('eggs') # doctest: +ELLIPSIS |
791 | + >>> print 'START ->'; ls('eggs') # doctest: +ELLIPSIS |
792 | + START... |
793 | - foox-0.0.0-py2.4.egg |
794 | ... |
795 | |
796 | @@ -3103,6 +3104,13 @@ |
797 | >>> write('foo.py', '') |
798 | >>> _ = system(buildout+' setup . sdist') |
799 | |
800 | + >>> if zc.buildout.easy_install.is_distribute: |
801 | + ... distribute_version = 'distribute = %s' % ( |
802 | + ... pkg_resources.working_set.find( |
803 | + ... pkg_resources.Requirement.parse('distribute')).version,) |
804 | + ... else: |
805 | + ... distribute_version = '' |
806 | + ... |
807 | >>> write('buildout.cfg', |
808 | ... ''' |
809 | ... [buildout] |
810 | @@ -3114,12 +3122,14 @@ |
811 | ... [versions] |
812 | ... setuptools = %s |
813 | ... foo = 1 |
814 | + ... %s |
815 | ... |
816 | ... [foo] |
817 | ... recipe = zc.recipe.egg |
818 | ... eggs = foo |
819 | - ... ''' % pkg_resources.working_set.find( |
820 | - ... pkg_resources.Requirement.parse('setuptools')).version) |
821 | + ... ''' % (pkg_resources.working_set.find( |
822 | + ... pkg_resources.Requirement.parse('setuptools')).version, |
823 | + ... distribute_version)) |
824 | |
825 | >>> print system(buildout), |
826 | Installing foo. |
827 | @@ -3623,11 +3633,13 @@ |
828 | |
829 | # now let's make the new releases |
830 | makeNewRelease('zc.buildout', ws, new_releases) |
831 | - makeNewRelease('setuptools', ws, new_releases) |
832 | - |
833 | os.mkdir(os.path.join(new_releases, 'zc.buildout')) |
834 | - os.mkdir(os.path.join(new_releases, 'setuptools')) |
835 | - |
836 | + if zc.buildout.easy_install.is_distribute: |
837 | + makeNewRelease('distribute', ws, new_releases) |
838 | + os.mkdir(os.path.join(new_releases, 'distribute')) |
839 | + else: |
840 | + makeNewRelease('setuptools', ws, new_releases) |
841 | + os.mkdir(os.path.join(new_releases, 'setuptools')) |
842 | |
843 | |
844 | normalize_bang = ( |
845 | @@ -3651,7 +3663,8 @@ |
846 | '__buildout_signature__ = recipes-SSSSSSSSSSS'), |
847 | (re.compile('executable = [\S ]+python\S*', re.I), |
848 | 'executable = python'), |
849 | - (re.compile('[-d] setuptools-\S+[.]egg'), 'setuptools.egg'), |
850 | + (re.compile('[-d] (setuptools|distribute)-\S+[.]egg'), |
851 | + 'setuptools.egg'), |
852 | (re.compile('zc.buildout(-\S+)?[.]egg(-link)?'), |
853 | 'zc.buildout.egg'), |
854 | (re.compile('creating \S*setup.cfg'), 'creating setup.cfg'), |
855 | @@ -3666,6 +3679,7 @@ |
856 | r'when that file already exists: '), |
857 | '[Errno 17] File exists: ' |
858 | ), |
859 | + (re.compile('distribute'), 'setuptools'), |
860 | ]) |
861 | ), |
862 | doctest.DocFileSuite( |
863 | @@ -3695,9 +3709,18 @@ |
864 | (re.compile('(zc.buildout|setuptools)-\d+[.]\d+\S*' |
865 | '-py\d.\d.egg'), |
866 | '\\1.egg'), |
867 | + (re.compile('distribute-\d+[.]\d+\S*' |
868 | + '-py\d.\d.egg'), |
869 | + 'setuptools.egg'), |
870 | (re.compile('(zc.buildout|setuptools)( version)? \d+[.]\d+\S*'), |
871 | '\\1 V.V'), |
872 | - (re.compile('[-d] setuptools'), '- setuptools'), |
873 | + (re.compile('distribute( version)? \d+[.]\d+\S*'), |
874 | + 'setuptools V.V'), |
875 | + (re.compile('[-d] (setuptools|distribute)'), '- setuptools'), |
876 | + (re.compile('distribute'), 'setuptools'), |
877 | + (re.compile("\nUnused options for buildout: " |
878 | + "'(distribute|setuptools)\-version'\."), |
879 | + '') |
880 | ]) |
881 | ), |
882 | |
883 | @@ -3713,17 +3736,17 @@ |
884 | zc.buildout.testing.normalize_egg_py, |
885 | normalize_bang, |
886 | (re.compile('extdemo[.]pyd'), 'extdemo.so'), |
887 | - (re.compile('[-d] setuptools-\S+[.]egg'), 'setuptools.egg'), |
888 | + (re.compile('[-d] (setuptools|distribute)-\S+[.]egg'), |
889 | + 'setuptools.egg'), |
890 | (re.compile(r'\\[\\]?'), '/'), |
891 | -<<<<<<< TREE |
892 | - (re.compile(r'\#!\S+\bpython\S*'), '#!/usr/bin/python'), |
893 | -======= |
894 | (re.compile(r'\#!\S+\bpython\S*'), '#!/usr/bin/python'), |
895 | # Normalize generate_script's Windows interpreter to UNIX: |
896 | (re.compile(r'\nimport subprocess\n'), '\n'), |
897 | (re.compile('subprocess\\.call\\(argv, env=environ\\)'), |
898 | 'os.execve(sys.executable, argv, environ)'), |
899 | ->>>>>>> MERGE-SOURCE |
900 | + (re.compile('distribute'), 'setuptools'), |
901 | + # Distribute unzips eggs by default. |
902 | + (re.compile('\- demoneeded'), 'd demoneeded'), |
903 | ]+(sys.version_info < (2, 5) and [ |
904 | (re.compile('.*No module named runpy.*', re.S), ''), |
905 | (re.compile('.*usage: pdb.py scriptfile .*', re.S), ''), |
906 | @@ -3755,7 +3778,7 @@ |
907 | zc.buildout.testing.normalize_egg_py, |
908 | (re.compile("buildout: Running \S*setup.py"), |
909 | 'buildout: Running setup.py'), |
910 | - (re.compile('setuptools-\S+-'), |
911 | + (re.compile('(setuptools|distribute)-\S+-'), |
912 | 'setuptools.egg'), |
913 | (re.compile('zc.buildout-\S+-'), |
914 | 'zc.buildout.egg'), |
915 | @@ -3763,7 +3786,7 @@ |
916 | 'File "one.py"'), |
917 | (re.compile(r'We have a develop egg: (\S+) (\S+)'), |
918 | r'We have a develop egg: \1 V'), |
919 | - (re.compile('Picked: setuptools = \S+'), |
920 | + (re.compile('Picked: (setuptools|distribute) = \S+'), |
921 | 'Picked: setuptools = V'), |
922 | (re.compile(r'\\[\\]?'), '/'), |
923 | (re.compile( |
924 | @@ -3774,6 +3797,9 @@ |
925 | # for bug_92891_bootstrap_crashes_with_egg_recipe_in_buildout_section |
926 | (re.compile(r"Unused options for buildout: 'eggs' 'scripts'\."), |
927 | "Unused options for buildout: 'scripts' 'eggs'."), |
928 | + (re.compile('distribute'), 'setuptools'), |
929 | + # Distribute unzips eggs by default. |
930 | + (re.compile('\- demoneeded'), 'd demoneeded'), |
931 | ]), |
932 | ), |
933 | zc.buildout.testselectingpython.test_suite(), |
934 | |
935 | === modified file 'src/zc/buildout/update.txt' |
936 | --- src/zc/buildout/update.txt 2010-04-29 14:34:36 +0000 |
937 | +++ src/zc/buildout/update.txt 2010-04-29 14:34:36 +0000 |
938 | @@ -100,8 +100,8 @@ |
939 | ... |
940 | |
941 | Now, let's recreate the sample buildout. If we specify constraints on |
942 | -the versions of zc.buildout and setuptools to use, running the |
943 | -buildout will install earlier versions of these packages: |
944 | +the versions of zc.buildout and setuptools (or distribute) to use, |
945 | +running the buildout will install earlier versions of these packages: |
946 | |
947 | >>> write(sample_buildout, 'buildout.cfg', |
948 | ... """ |
949 | @@ -112,6 +112,7 @@ |
950 | ... develop = showversions |
951 | ... zc.buildout-version = < 99 |
952 | ... setuptools-version = < 99 |
953 | + ... distribute-version = < 99 |
954 | ... |
955 | ... [show-versions] |
956 | ... recipe = showversions |
957 | |
958 | === modified file 'z3c.recipe.scripts_/src/z3c/recipe/scripts/tests.py' |
959 | --- z3c.recipe.scripts_/src/z3c/recipe/scripts/tests.py 2010-04-29 14:34:36 +0000 |
960 | +++ z3c.recipe.scripts_/src/z3c/recipe/scripts/tests.py 2010-04-29 14:34:36 +0000 |
961 | @@ -423,8 +423,8 @@ |
962 | zc.buildout.tests.normalize_bang, |
963 | (re.compile(r'zc.buildout(-\S+)?[.]egg(-link)?'), |
964 | 'zc.buildout.egg'), |
965 | - (re.compile('[-d] setuptools-[^-]+-'), 'setuptools-X-'), |
966 | - (re.compile(r'setuptools-[\w.]+-py'), 'setuptools-X-py'), |
967 | + (re.compile('[-d] (setuptools|distribute)-[^-]+-'), 'setuptools-X-'), |
968 | + (re.compile(r'(setuptools|distribute)-[\w.]+-py'), 'setuptools-X-py'), |
969 | (re.compile(r'eggs\\\\demo'), 'eggs/demo'), |
970 | (re.compile(r'[a-zA-Z]:\\\\foo\\\\bar'), '/foo/bar'), |
971 | (re.compile(r'\#!\S+\bpython\S*'), '#!/usr/bin/python'), |
972 | @@ -432,6 +432,7 @@ |
973 | (re.compile(r'\nimport subprocess\n'), '\n'), |
974 | (re.compile('subprocess\\.call\\(argv, env=environ\\)'), |
975 | 'os.execve(sys.executable, argv, environ)'), |
976 | + (re.compile('distribute'), 'setuptools'), |
977 | ]) |
978 | ), |
979 | doctest.DocTestSuite( |
980 | |
981 | === modified file 'zc.recipe.egg_/src/zc/recipe/egg/tests.py' |
982 | --- zc.recipe.egg_/src/zc/recipe/egg/tests.py 2010-04-29 14:34:36 +0000 |
983 | +++ zc.recipe.egg_/src/zc/recipe/egg/tests.py 2010-04-29 14:34:36 +0000 |
984 | @@ -50,9 +50,12 @@ |
985 | zc.buildout.tests.normalize_bang, |
986 | (re.compile('zc.buildout(-\S+)?[.]egg(-link)?'), |
987 | 'zc.buildout.egg'), |
988 | - (re.compile('[-d] setuptools-[^-]+-'), 'setuptools-X-'), |
989 | + (re.compile('[-d] (setuptools|distribute)-[^-]+-'), |
990 | + 'setuptools-X-'), |
991 | (re.compile(r'eggs\\\\demo'), 'eggs/demo'), |
992 | (re.compile(r'[a-zA-Z]:\\\\foo\\\\bar'), '/foo/bar'), |
993 | + # Distribute unzips eggs by default. |
994 | + (re.compile('\- demoneeded'), 'd demoneeded'), |
995 | ]) |
996 | ), |
997 | doctest.DocFileSuite( |
998 | @@ -64,7 +67,7 @@ |
999 | (re.compile('__buildout_signature__ = ' |
1000 | 'sample-\S+\s+' |
1001 | 'zc.recipe.egg-\S+\s+' |
1002 | - 'setuptools-\S+\s+' |
1003 | + '(setuptools|distribute)-\S+\s+' |
1004 | 'zc.buildout-\S+\s*' |
1005 | ), |
1006 | '__buildout_signature__ = sample- zc.recipe.egg-\n'), |
1007 | @@ -104,14 +107,17 @@ |
1008 | zc.buildout.testing.normalize_path, |
1009 | zc.buildout.testing.normalize_endings, |
1010 | zc.buildout.testing.normalize_script, |
1011 | - (re.compile('Got setuptools \S+'), 'Got setuptools V'), |
1012 | - (re.compile('([d-] )?setuptools-\S+-py'), |
1013 | + (re.compile('Got (setuptools|distribute) \S+'), |
1014 | + 'Got setuptools V'), |
1015 | + (re.compile('([d-] )?(setuptools|distribute)-\S+-py'), |
1016 | 'setuptools-V-py'), |
1017 | (re.compile('-py2[.][0-35-9][.]'), 'py2.5.'), |
1018 | (re.compile('zc.buildout-\S+[.]egg'), |
1019 | 'zc.buildout.egg'), |
1020 | (re.compile('zc.buildout[.]egg-link'), |
1021 | 'zc.buildout.egg'), |
1022 | + # Distribute unzips eggs by default. |
1023 | + (re.compile('\- demoneeded'), 'd demoneeded'), |
1024 | ]), |
1025 | ), |
1026 | ) |
My only question is on that change:
We have the best distribution that satisfies 'setuptools'. eggs-directory = /sample- buildout/ develop- eggs buildout/ eggs bin/python2. 3
> - Picked: setuptools = V.V
> + Picked: setuptools = 0.6
> <BLANKLINE>
> Configuration data:
> [buildout]
> @@ -2277,7 +2274,7 @@
> develop-
> directory = /sample-buildout
> eggs-directory = /sample-
> - executable = python
> + executable = /usr/local/
> find-links =
> install-from-cache = false
Is this really correct?