Merge lp:~brian.curtin/ubuntuone-windows-installer/buildout-env into lp:ubuntuone-windows-installer

Proposed by Brian Curtin
Status: Merged
Approved by: Alejandro J. Cura
Approved revision: 117
Merged at revision: 112
Proposed branch: lp:~brian.curtin/ubuntuone-windows-installer/buildout-env
Merge into: lp:ubuntuone-windows-installer
Diff against target: 564 lines (+534/-0)
6 files modified
scripts/devsetup/README.txt (+39/-0)
scripts/devsetup/bootstrap.py (+262/-0)
scripts/devsetup/buildout.cfg (+98/-0)
scripts/devsetup/env.bat (+79/-0)
scripts/devsetup/get_protoc.py (+33/-0)
scripts/devsetup/updateall.bat (+23/-0)
To merge this branch: bzr merge lp:~brian.curtin/ubuntuone-windows-installer/buildout-env
Reviewer Review Type Date Requested Status
Alejandro J. Cura (community) Approve
Roberto Alsina (community) Approve
Review via email: mp+102386@code.launchpad.net

Commit message

- Implement a buildout to create a simple, reproducible development environment.

Description of the change

Implement a buildout providing all of our necessary dependencies as well as support for running Python within that environment.

This change provides the following:
* bootstrap.py
 The buildout bootstrap script, to be executed first in order to bootstrap the environment. The script should be executed as "C:\Python27\python.exe bootstrap.py --distribute" to kick the setup off.
* buildout.cfg
 Version-specific configuration of all dependencies needed to build, run, and test all U1 projects. This includes a common "development" set of cross-platform dependencies, and a "windows" set which inherits from "development" and includes Windows-only projects. This script is picked up by the bin\buildout.exe binary created by the bootstrap. In order to setup a Windows environment, run "bin\buidout.exe install windows". The "install sources" will create branches of all of our projects in the "parts" folder.

* env.bat
 A batch script to be run which does some environment setup to place the buildout-specific Python in the path for the current command prompt session and place any auxiliary scripts in the proper places, e.g., u1trial.

* get_protoc.py
 A Python script to fetch the proper version of Google Protobuf to place the protoc.exe compiler in the Path. This is executed by the env.bat script.

To post a comment you must log in.
116. By Brian Curtin

direction updates

117. By Brian Curtin

Move standalone script code into a function

Revision history for this message
Roberto Alsina (ralsina) wrote :

I wuld move dirspec into sources but other than that, excellent branch!

review: Approve
Revision history for this message
Alejandro J. Cura (alecu) wrote :

I seem to have completely missed the "--distribute" flag when running bootstrap.py for the first time, so probably something broke on my end because of that. Sorry!

I was able to run all tests in the buildout created by this branch, but for that I had to remove the devtools installed by these scripts and force the use of devtools from trunk, otherwise I would get an error caused by a missing new testing baseclass that was recently added by mandel to devtools.

I think that deserves a different bug, so I'm approving this branch.

Great work!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added directory 'scripts/devsetup'
2=== added file 'scripts/devsetup/README.txt'
3--- scripts/devsetup/README.txt 1970-01-01 00:00:00 +0000
4+++ scripts/devsetup/README.txt 2012-04-18 14:27:24 +0000
5@@ -0,0 +1,39 @@
6+Ubuntu One buildout
7+===================
8+
9+This is a buildout for Ubuntu One. It aims to provide the following
10+when developing on windows (or in other Linuxes other than Ubuntu?):
11+
12+* A controlled set of dependencies for all our code
13+* A mechanism to create a repeatable build for our windows releases
14+* A simpler, more automated windows developer setup
15+
16+How Do I Use It
17+===============
18+
19+1. Get python 2.7 32 bits, get PyQt, get pywin32.
20+2. Setup bazaar and your keys
21+3. python bootstrap.py
22+
23+If you are on Windows, run "bin\buildout install windows"
24+On other OSes, run "bin\buildout install development"
25+
26+At this point you should have a bin\python.exe which is a custom interpreter
27+that can access all the required dependencies. If it fails installing
28+logilab-something: try again.
29+
30+You should also have all the required scripts, like pep8, coverage and pylint,
31+in the bin folder.
32+
33+5. bin\buildout install sources
34+
35+This will do a clean branch of all our relevant source code into the parts
36+folder, so you can use it. As long as you use the custom python interpreter,
37+everything should just work as you are used to. If it doesn't let me know
38+at roberto.alsina@canonical.com
39+
40+6. On Windows, running "env.bat" will put the "bin\python.exe" which
41+buildout created into the Path. It will also gather necessary scripts
42+from the buildout and place them in the bin folder as needed. Now your
43+tests should be able to use this Python in this buildout and work without
44+needed anything installed into your system's Python installation.
45
46=== added file 'scripts/devsetup/bootstrap.py'
47--- scripts/devsetup/bootstrap.py 1970-01-01 00:00:00 +0000
48+++ scripts/devsetup/bootstrap.py 2012-04-18 14:27:24 +0000
49@@ -0,0 +1,262 @@
50+##############################################################################
51+#
52+# Copyright (c) 2006 Zope Foundation and Contributors.
53+# All Rights Reserved.
54+#
55+# This software is subject to the provisions of the Zope Public License,
56+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
57+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
58+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
59+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
60+# FOR A PARTICULAR PURPOSE.
61+#
62+##############################################################################
63+"""Bootstrap a buildout-based project
64+
65+Simply run this script in a directory containing a buildout.cfg.
66+The script accepts buildout command-line options, so you can
67+use the -c option to specify an alternate configuration file.
68+"""
69+
70+import os, shutil, sys, tempfile, urllib, urllib2, subprocess
71+from optparse import OptionParser
72+
73+if sys.platform == 'win32':
74+ def quote(c):
75+ if ' ' in c:
76+ return '"%s"' % c # work around spawn lamosity on windows
77+ else:
78+ return c
79+else:
80+ quote = str
81+
82+# See zc.buildout.easy_install._has_broken_dash_S for motivation and comments.
83+stdout, stderr = subprocess.Popen(
84+ [sys.executable, '-Sc',
85+ 'try:\n'
86+ ' import ConfigParser\n'
87+ 'except ImportError:\n'
88+ ' print 1\n'
89+ 'else:\n'
90+ ' print 0\n'],
91+ stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
92+has_broken_dash_S = bool(int(stdout.strip()))
93+
94+# In order to be more robust in the face of system Pythons, we want to
95+# run without site-packages loaded. This is somewhat tricky, in
96+# particular because Python 2.6's distutils imports site, so starting
97+# with the -S flag is not sufficient. However, we'll start with that:
98+if not has_broken_dash_S and 'site' in sys.modules:
99+ # We will restart with python -S.
100+ args = sys.argv[:]
101+ args[0:0] = [sys.executable, '-S']
102+ args = map(quote, args)
103+ os.execv(sys.executable, args)
104+# Now we are running with -S. We'll get the clean sys.path, import site
105+# because distutils will do it later, and then reset the path and clean
106+# out any namespace packages from site-packages that might have been
107+# loaded by .pth files.
108+clean_path = sys.path[:]
109+import site # imported because of its side effects
110+sys.path[:] = clean_path
111+for k, v in sys.modules.items():
112+ if k in ('setuptools', 'pkg_resources') or (
113+ hasattr(v, '__path__') and
114+ len(v.__path__) == 1 and
115+ not os.path.exists(os.path.join(v.__path__[0], '__init__.py'))):
116+ # This is a namespace package. Remove it.
117+ sys.modules.pop(k)
118+
119+is_jython = sys.platform.startswith('java')
120+
121+setuptools_source = 'http://peak.telecommunity.com/dist/ez_setup.py'
122+distribute_source = 'http://python-distribute.org/distribute_setup.py'
123+
124+
125+# parsing arguments
126+def normalize_to_url(option, opt_str, value, parser):
127+ if value:
128+ if '://' not in value: # It doesn't smell like a URL.
129+ value = 'file://%s' % (
130+ urllib.pathname2url(
131+ os.path.abspath(os.path.expanduser(value))),)
132+ if opt_str == '--download-base' and not value.endswith('/'):
133+ # Download base needs a trailing slash to make the world happy.
134+ value += '/'
135+ else:
136+ value = None
137+ name = opt_str[2:].replace('-', '_')
138+ setattr(parser.values, name, value)
139+
140+usage = '''\
141+[DESIRED PYTHON FOR BUILDOUT] bootstrap.py [options]
142+
143+Bootstraps a buildout-based project.
144+
145+Simply run this script in a directory containing a buildout.cfg, using the
146+Python that you want bin/buildout to use.
147+
148+Note that by using --setup-source and --download-base to point to
149+local resources, you can keep this script from going over the network.
150+'''
151+
152+parser = OptionParser(usage=usage)
153+parser.add_option("-v", "--version", dest="version",
154+ help="use a specific zc.buildout version")
155+parser.add_option("-d", "--distribute",
156+ action="store_true", dest="use_distribute", default=False,
157+ help="Use Distribute rather than Setuptools.")
158+parser.add_option("--setup-source", action="callback", dest="setup_source",
159+ callback=normalize_to_url, nargs=1, type="string",
160+ help=("Specify a URL or file location for the setup file. "
161+ "If you use Setuptools, this will default to " +
162+ setuptools_source + "; if you use Distribute, this "
163+ "will default to " + distribute_source + "."))
164+parser.add_option("--download-base", action="callback", dest="download_base",
165+ callback=normalize_to_url, nargs=1, type="string",
166+ help=("Specify a URL or directory for downloading "
167+ "zc.buildout and either Setuptools or Distribute. "
168+ "Defaults to PyPI."))
169+parser.add_option("--eggs",
170+ help=("Specify a directory for storing eggs. Defaults to "
171+ "a temporary directory that is deleted when the "
172+ "bootstrap script completes."))
173+parser.add_option("-t", "--accept-buildout-test-releases",
174+ dest='accept_buildout_test_releases',
175+ action="store_true", default=False,
176+ help=("Normally, if you do not specify a --version, the "
177+ "bootstrap script and buildout gets the newest "
178+ "*final* versions of zc.buildout and its recipes and "
179+ "extensions for you. If you use this flag, "
180+ "bootstrap and buildout will get the newest releases "
181+ "even if they are alphas or betas."))
182+parser.add_option("-c", None, action="store", dest="config_file",
183+ help=("Specify the path to the buildout configuration "
184+ "file to be used."))
185+
186+options, args = parser.parse_args()
187+
188+# if -c was provided, we push it back into args for buildout's main function
189+if options.config_file is not None:
190+ args += ['-c', options.config_file]
191+
192+if options.eggs:
193+ eggs_dir = os.path.abspath(os.path.expanduser(options.eggs))
194+else:
195+ eggs_dir = tempfile.mkdtemp()
196+
197+if options.setup_source is None:
198+ if options.use_distribute:
199+ options.setup_source = distribute_source
200+ else:
201+ options.setup_source = setuptools_source
202+
203+if options.accept_buildout_test_releases:
204+ args.append('buildout:accept-buildout-test-releases=true')
205+args.append('bootstrap')
206+
207+try:
208+ import pkg_resources
209+ import setuptools # A flag. Sometimes pkg_resources is installed alone.
210+ if not hasattr(pkg_resources, '_distribute'):
211+ raise ImportError
212+except ImportError:
213+ ez_code = urllib2.urlopen(
214+ options.setup_source).read().replace('\r\n', '\n')
215+ ez = {}
216+ exec ez_code in ez
217+ setup_args = dict(to_dir=eggs_dir, download_delay=0)
218+ if options.download_base:
219+ setup_args['download_base'] = options.download_base
220+ if options.use_distribute:
221+ setup_args['no_fake'] = True
222+ ez['use_setuptools'](**setup_args)
223+ if 'pkg_resources' in sys.modules:
224+ reload(sys.modules['pkg_resources'])
225+ import pkg_resources
226+ # This does not (always?) update the default working set. We will
227+ # do it.
228+ for path in sys.path:
229+ if path not in pkg_resources.working_set.entries:
230+ pkg_resources.working_set.add_entry(path)
231+
232+cmd = [quote(sys.executable),
233+ '-c',
234+ quote('from setuptools.command.easy_install import main; main()'),
235+ '-mqNxd',
236+ quote(eggs_dir)]
237+
238+if not has_broken_dash_S:
239+ cmd.insert(1, '-S')
240+
241+find_links = options.download_base
242+if not find_links:
243+ find_links = os.environ.get('bootstrap-testing-find-links')
244+if find_links:
245+ cmd.extend(['-f', quote(find_links)])
246+
247+if options.use_distribute:
248+ setup_requirement = 'distribute'
249+else:
250+ setup_requirement = 'setuptools'
251+ws = pkg_resources.working_set
252+setup_requirement_path = ws.find(
253+ pkg_resources.Requirement.parse(setup_requirement)).location
254+env = dict(
255+ os.environ,
256+ PYTHONPATH=setup_requirement_path)
257+
258+requirement = 'zc.buildout'
259+version = options.version
260+if version is None and not options.accept_buildout_test_releases:
261+ # Figure out the most recent final version of zc.buildout.
262+ import setuptools.package_index
263+ _final_parts = '*final-', '*final'
264+
265+ def _final_version(parsed_version):
266+ for part in parsed_version:
267+ if (part[:1] == '*') and (part not in _final_parts):
268+ return False
269+ return True
270+ index = setuptools.package_index.PackageIndex(
271+ search_path=[setup_requirement_path])
272+ if find_links:
273+ index.add_find_links((find_links,))
274+ req = pkg_resources.Requirement.parse(requirement)
275+ if index.obtain(req) is not None:
276+ best = []
277+ bestv = None
278+ for dist in index[req.project_name]:
279+ distv = dist.parsed_version
280+ if _final_version(distv):
281+ if bestv is None or distv > bestv:
282+ best = [dist]
283+ bestv = distv
284+ elif distv == bestv:
285+ best.append(dist)
286+ if best:
287+ best.sort()
288+ version = best[-1].version
289+if version:
290+ requirement = '=='.join((requirement, version))
291+cmd.append(requirement)
292+
293+if is_jython:
294+ import subprocess
295+ exitcode = subprocess.Popen(cmd, env=env).wait()
296+else: # Windows prefers this, apparently; otherwise we would prefer subprocess
297+ exitcode = os.spawnle(*([os.P_WAIT, sys.executable] + cmd + [env]))
298+if exitcode != 0:
299+ sys.stdout.flush()
300+ sys.stderr.flush()
301+ print ("An error occurred when trying to install zc.buildout. "
302+ "Look above this message for any errors that "
303+ "were output by easy_install.")
304+ sys.exit(exitcode)
305+
306+ws.add_entry(eggs_dir)
307+ws.require(requirement)
308+import zc.buildout.buildout
309+zc.buildout.buildout.main(args)
310+if not options.eggs: # clean up temporary egg directory
311+ shutil.rmtree(eggs_dir)
312
313=== added file 'scripts/devsetup/buildout.cfg'
314--- scripts/devsetup/buildout.cfg 1970-01-01 00:00:00 +0000
315+++ scripts/devsetup/buildout.cfg 2012-04-18 14:27:24 +0000
316@@ -0,0 +1,98 @@
317+[buildout]
318+parts =
319+ development
320+ windows
321+
322+find-links =
323+ https://github.com/ghtdak/qtreactor/tarball/master#egg=qt4reactor
324+ http://launchpad.net/python-distutils-extra/trunk/2.31/+download/python-distutils-extra-2.31.tar.gz#egg=python-distutils-extra
325+# Mandel's patched keyring, already built
326+ http://u1.to/ralsina/L/keyring-0.7-py2.7.egg#egg=keyring
327+# Pycrypto already built using python -c "import setuptools; execfile('setup.py')" bdist_egg
328+ http://u1.to/ralsina/P/pycrypto-2.4.1-py2.7-win32.egg#egg=pycrypto
329+# Py2exe already build using python -c "import setuptools; execfile('setup.py')" bdist_egg
330+ http://u1.to/ralsina/x/py2exe-0.6.9-py2.7-win32.egg#egg=py2exe
331+# Protobuf's upstream zip file doesn't work via easy_install so using an egg.
332+ http://u1.to/ralsina/G/protobuf-2.4.1-py2.7.egg#egg=protobuf
333+# Comtypes has a bug in setup.py with Python 2.7, so this should be changed eventually
334+# http://sourceforge.net/tracker/index.php?func=detail&aid=3036368&group_id=115265&atid=692940
335+ http://u1.to/ralsina/w/comtypes-0.6.2.zip#egg=comtypes
336+ http://launchpad.net/configglue/trunk/1.0/+download/configglue-1.0.tar.gz#egg=configglue
337+ http://launchpad.net/ubuntuone-dev-tools/stable-3-0/3.0.0/+download/ubuntuone-dev-tools-3.0.0.tar.gz#egg=ubuntuone-dev-tools
338+ http://launchpad.net/dirspec/stable-3-0/3.0.0/+download/dirspec-3.0.0.tar.gz#egg=dirspec
339+ http://u1.to/ralsina/7/Twisted-11.1.0-py2.7-win32.egg#egg=twisted
340+unzip = true
341+newest = false
342+versions = versions
343+
344+[windows]
345+recipe = zc.recipe.egg:scripts
346+versions = versions
347+eggs =
348+ py2exe
349+ comtypes
350+# Include the common [development] eggs
351+ ${development:eggs}
352+interpreter = python
353+
354+[development]
355+recipe = zc.recipe.egg:scripts
356+eggs =
357+ twisted
358+ qt4reactor
359+ python-distutils-extra
360+ keyring
361+ pycrypto
362+ lazr.restfulclient
363+ pyOpenSSL
364+ pil
365+ httplib2
366+ protobuf
367+ configglue
368+ logilab-astng
369+ logilab-common
370+ mocker
371+ coverage
372+ pylint
373+ pyflakes
374+ pep8
375+ ubuntuone-dev-tools
376+ dirspec
377+ oauth
378+ simplejson
379+versions = versions
380+interpreter = python
381+
382+[versions]
383+twisted = 11.1.0
384+# qt4reactor does not go in here. Specifying the github link covers it.
385+python-distutils-extra = 2.31
386+keyring = 0.7
387+pycrypto = 2.4.1
388+lazr.restfulclient = 0.12.0
389+pyOpenSSL = 0.13
390+pil = 1.1.7
391+httplib2 = 0.7.2
392+protobuf = 2.4.1
393+configglue = 1.0.0
394+logilab-astng = 0.23.1
395+logilab-common = 0.57.1
396+mocker = 1.1
397+coverage = 3.5.1
398+pylint = 0.25.1
399+pyflakes = 0.5.0
400+pep8 = 0.6.1
401+ubuntuone-dev-tools = 3.0.0
402+dirspec = 3.0.0
403+oauth = 1.0.1
404+py2exe = 0.6.9
405+comtypes = 0.6.2
406+
407+[sources]
408+recipe = bazaarrecipeinfrae
409+urls =
410+ lp:ubuntuone-client ubuntuone-client
411+ lp:ubuntu-sso-client ubuntu-sso-client
412+ lp:ubuntuone-storage-protocol ubuntuone-storage-protocol
413+ lp:ubuntuone-control-panel ubuntuone-control-panel
414+ lp:ubuntuone-windows-installer ubuntuone-windows-installer
415
416=== added file 'scripts/devsetup/env.bat'
417--- scripts/devsetup/env.bat 1970-01-01 00:00:00 +0000
418+++ scripts/devsetup/env.bat 2012-04-18 14:27:24 +0000
419@@ -0,0 +1,79 @@
420+@echo off
421+
422+:: for jenkins
423+cd %~dp0
424+
425+SET PYTHONPATHTOKENS=3
426+VER | FIND "XP" > nul
427+IF %ERRORLEVEL% == 0 SET PYTHONPATHTOKENS=4
428+
429+echo Adding bin folder to Path
430+set Path=%CD%\bin;%Path%
431+
432+:: Get protoc.exe for ubuntuone-storage-protocol building
433+:: This will use the Python on the Path that we got from Buildout
434+python.exe get_protoc.py
435+
436+
437+FOR /F "tokens=*" %%A IN ('python -c "import sys;print [dir for dir in sys.path if \"ubuntuone_dev_tools\" in dir][0]"') DO SET DEVTOOLS=%%A
438+FOR /F "tokens=*" %%A IN ('python -c "import sys;print [dir for dir in sys.path if \"pylint\" in dir][0]"') DO SET PYLINT=%%A
439+FOR /F "tokens=*" %%A IN ('python -c "import sys;print [dir for dir in sys.path if \"pyflakes\" in dir][0]"') DO SET PYFLAKES=%%A
440+
441+IF EXIST "%~dp0bin\u1trial" GOTO TRIALALREADY
442+echo Copying u1trial to bin
443+copy %DEVTOOLS%\EGG-INFO\scripts\u1trial bin
444+copy %DEVTOOLS%\EGG-INFO\scripts\u1trial.bat bin
445+:TRIALALREADY
446+
447+IF EXIST "%~dp0bin\u1lint" GOTO LINTALREADY
448+echo Copying u1lint to bin
449+copy %DEVTOOLS%\EGG-INFO\scripts\u1lint bin
450+copy %DEVTOOLS%\EGG-INFO\scripts\u1lint.bat bin
451+:LINTALREADY
452+
453+IF EXIST "%~dp0bin\pylint" GOTO PYLINTALREADY
454+echo Copying pylint to bin
455+copy %PYLINT%\EGG-INFO\scripts\pylint bin
456+copy %PYLINT%\\EGG-INFO\scripts\pylint.bat bin
457+:PYLINTALREADY
458+
459+IF EXIST "%~dp0bin\pyflakes" GOTO PYFLAKESALREADY
460+echo Copying pyflakes to bin
461+copy %PYFLAKES%\pyflakes\scripts\pyflakes.py bin\pyflakes
462+:PYFLAKESALREADY
463+
464+:: Running ubuntuone-control-panel tests requires -protocol to be built
465+IF EXIST "%~dp0parts\ubuntuone-storage-protocol\build" GOTO PROTOCOLBUILT
466+echo Building ubuntuone-storage-protocol
467+cd parts\ubuntuone-storage-protocol
468+python.exe setup.py install
469+cd %~dp0
470+:PROTOCOLBUILT
471+
472+
473+
474+:: Run all tests
475+IF NOT "%1" == "testall" GOTO END
476+
477+cd parts\ubuntu-sso-client
478+:: Check for one of the expected reg values and install the value if we don't find it.
479+FOR /F "tokens=%PYTHONPATHTOKENS%" %%A IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Ubuntu One" /v path-ubuntuone-syncdaemon') DO SET SYNCDAEMON=%%A
480+IF NOT %errorlevel% == 0 ubuntu_sso\main\tests\ubuntuone.reg
481+
482+CALL run-tests.bat
483+cd "%~dp0"
484+
485+cd parts\ubuntuone-client
486+CALL run-tests.bat
487+cd "%~dp0"
488+
489+cd parts\ubuntuone-control-panel
490+CALL run-tests.bat
491+cd "%~dp0"
492+
493+cd parts\ubuntuone-windows-installer
494+CALL run-tests.bat
495+cd "%~dp0"
496+
497+:END
498+
499
500=== added file 'scripts/devsetup/get_protoc.py'
501--- scripts/devsetup/get_protoc.py 1970-01-01 00:00:00 +0000
502+++ scripts/devsetup/get_protoc.py 2012-04-18 14:27:24 +0000
503@@ -0,0 +1,33 @@
504+import sys
505+import subprocess
506+import shlex
507+import os
508+import urllib
509+import tempfile
510+import zipfile
511+
512+URL = "http://protobuf.googlecode.com/files/protoc-2.4.1-win32.zip"
513+
514+def get_protoc():
515+ response = urllib.urlopen(URL)
516+ data = response.read()
517+ if not data:
518+ raise Exception("Unable to download %s" % URL)
519+
520+ fd, name = tempfile.mkstemp()
521+
522+ with os.fdopen(fd, "w") as f:
523+ f.write(data)
524+ with zipfile.ZipFile(name) as zf:
525+ path = zf.extract("protoc.exe", "bin")
526+ return path
527+
528+def _main():
529+ bin_dir = os.path.join(os.getcwd(), "bin")
530+ if not os.path.exists(os.path.join(bin_dir, "protoc.exe")):
531+ path = get_protoc()
532+ print "Protobuf compiler installed to %s" % path
533+
534+if __name__ == "__main__":
535+ sys.exit(_main())
536+
537
538=== added file 'scripts/devsetup/updateall.bat'
539--- scripts/devsetup/updateall.bat 1970-01-01 00:00:00 +0000
540+++ scripts/devsetup/updateall.bat 2012-04-18 14:27:24 +0000
541@@ -0,0 +1,23 @@
542+@echo off
543+
544+cd %1\ubuntu-sso-client
545+bzr pull
546+cd %~dp0
547+
548+cd %1\ubuntuone-client
549+bzr pull
550+cd %~dp0
551+
552+cd %1\ubuntuone-control-panel
553+bzr pull
554+cd %~dp0
555+
556+cd %1\ubuntuone-storage-protocol
557+bzr pull
558+cd %~dp0
559+
560+cd %1\ubuntuone-windows-installer
561+bzr pull
562+cd %~dp0
563+
564+cd %~dp0

Subscribers

People subscribed via source and target branches