oldusersetup.py
218 lines
| 7.3 KiB
| text/x-python
|
PythonLexer
Brian Granger
|
r2202 | # -*- coding: utf-8 -*- | |
""" | |||
Main IPython Component | |||
""" | |||
#----------------------------------------------------------------------------- | |||
# Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> | |||
# Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu> | |||
# Copyright (C) 2008-2009 The IPython Development Team | |||
# | |||
# Distributed under the terms of the BSD License. The full license is in | |||
# the file COPYING, distributed as part of this software. | |||
#----------------------------------------------------------------------------- | |||
#----------------------------------------------------------------------------- | |||
# Imports | |||
#----------------------------------------------------------------------------- | |||
import glob | |||
import os | |||
import shutil | |||
import sys | |||
from IPython.utils.genutils import * | |||
def user_setup(ipythondir,rc_suffix,mode='install',interactive=True): | |||
"""Install or upgrade the user configuration directory. | |||
Can be called when running for the first time or to upgrade the user's | |||
.ipython/ directory. | |||
Parameters | |||
---------- | |||
ipythondir : path | |||
The directory to be used for installation/upgrade. In 'install' mode, | |||
if this path already exists, the function exits immediately. | |||
rc_suffix : str | |||
Extension for the config files. On *nix platforms it is typically the | |||
empty string, while Windows normally uses '.ini'. | |||
mode : str, optional | |||
Valid modes are 'install' and 'upgrade'. | |||
interactive : bool, optional | |||
If False, do not wait for user input on any errors. Normally after | |||
printing its status information, this function waits for the user to | |||
hit Return before proceeding. This is because the default use case is | |||
when first installing the IPython configuration, so we want the user to | |||
acknowledge the initial message, which contains some useful | |||
information. | |||
""" | |||
# For automatic use, deactivate all i/o | |||
if interactive: | |||
def wait(): | |||
try: | |||
raw_input("Please press <RETURN> to start IPython.") | |||
except EOFError: | |||
print >> Term.cout | |||
print '*'*70 | |||
def printf(s): | |||
print s | |||
else: | |||
wait = lambda : None | |||
printf = lambda s : None | |||
# Install mode should be re-entrant: if the install dir already exists, | |||
# bail out cleanly. | |||
# XXX. This is too hasty to return. We need to check to make sure that | |||
# all the expected config files and directories are actually there. We | |||
# currently have a failure mode if someone deletes a needed config file | |||
# but still has the ipythondir. | |||
if mode == 'install' and os.path.isdir(ipythondir): | |||
return | |||
cwd = os.getcwd() # remember where we started | |||
glb = glob.glob | |||
printf('*'*70) | |||
if mode == 'install': | |||
printf( | |||
"""Welcome to IPython. I will try to create a personal configuration directory | |||
where you can customize many aspects of IPython's functionality in:\n""") | |||
else: | |||
printf('I am going to upgrade your configuration in:') | |||
printf(ipythondir) | |||
rcdirend = os.path.join('IPython','config','userconfig') | |||
cfg = lambda d: os.path.join(d,rcdirend) | |||
try: | |||
rcdir = filter(os.path.isdir,map(cfg,sys.path))[0] | |||
printf("Initializing from configuration: %s" % rcdir) | |||
except IndexError: | |||
warning = """ | |||
Installation error. IPython's directory was not found. | |||
Check the following: | |||
The ipython/IPython directory should be in a directory belonging to your | |||
PYTHONPATH environment variable (that is, it should be in a directory | |||
belonging to sys.path). You can copy it explicitly there or just link to it. | |||
IPython will create a minimal default configuration for you. | |||
""" | |||
warn(warning) | |||
wait() | |||
if sys.platform =='win32': | |||
inif = 'ipythonrc.ini' | |||
else: | |||
inif = 'ipythonrc' | |||
minimal_setup = {'ipy_user_conf.py' : 'import ipy_defaults', | |||
inif : '# intentionally left blank' } | |||
os.makedirs(ipythondir, mode = 0777) | |||
for f, cont in minimal_setup.items(): | |||
# In 2.5, this can be more cleanly done using 'with' | |||
fobj = file(ipythondir + '/' + f,'w') | |||
fobj.write(cont) | |||
fobj.close() | |||
return | |||
if mode == 'install': | |||
try: | |||
shutil.copytree(rcdir,ipythondir) | |||
os.chdir(ipythondir) | |||
rc_files = glb("ipythonrc*") | |||
for rc_file in rc_files: | |||
os.rename(rc_file,rc_file+rc_suffix) | |||
except: | |||
warning = """ | |||
There was a problem with the installation: | |||
%s | |||
Try to correct it or contact the developers if you think it's a bug. | |||
IPython will proceed with builtin defaults.""" % sys.exc_info()[1] | |||
warn(warning) | |||
wait() | |||
return | |||
elif mode == 'upgrade': | |||
try: | |||
os.chdir(ipythondir) | |||
except: | |||
printf(""" | |||
Can not upgrade: changing to directory %s failed. Details: | |||
%s | |||
""" % (ipythondir,sys.exc_info()[1]) ) | |||
wait() | |||
return | |||
else: | |||
sources = glb(os.path.join(rcdir,'[A-Za-z]*')) | |||
for new_full_path in sources: | |||
new_filename = os.path.basename(new_full_path) | |||
if new_filename.startswith('ipythonrc'): | |||
new_filename = new_filename + rc_suffix | |||
# The config directory should only contain files, skip any | |||
# directories which may be there (like CVS) | |||
if os.path.isdir(new_full_path): | |||
continue | |||
if os.path.exists(new_filename): | |||
old_file = new_filename+'.old' | |||
if os.path.exists(old_file): | |||
os.remove(old_file) | |||
os.rename(new_filename,old_file) | |||
shutil.copy(new_full_path,new_filename) | |||
else: | |||
raise ValueError('unrecognized mode for install: %r' % mode) | |||
# Fix line-endings to those native to each platform in the config | |||
# directory. | |||
try: | |||
os.chdir(ipythondir) | |||
except: | |||
printf(""" | |||
Problem: changing to directory %s failed. | |||
Details: | |||
%s | |||
Some configuration files may have incorrect line endings. This should not | |||
cause any problems during execution. """ % (ipythondir,sys.exc_info()[1]) ) | |||
wait() | |||
else: | |||
for fname in glb('ipythonrc*'): | |||
try: | |||
native_line_ends(fname,backup=0) | |||
except IOError: | |||
pass | |||
if mode == 'install': | |||
printf(""" | |||
Successful installation! | |||
Please read the sections 'Initial Configuration' and 'Quick Tips' in the | |||
IPython manual (there are both HTML and PDF versions supplied with the | |||
distribution) to make sure that your system environment is properly configured | |||
to take advantage of IPython's features. | |||
Important note: the configuration system has changed! The old system is | |||
still in place, but its setting may be partly overridden by the settings in | |||
"~/.ipython/ipy_user_conf.py" config file. Please take a look at the file | |||
if some of the new settings bother you. | |||
""") | |||
else: | |||
printf(""" | |||
Successful upgrade! | |||
All files in your directory: | |||
%(ipythondir)s | |||
which would have been overwritten by the upgrade were backed up with a .old | |||
extension. If you had made particular customizations in those files you may | |||
want to merge them back into the new files.""" % locals() ) | |||
wait() | |||
os.chdir(cwd) |