| """Utility for changing directories and execution of commands in a subshell.""" |
| |
| import os |
| import shlex |
| import subprocess |
| |
| # Store the previous working directory for the 'cd -' command. |
| |
| |
| class Holder: |
| """Holds the _prev_dir_ class attribute for chdir() function.""" |
| _prev_dir_ = None |
| |
| @classmethod |
| def prev_dir(cls): |
| return cls._prev_dir_ |
| |
| @classmethod |
| def swap(cls, dir): |
| cls._prev_dir_ = dir |
| |
| |
| def chdir(debugger, args, result, dict): |
| """Change the working directory, or cd to ${HOME}. |
| You can also issue 'cd -' to change to the previous working directory.""" |
| new_dir = args.strip() |
| if not new_dir: |
| new_dir = os.path.expanduser('~') |
| elif new_dir == '-': |
| if not Holder.prev_dir(): |
| # Bad directory, not changing. |
| print "bad directory, not changing" |
| return |
| else: |
| new_dir = Holder.prev_dir() |
| |
| Holder.swap(os.getcwd()) |
| os.chdir(new_dir) |
| print "Current working directory: %s" % os.getcwd() |
| |
| |
| def system(debugger, command_line, result, dict): |
| """Execute the command (a string) in a subshell.""" |
| args = shlex.split(command_line) |
| process = subprocess.Popen( |
| args, |
| stdout=subprocess.PIPE, |
| stderr=subprocess.PIPE) |
| output, error = process.communicate() |
| retcode = process.poll() |
| if output and error: |
| print "stdout=>\n", output |
| print "stderr=>\n", error |
| elif output: |
| print output |
| elif error: |
| print error |
| print "retcode:", retcode |