mirror of
https://we.phorge.it/source/arcanist.git
synced 2024-11-22 06:42:41 +01:00
Disable 'textconv' when diffing
Summary: Adds "--no-textconv" to all 'git diff' commands so we don't invoke textconv. See T178 for discussion. Test Plan: Added something like this to .gitattributes: *.txt diff=uppercase And then this to .git/config: [diff "uppercase"] textconv = /path/to/uppercase ...where "uppercase" is a script which takes a file and emits an uppercase version of it. Then I added a "wisdom.txt" text file: The cow goes "moo". The duck goes "quack". Without this patch, the file appears in uppercase in Differential, i.e. textconv runs. With this patch, it appears as the original text. Reviewed By: tuomaspelkonen Reviewers: tuomaspelkonen, jungejason, aran CC: elgenie, aran, tuomaspelkonen Differential Revision: 372
This commit is contained in:
parent
857f08ae47
commit
5b6fbf70e0
1 changed files with 24 additions and 7 deletions
|
@ -60,11 +60,11 @@ class ArcanistGitAPI extends ArcanistRepositoryAPI {
|
||||||
return $this->relativeCommit;
|
return $this->relativeCommit;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getDiffOptions() {
|
private function getDiffFullOptions() {
|
||||||
$options = array(
|
$options = array(
|
||||||
|
self::getDiffBaseOptions(),
|
||||||
'-M',
|
'-M',
|
||||||
'-C',
|
'-C',
|
||||||
'--no-ext-diff',
|
|
||||||
'--no-color',
|
'--no-color',
|
||||||
'--src-prefix=a/',
|
'--src-prefix=a/',
|
||||||
'--dst-prefix=b/',
|
'--dst-prefix=b/',
|
||||||
|
@ -73,8 +73,22 @@ class ArcanistGitAPI extends ArcanistRepositoryAPI {
|
||||||
return implode(' ', $options);
|
return implode(' ', $options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function getDiffBaseOptions() {
|
||||||
|
$options = array(
|
||||||
|
// Disable external diff drivers, like graphical differs, since Arcanist
|
||||||
|
// needs to capture the diff text.
|
||||||
|
'--no-ext-diff',
|
||||||
|
// Disable textconv so we treat binary files as binary, even if they have
|
||||||
|
// an alternative textual representation. TODO: Ideally, Differential
|
||||||
|
// would ship up the binaries for 'arc patch' but display the textconv
|
||||||
|
// output in the visual diff.
|
||||||
|
'--no-textconv',
|
||||||
|
);
|
||||||
|
return implode(' ', $options);
|
||||||
|
}
|
||||||
|
|
||||||
public function getFullGitDiff() {
|
public function getFullGitDiff() {
|
||||||
$options = $this->getDiffOptions();
|
$options = $this->getDiffFullOptions();
|
||||||
list($stdout) = execx(
|
list($stdout) = execx(
|
||||||
"(cd %s; git diff {$options} %s --)",
|
"(cd %s; git diff {$options} %s --)",
|
||||||
$this->getPath(),
|
$this->getPath(),
|
||||||
|
@ -84,7 +98,7 @@ class ArcanistGitAPI extends ArcanistRepositoryAPI {
|
||||||
|
|
||||||
public function getRawDiffText($path) {
|
public function getRawDiffText($path) {
|
||||||
$relative_commit = $this->getRelativeCommit();
|
$relative_commit = $this->getRelativeCommit();
|
||||||
$options = $this->getDiffOptions();
|
$options = $this->getDiffFullOptions();
|
||||||
list($stdout) = execx(
|
list($stdout) = execx(
|
||||||
"(cd %s; git diff {$options} %s -- %s)",
|
"(cd %s; git diff {$options} %s -- %s)",
|
||||||
$this->getPath(),
|
$this->getPath(),
|
||||||
|
@ -167,16 +181,18 @@ class ArcanistGitAPI extends ArcanistRepositoryAPI {
|
||||||
public function getWorkingCopyStatus() {
|
public function getWorkingCopyStatus() {
|
||||||
if (!isset($this->status)) {
|
if (!isset($this->status)) {
|
||||||
|
|
||||||
|
$options = $this->getDiffBaseOptions();
|
||||||
|
|
||||||
// Find committed changes.
|
// Find committed changes.
|
||||||
list($stdout) = execx(
|
list($stdout) = execx(
|
||||||
'(cd %s; git diff --no-ext-diff --raw %s --)',
|
"(cd %s; git diff {$options} --raw %s --)",
|
||||||
$this->getPath(),
|
$this->getPath(),
|
||||||
$this->getRelativeCommit());
|
$this->getRelativeCommit());
|
||||||
$files = $this->parseGitStatus($stdout);
|
$files = $this->parseGitStatus($stdout);
|
||||||
|
|
||||||
// Find uncommitted changes.
|
// Find uncommitted changes.
|
||||||
list($stdout) = execx(
|
list($stdout) = execx(
|
||||||
'(cd %s; git diff --no-ext-diff --raw HEAD --)',
|
"(cd %s; git diff {$options} --raw HEAD --)",
|
||||||
$this->getPath());
|
$this->getPath());
|
||||||
$uncommitted_files = $this->parseGitStatus($stdout);
|
$uncommitted_files = $this->parseGitStatus($stdout);
|
||||||
foreach ($uncommitted_files as $path => $mask) {
|
foreach ($uncommitted_files as $path => $mask) {
|
||||||
|
@ -230,8 +246,9 @@ class ArcanistGitAPI extends ArcanistRepositoryAPI {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getPreReceiveHookStatus($old_ref, $new_ref) {
|
public function getPreReceiveHookStatus($old_ref, $new_ref) {
|
||||||
|
$options = $this->getDiffBaseOptions();
|
||||||
list($stdout) = execx(
|
list($stdout) = execx(
|
||||||
'(cd %s && git diff --no-ext-diff --raw %s %s --)',
|
"(cd %s && git diff {$options} --raw %s %s --)",
|
||||||
$this->getPath(),
|
$this->getPath(),
|
||||||
$old_ref,
|
$old_ref,
|
||||||
$new_ref);
|
$new_ref);
|
||||||
|
|
Loading…
Reference in a new issue