Page MenuHomePhabricator

D20910.diff
No OneTemporary

D20910.diff

diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -985,6 +985,7 @@
'DiffusionRepositoryFunctionDatasource' => 'applications/diffusion/typeahead/DiffusionRepositoryFunctionDatasource.php',
'DiffusionRepositoryHistoryManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryHistoryManagementPanel.php',
'DiffusionRepositoryIdentityEditor' => 'applications/diffusion/editor/DiffusionRepositoryIdentityEditor.php',
+ 'DiffusionRepositoryIdentityEngine' => 'applications/diffusion/identity/DiffusionRepositoryIdentityEngine.php',
'DiffusionRepositoryIdentitySearchEngine' => 'applications/diffusion/query/DiffusionRepositoryIdentitySearchEngine.php',
'DiffusionRepositoryLimitsManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryLimitsManagementPanel.php',
'DiffusionRepositoryListController' => 'applications/diffusion/controller/DiffusionRepositoryListController.php',
@@ -6966,6 +6967,7 @@
'DiffusionRepositoryFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
'DiffusionRepositoryHistoryManagementPanel' => 'DiffusionRepositoryManagementPanel',
'DiffusionRepositoryIdentityEditor' => 'PhabricatorApplicationTransactionEditor',
+ 'DiffusionRepositoryIdentityEngine' => 'Phobject',
'DiffusionRepositoryIdentitySearchEngine' => 'PhabricatorApplicationSearchEngine',
'DiffusionRepositoryLimitsManagementPanel' => 'DiffusionRepositoryManagementPanel',
'DiffusionRepositoryListController' => 'DiffusionController',
diff --git a/src/applications/diffusion/identity/DiffusionRepositoryIdentityEngine.php b/src/applications/diffusion/identity/DiffusionRepositoryIdentityEngine.php
new file mode 100644
--- /dev/null
+++ b/src/applications/diffusion/identity/DiffusionRepositoryIdentityEngine.php
@@ -0,0 +1,80 @@
+<?php
+
+final class DiffusionRepositoryIdentityEngine
+ extends Phobject {
+
+ private $viewer;
+ private $sourcePHID;
+
+ public function setViewer(PhabricatorUser $viewer) {
+ $this->viewer = $viewer;
+ return $this;
+ }
+
+ public function getViewer() {
+ return $this->viewer;
+ }
+
+ public function setSourcePHID($source_phid) {
+ $this->sourcePHID = $source_phid;
+ return $this;
+ }
+
+ public function getSourcePHID() {
+ if (!$this->sourcePHID) {
+ throw new PhutilInvalidStateException('setSourcePHID');
+ }
+
+ return $this->sourcePHID;
+ }
+
+ public function newResolvedIdentity($raw_identity) {
+ $identity = $this->loadRawIdentity($raw_identity);
+
+ if (!$identity) {
+ $identity = $this->newIdentity($raw_identity);
+ }
+
+ return $this->updateIdentity($identity);
+ }
+
+ public function newUpdatedIdentity(PhabricatorRepositoryIdentity $identity) {
+ return $this->updateIdentity($identity);
+ }
+
+ private function loadRawIdentity($raw_identity) {
+ $viewer = $this->getViewer();
+
+ return id(new PhabricatorRepositoryIdentityQuery())
+ ->setViewer($viewer)
+ ->withIdentityNames(array($raw_identity))
+ ->executeOne();
+ }
+
+ private function newIdentity($raw_identity) {
+ $source_phid = $this->getSourcePHID();
+
+ return id(new PhabricatorRepositoryIdentity())
+ ->setAuthorPHID($source_phid)
+ ->setIdentityName($raw_identity);
+ }
+
+ private function resolveIdentity(PhabricatorRepositoryIdentity $identity) {
+ $raw_identity = $identity->getIdentityName();
+
+ return id(new DiffusionResolveUserQuery())
+ ->withName($raw_identity)
+ ->execute();
+ }
+
+ private function updateIdentity(PhabricatorRepositoryIdentity $identity) {
+ $resolved_phid = $this->resolveIdentity($identity);
+
+ $identity
+ ->setAutomaticGuessedUserPHID($resolved_phid)
+ ->save();
+
+ return $identity;
+ }
+
+}
diff --git a/src/applications/repository/management/PhabricatorRepositoryManagementRebuildIdentitiesWorkflow.php b/src/applications/repository/management/PhabricatorRepositoryManagementRebuildIdentitiesWorkflow.php
--- a/src/applications/repository/management/PhabricatorRepositoryManagementRebuildIdentitiesWorkflow.php
+++ b/src/applications/repository/management/PhabricatorRepositoryManagementRebuildIdentitiesWorkflow.php
@@ -3,6 +3,8 @@
final class PhabricatorRepositoryManagementRebuildIdentitiesWorkflow
extends PhabricatorRepositoryManagementWorkflow {
+ private $identityCache = array();
+
protected function didConstruct() {
$this
->setName('rebuild-identities')
@@ -94,31 +96,21 @@
}
private function getIdentityForCommit(
- PhabricatorRepositoryCommit $commit, $identity_name) {
-
- static $seen = array();
- $identity_key = PhabricatorHash::digestForIndex($identity_name);
- if (empty($seen[$identity_key])) {
- try {
- $user_phid = id(new DiffusionResolveUserQuery())
- ->withName($identity_name)
- ->execute();
-
- $identity = id(new PhabricatorRepositoryIdentity())
- ->setAuthorPHID($commit->getPHID())
- ->setIdentityName($identity_name)
- ->setAutomaticGuessedUserPHID($user_phid)
- ->save();
- } catch (AphrontDuplicateKeyQueryException $ex) {
- // Somehow this identity already exists?
- $identity = id(new PhabricatorRepositoryIdentityQuery())
- ->setViewer(PhabricatorUser::getOmnipotentUser())
- ->withIdentityNames(array($identity_name))
- ->executeOne();
- }
- $seen[$identity_key] = $identity;
+ PhabricatorRepositoryCommit $commit,
+ $raw_identity) {
+
+ if (!isset($this->identityCache[$raw_identity])) {
+ $viewer = $this->getViewer();
+
+ $identity = id(new DiffusionRepositoryIdentityEngine())
+ ->setViewer($viewer)
+ ->setSourcePHID($commit->getPHID())
+ ->newResolvedIdentity($raw_identity);
+
+ $this->identityCache[$raw_identity] = $identity;
}
- return $seen[$identity_key];
+ return $this->identityCache[$raw_identity];
}
+
}
diff --git a/src/applications/repository/worker/PhabricatorRepositoryIdentityChangeWorker.php b/src/applications/repository/worker/PhabricatorRepositoryIdentityChangeWorker.php
--- a/src/applications/repository/worker/PhabricatorRepositoryIdentityChangeWorker.php
+++ b/src/applications/repository/worker/PhabricatorRepositoryIdentityChangeWorker.php
@@ -1,7 +1,7 @@
<?php
final class PhabricatorRepositoryIdentityChangeWorker
-extends PhabricatorWorker {
+ extends PhabricatorWorker {
protected function doWork() {
$viewer = PhabricatorUser::getOmnipotentUser();
@@ -15,18 +15,20 @@
->executeOne();
$emails = id(new PhabricatorUserEmail())->loadAllWhere(
- 'userPHID = %s ORDER BY address',
+ 'userPHID = %s',
$user->getPHID());
+ $identity_engine = id(new DiffusionRepositoryIdentityEngine())
+ ->setViewer($viewer);
+
foreach ($emails as $email) {
$identities = id(new PhabricatorRepositoryIdentityQuery())
->setViewer($viewer)
- ->withEmailAddresses($email->getAddress())
+ ->withEmailAddresses(array($email->getAddress()))
->execute();
foreach ($identities as $identity) {
- $identity->setAutomaticGuessedUserPHID($user->getPHID())
- ->save();
+ $identity_engine->newUpdatedIdentity($identity);
}
}
}
diff --git a/src/applications/repository/worker/commitmessageparser/PhabricatorRepositoryCommitMessageParserWorker.php b/src/applications/repository/worker/commitmessageparser/PhabricatorRepositoryCommitMessageParserWorker.php
--- a/src/applications/repository/worker/commitmessageparser/PhabricatorRepositoryCommitMessageParserWorker.php
+++ b/src/applications/repository/worker/commitmessageparser/PhabricatorRepositoryCommitMessageParserWorker.php
@@ -65,37 +65,20 @@
$message = $ref->getMessage();
$committer = $ref->getCommitter();
$hashes = $ref->getHashes();
+ $has_committer = (bool)strlen($committer);
- $author_identity = id(new PhabricatorRepositoryIdentityQuery())
- ->setViewer(PhabricatorUser::getOmnipotentUser())
- ->withIdentityNames(array($author))
- ->executeOne();
+ $viewer = PhabricatorUser::getOmnipotentUser();
- if (!$author_identity) {
- $author_identity = id(new PhabricatorRepositoryIdentity())
- ->setAuthorPHID($commit->getPHID())
- ->setIdentityName($author)
- ->setAutomaticGuessedUserPHID(
- $this->resolveUserPHID($commit, $author))
- ->save();
- }
+ $identity_engine = id(new DiffusionRepositoryIdentityEngine())
+ ->setViewer($viewer)
+ ->setSourcePHID($commit->getPHID());
- $committer_identity = null;
-
- if ($committer) {
- $committer_identity = id(new PhabricatorRepositoryIdentityQuery())
- ->setViewer(PhabricatorUser::getOmnipotentUser())
- ->withIdentityNames(array($committer))
- ->executeOne();
-
- if (!$committer_identity) {
- $committer_identity = id(new PhabricatorRepositoryIdentity())
- ->setAuthorPHID($commit->getPHID())
- ->setIdentityName($committer)
- ->setAutomaticGuessedUserPHID(
- $this->resolveUserPHID($commit, $committer))
- ->save();
- }
+ $author_identity = $identity_engine->newResolvedIdentity($author);
+
+ if ($has_committer) {
+ $committer_identity = $identity_engine->newResolvedIdentity($committer);
+ } else {
+ $committer_identity = null;
}
$data = id(new PhabricatorRepositoryCommitData())->loadOneWhere(
@@ -117,11 +100,11 @@
'authorIdentityPHID', $author_identity->getPHID());
$data->setCommitDetail(
'authorPHID',
- $this->resolveUserPHID($commit, $author));
+ $author_identity->getCurrentEffectiveUserPHID());
$data->setCommitMessage($message);
- if (strlen($committer)) {
+ if ($has_committer) {
$data->setCommitDetail('committer', $committer);
$data->setCommitDetail('committerName', $ref->getCommitterName());
@@ -129,7 +112,8 @@
$data->setCommitDetail(
'committerPHID',
- $this->resolveUserPHID($commit, $committer));
+ $committer_identity->getCurrentEffectiveUserPHID());
+
$data->setCommitDetail(
'committerIdentityPHID', $committer_identity->getPHID());
@@ -177,15 +161,6 @@
PhabricatorRepositoryCommit::IMPORTED_MESSAGE);
}
- private function resolveUserPHID(
- PhabricatorRepositoryCommit $commit,
- $user_name) {
-
- return id(new DiffusionResolveUserQuery())
- ->withName($user_name)
- ->execute();
- }
-
private function closeRevisions(
PhabricatorUser $actor,
DiffusionCommitRef $ref,

File Metadata

Mime Type
text/plain
Expires
Wed, Nov 27, 5:22 AM (20 h, 35 m)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6792062
Default Alt Text
D20910.diff (10 KB)

Event Timeline