Changeset View
Changeset View
Standalone View
Standalone View
src/applications/differential/parser/DifferentialChangesetParser.php
| Show All 38 Lines | final class DifferentialChangesetParser extends Phobject { | ||||
| private $isTopLevel; | private $isTopLevel; | ||||
| private $coverage; | private $coverage; | ||||
| private $markupEngine; | private $markupEngine; | ||||
| private $highlightErrors; | private $highlightErrors; | ||||
| private $disableCache; | private $disableCache; | ||||
| private $renderer; | private $renderer; | ||||
| private $characterEncoding; | |||||
| private $highlightingDisabled; | private $highlightingDisabled; | ||||
| private $showEditAndReplyLinks = true; | private $showEditAndReplyLinks = true; | ||||
| private $canMarkDone; | private $canMarkDone; | ||||
| private $objectOwnerPHID; | private $objectOwnerPHID; | ||||
| private $offsetMode; | private $offsetMode; | ||||
| private $rangeStart; | private $rangeStart; | ||||
| private $rangeEnd; | private $rangeEnd; | ||||
| private $mask; | private $mask; | ||||
| private $linesOfContext = 8; | private $linesOfContext = 8; | ||||
| private $highlightEngine; | private $highlightEngine; | ||||
| private $viewer; | private $viewer; | ||||
| private $documentEngineKey; | |||||
| private $viewState; | private $viewState; | ||||
| public function setRange($start, $end) { | public function setRange($start, $end) { | ||||
| $this->rangeStart = $start; | $this->rangeStart = $start; | ||||
| $this->rangeEnd = $end; | $this->rangeEnd = $end; | ||||
| return $this; | return $this; | ||||
| } | } | ||||
| Show All 20 Lines | public function setViewState(PhabricatorChangesetViewState $view_state) { | ||||
| $this->viewState = $view_state; | $this->viewState = $view_state; | ||||
| return $this; | return $this; | ||||
| } | } | ||||
| public function getViewState() { | public function getViewState() { | ||||
| return $this->viewState; | return $this->viewState; | ||||
| } | } | ||||
| public function setCharacterEncoding($character_encoding) { | |||||
| $this->characterEncoding = $character_encoding; | |||||
| return $this; | |||||
| } | |||||
| public function getCharacterEncoding() { | |||||
| return $this->characterEncoding; | |||||
| } | |||||
| public function setRenderer(DifferentialChangesetRenderer $renderer) { | public function setRenderer(DifferentialChangesetRenderer $renderer) { | ||||
| $this->renderer = $renderer; | $this->renderer = $renderer; | ||||
| return $this; | return $this; | ||||
| } | } | ||||
| public function getRenderer() { | public function getRenderer() { | ||||
| if (!$this->renderer) { | |||||
| return new DifferentialChangesetTwoUpRenderer(); | |||||
| } | |||||
| return $this->renderer; | return $this->renderer; | ||||
| } | } | ||||
| public function setDisableCache($disable_cache) { | public function setDisableCache($disable_cache) { | ||||
| $this->disableCache = $disable_cache; | $this->disableCache = $disable_cache; | ||||
| return $this; | return $this; | ||||
| } | } | ||||
| Show All 32 Lines | public function setViewer(PhabricatorUser $viewer) { | ||||
| $this->viewer = $viewer; | $this->viewer = $viewer; | ||||
| return $this; | return $this; | ||||
| } | } | ||||
| public function getViewer() { | public function getViewer() { | ||||
| return $this->viewer; | return $this->viewer; | ||||
| } | } | ||||
| public function setDocumentEngineKey($document_engine_key) { | private function newRenderer() { | ||||
| $this->documentEngineKey = $document_engine_key; | $viewer = $this->getViewer(); | ||||
| return $this; | $viewstate = $this->getViewstate(); | ||||
| } | |||||
| public function getDocumentEngineKey() { | $renderer_key = $viewstate->getRendererKey(); | ||||
| return $this->documentEngineKey; | |||||
| } | |||||
| public static function getDefaultRendererForViewer(PhabricatorUser $viewer) { | if ($renderer_key === null) { | ||||
| $is_unified = $viewer->compareUserSetting( | $is_unified = $viewer->compareUserSetting( | ||||
| PhabricatorUnifiedDiffsSetting::SETTINGKEY, | PhabricatorUnifiedDiffsSetting::SETTINGKEY, | ||||
| PhabricatorUnifiedDiffsSetting::VALUE_ALWAYS_UNIFIED); | PhabricatorUnifiedDiffsSetting::VALUE_ALWAYS_UNIFIED); | ||||
| if ($is_unified) { | if ($is_unified) { | ||||
| return '1up'; | $renderer_key = '1up'; | ||||
| } | |||||
| return null; | |||||
| } | |||||
| public function readParametersFromRequest(AphrontRequest $request) { | |||||
| $this->setCharacterEncoding($request->getStr('encoding')); | |||||
| $this->setDocumentEngineKey($request->getStr('engine')); | |||||
| $renderer = null; | |||||
| // If the viewer prefers unified diffs, always set the renderer to unified. | |||||
| // Otherwise, we leave it unspecified and the client will choose a | |||||
| // renderer based on the screen size. | |||||
| if ($request->getStr('renderer')) { | |||||
| $renderer = $request->getStr('renderer'); | |||||
| } else { | } else { | ||||
| $renderer = self::getDefaultRendererForViewer($request->getViewer()); | $renderer_key = $viewstate->getDefaultDeviceRendererKey(); | ||||
| } | |||||
| } | } | ||||
| switch ($renderer) { | switch ($renderer_key) { | ||||
| case '1up': | case '1up': | ||||
| $this->setRenderer(new DifferentialChangesetOneUpRenderer()); | $renderer = new DifferentialChangesetOneUpRenderer(); | ||||
| break; | break; | ||||
| default: | default: | ||||
| $this->setRenderer(new DifferentialChangesetTwoUpRenderer()); | $renderer = new DifferentialChangesetTwoUpRenderer(); | ||||
| break; | break; | ||||
| } | } | ||||
| return $this; | return $renderer; | ||||
| } | } | ||||
| const CACHE_VERSION = 14; | const CACHE_VERSION = 14; | ||||
| const CACHE_MAX_SIZE = 8e6; | const CACHE_MAX_SIZE = 8e6; | ||||
| const ATTR_GENERATED = 'attr:generated'; | const ATTR_GENERATED = 'attr:generated'; | ||||
| const ATTR_DELETED = 'attr:deleted'; | const ATTR_DELETED = 'attr:deleted'; | ||||
| const ATTR_UNCHANGED = 'attr:unchanged'; | const ATTR_UNCHANGED = 'attr:unchanged'; | ||||
| ▲ Show 20 Lines • Show All 409 Lines • ▼ Show 20 Lines | private function tryCacheStuff() { | ||||
| $viewstate = $this->getViewState(); | $viewstate = $this->getViewState(); | ||||
| $skip_cache = false; | $skip_cache = false; | ||||
| if ($this->disableCache) { | if ($this->disableCache) { | ||||
| $skip_cache = true; | $skip_cache = true; | ||||
| } | } | ||||
| if ($this->characterEncoding) { | $character_encoding = $viewstate->getCharacterEncoding(); | ||||
| if ($character_encoding !== null) { | |||||
| $skip_cache = true; | $skip_cache = true; | ||||
| } | } | ||||
| $highlight_language = $viewstate->getHighlightLanguage(); | $highlight_language = $viewstate->getHighlightLanguage(); | ||||
| if ($highlight_language !== null) { | if ($highlight_language !== null) { | ||||
| $skip_cache = true; | $skip_cache = true; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 132 Lines • ▼ Show 20 Lines | private function shouldRenderPropertyChangeHeader($changeset) { | ||||
| return true; | return true; | ||||
| } | } | ||||
| public function render( | public function render( | ||||
| $range_start = null, | $range_start = null, | ||||
| $range_len = null, | $range_len = null, | ||||
| $mask_force = array()) { | $mask_force = array()) { | ||||
| $renderer = $this->getRenderer(); | |||||
| if (!$renderer) { | |||||
| $renderer = $this->newRenderer(); | |||||
| $this->setRenderer($renderer); | |||||
| } | |||||
| // "Top level" renders are initial requests for the whole file, versus | // "Top level" renders are initial requests for the whole file, versus | ||||
| // requests for a specific range generated by clicking "show more". We | // requests for a specific range generated by clicking "show more". We | ||||
| // generate property changes and "shield" UI elements only for toplevel | // generate property changes and "shield" UI elements only for toplevel | ||||
| // requests. | // requests. | ||||
| $this->isTopLevel = (($range_start === null) && ($range_len === null)); | $this->isTopLevel = (($range_start === null) && ($range_len === null)); | ||||
| $this->highlightEngine = PhabricatorSyntaxHighlighter::newEngine(); | $this->highlightEngine = PhabricatorSyntaxHighlighter::newEngine(); | ||||
| $viewstate = $this->getViewState(); | |||||
| $encoding = null; | $encoding = null; | ||||
| if ($this->characterEncoding) { | |||||
| $character_encoding = $viewstate->getCharacterEncoding(); | |||||
| if ($character_encoding) { | |||||
| // We are forcing this changeset to be interpreted with a specific | // We are forcing this changeset to be interpreted with a specific | ||||
| // character encoding, so force all the hunks into that encoding and | // character encoding, so force all the hunks into that encoding and | ||||
| // propagate it to the renderer. | // propagate it to the renderer. | ||||
| $encoding = $this->characterEncoding; | $encoding = $character_encoding; | ||||
| foreach ($this->changeset->getHunks() as $hunk) { | foreach ($this->changeset->getHunks() as $hunk) { | ||||
| $hunk->forceEncoding($this->characterEncoding); | $hunk->forceEncoding($character_encoding); | ||||
| } | } | ||||
| } else { | } else { | ||||
| // We're just using the default, so tell the renderer what that is | // We're just using the default, so tell the renderer what that is | ||||
| // (by reading the encoding from the first hunk). | // (by reading the encoding from the first hunk). | ||||
| foreach ($this->changeset->getHunks() as $hunk) { | foreach ($this->changeset->getHunks() as $hunk) { | ||||
| $encoding = $hunk->getDataEncoding(); | $encoding = $hunk->getDataEncoding(); | ||||
| break; | break; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 981 Lines • ▼ Show 20 Lines | private function newDocumentEngine() { | ||||
| } | } | ||||
| foreach ($shared_engines as $key => $shared_engine) { | foreach ($shared_engines as $key => $shared_engine) { | ||||
| if (!$shared_engine->canDiffDocuments($old_ref, $new_ref)) { | if (!$shared_engine->canDiffDocuments($old_ref, $new_ref)) { | ||||
| unset($shared_engines[$key]); | unset($shared_engines[$key]); | ||||
| } | } | ||||
| } | } | ||||
| $engine_key = $this->getDocumentEngineKey(); | $viewstate = $this->getViewState(); | ||||
| $engine_key = $viewstate->getDocumentEngineKey(); | |||||
| if (strlen($engine_key)) { | if (strlen($engine_key)) { | ||||
| if (isset($shared_engines[$engine_key])) { | if (isset($shared_engines[$engine_key])) { | ||||
| $document_engine = $shared_engines[$engine_key]; | $document_engine = $shared_engines[$engine_key]; | ||||
| } else { | } else { | ||||
| $document_engine = null; | $document_engine = null; | ||||
| } | } | ||||
| } else { | } else { | ||||
| // If we aren't rendering with a specific engine, only use a default | // If we aren't rendering with a specific engine, only use a default | ||||
| ▲ Show 20 Lines • Show All 84 Lines • ▼ Show 20 Lines | if ($old_phid || $new_phid) { | ||||
| $new_file = $file; | $new_file = $file; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| return array($old_file, $new_file); | return array($old_file, $new_file); | ||||
| } | } | ||||
| public function newChangesetResponse() { | |||||
| // NOTE: This has to happen first because it has side effects. Yuck. | |||||
| $rendered_changeset = $this->renderChangeset(); | |||||
| $renderer = $this->getRenderer(); | |||||
| $renderer_key = $renderer->getRendererKey(); | |||||
| $viewstate = $this->getViewState(); | |||||
| $undo_templates = $renderer->renderUndoTemplates(); | |||||
| foreach ($undo_templates as $key => $undo_template) { | |||||
| $undo_templates[$key] = hsprintf('%s', $undo_template); | |||||
| } | |||||
| $state = array( | |||||
| 'undoTemplates' => $undo_templates, | |||||
| 'rendererKey' => $renderer_key, | |||||
| 'highlight' => $viewstate->getHighlightLanguage(), | |||||
| 'characterEncoding' => $viewstate->getCharacterEncoding(), | |||||
| 'documentEngine' => $viewstate->getDocumentEngineKey(), | |||||
| ); | |||||
| return id(new PhabricatorChangesetResponse()) | |||||
| ->setRenderedChangeset($rendered_changeset) | |||||
| ->setChangesetState($state); | |||||
| } | |||||
| } | } | ||||