def Run(self, cmd_val): # type: (cmd_value__Argv) -> int num_args = len(cmd_val.argv) - 1 if num_args == 0: # TODO: It's suppose to try another dir before doing this? self.errfmt.Print_('pushd: no other directory') return 1 elif num_args > 1: e_usage('got too many arguments') # TODO: 'cd' uses normpath? Is that inconsistent? dest_dir = os_path.abspath(cmd_val.argv[1]) try: posix.chdir(dest_dir) except OSError as e: self.errfmt.Print_("pushd: %r: %s" % (dest_dir, pyutil.strerror_OS(e)), span_id=cmd_val.arg_spids[1]) return 1 self.dir_stack.Push(dest_dir) _PrintDirStack(self.dir_stack, SINGLE_LINE, state.MaybeString(self.mem, 'HOME')) state.ExportGlobalString(self.mem, 'PWD', dest_dir) self.mem.SetPwd(dest_dir) return 0
def Run(self, cmd_val): # type: (cmd_value__Argv) -> int if len(cmd_val.arg_spids) > 1: e_usage('got extra argument', span_id=cmd_val.arg_spids[1]) if not _PopDirStack(self.mem, self.dir_stack, self.errfmt): return 1 # error _PrintDirStack(self.dir_stack, SINGLE_LINE, state.MaybeString(self.mem, ('HOME'))) return 0
def Run(self, cmd_val): # type: (cmd_value__Argv) -> int attrs, arg_r = flag_spec.ParseCmdVal('dirs', cmd_val) arg = arg_types.dirs(attrs.attrs) home_dir = state.MaybeString(self.mem, 'HOME') style = SINGLE_LINE # Following bash order of flag priority if arg.l: home_dir = None # disable pretty ~ if arg.c: self.dir_stack.Reset() return 0 elif arg.v: style = WITH_LINE_NUMBERS elif arg.p: style = WITHOUT_LINE_NUMBERS _PrintDirStack(self.dir_stack, style, home_dir) return 0
def _ReplaceBackslashCodes(self, tokens): # type: (List[Tuple[Id_t, str]]) -> str ret = [] # type: List[str] non_printing = 0 for id_, value in tokens: # BadBacklash means they should have escaped with \\. TODO: Make it an error. # 'echo -e' has a similar issue. if id_ in (Id.PS_Literals, Id.PS_BadBackslash): ret.append(value) elif id_ == Id.PS_Octal3: i = int(value[1:], 8) ret.append(chr(i % 256)) elif id_ == Id.PS_LBrace: non_printing += 1 ret.append('\x01') elif id_ == Id.PS_RBrace: non_printing -= 1 if non_printing < 0: # e.g. \]\[ return PROMPT_ERROR ret.append('\x02') elif id_ == Id.PS_Subst: # \u \h \w etc. ch = value[1:] if ch == '$': # So the user can tell if they're root or not. r = self.cache.Get('$') elif ch == 'u': r = self.cache.Get('user') elif ch == 'h': hostname = self.cache.Get('hostname') # foo.com -> foo r, _ = mylib.split_once(hostname, '.') elif ch == 'H': r = self.cache.Get('hostname') elif ch == 'w': try: pwd = state.GetString(self.mem, 'PWD') home = state.MaybeString( self.mem, 'HOME') # doesn't have to exist # Shorten to ~/mydir r = ui.PrettyDir(pwd, home) except error.Runtime as e: r = '<Error: %s>' % e.UserErrorString() elif ch == 'W': val = self.mem.GetValue('PWD') if val.tag_() == value_e.Str: str_val = cast(value__Str, val) r = os_path.basename(str_val.s) else: r = '<Error: PWD is not a string> ' else: r = consts.LookupCharPrompt(ch) # TODO: Handle more codes # R(r'\\[adehHjlnrstT@AuvVwW!#$\\]', Id.PS_Subst), if r is None: r = r'<Error: \%s not implemented in $PS1> ' % ch # See comment above on bash hack for $. ret.append(r.replace('$', '\\$')) else: raise AssertionError('Invalid token %r' % id_) # mismatched brackets, see https://github.com/oilshell/oil/pull/256 if non_printing != 0: return PROMPT_ERROR return ''.join(ret)