D1683: sshpeer: allow for additional environment passing to ssh exe
This revision was automatically updated to reflect the committed changes. Closed by commit rHG47921dafb44b: sshpeer: allow for additional environment passing to ssh exe (authored by ikostia, committed by ). REPOSITORY rHG Mercurial CHANGES SINCE LAST UPDATE https://phab.mercurial-scm.org/D1683?vs=4429=4519 REVISION DETAIL https://phab.mercurial-scm.org/D1683 AFFECTED FILES mercurial/sshpeer.py tests/test-ssh.t CHANGE DETAILS diff --git a/tests/test-ssh.t b/tests/test-ssh.t --- a/tests/test-ssh.t +++ b/tests/test-ssh.t @@ -596,3 +596,21 @@ abort: no suitable response from remote hg! (Please see http://company/internalwiki/ssh.html) [255] + +test that custom environment is passed down to ssh executable + $ cat >>dumpenv < #! /bin/sh + > echo \$VAR >&2 + > EOF + $ chmod +x dumpenv + $ hg pull ssh://something --config ui.ssh="./dumpenv" + pulling from ssh://something/ + remote: + abort: no suitable response from remote hg! + [255] + $ hg pull ssh://something --config ui.ssh="./dumpenv" --config sshenv.VAR=17 + pulling from ssh://something/ + remote: 17 + abort: no suitable response from remote hg! + [255] + diff --git a/mercurial/sshpeer.py b/mercurial/sshpeer.py --- a/mercurial/sshpeer.py +++ b/mercurial/sshpeer.py @@ -136,19 +136,21 @@ sshcmd = self.ui.config("ui", "ssh") remotecmd = self.ui.config("ui", "remotecmd") +sshaddenv = dict(self.ui.configitems("sshenv")) +sshenv = util.shellenviron(sshaddenv) args = util.sshargs(sshcmd, self._host, self._user, self._port) if create: cmd = '%s %s %s' % (sshcmd, args, util.shellquote("%s init %s" % (_serverquote(remotecmd), _serverquote(self._path ui.debug('running %s\n' % cmd) -res = ui.system(cmd, blockedtag='sshpeer') +res = ui.system(cmd, blockedtag='sshpeer', environ=sshenv) if res != 0: self._abort(error.RepoError(_("could not create remote repo"))) -self._validaterepo(sshcmd, args, remotecmd) +self._validaterepo(sshcmd, args, remotecmd, sshenv) # Begin of _basepeer interface. @@ -180,7 +182,7 @@ # End of _basewirecommands interface. -def _validaterepo(self, sshcmd, args, remotecmd): +def _validaterepo(self, sshcmd, args, remotecmd, sshenv=None): # cleanup up previous run self._cleanup() @@ -196,7 +198,7 @@ # no buffer allow the use of 'select' # feel free to remove buffering and select usage when we ultimately # move to threading. -sub = util.popen4(cmd, bufsize=0) +sub = util.popen4(cmd, bufsize=0, env=sshenv) self._pipeo, self._pipei, self._pipee, self._subprocess = sub self._pipei = util.bufferedinputpipe(self._pipei) To: ikostia, #hg-reviewers, mbthomas, durin42 Cc: durin42, mbthomas, mercurial-devel ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
D1683: sshpeer: allow for additional environment passing to ssh exe
durin42 accepted this revision. durin42 added a comment. This revision is now accepted and ready to land. Ugh. But clearly needed. REPOSITORY rHG Mercurial BRANCH default REVISION DETAIL https://phab.mercurial-scm.org/D1683 To: ikostia, #hg-reviewers, mbthomas, durin42 Cc: durin42, mbthomas, mercurial-devel ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
D1683: sshpeer: allow for additional environment passing to ssh exe
mbthomas accepted this revision. mbthomas added a comment. Looks reasonable to me. This could also be achieved by making SSH a script which sets the environment up and invokes the real SSH, but that's clumsy, whereas this allows use of config to set the env vars. REPOSITORY rHG Mercurial REVISION DETAIL https://phab.mercurial-scm.org/D1683 To: ikostia, #hg-reviewers, mbthomas Cc: mbthomas, mercurial-devel ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
D1683: sshpeer: allow for additional environment passing to ssh exe
ikostia created this revision. Herald added a subscriber: mercurial-devel. Herald added a reviewer: hg-reviewers. REVISION SUMMARY We already have the ability to customize the ssh command line arguments, let's add the ability to customize its environment as well. Example use-case is ssh.exe from Git on Windows. If `HOME` enviroment variable is present and has some non-empty value, ssh.exe will try to access that location for some stuff (for example, it seems for resolving `~` in `.ssh/config`). Git for Windows seems to sometimess set this variable to the value of `/home/username` which probably works under Git Bash, but does not work in a native `cmd.exe` or `powershell`. Whatever the root cause, setting `HOME` to be an empty string heals things. Therefore, some distributors might want to set `sshenv.HOME=` in the configuration (seems less intrusive that forcing everyone to tweak their env). TEST PLAN - rt REPOSITORY rHG Mercurial BRANCH default REVISION DETAIL https://phab.mercurial-scm.org/D1683 AFFECTED FILES mercurial/sshpeer.py tests/test-ssh.t CHANGE DETAILS diff --git a/tests/test-ssh.t b/tests/test-ssh.t --- a/tests/test-ssh.t +++ b/tests/test-ssh.t @@ -596,3 +596,21 @@ abort: no suitable response from remote hg! (Please see http://company/internalwiki/ssh.html) [255] + +test that custom environment is passed down to ssh executable + $ cat >>dumpenv < #! /bin/sh + > echo \$VAR >&2 + > EOF + $ chmod +x dumpenv + $ hg pull ssh://something --config ui.ssh="./dumpenv" + pulling from ssh://something/ + remote: + abort: no suitable response from remote hg! + [255] + $ hg pull ssh://something --config ui.ssh="./dumpenv" --config sshenv.VAR=17 + pulling from ssh://something/ + remote: 17 + abort: no suitable response from remote hg! + [255] + diff --git a/mercurial/sshpeer.py b/mercurial/sshpeer.py --- a/mercurial/sshpeer.py +++ b/mercurial/sshpeer.py @@ -136,19 +136,21 @@ sshcmd = self.ui.config("ui", "ssh") remotecmd = self.ui.config("ui", "remotecmd") +sshaddenv = dict(self.ui.configitems("sshenv")) +sshenv = util.shellenviron(sshaddenv) args = util.sshargs(sshcmd, self._host, self._user, self._port) if create: cmd = '%s %s %s' % (sshcmd, args, util.shellquote("%s init %s" % (_serverquote(remotecmd), _serverquote(self._path ui.debug('running %s\n' % cmd) -res = ui.system(cmd, blockedtag='sshpeer') +res = ui.system(cmd, blockedtag='sshpeer', environ=sshenv) if res != 0: self._abort(error.RepoError(_("could not create remote repo"))) -self._validaterepo(sshcmd, args, remotecmd) +self._validaterepo(sshcmd, args, remotecmd, sshenv) # Begin of _basepeer interface. @@ -180,7 +182,7 @@ # End of _basewirecommands interface. -def _validaterepo(self, sshcmd, args, remotecmd): +def _validaterepo(self, sshcmd, args, remotecmd, sshenv=None): # cleanup up previous run self._cleanup() @@ -196,7 +198,7 @@ # no buffer allow the use of 'select' # feel free to remove buffering and select usage when we ultimately # move to threading. -sub = util.popen4(cmd, bufsize=0) +sub = util.popen4(cmd, bufsize=0, env=sshenv) self._pipeo, self._pipei, self._pipee, self._subprocess = sub self._pipei = util.bufferedinputpipe(self._pipei) To: ikostia, #hg-reviewers Cc: mercurial-devel ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel