mirror of
https://github.com/xonsh/xonsh.git
synced 2025-03-04 16:34:47 +01:00
Merge branch 'wrywerytwreywery-cd'
This commit is contained in:
commit
ac02ead48f
3 changed files with 76 additions and 40 deletions
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Add table
Reference in a new issue