mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-25 16:22:43 +01:00
Specify HOME when invoking Git commands
Summary: Fixes T2965, see that task for discussion. This is dumb but seems like our best bet. Test Plan: - Installed newish version of Git. - Set HOME on the websever to `/var/root` (or any other unreadable directory). - Hit the error described in T2965 when viewing Diffusion. - Applied this patch. - Diffusion works. Reviewers: btrahan, joel Reviewed By: btrahan CC: aran, chad Maniphest Tasks: T2965 Differential Revision: https://secure.phabricator.com/D5994
This commit is contained in:
parent
88fec4908b
commit
c48f64b391
2 changed files with 27 additions and 4 deletions
|
@ -159,6 +159,8 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO
|
||||||
$pattern = $args[0];
|
$pattern = $args[0];
|
||||||
$args = array_slice($args, 1);
|
$args = array_slice($args, 1);
|
||||||
|
|
||||||
|
$empty = $this->getEmptyReadableDirectoryPath();
|
||||||
|
|
||||||
if ($this->shouldUseSSH()) {
|
if ($this->shouldUseSSH()) {
|
||||||
switch ($this->getVersionControlSystem()) {
|
switch ($this->getVersionControlSystem()) {
|
||||||
case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
|
case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
|
||||||
|
@ -175,8 +177,9 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO
|
||||||
'csprintf',
|
'csprintf',
|
||||||
array_merge(
|
array_merge(
|
||||||
array(
|
array(
|
||||||
"(ssh-add %s && git {$pattern})",
|
"(ssh-add %s && HOME=%s git {$pattern})",
|
||||||
$this->getSSHKeyfile(),
|
$this->getSSHKeyfile(),
|
||||||
|
$empty,
|
||||||
),
|
),
|
||||||
$args));
|
$args));
|
||||||
$pattern = "ssh-agent sh -c %s";
|
$pattern = "ssh-agent sh -c %s";
|
||||||
|
@ -239,7 +242,8 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO
|
||||||
$pattern = "svn --non-interactive {$pattern}";
|
$pattern = "svn --non-interactive {$pattern}";
|
||||||
break;
|
break;
|
||||||
case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
|
case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
|
||||||
$pattern = "git {$pattern}";
|
$pattern = "HOME=%s git {$pattern}";
|
||||||
|
array_unshift($args, $empty);
|
||||||
break;
|
break;
|
||||||
case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
|
case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
|
||||||
$pattern = "hg {$pattern}";
|
$pattern = "hg {$pattern}";
|
||||||
|
@ -258,14 +262,16 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO
|
||||||
$pattern = $args[0];
|
$pattern = $args[0];
|
||||||
$args = array_slice($args, 1);
|
$args = array_slice($args, 1);
|
||||||
|
|
||||||
|
$empty = $this->getEmptyReadableDirectoryPath();
|
||||||
|
|
||||||
switch ($this->getVersionControlSystem()) {
|
switch ($this->getVersionControlSystem()) {
|
||||||
case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
|
case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
|
||||||
$pattern = "(cd %s && svn --non-interactive {$pattern})";
|
$pattern = "(cd %s && svn --non-interactive {$pattern})";
|
||||||
array_unshift($args, $this->getLocalPath());
|
array_unshift($args, $this->getLocalPath());
|
||||||
break;
|
break;
|
||||||
case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
|
case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
|
||||||
$pattern = "(cd %s && git {$pattern})";
|
$pattern = "(cd %s && HOME=%s git {$pattern})";
|
||||||
array_unshift($args, $this->getLocalPath());
|
array_unshift($args, $this->getLocalPath(), $empty);
|
||||||
break;
|
break;
|
||||||
case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
|
case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
|
||||||
$hgplain = (phutil_is_windows() ? "set HGPLAIN=1 &&" : "HGPLAIN=1");
|
$hgplain = (phutil_is_windows() ? "set HGPLAIN=1 &&" : "HGPLAIN=1");
|
||||||
|
@ -281,6 +287,17 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO
|
||||||
return $args;
|
return $args;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function getEmptyReadableDirectoryPath() {
|
||||||
|
// See T2965. Some time after Git 1.7.5.4, Git started fataling if it can
|
||||||
|
// not read $HOME. For many users, $HOME points at /root (this seems to be
|
||||||
|
// a default result of Apache setup). Instead, explicitly point $HOME at a
|
||||||
|
// readable, empty directory so that Git looks for the config file it's
|
||||||
|
// after, fails to locate it, and moves on. This is really silly, but seems
|
||||||
|
// like the least damaging approach to mitigating the issue.
|
||||||
|
$root = dirname(phutil_get_library_root('phabricator'));
|
||||||
|
return $root.'/support/empty/';
|
||||||
|
}
|
||||||
|
|
||||||
private function getSSHLogin() {
|
private function getSSHLogin() {
|
||||||
return $this->getDetail('ssh-login');
|
return $this->getDetail('ssh-login');
|
||||||
}
|
}
|
||||||
|
|
6
support/empty/README
Normal file
6
support/empty/README
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
This is an empty, readable directory. If you need an empty, readable directory
|
||||||
|
for some reason, you can use this one.
|
||||||
|
|
||||||
|
Of course, it's not quite empty because it has this file in it. So it's a
|
||||||
|
mostly-empty, readable directory.
|
||||||
|
|
Loading…
Reference in a new issue