1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-24 14:30:56 +01:00

Allow Diffusion to display the initial commit in Git repositories

Summary: See T507. Since you can't do "xxxxxxxx^" where "xxxxxxxx" is the first
commit in a repository, fall back to diffing against the empty tree if we fail
to diff against the parent commit.

Test Plan: Looked at the first commit in libphutil on my local.

Reviewers: edward, jungejason, nh, tuomaspelkonen, aran

Reviewed By: nh

CC: aran, edward, epriestley, nh

Differential Revision: 953
This commit is contained in:
epriestley 2011-09-21 16:05:43 -07:00
parent 05084b2e57
commit 8e8d91a1ff
3 changed files with 32 additions and 7 deletions

View file

@ -44,12 +44,36 @@ final class DiffusionGitDiffQuery extends DiffusionDiffQuery {
); );
$options = implode(' ', $options); $options = implode(' ', $options);
try {
list($raw_diff) = execx( list($raw_diff) = execx(
"(cd %s && git diff {$options} %s^ %s -- %s)", "(cd %s && git diff %C %s^ %s -- %s)",
$repository->getDetail('local-path'), $repository->getDetail('local-path'),
$options,
$effective_commit, $effective_commit,
$effective_commit, $effective_commit,
$drequest->getPath()); $drequest->getPath());
} catch (CommandException $ex) {
// Check if this is the root commit by seeing if it has parents.
list($parents) = execx(
'(cd %s && git log --format=%s %s --)',
$repository->getDetail('local-path'),
'%P', // "parents"
$effective_commit);
if (!strlen(trim($parents))) {
// No parents means we're looking at the root revision. Diff against
// the empty tree hash instead, since there is no parent so "^" does
// not work. See ArcanistGitAPI for more discussion.
list($raw_diff) = execx(
'(cd %s && git diff %C %s %s -- %s)',
$repository->getDetail('local-path'),
$options,
ArcanistGitAPI::GIT_MAGIC_ROOT_COMMIT,
$effective_commit,
$drequest->getPath());
} else {
throw $ex;
}
}
$parser = new ArcanistDiffParser(); $parser = new ArcanistDiffParser();
$parser->setDetectBinaryFiles(true); $parser->setDetectBinaryFiles(true);

View file

@ -7,6 +7,7 @@
phutil_require_module('arcanist', 'parser/diff'); phutil_require_module('arcanist', 'parser/diff');
phutil_require_module('arcanist', 'repository/api/git');
phutil_require_module('phabricator', 'applications/differential/storage/diff'); phutil_require_module('phabricator', 'applications/differential/storage/diff');
phutil_require_module('phabricator', 'applications/diffusion/query/diff/base'); phutil_require_module('phabricator', 'applications/diffusion/query/diff/base');

View file

@ -405,7 +405,7 @@ class PhabricatorRepositoryEditController
if ($is_git) { if ($is_git) {
$instructions = $instructions =
'Enter the URI to clone this repository from. It should look like '. 'Enter the URI to clone this repository from. It should look like '.
'<tt>git@github.com:example/example.git</tt>, <tt> '. '<tt>git@github.com:example/example.git</tt> or '.
'<tt>ssh://user@host.com/git/example.git</tt>'; '<tt>ssh://user@host.com/git/example.git</tt>';
} else if ($is_mercurial) { } else if ($is_mercurial) {
$instructions = $instructions =