Patchwork D1683: sshpeer: allow for additional environment passing to ssh exe

login
register
mail settings
Submitter phabricator
Date Dec. 14, 2017, 2:39 p.m.
Message ID <differential-rev-PHID-DREV-i72tjd5bspjg2sawwk3i-req@phab.mercurial-scm.org>
Download mbox | patch
Permalink /patch/26281/
State Superseded
Headers show

Comments

phabricator - Dec. 14, 2017, 2:39 p.m.
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




To: ikostia, #hg-reviewers
Cc: mercurial-devel
phabricator - Dec. 14, 2017, 4:21 p.m.
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
phabricator - Dec. 15, 2017, 9:14 p.m.
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

Patch

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 <<EOF
+  > #! /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)