Source code for rezplugins.shell.csh

"""
CSH shell
"""
import pipes
import os.path
import subprocess
from rez.config import config
from rez.utils.execution import Popen
from rez.utils.platform_ import platform_
from rez.shells import UnixShell
from rez.rex import EscapedString


[docs]class CSH(UnixShell): norc_arg = '-f' last_command_status = '$status' histfile = "~/.history" histvar = "histfile"
[docs] @classmethod def name(cls): return 'csh'
[docs] @classmethod def file_extension(cls): return 'csh'
[docs] @classmethod def get_syspaths(cls): if cls.syspaths is not None: return cls.syspaths if config.standard_system_paths: cls.syspaths = config.standard_system_paths return cls.syspaths # detect system paths using registry cmd = "cmd=`which %s`; unset PATH; $cmd %s 'echo __PATHS_ $PATH'" \ % (cls.name(), cls.command_arg) p = Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, text=True) out_, err_ = p.communicate() if p.returncode: paths = [] else: lines = out_.split('\n') line = [x for x in lines if "__PATHS_" in x.split()][0] paths = line.strip().split()[-1].split(os.pathsep) for path in os.defpath.split(os.path.pathsep): if path not in paths: paths.append(path) cls.syspaths = [x for x in paths if x] return cls.syspaths
[docs] @classmethod def startup_capabilities(cls, rcfile=False, norc=False, stdin=False, command=False): cls._unsupported_option('rcfile', rcfile) rcfile = False if command is not None: cls._overruled_option('stdin', 'command', stdin) stdin = False return (rcfile, norc, stdin, command)
[docs] @classmethod def get_startup_sequence(cls, rcfile, norc, stdin, command): rcfile, norc, stdin, command = \ cls.startup_capabilities(rcfile, norc, stdin, command) files = [] if not norc: for file in ( "~/.tcshrc", "~/.cshrc", "~/.login", "~/.cshdirs"): if os.path.exists(os.path.expanduser(file)): files.append(file) return dict( stdin=stdin, command=command, do_rcfile=False, envvar=None, files=files, bind_files=( "~/.tcshrc", "~/.cshrc"), source_bind_files=(not norc) )
[docs] def escape_string(self, value): value = EscapedString.promote(value) value = value.expanduser() result = '' for is_literal, txt in value.strings: if is_literal: txt = pipes.quote(txt) if not txt.startswith("'"): txt = "'%s'" % txt else: txt = txt.replace('"', '"\\""') txt = txt.replace('!', '\\!') txt = '"%s"' % txt result += txt return result
def _bind_interactive_rez(self): if config.set_prompt and self.settings.prompt: # TODO: Do more like in sh.py, much less error prone stored_prompt = os.getenv("REZ_STORED_PROMPT_CSH") curr_prompt = stored_prompt or os.getenv("prompt", "[%m %c]%# ") if not stored_prompt: self.setenv("REZ_STORED_PROMPT_CSH", '"%s"' % curr_prompt) new_prompt = "$REZ_ENV_PROMPT" new_prompt = (new_prompt + " %s") if config.prefix_prompt \ else ("%s " + new_prompt) new_prompt = new_prompt % curr_prompt new_prompt = self.escape_string(new_prompt) self._addline('set prompt=%s' % new_prompt) def _saferefenv(self, key): self._addline("if (!($?%s)) setenv %s" % (key, key))
[docs] def setenv(self, key, value): value = self.escape_string(value) self._addline('setenv %s %s' % (key, value))
[docs] def unsetenv(self, key): self._addline("unsetenv %s" % key)
[docs] def alias(self, key, value): value = EscapedString.disallow(value) self._addline("alias %s '%s';" % (key, value))
[docs] def source(self, value): value = self.escape_string(value) self._addline('source %s' % value)
[docs]def register_plugin(): if platform_.name != "windows": return CSH
# Copyright 2013-2016 Allan Johns. # # This library is free software: you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation, either # version 3 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library. If not, see <http://www.gnu.org/licenses/>.