Merge branch 'wrywerytwreywery-cd'

This commit is contained in:
Anthony Scopatz 2015-04-16 13:45:00 -05:00
commit ac02ead48f
3 changed files with 76 additions and 40 deletions

View file

@ -7,37 +7,10 @@ import subprocess
import shlex import shlex
from warnings import warn from warnings import warn
from xonsh.dirstack import dirs, pushd, popd from xonsh.dirstack import cd, pushd, popd, dirs
from xonsh.jobs import jobs, fg, bg, kill_all_jobs from xonsh.jobs import jobs, fg, bg, kill_all_jobs
def cd(args, stdin=None):
"""Changes the directory.
If no directory is specified (i.e. if `args` is None) then this
changes to the current user's home directory.
"""
env = builtins.__xonsh_env__
cur_oldpwd = env.get('OLDPWD', os.getcwd())
if len(args) == 0:
d = os.path.expanduser('~')
elif len(args) == 1:
d = os.path.expanduser(args[0])
if d == '-':
d = cur_oldpwd
else:
return '', 'cd takes 0 or 1 arguments, not {0}\n'.format(len(args))
if not os.path.exists(d):
return '', 'cd: no such file or directory: {0}\n'.format(d)
if not os.path.isdir(d):
return '', 'cd: {0} is not a directory\n'.format(d)
env['OLDPWD'] = os.getcwd()
os.chdir(d)
env['PWD'] = os.getcwd()
return None, None
def exit(args, stdin=None): # pylint:disable=redefined-builtin,W0622 def exit(args, stdin=None): # pylint:disable=redefined-builtin,W0622
"""Sends signal to exit shell.""" """Sends signal to exit shell."""
builtins.__xonsh_exit__ = True builtins.__xonsh_exit__ = True

View file

@ -10,6 +10,73 @@ A list containing the currently remembered directories.
""" """
def _get_cwd():
try:
return os.getcwd()
except (OSError, FileNotFoundError):
return None
def _change_working_directory(newdir):
env = builtins.__xonsh_env__
old = _get_cwd()
try:
os.chdir(newdir)
except (OSError, FileNotFoundError):
return
new = _get_cwd()
if old is not None:
env['OLDPWD'] = old
if new is not None:
env['PWD'] = new
def cd(args, stdin=None):
"""Changes the directory.
If no directory is specified (i.e. if `args` is None) then this
changes to the current user's home directory.
"""
env = builtins.__xonsh_env__
oldpwd = env.get('OLDPWD', None)
cwd = _get_cwd()
if len(args) == 0:
d = os.path.expanduser('~')
elif len(args) == 1:
d = os.path.expanduser(args[0])
if not os.path.isdir(d):
if d == '-':
if oldpwd is not None:
d = oldpwd
else:
return '', 'cd: no previous directory stored\n'
elif d.startswith('-'):
try:
num = int(d[1:])
except ValueError:
return '', 'cd: Invalid destination: {0}\n'.format(d)
if num == 0:
return
elif num < 0:
return '', 'cd: Invalid destination: {0}\n'.format(d)
elif num > len(DIRSTACK):
e = 'cd: Too few elements in dirstack ({0} elements)\n'
return '', e.format(len(DIRSTACK))
else:
d = DIRSTACK[num - 1]
else:
return '', 'cd takes 0 or 1 arguments, not {0}\n'.format(len(args))
if not os.path.exists(d):
return '', 'cd: no such file or directory: {0}\n'.format(d)
if not os.path.isdir(d):
return '', 'cd: {0} is not a directory\n'.format(d)
# now, push the directory onto the dirstack if AUTO_PUSHD is set
if cwd is not None and env.get('AUTO_PUSHD', False):
pushd(['-n', '-q', cwd])
_change_working_directory(os.path.abspath(d))
return None, None
def pushd(args, stdin=None): def pushd(args, stdin=None):
""" """
xonsh command: pushd xonsh command: pushd
@ -71,16 +138,12 @@ def pushd(args, stdin=None):
e = 'Invalid argument to pushd: {0}\n' e = 'Invalid argument to pushd: {0}\n'
return None, e.format(args.dir) return None, e.format(args.dir)
if new_pwd is not None: if new_pwd is not None:
e = None
if args.cd: if args.cd:
DIRSTACK.insert(0, os.path.expanduser(pwd)) DIRSTACK.insert(0, os.path.expanduser(pwd))
_, e = builtins.default_aliases['cd']([new_pwd], None) _change_working_directory(os.path.abspath(new_pwd))
else: else:
DIRSTACK.insert(0, os.path.expanduser(os.path.abspath(new_pwd))) DIRSTACK.insert(0, os.path.expanduser(os.path.abspath(new_pwd)))
if e is not None:
return None, e
maxsize = env.get('DIRSTACK_SIZE', 20) maxsize = env.get('DIRSTACK_SIZE', 20)
if len(DIRSTACK) > maxsize: if len(DIRSTACK) > maxsize:
DIRSTACK = DIRSTACK[:maxsize] DIRSTACK = DIRSTACK[:maxsize]
@ -152,10 +215,7 @@ def popd(args, stdin=None):
if new_pwd is not None: if new_pwd is not None:
e = None e = None
if args.cd: if args.cd:
_, e = builtins.default_aliases['cd']([new_pwd], None) _change_working_directory(os.path.abspath(new_pwd))
if e is not None:
return None, e
if not args.quiet and not env.get('PUSHD_SILENT', False): if not args.quiet and not env.get('PUSHD_SILENT', False):
return dirs([], None) return dirs([], None)

View file

@ -12,6 +12,7 @@ from warnings import warn
from xonsh import __version__ as XONSH_VERSION from xonsh import __version__ as XONSH_VERSION
from xonsh.tools import TERM_COLORS from xonsh.tools import TERM_COLORS
from xonsh.dirstack import _get_cwd
def current_branch(cwd=None, pad=True): def current_branch(cwd=None, pad=True):
@ -20,7 +21,9 @@ def current_branch(cwd=None, pad=True):
bust should be extended in the future. bust should be extended in the future.
""" """
branch = None branch = None
cwd = os.getcwd() if cwd is None else cwd cwd = _get_cwd() if cwd is None else cwd
if cwd is None:
return ''
# step out completely if git is not installed # step out completely if git is not installed
try: try:
@ -64,7 +67,7 @@ def current_branch(cwd=None, pad=True):
if pad and branch is not None: if pad and branch is not None:
branch = ' ' + branch branch = ' ' + branch
return branch return branch or ''
DEFAULT_PROMPT = ('{BOLD_GREEN}{user}@{hostname}{BOLD_BLUE} ' DEFAULT_PROMPT = ('{BOLD_GREEN}{user}@{hostname}{BOLD_BLUE} '
@ -78,7 +81,7 @@ def _replace_home(x):
FORMATTER_DICT = dict(user=os.environ.get('USER', '<user>'), FORMATTER_DICT = dict(user=os.environ.get('USER', '<user>'),
hostname=socket.gethostname().split('.', 1)[0], hostname=socket.gethostname().split('.', 1)[0],
cwd=lambda: _replace_home(builtins.__xonsh_env__['PWD']), cwd=lambda: _replace_home(builtins.__xonsh_env__['PWD']),
curr_branch=lambda: current_branch() or '', curr_branch=lambda: current_branch(),
**TERM_COLORS) **TERM_COLORS)
_formatter = string.Formatter() _formatter = string.Formatter()