2012-09-28 23:36:47 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
final class DiffusionRenameHistoryQuery {
|
|
|
|
|
|
|
|
private $oldCommit;
|
|
|
|
private $wasCreated;
|
|
|
|
private $request;
|
Diffusion - move commit parents query to conduit
Summary:
Ref T2784. Relatively complicated one as this bad boy is used in a repository daemon.
While testing, I noticed bugs in the expandshortname query stuff. Those variables are private to the parent class so they need some setX love.
Also, was unable to find links to the "before" stuff, but made them by hand by looking at some of these T2784 diffs, browsing a file at a specific revision, then hacking the "before" variable to be some known commit that also touched the file. This produced sensical results. On the process of doing that I upgraded a query to use the proper policy query.
Test Plan: In git, mercurial, svn, verified on a commit page the "parents" showed up correctly. played around with ?before parameter on specific file browse page, with commits known to have interesting history and stuff looked good
Reviewers: epriestley
Reviewed By: epriestley
CC: aran, Korvin
Maniphest Tasks: T2784
Differential Revision: https://secure.phabricator.com/D5988
2013-05-22 01:22:49 +02:00
|
|
|
private $viewer;
|
|
|
|
|
|
|
|
public function setViewer(PhabricatorUser $viewer) {
|
|
|
|
$this->viewer = $viewer;
|
|
|
|
return $this;
|
|
|
|
}
|
2012-09-28 23:36:47 +02:00
|
|
|
|
|
|
|
public function getWasCreated() {
|
|
|
|
return $this->wasCreated;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setRequest(DiffusionRequest $request) {
|
|
|
|
$this->request = $request;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setOldCommit($old_commit) {
|
|
|
|
$this->oldCommit = $old_commit;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getOldCommit() {
|
|
|
|
return $this->oldCommit;
|
|
|
|
}
|
|
|
|
|
|
|
|
final public function loadOldFilename() {
|
|
|
|
$drequest = $this->request;
|
|
|
|
$repository_id = $drequest->getRepository()->getID();
|
|
|
|
$conn_r = id(new PhabricatorRepository())->establishConnection('r');
|
|
|
|
|
|
|
|
$commit_id = $this->loadCommitId($this->oldCommit);
|
|
|
|
$old_commit_sequence = $this->loadCommitSequence($commit_id);
|
|
|
|
|
|
|
|
$path = '/'.$drequest->getPath();
|
|
|
|
$commit_id = $this->loadCommitId($drequest->getCommit());
|
|
|
|
|
|
|
|
do {
|
|
|
|
$commit_sequence = $this->loadCommitSequence($commit_id);
|
|
|
|
$change = queryfx_one(
|
|
|
|
$conn_r,
|
|
|
|
'SELECT pc.changeType, pc.targetCommitID, tp.path
|
|
|
|
FROM %T p
|
|
|
|
JOIN %T pc ON p.id = pc.pathID
|
|
|
|
LEFT JOIN %T tp ON pc.targetPathID = tp.id
|
|
|
|
WHERE p.pathHash = %s
|
|
|
|
AND pc.repositoryID = %d
|
|
|
|
AND pc.changeType IN (%d, %d)
|
|
|
|
AND pc.commitSequence BETWEEN %d AND %d
|
|
|
|
ORDER BY pc.commitSequence DESC
|
|
|
|
LIMIT 1',
|
|
|
|
PhabricatorRepository::TABLE_PATH,
|
|
|
|
PhabricatorRepository::TABLE_PATHCHANGE,
|
|
|
|
PhabricatorRepository::TABLE_PATH,
|
|
|
|
md5($path),
|
|
|
|
$repository_id,
|
|
|
|
ArcanistDiffChangeType::TYPE_MOVE_HERE,
|
|
|
|
ArcanistDiffChangeType::TYPE_ADD,
|
|
|
|
$old_commit_sequence,
|
|
|
|
$commit_sequence);
|
|
|
|
if ($change) {
|
|
|
|
if ($change['changeType'] == ArcanistDiffChangeType::TYPE_ADD) {
|
|
|
|
$this->wasCreated = true;
|
|
|
|
return $path;
|
|
|
|
}
|
|
|
|
$commit_id = $change['targetCommitID'];
|
|
|
|
$path = $change['path'];
|
|
|
|
}
|
|
|
|
} while ($change && $path);
|
|
|
|
|
|
|
|
return $path;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function loadCommitId($commit_identifier) {
|
Diffusion - move commit parents query to conduit
Summary:
Ref T2784. Relatively complicated one as this bad boy is used in a repository daemon.
While testing, I noticed bugs in the expandshortname query stuff. Those variables are private to the parent class so they need some setX love.
Also, was unable to find links to the "before" stuff, but made them by hand by looking at some of these T2784 diffs, browsing a file at a specific revision, then hacking the "before" variable to be some known commit that also touched the file. This produced sensical results. On the process of doing that I upgraded a query to use the proper policy query.
Test Plan: In git, mercurial, svn, verified on a commit page the "parents" showed up correctly. played around with ?before parameter on specific file browse page, with commits known to have interesting history and stuff looked good
Reviewers: epriestley
Reviewed By: epriestley
CC: aran, Korvin
Maniphest Tasks: T2784
Differential Revision: https://secure.phabricator.com/D5988
2013-05-22 01:22:49 +02:00
|
|
|
$commit = id(new DiffusionCommitQuery())
|
|
|
|
->setViewer($this->viewer)
|
|
|
|
->withIdentifiers(array($commit_identifier))
|
|
|
|
->withDefaultRepository($this->request->getRepository())
|
|
|
|
->executeOne();
|
2012-09-28 23:36:47 +02:00
|
|
|
return $commit->getID();
|
|
|
|
}
|
|
|
|
|
|
|
|
private function loadCommitSequence($commit_id) {
|
|
|
|
$conn_r = id(new PhabricatorRepository())->establishConnection('r');
|
|
|
|
$path_change = queryfx_one(
|
|
|
|
$conn_r,
|
|
|
|
'SELECT commitSequence
|
|
|
|
FROM %T
|
|
|
|
WHERE repositoryID = %d AND commitID = %d
|
|
|
|
LIMIT 1',
|
|
|
|
PhabricatorRepository::TABLE_PATHCHANGE,
|
|
|
|
$this->request->getRepository()->getID(),
|
|
|
|
$commit_id);
|
|
|
|
return reset($path_change);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|