Differential D21158 Diff 50376 src/infrastructure/diff/viewstate/PhabricatorChangesetViewStateEngine.php
Changeset View
Changeset View
Standalone View
Standalone View
src/infrastructure/diff/viewstate/PhabricatorChangesetViewStateEngine.php
| Show First 20 Lines • Show All 54 Lines • ▼ Show 20 Lines | if ($engine !== null) { | ||||
| $this->setChangesetProperty('engine', $engine); | $this->setChangesetProperty('engine', $engine); | ||||
| } | } | ||||
| $renderer = $request->getStr('renderer'); | $renderer = $request->getStr('renderer'); | ||||
| if ($renderer !== null) { | if ($renderer !== null) { | ||||
| $this->setChangesetProperty('renderer', $renderer); | $this->setChangesetProperty('renderer', $renderer); | ||||
| } | } | ||||
| $hidden = $request->getStr('hidden'); | |||||
| if ($hidden !== null) { | |||||
| $this->setChangesetProperty('hidden', (int)$hidden); | |||||
| } | |||||
| $this->saveViewStateStorage(); | $this->saveViewStateStorage(); | ||||
| $state = new PhabricatorChangesetViewState(); | $state = new PhabricatorChangesetViewState(); | ||||
| $highlight_language = $this->getChangesetProperty('highlight'); | $highlight_language = $this->getChangesetProperty('highlight'); | ||||
| $state->setHighlightLanguage($highlight_language); | $state->setHighlightLanguage($highlight_language); | ||||
| $encoding = $this->getChangesetProperty('encoding'); | $encoding = $this->getChangesetProperty('encoding'); | ||||
| $state->setCharacterEncoding($encoding); | $state->setCharacterEncoding($encoding); | ||||
| $document_engine = $this->getChangesetProperty('engine'); | $document_engine = $this->getChangesetProperty('engine'); | ||||
| $state->setDocumentEngineKey($document_engine); | $state->setDocumentEngineKey($document_engine); | ||||
| $renderer = $this->getChangesetProperty('renderer'); | $renderer = $this->getChangesetProperty('renderer'); | ||||
| $state->setRendererKey($renderer); | $state->setRendererKey($renderer); | ||||
| $this->updateHiddenState($state); | |||||
| // This is the client-selected default renderer based on viewport | // This is the client-selected default renderer based on viewport | ||||
| // dimensions. | // dimensions. | ||||
| $device_key = $request->getStr('device'); | $device_key = $request->getStr('device'); | ||||
| if ($device_key !== null && strlen($device_key)) { | if ($device_key !== null) { | ||||
| $state->setDefaultDeviceRendererKey($device_key); | $state->setDefaultDeviceRendererKey($device_key); | ||||
| } | } | ||||
| $discard_response = $request->getStr('discard'); | |||||
| if ($discard_response !== null) { | |||||
| $state->setDiscardResponse(true); | |||||
| } | |||||
| return $state; | return $state; | ||||
| } | } | ||||
| private function setStorage(DifferentialViewState $storage) { | private function setStorage(DifferentialViewState $storage) { | ||||
| $this->storage = $storage; | $this->storage = $storage; | ||||
| return $this; | return $this; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 74 Lines • ▼ Show 20 Lines | private function saveViewStateStorage() { | ||||
| } catch (AphrontDuplicateKeyQueryException $ex) { | } catch (AphrontDuplicateKeyQueryException $ex) { | ||||
| // We may race another process to save view state. For now, just discard | // We may race another process to save view state. For now, just discard | ||||
| // our state if we do. | // our state if we do. | ||||
| } | } | ||||
| unset($unguarded); | unset($unguarded); | ||||
| } | } | ||||
| private function updateHiddenState(PhabricatorChangesetViewState $state) { | |||||
| $is_hidden = false; | |||||
| $was_modified = false; | |||||
| $storage = $this->getStorage(); | |||||
| $changeset = $this->getChangeset(); | |||||
| $entries = $storage->getChangesetPropertyEntries($changeset, 'hidden'); | |||||
| $entries = isort($entries, 'epoch'); | |||||
| if ($entries) { | |||||
| $other_phid = last_key($entries); | |||||
| $other_spec = last($entries); | |||||
| $this_version = (int)$changeset->getDiffID(); | |||||
| $other_version = (int)idx($other_spec, 'diffID'); | |||||
| $other_value = (bool)idx($other_spec, 'value', false); | |||||
| if ($other_value === false) { | |||||
| $is_hidden = false; | |||||
| } else if ($other_version >= $this_version) { | |||||
| $is_hidden = $other_value; | |||||
| } else { | |||||
| $viewer = $this->getViewer(); | |||||
| $other_changeset = id(new DifferentialChangesetQuery()) | |||||
| ->setViewer($viewer) | |||||
| ->withPHIDs(array($other_phid)) | |||||
| ->executeOne(); | |||||
| $is_modified = false; | |||||
| if ($other_changeset) { | |||||
| if (!$changeset->hasSameEffectAs($other_changeset)) { | |||||
| $is_modified = true; | |||||
| } | |||||
| } | |||||
| $is_hidden = false; | |||||
| $was_modified = true; | |||||
| } | |||||
| } | |||||
| $state->setHidden($is_hidden); | |||||
| $state->setModifiedSinceHide($was_modified); | |||||
| } | |||||
| } | } | ||||