##// END OF EJS Templates
Remove unused configobj and validate libraries from externals.
Thomas Kluyver -
Show More
@@ -1,388 +1,386 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """
2 """
3 This module defines the things that are used in setup.py for building IPython
3 This module defines the things that are used in setup.py for building IPython
4
4
5 This includes:
5 This includes:
6
6
7 * The basic arguments to setup
7 * The basic arguments to setup
8 * Functions for finding things like packages, package data, etc.
8 * Functions for finding things like packages, package data, etc.
9 * A function for checking dependencies.
9 * A function for checking dependencies.
10 """
10 """
11 from __future__ import print_function
11 from __future__ import print_function
12
12
13 #-------------------------------------------------------------------------------
13 #-------------------------------------------------------------------------------
14 # Copyright (C) 2008 The IPython Development Team
14 # Copyright (C) 2008 The IPython Development Team
15 #
15 #
16 # Distributed under the terms of the BSD License. The full license is in
16 # Distributed under the terms of the BSD License. The full license is in
17 # the file COPYING, distributed as part of this software.
17 # the file COPYING, distributed as part of this software.
18 #-------------------------------------------------------------------------------
18 #-------------------------------------------------------------------------------
19
19
20 #-------------------------------------------------------------------------------
20 #-------------------------------------------------------------------------------
21 # Imports
21 # Imports
22 #-------------------------------------------------------------------------------
22 #-------------------------------------------------------------------------------
23 import os
23 import os
24 import sys
24 import sys
25
25
26 from ConfigParser import ConfigParser
26 from ConfigParser import ConfigParser
27 from distutils.command.build_py import build_py
27 from distutils.command.build_py import build_py
28 from glob import glob
28 from glob import glob
29
29
30 from setupext import install_data_ext
30 from setupext import install_data_ext
31
31
32 #-------------------------------------------------------------------------------
32 #-------------------------------------------------------------------------------
33 # Useful globals and utility functions
33 # Useful globals and utility functions
34 #-------------------------------------------------------------------------------
34 #-------------------------------------------------------------------------------
35
35
36 # A few handy globals
36 # A few handy globals
37 isfile = os.path.isfile
37 isfile = os.path.isfile
38 pjoin = os.path.join
38 pjoin = os.path.join
39
39
40 def oscmd(s):
40 def oscmd(s):
41 print(">", s)
41 print(">", s)
42 os.system(s)
42 os.system(s)
43
43
44 # A little utility we'll need below, since glob() does NOT allow you to do
44 # A little utility we'll need below, since glob() does NOT allow you to do
45 # exclusion on multiple endings!
45 # exclusion on multiple endings!
46 def file_doesnt_endwith(test,endings):
46 def file_doesnt_endwith(test,endings):
47 """Return true if test is a file and its name does NOT end with any
47 """Return true if test is a file and its name does NOT end with any
48 of the strings listed in endings."""
48 of the strings listed in endings."""
49 if not isfile(test):
49 if not isfile(test):
50 return False
50 return False
51 for e in endings:
51 for e in endings:
52 if test.endswith(e):
52 if test.endswith(e):
53 return False
53 return False
54 return True
54 return True
55
55
56 #---------------------------------------------------------------------------
56 #---------------------------------------------------------------------------
57 # Basic project information
57 # Basic project information
58 #---------------------------------------------------------------------------
58 #---------------------------------------------------------------------------
59
59
60 # release.py contains version, authors, license, url, keywords, etc.
60 # release.py contains version, authors, license, url, keywords, etc.
61 execfile(pjoin('IPython','core','release.py'))
61 execfile(pjoin('IPython','core','release.py'))
62
62
63 # Create a dict with the basic information
63 # Create a dict with the basic information
64 # This dict is eventually passed to setup after additional keys are added.
64 # This dict is eventually passed to setup after additional keys are added.
65 setup_args = dict(
65 setup_args = dict(
66 name = name,
66 name = name,
67 version = version,
67 version = version,
68 description = description,
68 description = description,
69 long_description = long_description,
69 long_description = long_description,
70 author = author,
70 author = author,
71 author_email = author_email,
71 author_email = author_email,
72 url = url,
72 url = url,
73 download_url = download_url,
73 download_url = download_url,
74 license = license,
74 license = license,
75 platforms = platforms,
75 platforms = platforms,
76 keywords = keywords,
76 keywords = keywords,
77 cmdclass = {'install_data': install_data_ext},
77 cmdclass = {'install_data': install_data_ext},
78 )
78 )
79
79
80
80
81 #---------------------------------------------------------------------------
81 #---------------------------------------------------------------------------
82 # Find packages
82 # Find packages
83 #---------------------------------------------------------------------------
83 #---------------------------------------------------------------------------
84
84
85 def add_package(packages,pname,config=False,tests=False,scripts=False,
85 def add_package(packages,pname,config=False,tests=False,scripts=False,
86 others=None):
86 others=None):
87 """
87 """
88 Add a package to the list of packages, including certain subpackages.
88 Add a package to the list of packages, including certain subpackages.
89 """
89 """
90 packages.append('.'.join(['IPython',pname]))
90 packages.append('.'.join(['IPython',pname]))
91 if config:
91 if config:
92 packages.append('.'.join(['IPython',pname,'config']))
92 packages.append('.'.join(['IPython',pname,'config']))
93 if tests:
93 if tests:
94 packages.append('.'.join(['IPython',pname,'tests']))
94 packages.append('.'.join(['IPython',pname,'tests']))
95 if scripts:
95 if scripts:
96 packages.append('.'.join(['IPython',pname,'scripts']))
96 packages.append('.'.join(['IPython',pname,'scripts']))
97 if others is not None:
97 if others is not None:
98 for o in others:
98 for o in others:
99 packages.append('.'.join(['IPython',pname,o]))
99 packages.append('.'.join(['IPython',pname,o]))
100
100
101 def find_packages():
101 def find_packages():
102 """
102 """
103 Find all of IPython's packages.
103 Find all of IPython's packages.
104 """
104 """
105 packages = ['IPython']
105 packages = ['IPython']
106 add_package(packages, 'config', tests=True, others=['profile'])
106 add_package(packages, 'config', tests=True, others=['profile'])
107 add_package(packages, 'core', tests=True)
107 add_package(packages, 'core', tests=True)
108 add_package(packages, 'deathrow', tests=True)
108 add_package(packages, 'deathrow', tests=True)
109 add_package(packages, 'extensions')
109 add_package(packages, 'extensions')
110 add_package(packages, 'external')
110 add_package(packages, 'external')
111 add_package(packages, 'external.argparse')
111 add_package(packages, 'external.argparse')
112 add_package(packages, 'external.configobj')
113 add_package(packages, 'external.decorator')
112 add_package(packages, 'external.decorator')
114 add_package(packages, 'external.decorators')
113 add_package(packages, 'external.decorators')
115 add_package(packages, 'external.guid')
114 add_package(packages, 'external.guid')
116 add_package(packages, 'external.Itpl')
115 add_package(packages, 'external.Itpl')
117 add_package(packages, 'external.mglob')
116 add_package(packages, 'external.mglob')
118 add_package(packages, 'external.path')
117 add_package(packages, 'external.path')
119 add_package(packages, 'external.pexpect')
118 add_package(packages, 'external.pexpect')
120 add_package(packages, 'external.pyparsing')
119 add_package(packages, 'external.pyparsing')
121 add_package(packages, 'external.simplegeneric')
120 add_package(packages, 'external.simplegeneric')
122 add_package(packages, 'external.ssh')
121 add_package(packages, 'external.ssh')
123 add_package(packages, 'external.validate')
124 add_package(packages, 'kernel')
122 add_package(packages, 'kernel')
125 add_package(packages, 'frontend')
123 add_package(packages, 'frontend')
126 add_package(packages, 'frontend.qt')
124 add_package(packages, 'frontend.qt')
127 add_package(packages, 'frontend.qt.console', tests=True)
125 add_package(packages, 'frontend.qt.console', tests=True)
128 add_package(packages, 'frontend.terminal', tests=True)
126 add_package(packages, 'frontend.terminal', tests=True)
129 add_package(packages, 'lib', tests=True)
127 add_package(packages, 'lib', tests=True)
130 add_package(packages, 'parallel', tests=True, scripts=True,
128 add_package(packages, 'parallel', tests=True, scripts=True,
131 others=['apps','engine','client','controller'])
129 others=['apps','engine','client','controller'])
132 add_package(packages, 'quarantine', tests=True)
130 add_package(packages, 'quarantine', tests=True)
133 add_package(packages, 'scripts')
131 add_package(packages, 'scripts')
134 add_package(packages, 'testing', tests=True)
132 add_package(packages, 'testing', tests=True)
135 add_package(packages, 'testing.plugin', tests=False)
133 add_package(packages, 'testing.plugin', tests=False)
136 add_package(packages, 'utils', tests=True)
134 add_package(packages, 'utils', tests=True)
137 add_package(packages, 'zmq')
135 add_package(packages, 'zmq')
138 add_package(packages, 'zmq.pylab')
136 add_package(packages, 'zmq.pylab')
139 add_package(packages, 'zmq.gui')
137 add_package(packages, 'zmq.gui')
140 return packages
138 return packages
141
139
142 #---------------------------------------------------------------------------
140 #---------------------------------------------------------------------------
143 # Find package data
141 # Find package data
144 #---------------------------------------------------------------------------
142 #---------------------------------------------------------------------------
145
143
146 def find_package_data():
144 def find_package_data():
147 """
145 """
148 Find IPython's package_data.
146 Find IPython's package_data.
149 """
147 """
150 # This is not enough for these things to appear in an sdist.
148 # This is not enough for these things to appear in an sdist.
151 # We need to muck with the MANIFEST to get this to work
149 # We need to muck with the MANIFEST to get this to work
152 package_data = {
150 package_data = {
153 'IPython.config.profile' : ['README', '*/*.py'],
151 'IPython.config.profile' : ['README', '*/*.py'],
154 'IPython.testing' : ['*.txt'],
152 'IPython.testing' : ['*.txt'],
155 }
153 }
156 return package_data
154 return package_data
157
155
158
156
159 #---------------------------------------------------------------------------
157 #---------------------------------------------------------------------------
160 # Find data files
158 # Find data files
161 #---------------------------------------------------------------------------
159 #---------------------------------------------------------------------------
162
160
163 def make_dir_struct(tag,base,out_base):
161 def make_dir_struct(tag,base,out_base):
164 """Make the directory structure of all files below a starting dir.
162 """Make the directory structure of all files below a starting dir.
165
163
166 This is just a convenience routine to help build a nested directory
164 This is just a convenience routine to help build a nested directory
167 hierarchy because distutils is too stupid to do this by itself.
165 hierarchy because distutils is too stupid to do this by itself.
168
166
169 XXX - this needs a proper docstring!
167 XXX - this needs a proper docstring!
170 """
168 """
171
169
172 # we'll use these a lot below
170 # we'll use these a lot below
173 lbase = len(base)
171 lbase = len(base)
174 pathsep = os.path.sep
172 pathsep = os.path.sep
175 lpathsep = len(pathsep)
173 lpathsep = len(pathsep)
176
174
177 out = []
175 out = []
178 for (dirpath,dirnames,filenames) in os.walk(base):
176 for (dirpath,dirnames,filenames) in os.walk(base):
179 # we need to strip out the dirpath from the base to map it to the
177 # we need to strip out the dirpath from the base to map it to the
180 # output (installation) path. This requires possibly stripping the
178 # output (installation) path. This requires possibly stripping the
181 # path separator, because otherwise pjoin will not work correctly
179 # path separator, because otherwise pjoin will not work correctly
182 # (pjoin('foo/','/bar') returns '/bar').
180 # (pjoin('foo/','/bar') returns '/bar').
183
181
184 dp_eff = dirpath[lbase:]
182 dp_eff = dirpath[lbase:]
185 if dp_eff.startswith(pathsep):
183 if dp_eff.startswith(pathsep):
186 dp_eff = dp_eff[lpathsep:]
184 dp_eff = dp_eff[lpathsep:]
187 # The output path must be anchored at the out_base marker
185 # The output path must be anchored at the out_base marker
188 out_path = pjoin(out_base,dp_eff)
186 out_path = pjoin(out_base,dp_eff)
189 # Now we can generate the final filenames. Since os.walk only produces
187 # Now we can generate the final filenames. Since os.walk only produces
190 # filenames, we must join back with the dirpath to get full valid file
188 # filenames, we must join back with the dirpath to get full valid file
191 # paths:
189 # paths:
192 pfiles = [pjoin(dirpath,f) for f in filenames]
190 pfiles = [pjoin(dirpath,f) for f in filenames]
193 # Finally, generate the entry we need, which is a pari of (output
191 # Finally, generate the entry we need, which is a pari of (output
194 # path, files) for use as a data_files parameter in install_data.
192 # path, files) for use as a data_files parameter in install_data.
195 out.append((out_path, pfiles))
193 out.append((out_path, pfiles))
196
194
197 return out
195 return out
198
196
199
197
200 def find_data_files():
198 def find_data_files():
201 """
199 """
202 Find IPython's data_files.
200 Find IPython's data_files.
203
201
204 Most of these are docs.
202 Most of these are docs.
205 """
203 """
206
204
207 docdirbase = pjoin('share', 'doc', 'ipython')
205 docdirbase = pjoin('share', 'doc', 'ipython')
208 manpagebase = pjoin('share', 'man', 'man1')
206 manpagebase = pjoin('share', 'man', 'man1')
209
207
210 # Simple file lists can be made by hand
208 # Simple file lists can be made by hand
211 manpages = filter(isfile, glob(pjoin('docs','man','*.1.gz')))
209 manpages = filter(isfile, glob(pjoin('docs','man','*.1.gz')))
212 igridhelpfiles = filter(isfile,
210 igridhelpfiles = filter(isfile,
213 glob(pjoin('IPython','extensions','igrid_help.*')))
211 glob(pjoin('IPython','extensions','igrid_help.*')))
214
212
215 # For nested structures, use the utility above
213 # For nested structures, use the utility above
216 example_files = make_dir_struct(
214 example_files = make_dir_struct(
217 'data',
215 'data',
218 pjoin('docs','examples'),
216 pjoin('docs','examples'),
219 pjoin(docdirbase,'examples')
217 pjoin(docdirbase,'examples')
220 )
218 )
221 manual_files = make_dir_struct(
219 manual_files = make_dir_struct(
222 'data',
220 'data',
223 pjoin('docs','dist'),
221 pjoin('docs','dist'),
224 pjoin(docdirbase,'manual')
222 pjoin(docdirbase,'manual')
225 )
223 )
226
224
227 # And assemble the entire output list
225 # And assemble the entire output list
228 data_files = [ (manpagebase, manpages),
226 data_files = [ (manpagebase, manpages),
229 (pjoin(docdirbase, 'extensions'), igridhelpfiles),
227 (pjoin(docdirbase, 'extensions'), igridhelpfiles),
230 ] + manual_files + example_files
228 ] + manual_files + example_files
231
229
232 return data_files
230 return data_files
233
231
234
232
235 def make_man_update_target(manpage):
233 def make_man_update_target(manpage):
236 """Return a target_update-compliant tuple for the given manpage.
234 """Return a target_update-compliant tuple for the given manpage.
237
235
238 Parameters
236 Parameters
239 ----------
237 ----------
240 manpage : string
238 manpage : string
241 Name of the manpage, must include the section number (trailing number).
239 Name of the manpage, must include the section number (trailing number).
242
240
243 Example
241 Example
244 -------
242 -------
245
243
246 >>> make_man_update_target('ipython.1') #doctest: +NORMALIZE_WHITESPACE
244 >>> make_man_update_target('ipython.1') #doctest: +NORMALIZE_WHITESPACE
247 ('docs/man/ipython.1.gz',
245 ('docs/man/ipython.1.gz',
248 ['docs/man/ipython.1'],
246 ['docs/man/ipython.1'],
249 'cd docs/man && gzip -9c ipython.1 > ipython.1.gz')
247 'cd docs/man && gzip -9c ipython.1 > ipython.1.gz')
250 """
248 """
251 man_dir = pjoin('docs', 'man')
249 man_dir = pjoin('docs', 'man')
252 manpage_gz = manpage + '.gz'
250 manpage_gz = manpage + '.gz'
253 manpath = pjoin(man_dir, manpage)
251 manpath = pjoin(man_dir, manpage)
254 manpath_gz = pjoin(man_dir, manpage_gz)
252 manpath_gz = pjoin(man_dir, manpage_gz)
255 gz_cmd = ( "cd %(man_dir)s && gzip -9c %(manpage)s > %(manpage_gz)s" %
253 gz_cmd = ( "cd %(man_dir)s && gzip -9c %(manpage)s > %(manpage_gz)s" %
256 locals() )
254 locals() )
257 return (manpath_gz, [manpath], gz_cmd)
255 return (manpath_gz, [manpath], gz_cmd)
258
256
259 #---------------------------------------------------------------------------
257 #---------------------------------------------------------------------------
260 # Find scripts
258 # Find scripts
261 #---------------------------------------------------------------------------
259 #---------------------------------------------------------------------------
262
260
263 def find_scripts(entry_points=False):
261 def find_scripts(entry_points=False):
264 """Find IPython's scripts.
262 """Find IPython's scripts.
265
263
266 if entry_points is True:
264 if entry_points is True:
267 return setuptools entry_point-style definitions
265 return setuptools entry_point-style definitions
268 else:
266 else:
269 return file paths of plain scripts [default]
267 return file paths of plain scripts [default]
270 """
268 """
271 if entry_points:
269 if entry_points:
272 console_scripts = [
270 console_scripts = [
273 'ipython = IPython.frontend.terminal.ipapp:launch_new_instance',
271 'ipython = IPython.frontend.terminal.ipapp:launch_new_instance',
274 'pycolor = IPython.utils.PyColorize:main',
272 'pycolor = IPython.utils.PyColorize:main',
275 'ipcontroller = IPython.parallel.apps.ipcontrollerapp:launch_new_instance',
273 'ipcontroller = IPython.parallel.apps.ipcontrollerapp:launch_new_instance',
276 'ipengine = IPython.parallel.apps.ipengineapp:launch_new_instance',
274 'ipengine = IPython.parallel.apps.ipengineapp:launch_new_instance',
277 'iplogger = IPython.parallel.apps.iploggerapp:launch_new_instance',
275 'iplogger = IPython.parallel.apps.iploggerapp:launch_new_instance',
278 'ipcluster = IPython.parallel.apps.ipclusterapp:launch_new_instance',
276 'ipcluster = IPython.parallel.apps.ipclusterapp:launch_new_instance',
279 'iptest = IPython.testing.iptest:main',
277 'iptest = IPython.testing.iptest:main',
280 'irunner = IPython.lib.irunner:main'
278 'irunner = IPython.lib.irunner:main'
281 ]
279 ]
282 gui_scripts = [
280 gui_scripts = [
283 'ipython-qtconsole = IPython.frontend.qt.console.qtconsoleapp:main',
281 'ipython-qtconsole = IPython.frontend.qt.console.qtconsoleapp:main',
284 ]
282 ]
285 scripts = dict(console_scripts=console_scripts, gui_scripts=gui_scripts)
283 scripts = dict(console_scripts=console_scripts, gui_scripts=gui_scripts)
286 else:
284 else:
287 parallel_scripts = pjoin('IPython','parallel','scripts')
285 parallel_scripts = pjoin('IPython','parallel','scripts')
288 main_scripts = pjoin('IPython','scripts')
286 main_scripts = pjoin('IPython','scripts')
289 scripts = [
287 scripts = [
290 pjoin(parallel_scripts, 'ipengine'),
288 pjoin(parallel_scripts, 'ipengine'),
291 pjoin(parallel_scripts, 'ipcontroller'),
289 pjoin(parallel_scripts, 'ipcontroller'),
292 pjoin(parallel_scripts, 'ipcluster'),
290 pjoin(parallel_scripts, 'ipcluster'),
293 pjoin(parallel_scripts, 'iplogger'),
291 pjoin(parallel_scripts, 'iplogger'),
294 pjoin(main_scripts, 'ipython'),
292 pjoin(main_scripts, 'ipython'),
295 pjoin(main_scripts, 'pycolor'),
293 pjoin(main_scripts, 'pycolor'),
296 pjoin(main_scripts, 'irunner'),
294 pjoin(main_scripts, 'irunner'),
297 pjoin(main_scripts, 'iptest')
295 pjoin(main_scripts, 'iptest')
298 ]
296 ]
299 return scripts
297 return scripts
300
298
301 #---------------------------------------------------------------------------
299 #---------------------------------------------------------------------------
302 # Verify all dependencies
300 # Verify all dependencies
303 #---------------------------------------------------------------------------
301 #---------------------------------------------------------------------------
304
302
305 def check_for_dependencies():
303 def check_for_dependencies():
306 """Check for IPython's dependencies.
304 """Check for IPython's dependencies.
307
305
308 This function should NOT be called if running under setuptools!
306 This function should NOT be called if running under setuptools!
309 """
307 """
310 from setupext.setupext import (
308 from setupext.setupext import (
311 print_line, print_raw, print_status,
309 print_line, print_raw, print_status,
312 check_for_sphinx, check_for_pygments,
310 check_for_sphinx, check_for_pygments,
313 check_for_nose, check_for_pexpect,
311 check_for_nose, check_for_pexpect,
314 check_for_pyzmq, check_for_readline
312 check_for_pyzmq, check_for_readline
315 )
313 )
316 print_line()
314 print_line()
317 print_raw("BUILDING IPYTHON")
315 print_raw("BUILDING IPYTHON")
318 print_status('python', sys.version)
316 print_status('python', sys.version)
319 print_status('platform', sys.platform)
317 print_status('platform', sys.platform)
320 if sys.platform == 'win32':
318 if sys.platform == 'win32':
321 print_status('Windows version', sys.getwindowsversion())
319 print_status('Windows version', sys.getwindowsversion())
322
320
323 print_raw("")
321 print_raw("")
324 print_raw("OPTIONAL DEPENDENCIES")
322 print_raw("OPTIONAL DEPENDENCIES")
325
323
326 check_for_sphinx()
324 check_for_sphinx()
327 check_for_pygments()
325 check_for_pygments()
328 check_for_nose()
326 check_for_nose()
329 check_for_pexpect()
327 check_for_pexpect()
330 check_for_pyzmq()
328 check_for_pyzmq()
331 check_for_readline()
329 check_for_readline()
332
330
333 def record_commit_info(pkg_dir, build_cmd=build_py):
331 def record_commit_info(pkg_dir, build_cmd=build_py):
334 """ Return extended build command class for recording commit
332 """ Return extended build command class for recording commit
335
333
336 The extended command tries to run git to find the current commit, getting
334 The extended command tries to run git to find the current commit, getting
337 the empty string if it fails. It then writes the commit hash into a file
335 the empty string if it fails. It then writes the commit hash into a file
338 in the `pkg_dir` path, named ``.git_commit_info.ini``.
336 in the `pkg_dir` path, named ``.git_commit_info.ini``.
339
337
340 In due course this information can be used by the package after it is
338 In due course this information can be used by the package after it is
341 installed, to tell you what commit it was installed from if known.
339 installed, to tell you what commit it was installed from if known.
342
340
343 To make use of this system, you need a package with a .git_commit_info.ini
341 To make use of this system, you need a package with a .git_commit_info.ini
344 file - e.g. ``myproject/.git_commit_info.ini`` - that might well look like
342 file - e.g. ``myproject/.git_commit_info.ini`` - that might well look like
345 this::
343 this::
346
344
347 # This is an ini file that may contain information about the code state
345 # This is an ini file that may contain information about the code state
348 [commit hash]
346 [commit hash]
349 # The line below may contain a valid hash if it has been substituted
347 # The line below may contain a valid hash if it has been substituted
350 # during 'git archive'
348 # during 'git archive'
351 archive_subst_hash=$Format:%h$
349 archive_subst_hash=$Format:%h$
352 # This line may be modified by the install process
350 # This line may be modified by the install process
353 install_hash=
351 install_hash=
354
352
355 The .git_commit_info file above is also designed to be used with git
353 The .git_commit_info file above is also designed to be used with git
356 substitution - so you probably also want a ``.gitattributes`` file in the
354 substitution - so you probably also want a ``.gitattributes`` file in the
357 root directory of your working tree that contains something like this::
355 root directory of your working tree that contains something like this::
358
356
359 myproject/.git_commit_info.ini export-subst
357 myproject/.git_commit_info.ini export-subst
360
358
361 That will cause the ``.git_commit_info.ini`` file to get filled in by ``git
359 That will cause the ``.git_commit_info.ini`` file to get filled in by ``git
362 archive`` - useful in case someone makes such an archive - for example with
360 archive`` - useful in case someone makes such an archive - for example with
363 via the github 'download source' button.
361 via the github 'download source' button.
364
362
365 Although all the above will work as is, you might consider having something
363 Although all the above will work as is, you might consider having something
366 like a ``get_info()`` function in your package to display the commit
364 like a ``get_info()`` function in your package to display the commit
367 information at the terminal. See the ``pkg_info.py`` module in the nipy
365 information at the terminal. See the ``pkg_info.py`` module in the nipy
368 package for an example.
366 package for an example.
369 """
367 """
370 class MyBuildPy(build_cmd):
368 class MyBuildPy(build_cmd):
371 ''' Subclass to write commit data into installation tree '''
369 ''' Subclass to write commit data into installation tree '''
372 def run(self):
370 def run(self):
373 build_py.run(self)
371 build_py.run(self)
374 import subprocess
372 import subprocess
375 proc = subprocess.Popen('git rev-parse --short HEAD',
373 proc = subprocess.Popen('git rev-parse --short HEAD',
376 stdout=subprocess.PIPE,
374 stdout=subprocess.PIPE,
377 stderr=subprocess.PIPE,
375 stderr=subprocess.PIPE,
378 shell=True)
376 shell=True)
379 repo_commit, _ = proc.communicate()
377 repo_commit, _ = proc.communicate()
380 # We write the installation commit even if it's empty
378 # We write the installation commit even if it's empty
381 cfg_parser = ConfigParser()
379 cfg_parser = ConfigParser()
382 cfg_parser.read(pjoin(pkg_dir, '.git_commit_info.ini'))
380 cfg_parser.read(pjoin(pkg_dir, '.git_commit_info.ini'))
383 cfg_parser.set('commit hash', 'install_hash', repo_commit)
381 cfg_parser.set('commit hash', 'install_hash', repo_commit)
384 out_pth = pjoin(self.build_lib, pkg_dir, '.git_commit_info.ini')
382 out_pth = pjoin(self.build_lib, pkg_dir, '.git_commit_info.ini')
385 out_file = open(out_pth, 'wt')
383 out_file = open(out_pth, 'wt')
386 cfg_parser.write(out_file)
384 cfg_parser.write(out_file)
387 out_file.close()
385 out_file.close()
388 return MyBuildPy
386 return MyBuildPy
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
This diff has been collapsed as it changes many lines, (2472 lines changed) Show them Hide them
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
This diff has been collapsed as it changes many lines, (1414 lines changed) Show them Hide them
General Comments 0
You need to be logged in to leave comments. Login now